• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
3 // found in the LICENSE file.
4 
5 #ifndef CC_RESOURCES_PICTURE_LAYER_TILING_H_
6 #define CC_RESOURCES_PICTURE_LAYER_TILING_H_
7 
8 #include <utility>
9 #include <vector>
10 
11 #include "base/basictypes.h"
12 #include "base/containers/hash_tables.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "cc/base/cc_export.h"
15 #include "cc/base/region.h"
16 #include "cc/base/tiling_data.h"
17 #include "cc/resources/tile.h"
18 #include "cc/resources/tile_priority.h"
19 #include "ui/gfx/rect.h"
20 
21 namespace cc {
22 
23 class PictureLayerTiling;
24 
25 class CC_EXPORT PictureLayerTilingClient {
26  public:
27   // Create a tile at the given content_rect (in the contents scale of the
28   // tiling) This might return null if the client cannot create such a tile.
29   virtual scoped_refptr<Tile> CreateTile(
30     PictureLayerTiling* tiling,
31     gfx::Rect content_rect) = 0;
32   virtual void UpdatePile(Tile* tile) = 0;
33   virtual gfx::Size CalculateTileSize(
34     gfx::Size content_bounds) const = 0;
35   virtual const Region* GetInvalidation() = 0;
36   virtual const PictureLayerTiling* GetTwinTiling(
37       const PictureLayerTiling* tiling) const = 0;
38 
39  protected:
~PictureLayerTilingClient()40   virtual ~PictureLayerTilingClient() {}
41 };
42 
43 class CC_EXPORT PictureLayerTiling {
44  public:
45   ~PictureLayerTiling();
46 
47   // Create a tiling with no tiles.  CreateTiles must be called to add some.
48   static scoped_ptr<PictureLayerTiling> Create(
49       float contents_scale,
50       gfx::Size layer_bounds,
51       PictureLayerTilingClient* client);
layer_bounds()52   gfx::Size layer_bounds() const { return layer_bounds_; }
53   void SetLayerBounds(gfx::Size layer_bounds);
54   void Invalidate(const Region& layer_region);
55   void CreateMissingTilesInLiveTilesRect();
56 
57   void SetCanUseLCDText(bool can_use_lcd_text);
58 
59   void SetClient(PictureLayerTilingClient* client);
set_resolution(TileResolution resolution)60   void set_resolution(TileResolution resolution) { resolution_ = resolution; }
resolution()61   TileResolution resolution() const { return resolution_; }
62 
63   gfx::Rect ContentRect() const;
64   gfx::SizeF ContentSizeF() const;
live_tiles_rect()65   gfx::Rect live_tiles_rect() const { return live_tiles_rect_; }
tile_size()66   gfx::Size tile_size() const { return tiling_data_.max_texture_size(); }
contents_scale()67   float contents_scale() const { return contents_scale_; }
68 
CreateAllTilesForTesting()69   void CreateAllTilesForTesting() {
70     SetLiveTilesRect(gfx::Rect(tiling_data_.total_size()));
71   }
72 
AllTilesForTesting()73   std::vector<Tile*> AllTilesForTesting() const {
74     std::vector<Tile*> all_tiles;
75     for (TileMap::const_iterator it = tiles_.begin();
76          it != tiles_.end(); ++it)
77       all_tiles.push_back(it->second.get());
78     return all_tiles;
79   }
80 
81   Tile* TileAt(int i, int j) const;
82 
83   // Iterate over all tiles to fill content_rect.  Even if tiles are invalid
84   // (i.e. no valid resource) this tiling should still iterate over them.
85   // The union of all geometry_rect calls for each element iterated over should
86   // exactly equal content_rect and no two geometry_rects should intersect.
87   class CC_EXPORT CoverageIterator {
88    public:
89     CoverageIterator();
90     CoverageIterator(const PictureLayerTiling* tiling,
91         float dest_scale,
92         gfx::Rect rect);
93     ~CoverageIterator();
94 
95     // Visible rect (no borders), always in the space of content_rect,
96     // regardless of the contents scale of the tiling.
97     gfx::Rect geometry_rect() const;
98     // Texture rect (in texels) for geometry_rect
99     gfx::RectF texture_rect() const;
100     gfx::Size texture_size() const;
101 
102     // Full rect (including borders) of the current tile, always in the space
103     // of content_rect, regardless of the contents scale of the tiling.
104     gfx::Rect full_tile_geometry_rect() const;
105 
106     Tile* operator->() const { return current_tile_; }
107     Tile* operator*() const { return current_tile_; }
108 
109     CoverageIterator& operator++();
110     operator bool() const { return tile_j_ <= bottom_; }
111 
i()112     int i() const { return tile_i_; }
j()113     int j() const { return tile_j_; }
114 
115    private:
116     const PictureLayerTiling* tiling_;
117     gfx::Rect dest_rect_;
118     float dest_to_content_scale_;
119 
120     Tile* current_tile_;
121     gfx::Rect current_geometry_rect_;
122     int tile_i_;
123     int tile_j_;
124     int left_;
125     int top_;
126     int right_;
127     int bottom_;
128 
129     friend class PictureLayerTiling;
130   };
131 
132   Region OpaqueRegionInContentRect(gfx::Rect content_rect) const;
133 
134   void Reset();
135 
136   void UpdateTilePriorities(
137       WhichTree tree,
138       gfx::Size device_viewport,
139       gfx::Rect viewport_in_layer_space,
140       gfx::Rect visible_layer_rect,
141       gfx::Size last_layer_bounds,
142       gfx::Size current_layer_bounds,
143       float last_layer_contents_scale,
144       float current_layer_contents_scale,
145       const gfx::Transform& last_screen_transform,
146       const gfx::Transform& current_screen_transform,
147       double current_frame_time_in_seconds,
148       size_t max_tiles_for_interest_area);
149 
150   // Copies the src_tree priority into the dst_tree priority for all tiles.
151   // The src_tree priority is reset to the lowest priority possible.  This
152   // also updates the pile on each tile to be the current client's pile.
153   void DidBecomeActive();
154 
155   // Resets the active priority for all tiles in a tiling, when an active
156   // tiling is becoming recycled. This may include some tiles which are
157   // not in the the pending tiling (due to invalidations). This must
158   // be called before DidBecomeActive, as it resets the active priority
159   // while DidBecomeActive promotes pending priority on a similar set of tiles.
160   void DidBecomeRecycled();
161 
162   void UpdateTilesToCurrentPile();
163 
NeedsUpdateForFrameAtTime(double frame_time_in_seconds)164   bool NeedsUpdateForFrameAtTime(double frame_time_in_seconds) {
165     return frame_time_in_seconds != last_impl_frame_time_in_seconds_;
166   }
167 
168   scoped_ptr<base::Value> AsValue() const;
169   size_t GPUMemoryUsageInBytes() const;
170 
171   struct RectExpansionCache {
172     RectExpansionCache();
173 
174     gfx::Rect previous_start;
175     gfx::Rect previous_bounds;
176     gfx::Rect previous_result;
177     int64 previous_target;
178   };
179 
180   static
181   gfx::Rect ExpandRectEquallyToAreaBoundedBy(
182       gfx::Rect starting_rect,
183       int64 target_area,
184       gfx::Rect bounding_rect,
185       RectExpansionCache* cache);
186 
has_ever_been_updated()187   bool has_ever_been_updated() const {
188     return last_impl_frame_time_in_seconds_ != 0.0;
189   }
190 
191  protected:
192   typedef std::pair<int, int> TileMapKey;
193   typedef base::hash_map<TileMapKey, scoped_refptr<Tile> > TileMap;
194 
195   PictureLayerTiling(float contents_scale,
196                      gfx::Size layer_bounds,
197                      PictureLayerTilingClient* client);
198   void SetLiveTilesRect(gfx::Rect live_tiles_rect);
199   void CreateTile(int i, int j, const PictureLayerTiling* twin_tiling);
200 
201   // Given properties.
202   float contents_scale_;
203   gfx::Size layer_bounds_;
204   TileResolution resolution_;
205   PictureLayerTilingClient* client_;
206 
207   // Internal data.
208   TilingData tiling_data_;
209   TileMap tiles_;  // It is not legal to have a NULL tile in the tiles_ map.
210   gfx::Rect live_tiles_rect_;
211 
212   // State saved for computing velocities based upon finite differences.
213   double last_impl_frame_time_in_seconds_;
214 
215   friend class CoverageIterator;
216 
217  private:
218   DISALLOW_ASSIGN(PictureLayerTiling);
219 
220   RectExpansionCache expansion_cache_;
221 };
222 
223 }  // namespace cc
224 
225 #endif  // CC_RESOURCES_PICTURE_LAYER_TILING_H_
226