1 // Copyright 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 CC_RESOURCES_LAYER_TILING_DATA_H_ 6 #define CC_RESOURCES_LAYER_TILING_DATA_H_ 7 8 #include <utility> 9 10 #include "base/basictypes.h" 11 #include "base/containers/hash_tables.h" 12 #include "base/containers/scoped_ptr_hash_map.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 "ui/gfx/rect.h" 18 19 namespace cc { 20 21 class CC_EXPORT LayerTilingData { 22 public: 23 enum BorderTexelOption { 24 HAS_BORDER_TEXELS, 25 NO_BORDER_TEXELS 26 }; 27 28 ~LayerTilingData(); 29 30 static scoped_ptr<LayerTilingData> Create(const gfx::Size& tile_size, 31 BorderTexelOption option); 32 has_empty_bounds()33 bool has_empty_bounds() const { return tiling_data_.has_empty_bounds(); } num_tiles_x()34 int num_tiles_x() const { return tiling_data_.num_tiles_x(); } num_tiles_y()35 int num_tiles_y() const { return tiling_data_.num_tiles_y(); } tile_bounds(int i,int j)36 gfx::Rect tile_bounds(int i, int j) const { 37 return tiling_data_.TileBounds(i, j); 38 } texture_offset(int x_index,int y_index)39 gfx::Vector2d texture_offset(int x_index, int y_index) const { 40 return tiling_data_.TextureOffset(x_index, y_index); 41 } 42 43 // Change the tile size. This may invalidate all the existing tiles. 44 void SetTileSize(const gfx::Size& size); 45 gfx::Size tile_size() const; 46 // Change the border texel setting. This may invalidate all existing tiles. 47 void SetBorderTexelOption(BorderTexelOption option); has_border_texels()48 bool has_border_texels() const { return !!tiling_data_.border_texels(); } 49 is_empty()50 bool is_empty() const { return has_empty_bounds() || !tiles().size(); } 51 52 const LayerTilingData& operator=(const LayerTilingData&); 53 54 class Tile { 55 public: Tile()56 Tile() : i_(-1), j_(-1) {} ~Tile()57 virtual ~Tile() {} 58 i()59 int i() const { return i_; } j()60 int j() const { return j_; } move_to(int i,int j)61 void move_to(int i, int j) { 62 i_ = i; 63 j_ = j; 64 } 65 opaque_rect()66 gfx::Rect opaque_rect() const { return opaque_rect_; } set_opaque_rect(const gfx::Rect & opaque_rect)67 void set_opaque_rect(const gfx::Rect& opaque_rect) { 68 opaque_rect_ = opaque_rect; 69 } 70 private: 71 int i_; 72 int j_; 73 gfx::Rect opaque_rect_; 74 DISALLOW_COPY_AND_ASSIGN(Tile); 75 }; 76 typedef std::pair<int, int> TileMapKey; 77 typedef base::ScopedPtrHashMap<TileMapKey, Tile> TileMap; 78 79 void AddTile(scoped_ptr<Tile> tile, int i, int j); 80 scoped_ptr<Tile> TakeTile(int i, int j); 81 Tile* TileAt(int i, int j) const; tiles()82 const TileMap& tiles() const { return tiles_; } 83 84 void SetTilingRect(const gfx::Rect& tiling_rect); tiling_rect()85 gfx::Rect tiling_rect() const { return tiling_data_.tiling_rect(); } 86 87 void ContentRectToTileIndices(const gfx::Rect& rect, 88 int* left, 89 int* top, 90 int* right, 91 int* bottom) const; 92 gfx::Rect TileRect(const Tile* tile) const; 93 94 Region OpaqueRegionInContentRect(const gfx::Rect& rect) const; 95 reset()96 void reset() { tiles_.clear(); } 97 98 protected: 99 LayerTilingData(const gfx::Size& tile_size, BorderTexelOption option); 100 101 TileMap tiles_; 102 TilingData tiling_data_; 103 104 DISALLOW_COPY(LayerTilingData); 105 }; 106 107 } // namespace cc 108 109 #endif // CC_RESOURCES_LAYER_TILING_DATA_H_ 110