1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef PPAPI_UTILITY_GRAPHICS_PAINT_AGGREGATOR_H_
6 #define PPAPI_UTILITY_GRAPHICS_PAINT_AGGREGATOR_H_
11 #include "ppapi/cpp/point.h"
12 #include "ppapi/cpp/rect.h"
15 /// This file defines the API to aggregate multiple invalidation and scroll
16 /// commands to produce a scroll and repaint sequence.
19 /// This class is responsible for aggregating multiple invalidation and scroll
20 /// commands to produce a scroll and repaint sequence. You can use this manually
21 /// to track your updates, but most applications will use the PaintManager to
22 /// additionally handle the necessary callbacks on top of the PaintAggregator
25 /// Refer to <code>http://code.google.com/p/ppapi/wiki/2DPaintingModel</code>
26 /// for further information.
27 class PaintAggregator
{
30 /// Default constructor for creating an is_null() <code>PaintUpdate</code>
37 /// True if there is a scroll applied. This indicates that the scroll delta
38 /// and scroll_rect are nonzero (just as a convenience).
41 /// The amount to scroll by. Either the X or Y may be nonzero to indicate a
42 /// scroll in that direction, but there will never be a scroll in both
43 /// directions at the same time (this will be converted to a paint of the
46 /// If there is no scroll, this will be (0, 0).
49 /// The rectangle that should be scrolled by the scroll_delta. If there is
50 /// no scroll, this will be (0, 0, 0, 0). We only track one scroll command
51 /// at once. If there are multiple ones, they will be converted to
55 /// A list of all the individual dirty rectangles. This is an aggregated
56 /// list of all invalidate calls. Different rectangles may be unified to
57 /// produce a minimal list with no overlap that is more efficient to paint.
58 /// This list also contains the region exposed by any scroll command.
59 std::vector
<Rect
> paint_rects
;
61 /// The union of all paint_rects.
65 /// Default constructor.
68 /// Setter function setting the max ratio of paint rect area to scroll rect
69 /// area that we will tolerate before downgrading the scroll into a repaint.
71 /// If the combined area of paint rects contained within the scroll
72 /// rect grows too large, then we might as well just treat
73 /// the scroll rect as a paint rect.
75 /// @param[in] area The max ratio of paint rect area to scroll rect area that
76 /// we will tolerate before downgrading the scroll into a repaint.
77 void set_max_redundant_paint_to_scroll_area(float area
) {
78 max_redundant_paint_to_scroll_area_
= area
;
81 /// Setter function for setting the maximum number of paint rects. If we
82 /// exceed this limit, then we'll start combining paint rects (see
83 /// CombinePaintRects). This limiting can be important since there is
84 /// typically some overhead in deciding what to paint. If your module is fast
85 /// at doing these computations, raise this threshold, if your module is
86 /// slow, lower it (probably requires some tuning to find the right value).
88 /// @param[in] max_rects The maximum number of paint rects.
89 void set_max_paint_rects(size_t max_rects
) {
90 max_paint_rects_
= max_rects
;
93 /// This function determines if there is a pending update. There is a
94 /// PendingUpdate if InvalidateRect or ScrollRect were called and
95 /// ClearPendingUpdate was not called.
97 /// @return true if there is a pending update, otherwise false.
98 bool HasPendingUpdate() const;
100 /// This function clears a pending update.
101 void ClearPendingUpdate();
103 /// This function gets a pending update.
105 /// @return A PaintUpdate containing the pending update.
106 PaintUpdate
GetPendingUpdate() const;
108 /// This function invalidates the rect so it will be repainted.
110 /// @param[in] rect A rect to be repainted.
111 void InvalidateRect(const Rect
& rect
);
113 /// This function adds a pending scroll update.
115 /// @param[in] clip_rect The rect to scroll.
116 /// @param[in] amount A Point amount to scroll <code>rect</code>.
117 void ScrollRect(const Rect
& clip_rect
, const Point
& amount
);
120 // This structure is an internal version of PaintUpdate. It's different in
123 // - The scroll damange (area exposed by the scroll operation, if any) is
124 // maintained separately from the dirty rects generated by calling
125 // InvalidateRect. We need to know this distinction for some operations.
127 // - The paint bounds union is computed on the fly so we don't have to keep
128 // a rectangle up-to-date as we do different operations.
129 class InternalPaintUpdate
{
131 InternalPaintUpdate();
132 ~InternalPaintUpdate();
134 // Computes the rect damaged by scrolling within |scroll_rect| by
135 // |scroll_delta|. This rect must be repainted. It is not included in
136 // paint_rects or in the rect returned by GetPaintBounds.
137 Rect
GetScrollDamage() const;
139 // Returns the smallest rect containing all paint rects, not including the
140 // scroll damage rect.
141 Rect
GetPaintBounds() const;
146 // Does not include the scroll damage rect.
147 std::vector
<Rect
> paint_rects
;
150 Rect
ScrollPaintRect(const Rect
& paint_rect
, const Point
& amount
) const;
151 bool ShouldInvalidateScrollRect(const Rect
& rect
) const;
152 void InvalidateScrollRect();
153 void CombinePaintRects();
155 InternalPaintUpdate update_
;
157 // If the combined area of paint rects contained within the scroll rect grows
158 // too large, then we might as well just treat the scroll rect as a paint
159 // rect. This constant sets the max ratio of paint rect area to scroll rect
160 // area that we will tolerate before downgrading the scroll into a repaint.
161 float max_redundant_paint_to_scroll_area_
;
163 // The maximum number of paint rects. If we exceed this limit, then we'll
164 // start combining paint rects (see CombinePaintRects). This limiting can be
165 // important since there is typically some overhead in deciding what to
166 // paint. If your plugin is fast at doing these computations, raise this
167 // threshold, if your plugin is slow, lower it (probably requires some
168 // tuning to find the right value).
169 size_t max_paint_rects_
;
174 #endif // PPAPI_UTILITY_PAINT_AGGREGATOR_H_