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(gfx::Size tile_size, 31 BorderTexelOption option); 32 33 bool has_empty_bounds() const { return tiling_data_.has_empty_bounds(); } 34 int num_tiles_x() const { return tiling_data_.num_tiles_x(); } 35 int num_tiles_y() const { return tiling_data_.num_tiles_y(); } 36 gfx::Rect tile_bounds(int i, int j) const { 37 return tiling_data_.TileBounds(i, j); 38 } 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(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); 48 bool has_border_texels() const { return !!tiling_data_.border_texels(); } 49 50 bool is_empty() const { return has_empty_bounds() || !tiles().size(); } 51 52 const LayerTilingData& operator=(const LayerTilingData&); 53 54 class Tile { 55 public: 56 Tile() : i_(-1), j_(-1) {} 57 virtual ~Tile() {} 58 59 int i() const { return i_; } 60 int j() const { return j_; } 61 void move_to(int i, int j) { 62 i_ = i; 63 j_ = j; 64 } 65 66 gfx::Rect opaque_rect() const { return opaque_rect_; } 67 void set_opaque_rect(gfx::Rect opaque_rect) { opaque_rect_ = opaque_rect; } 68 private: 69 int i_; 70 int j_; 71 gfx::Rect opaque_rect_; 72 DISALLOW_COPY_AND_ASSIGN(Tile); 73 }; 74 typedef std::pair<int, int> TileMapKey; 75 typedef base::ScopedPtrHashMap<TileMapKey, Tile> TileMap; 76 77 void AddTile(scoped_ptr<Tile> tile, int i, int j); 78 scoped_ptr<Tile> TakeTile(int i, int j); 79 Tile* TileAt(int i, int j) const; 80 const TileMap& tiles() const { return tiles_; } 81 82 void SetBounds(gfx::Size size); 83 gfx::Size bounds() const { return tiling_data_.total_size(); } 84 85 void ContentRectToTileIndices(gfx::Rect rect, 86 int* left, 87 int* top, 88 int* right, 89 int* bottom) const; 90 gfx::Rect TileRect(const Tile* tile) const; 91 92 Region OpaqueRegionInContentRect(gfx::Rect rect) const; 93 94 void reset() { tiles_.clear(); } 95 96 protected: 97 LayerTilingData(gfx::Size tile_size, BorderTexelOption option); 98 99 TileMap tiles_; 100 TilingData tiling_data_; 101 102 DISALLOW_COPY(LayerTilingData); 103 }; 104 105 } // namespace cc 106 107 #endif // CC_RESOURCES_LAYER_TILING_DATA_H_ 108