| OLD | NEW |
| (Empty) |
| 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_PICTURE_LAYER_TILING_H_ | |
| 6 #define CC_PICTURE_LAYER_TILING_H_ | |
| 7 | |
| 8 #include "base/basictypes.h" | |
| 9 #include "base/hash_tables.h" | |
| 10 #include "base/memory/scoped_ptr.h" | |
| 11 #include "cc/base/cc_export.h" | |
| 12 #include "cc/base/hash_pair.h" | |
| 13 #include "cc/base/region.h" | |
| 14 #include "cc/base/tiling_data.h" | |
| 15 #include "cc/tile.h" | |
| 16 #include "cc/tile_priority.h" | |
| 17 #include "ui/gfx/rect.h" | |
| 18 | |
| 19 namespace cc { | |
| 20 | |
| 21 class PictureLayerTiling; | |
| 22 | |
| 23 class PictureLayerTilingClient { | |
| 24 public: | |
| 25 // Create a tile at the given content_rect (in the contents scale of the | |
| 26 // tiling) This might return null if the client cannot create such a tile. | |
| 27 virtual scoped_refptr<Tile> CreateTile( | |
| 28 PictureLayerTiling* tiling, | |
| 29 gfx::Rect content_rect) = 0; | |
| 30 virtual void UpdatePile(Tile* tile) = 0; | |
| 31 virtual gfx::Size CalculateTileSize( | |
| 32 gfx::Size current_tile_size, | |
| 33 gfx::Size content_bounds) = 0; | |
| 34 }; | |
| 35 | |
| 36 class CC_EXPORT PictureLayerTiling { | |
| 37 public: | |
| 38 ~PictureLayerTiling(); | |
| 39 | |
| 40 // Create a tiling with no tiles. CreateTiles must be called to add some. | |
| 41 static scoped_ptr<PictureLayerTiling> Create(float contents_scale); | |
| 42 scoped_ptr<PictureLayerTiling> Clone() const; | |
| 43 | |
| 44 gfx::Size layer_bounds() const { return layer_bounds_; } | |
| 45 void SetLayerBounds(gfx::Size layer_bounds); | |
| 46 void Invalidate(const Region& layer_invalidation); | |
| 47 | |
| 48 // Add any tiles that intersect with |layer_rect|. If any tiles already | |
| 49 // exist, then this leaves them as-is. | |
| 50 void CreateTilesFromLayerRect(gfx::Rect layer_rect); | |
| 51 | |
| 52 void SetClient(PictureLayerTilingClient* client); | |
| 53 void set_resolution(TileResolution resolution) { resolution_ = resolution; } | |
| 54 TileResolution resolution() const { return resolution_; } | |
| 55 | |
| 56 gfx::Rect ContentRect() const; | |
| 57 gfx::SizeF ContentSizeF() const; | |
| 58 float contents_scale() const { return contents_scale_; } | |
| 59 | |
| 60 std::vector<Tile*> AllTilesForTesting() const { | |
| 61 std::vector<Tile*> all_tiles; | |
| 62 for (TileMap::const_iterator it = tiles_.begin(); | |
| 63 it != tiles_.end(); ++it) | |
| 64 all_tiles.push_back(it->second); | |
| 65 return all_tiles; | |
| 66 } | |
| 67 | |
| 68 enum LayerDeviceAlignment { | |
| 69 LayerDeviceAlignmentUnknown, | |
| 70 LayerAlignedToDevice, | |
| 71 LayerNotAlignedToDevice, | |
| 72 }; | |
| 73 | |
| 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 | |
| 80 // (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 | |
| 82 // exactly equal content_rect and no two geometry_rects should intersect. | |
| 83 class CC_EXPORT Iterator { | |
| 84 public: | |
| 85 Iterator(); | |
| 86 Iterator(const PictureLayerTiling* tiling, | |
| 87 float dest_scale, | |
| 88 gfx::Rect rect, | |
| 89 LayerDeviceAlignment layerDeviceAlignment); | |
| 90 ~Iterator(); | |
| 91 | |
| 92 // Visible rect (no borders), always in the space of content_rect, | |
| 93 // regardless of the contents scale of the tiling. | |
| 94 gfx::Rect geometry_rect() const; | |
| 95 // Texture rect (in texels) for geometry_rect | |
| 96 gfx::RectF texture_rect() const; | |
| 97 gfx::Size texture_size() const; | |
| 98 | |
| 99 // Full rect (including borders) of the current tile, always in the space | |
| 100 // of content_rect, regardless of the contents scale of the tiling. | |
| 101 gfx::Rect full_tile_geometry_rect() const; | |
| 102 | |
| 103 Tile* operator->() const { return current_tile_; } | |
| 104 Tile* operator*() const { return current_tile_; } | |
| 105 | |
| 106 Iterator& operator++(); | |
| 107 operator bool() const { return tile_j_ <= bottom_; } | |
| 108 | |
| 109 private: | |
| 110 const PictureLayerTiling* tiling_; | |
| 111 gfx::Rect dest_rect_; | |
| 112 float dest_to_content_scale_; | |
| 113 | |
| 114 Tile* current_tile_; | |
| 115 gfx::Rect current_geometry_rect_; | |
| 116 int tile_i_; | |
| 117 int tile_j_; | |
| 118 int left_; | |
| 119 int top_; | |
| 120 int right_; | |
| 121 int bottom_; | |
| 122 | |
| 123 friend class PictureLayerTiling; | |
| 124 }; | |
| 125 | |
| 126 Region OpaqueRegionInContentRect(const gfx::Rect&) const; | |
| 127 | |
| 128 void Reset() { return tiles_.clear(); } | |
| 129 | |
| 130 void UpdateTilePriorities( | |
| 131 WhichTree tree, | |
| 132 gfx::Size device_viewport, | |
| 133 const gfx::RectF& viewport_in_layer_space, | |
| 134 gfx::Size last_layer_bounds, | |
| 135 gfx::Size current_layer_bounds, | |
| 136 float last_layer_contents_scale, | |
| 137 float current_layer_contents_scale, | |
| 138 const gfx::Transform& last_screen_transform, | |
| 139 const gfx::Transform& current_screen_transform, | |
| 140 int current_source_frame_number, | |
| 141 double current_frame_time, | |
| 142 bool store_screen_space_quads_on_tiles); | |
| 143 | |
| 144 // 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 | |
| 146 // also updates the pile on each tile to be the current client's pile. | |
| 147 void DidBecomeActive(); | |
| 148 | |
| 149 scoped_ptr<base::Value> AsValue() const; | |
| 150 | |
| 151 protected: | |
| 152 typedef std::pair<int, int> TileMapKey; | |
| 153 typedef base::hash_map<TileMapKey, scoped_refptr<Tile> > TileMap; | |
| 154 | |
| 155 PictureLayerTiling(float contents_scale); | |
| 156 Tile* TileAt(int, int) const; | |
| 157 void CreateTilesFromContentRect(gfx::Rect layer_rect); | |
| 158 void CreateTile(int i, int j); | |
| 159 | |
| 160 PictureLayerTilingClient* client_; | |
| 161 float contents_scale_; | |
| 162 gfx::Size layer_bounds_; | |
| 163 gfx::Rect last_prioritized_rect_; | |
| 164 // It is not legal to have a NULL tile in the tiles_ map. | |
| 165 TileMap tiles_; | |
| 166 TilingData tiling_data_; | |
| 167 TileResolution resolution_; | |
| 168 int last_source_frame_number_; | |
| 169 double last_impl_frame_time_; | |
| 170 | |
| 171 friend class Iterator; | |
| 172 }; | |
| 173 | |
| 174 } // namespace cc | |
| 175 | |
| 176 #endif // CC_PICTURE_LAYER_TILING_H_ | |
| OLD | NEW |