OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef CC_RESOURCES_PICTURE_LAYER_TILING_H_ | 5 #ifndef CC_RESOURCES_PICTURE_LAYER_TILING_H_ |
6 #define CC_RESOURCES_PICTURE_LAYER_TILING_H_ | 6 #define CC_RESOURCES_PICTURE_LAYER_TILING_H_ |
7 | 7 |
8 #include <utility> | 8 #include <utility> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 14 matching lines...) Expand all Loading... |
25 | 25 |
26 class PictureLayerTilingClient { | 26 class PictureLayerTilingClient { |
27 public: | 27 public: |
28 // Create a tile at the given content_rect (in the contents scale of the | 28 // Create a tile at the given content_rect (in the contents scale of the |
29 // tiling) This might return null if the client cannot create such a tile. | 29 // tiling) This might return null if the client cannot create such a tile. |
30 virtual scoped_refptr<Tile> CreateTile( | 30 virtual scoped_refptr<Tile> CreateTile( |
31 PictureLayerTiling* tiling, | 31 PictureLayerTiling* tiling, |
32 gfx::Rect content_rect) = 0; | 32 gfx::Rect content_rect) = 0; |
33 virtual void UpdatePile(Tile* tile) = 0; | 33 virtual void UpdatePile(Tile* tile) = 0; |
34 virtual gfx::Size CalculateTileSize( | 34 virtual gfx::Size CalculateTileSize( |
35 gfx::Size current_tile_size, | |
36 gfx::Size content_bounds) = 0; | 35 gfx::Size content_bounds) = 0; |
| 36 virtual const Region* GetInvalidation() = 0; |
| 37 virtual const PictureLayerTiling* GetTwinTiling( |
| 38 const PictureLayerTiling* tiling) = 0; |
37 | 39 |
38 protected: | 40 protected: |
39 virtual ~PictureLayerTilingClient() {} | 41 virtual ~PictureLayerTilingClient() {} |
40 }; | 42 }; |
41 | 43 |
42 class CC_EXPORT PictureLayerTiling { | 44 class CC_EXPORT PictureLayerTiling { |
43 public: | 45 public: |
44 ~PictureLayerTiling(); | 46 ~PictureLayerTiling(); |
45 | 47 |
46 // Create a tiling with no tiles. CreateTiles must be called to add some. | 48 // Create a tiling with no tiles. CreateTiles must be called to add some. |
47 static scoped_ptr<PictureLayerTiling> Create(float contents_scale); | 49 static scoped_ptr<PictureLayerTiling> Create( |
48 scoped_ptr<PictureLayerTiling> Clone() const; | 50 float contents_scale, |
49 | 51 gfx::Size layer_bounds, |
| 52 PictureLayerTilingClient* client); |
| 53 scoped_ptr<PictureLayerTiling> Clone(gfx::Size layer_bounds, |
| 54 PictureLayerTilingClient* client) const; |
50 gfx::Size layer_bounds() const { return layer_bounds_; } | 55 gfx::Size layer_bounds() const { return layer_bounds_; } |
51 void SetLayerBounds(gfx::Size layer_bounds); | |
52 void Invalidate(const Region& layer_invalidation); | |
53 | 56 |
54 // Add any tiles that intersect with |layer_rect|. If any tiles already | 57 // Add any tiles that intersect with |layer_rect|. If any tiles already |
55 // exist, then this leaves them as-is. | 58 // exist, then this leaves them as-is. |
56 void CreateTilesFromLayerRect(gfx::Rect layer_rect); | |
57 | 59 |
58 void SetClient(PictureLayerTilingClient* client); | 60 void SetClient(PictureLayerTilingClient* client); |
59 void set_resolution(TileResolution resolution) { resolution_ = resolution; } | 61 void set_resolution(TileResolution resolution) { resolution_ = resolution; } |
60 TileResolution resolution() const { return resolution_; } | 62 TileResolution resolution() const { return resolution_; } |
61 | 63 |
62 gfx::Rect ContentRect() const; | 64 gfx::Rect ContentRect() const; |
63 gfx::SizeF ContentSizeF() const; | 65 gfx::SizeF ContentSizeF() const; |
64 float contents_scale() const { return contents_scale_; } | 66 float contents_scale() const { return contents_scale_; } |
65 | 67 |
66 std::vector<Tile*> AllTilesForTesting() const { | 68 std::vector<Tile*> AllTilesForTesting() { |
| 69 SetLiveTilesRect(gfx::Rect(tiling_data_.total_size())); |
| 70 |
67 std::vector<Tile*> all_tiles; | 71 std::vector<Tile*> all_tiles; |
68 for (TileMap::const_iterator it = tiles_.begin(); | 72 for (TileMap::const_iterator it = tiles_.begin(); |
69 it != tiles_.end(); ++it) | 73 it != tiles_.end(); ++it) |
70 all_tiles.push_back(it->second); | 74 all_tiles.push_back(it->second); |
71 return all_tiles; | 75 return all_tiles; |
72 } | 76 } |
73 | 77 |
74 static gfx::Rect ExpandRectEquallyToAreaBoundedBy( | |
75 gfx::Rect starting_rect, | |
76 int64 target_area, | |
77 gfx::Rect bounding_rect); | |
78 | |
79 // Iterate over all tiles to fill content_rect. Even if tiles are invalid | 78 // Iterate over all tiles to fill content_rect. Even if tiles are invalid |
80 // (i.e. no valid resource) this tiling should still iterate over them. | 79 // (i.e. no valid resource) this tiling should still iterate over them. |
81 // The union of all geometry_rect calls for each element iterated over should | 80 // The union of all geometry_rect calls for each element iterated over should |
82 // exactly equal content_rect and no two geometry_rects should intersect. | 81 // exactly equal content_rect and no two geometry_rects should intersect. |
83 class CC_EXPORT Iterator { | 82 class CC_EXPORT Iterator { |
84 public: | 83 public: |
85 Iterator(); | 84 Iterator(); |
86 Iterator(const PictureLayerTiling* tiling, | 85 Iterator(const PictureLayerTiling* tiling, |
87 float dest_scale, | 86 float dest_scale, |
88 gfx::Rect rect); | 87 gfx::Rect rect); |
(...skipping 28 matching lines...) Expand all Loading... |
117 int left_; | 116 int left_; |
118 int top_; | 117 int top_; |
119 int right_; | 118 int right_; |
120 int bottom_; | 119 int bottom_; |
121 | 120 |
122 friend class PictureLayerTiling; | 121 friend class PictureLayerTiling; |
123 }; | 122 }; |
124 | 123 |
125 Region OpaqueRegionInContentRect(const gfx::Rect&) const; | 124 Region OpaqueRegionInContentRect(const gfx::Rect&) const; |
126 | 125 |
127 void Reset() { return tiles_.clear(); } | 126 void Reset(); |
128 | 127 |
129 void UpdateTilePriorities( | 128 void UpdateTilePriorities( |
130 WhichTree tree, | 129 WhichTree tree, |
131 gfx::Size device_viewport, | 130 gfx::Size device_viewport, |
132 const gfx::RectF& viewport_in_layer_space, | 131 const gfx::RectF& viewport_in_layer_space, |
133 gfx::Size last_layer_bounds, | 132 gfx::Size last_layer_bounds, |
134 gfx::Size current_layer_bounds, | 133 gfx::Size current_layer_bounds, |
135 float last_layer_contents_scale, | 134 float last_layer_contents_scale, |
136 float current_layer_contents_scale, | 135 float current_layer_contents_scale, |
137 const gfx::Transform& last_screen_transform, | 136 const gfx::Transform& last_screen_transform, |
138 const gfx::Transform& current_screen_transform, | 137 const gfx::Transform& current_screen_transform, |
139 int current_source_frame_number, | 138 int current_source_frame_number, |
140 double current_frame_time, | 139 double current_frame_time, |
141 bool store_screen_space_quads_on_tiles, | 140 bool store_screen_space_quads_on_tiles, |
142 size_t max_tiles_for_interest_area); | 141 size_t max_tiles_for_interest_area); |
143 | 142 |
144 // Copies the src_tree priority into the dst_tree priority for all tiles. | 143 // Copies the src_tree priority into the dst_tree priority for all tiles. |
145 // The src_tree priority is reset to the lowest priority possible. This | 144 // The src_tree priority is reset to the lowest priority possible. This |
146 // also updates the pile on each tile to be the current client's pile. | 145 // also updates the pile on each tile to be the current client's pile. |
147 void DidBecomeActive(); | 146 void DidBecomeActive(); |
148 | 147 |
149 scoped_ptr<base::Value> AsValue() const; | 148 scoped_ptr<base::Value> AsValue() const; |
150 | 149 |
| 150 static gfx::Rect ExpandRectEquallyToAreaBoundedBy( |
| 151 gfx::Rect starting_rect, |
| 152 int64 target_area, |
| 153 gfx::Rect bounding_rect); |
| 154 |
| 155 gfx::Size tile_bounds() const { |
| 156 return tiling_data_.max_texture_size(); |
| 157 } |
| 158 |
151 protected: | 159 protected: |
152 typedef std::pair<int, int> TileMapKey; | 160 typedef std::pair<int, int> TileMapKey; |
153 typedef base::hash_map<TileMapKey, scoped_refptr<Tile> > TileMap; | 161 typedef base::hash_map<TileMapKey, scoped_refptr<Tile> > TileMap; |
154 | 162 |
155 explicit PictureLayerTiling(float contents_scale); | 163 PictureLayerTiling(float contents_scale, |
| 164 gfx::Size layer_bounds, |
| 165 PictureLayerTilingClient* client); |
| 166 |
156 Tile* TileAt(int, int) const; | 167 Tile* TileAt(int, int) const; |
157 void CreateTilesFromContentRect(gfx::Rect layer_rect); | |
158 void CreateTile(int i, int j); | 168 void CreateTile(int i, int j); |
159 | 169 |
160 PictureLayerTilingClient* client_; | 170 // Given properties. |
161 float contents_scale_; | 171 float contents_scale_; |
162 gfx::Size layer_bounds_; | 172 gfx::Size layer_bounds_; |
163 gfx::Rect last_prioritized_rect_; | 173 TileResolution resolution_; |
164 // It is not legal to have a NULL tile in the tiles_ map. | 174 PictureLayerTilingClient* client_; |
165 TileMap tiles_; | 175 |
| 176 // Internal data. |
166 TilingData tiling_data_; | 177 TilingData tiling_data_; |
167 TileResolution resolution_; | 178 TileMap tiles_; // It is not legal to have a NULL tile in the tiles_ map. |
| 179 gfx::Rect live_tiles_rect_; |
| 180 |
| 181 // State saved for computing velocities based upon finite differences. |
168 int last_source_frame_number_; | 182 int last_source_frame_number_; |
169 double last_impl_frame_time_; | 183 double last_impl_frame_time_; |
170 | 184 |
171 friend class Iterator; | 185 friend class Iterator; |
172 | 186 |
| 187 void SetLiveTilesRect(const gfx::Rect& live_tiles_rect); |
| 188 |
173 private: | 189 private: |
174 DISALLOW_ASSIGN(PictureLayerTiling); | 190 DISALLOW_ASSIGN(PictureLayerTiling); |
175 }; | 191 }; |
176 | 192 |
177 } // namespace cc | 193 } // namespace cc |
178 | 194 |
179 #endif // CC_RESOURCES_PICTURE_LAYER_TILING_H_ | 195 #endif // CC_RESOURCES_PICTURE_LAYER_TILING_H_ |
OLD | NEW |