• 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_SET_H_
6 #define CC_RESOURCES_PICTURE_LAYER_TILING_SET_H_
7 
8 #include "cc/base/region.h"
9 #include "cc/base/scoped_ptr_vector.h"
10 #include "cc/resources/picture_layer_tiling.h"
11 #include "ui/gfx/size.h"
12 
13 namespace cc {
14 
15 class CC_EXPORT PictureLayerTilingSet {
16  public:
17   PictureLayerTilingSet(PictureLayerTilingClient* client,
18                         const gfx::Size& layer_bounds);
19   ~PictureLayerTilingSet();
20 
21   void SetClient(PictureLayerTilingClient* client);
client()22   const PictureLayerTilingClient* client() const { return client_; }
23 
24   // Make this set of tilings match the same set of content scales from |other|.
25   // Delete any tilings that don't meet |minimum_contents_scale|.  Recreate
26   // any tiles that intersect |layer_invalidation|.  Update the size of all
27   // tilings to |new_layer_bounds|.
28   // Returns true if we had at least one high res tiling synced.
29   bool SyncTilings(const PictureLayerTilingSet& other,
30                    const gfx::Size& new_layer_bounds,
31                    const Region& layer_invalidation,
32                    float minimum_contents_scale);
33 
34   void RemoveTilesInRegion(const Region& region);
35 
layer_bounds()36   gfx::Size layer_bounds() const { return layer_bounds_; }
37 
38   PictureLayerTiling* AddTiling(float contents_scale);
num_tilings()39   size_t num_tilings() const { return tilings_.size(); }
40   int NumHighResTilings() const;
tiling_at(size_t idx)41   PictureLayerTiling* tiling_at(size_t idx) { return tilings_[idx]; }
tiling_at(size_t idx)42   const PictureLayerTiling* tiling_at(size_t idx) const {
43     return tilings_[idx];
44   }
45 
46   PictureLayerTiling* TilingAtScale(float scale) const;
47 
48   // Remove all tilings.
49   void RemoveAllTilings();
50 
51   // Remove one tiling.
52   void Remove(PictureLayerTiling* tiling);
53 
54   // Remove all tiles; keep all tilings.
55   void RemoveAllTiles();
56 
57   void DidBecomeActive();
58   void DidBecomeRecycled();
59 
60   // For a given rect, iterates through tiles that can fill it.  If no
61   // set of tiles with resources can fill the rect, then it will iterate
62   // through null tiles with valid geometry_rect() until the rect is full.
63   // If all tiles have resources, the union of all geometry_rects will
64   // exactly fill rect with no overlap.
65   class CC_EXPORT CoverageIterator {
66    public:
67     CoverageIterator(const PictureLayerTilingSet* set,
68       float contents_scale,
69       const gfx::Rect& content_rect,
70       float ideal_contents_scale);
71     ~CoverageIterator();
72 
73     // Visible rect (no borders), always in the space of rect,
74     // regardless of the relative contents scale of the tiling.
75     gfx::Rect geometry_rect() const;
76     // Texture rect (in texels) for geometry_rect
77     gfx::RectF texture_rect() const;
78     // Texture size in texels
79     gfx::Size texture_size() const;
80 
81     Tile* operator->() const;
82     Tile* operator*() const;
83 
84     CoverageIterator& operator++();
85     operator bool() const;
86 
87     PictureLayerTiling* CurrentTiling();
88 
89    private:
90     int NextTiling() const;
91 
92     const PictureLayerTilingSet* set_;
93     float contents_scale_;
94     float ideal_contents_scale_;
95     PictureLayerTiling::CoverageIterator tiling_iter_;
96     int current_tiling_;
97     int ideal_tiling_;
98 
99     Region current_region_;
100     Region missing_region_;
101     Region::Iterator region_iter_;
102   };
103 
104   scoped_ptr<base::Value> AsValue() const;
105   size_t GPUMemoryUsageInBytes() const;
106 
107  private:
108   PictureLayerTilingClient* client_;
109   gfx::Size layer_bounds_;
110   ScopedPtrVector<PictureLayerTiling> tilings_;
111 
112   friend class Iterator;
113   DISALLOW_COPY_AND_ASSIGN(PictureLayerTilingSet);
114 };
115 
116 }  // namespace cc
117 
118 #endif  // CC_RESOURCES_PICTURE_LAYER_TILING_SET_H_
119