| OLD | NEW |
| (Empty) |
| 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. | |
| 4 | |
| 5 #ifndef PPAPI_CPP_PAINT_AGGREGATOR_H_ | |
| 6 #define PPAPI_CPP_PAINT_AGGREGATOR_H_ | |
| 7 | |
| 8 #include <stddef.h> | |
| 9 #include <vector> | |
| 10 | |
| 11 #include "ppapi/cpp/point.h" | |
| 12 #include "ppapi/cpp/rect.h" | |
| 13 | |
| 14 /// @file | |
| 15 /// This file defines the API to aggregate multiple invalidation and scroll | |
| 16 /// commands to produce a scroll and repaint sequence. | |
| 17 namespace pp { | |
| 18 | |
| 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 | |
| 23 /// functionality. | |
| 24 /// | |
| 25 /// Refer to <code>http://code.google.com/p/ppapi/wiki/2DPaintingModel</code> | |
| 26 /// for further information. | |
| 27 class PaintAggregator { | |
| 28 public: | |
| 29 struct PaintUpdate { | |
| 30 /// Default constructor for creating an is_null() <code>PaintUpdate</code> | |
| 31 /// object. | |
| 32 PaintUpdate(); | |
| 33 | |
| 34 /// Destructor. | |
| 35 ~PaintUpdate(); | |
| 36 | |
| 37 /// True if there is a scroll applied. This indicates that the scroll delta | |
| 38 /// and scroll_rect are nonzero (just as a convenience). | |
| 39 bool has_scroll; | |
| 40 | |
| 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 | |
| 44 /// region instead). | |
| 45 /// | |
| 46 /// If there is no scroll, this will be (0, 0). | |
| 47 Point scroll_delta; | |
| 48 | |
| 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 | |
| 52 /// invalidates. | |
| 53 Rect scroll_rect; | |
| 54 | |
| 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; | |
| 60 | |
| 61 /// The union of all paint_rects. | |
| 62 Rect paint_bounds; | |
| 63 }; | |
| 64 | |
| 65 /// Default constructor. | |
| 66 PaintAggregator(); | |
| 67 | |
| 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. | |
| 70 /// | |
| 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. | |
| 74 /// | |
| 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; | |
| 79 } | |
| 80 | |
| 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). | |
| 87 /// | |
| 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; | |
| 91 } | |
| 92 | |
| 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. | |
| 96 /// | |
| 97 /// @return true if there is a pending update, otherwise false. | |
| 98 bool HasPendingUpdate() const; | |
| 99 | |
| 100 /// This function clears a pending update. | |
| 101 void ClearPendingUpdate(); | |
| 102 | |
| 103 /// This function gets a pending update. | |
| 104 /// | |
| 105 /// @return A PaintUpdate containing the pending update. | |
| 106 PaintUpdate GetPendingUpdate() const; | |
| 107 | |
| 108 /// This function invalidates the rect so it will be repainted. | |
| 109 /// | |
| 110 /// @param[in] rect A rect to be repainted. | |
| 111 void InvalidateRect(const Rect& rect); | |
| 112 | |
| 113 /// This function adds a pending scroll update. | |
| 114 /// | |
| 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); | |
| 118 | |
| 119 private: | |
| 120 // This structure is an internal version of PaintUpdate. It's different in | |
| 121 // two respects: | |
| 122 // | |
| 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. | |
| 126 // | |
| 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 { | |
| 130 public: | |
| 131 InternalPaintUpdate(); | |
| 132 ~InternalPaintUpdate(); | |
| 133 | |
| 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; | |
| 138 | |
| 139 // Returns the smallest rect containing all paint rects, not including the | |
| 140 // scroll damage rect. | |
| 141 Rect GetPaintBounds() const; | |
| 142 | |
| 143 Point scroll_delta; | |
| 144 Rect scroll_rect; | |
| 145 | |
| 146 // Does not include the scroll damage rect. | |
| 147 std::vector<Rect> paint_rects; | |
| 148 }; | |
| 149 | |
| 150 Rect ScrollPaintRect(const Rect& paint_rect, const Point& amount) const; | |
| 151 bool ShouldInvalidateScrollRect(const Rect& rect) const; | |
| 152 void InvalidateScrollRect(); | |
| 153 void CombinePaintRects(); | |
| 154 | |
| 155 InternalPaintUpdate update_; | |
| 156 | |
| 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_; | |
| 162 | |
| 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_; | |
| 170 }; | |
| 171 | |
| 172 } // namespace pp | |
| 173 | |
| 174 #endif // PPAPI_CPP_PAINT_AGGREGATOR_H_ | |
| OLD | NEW |