1 // Copyright 2010 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.
5 #ifndef CC_BASE_TILING_DATA_H_
6 #define CC_BASE_TILING_DATA_H_
10 #include "base/basictypes.h"
11 #include "base/logging.h"
12 #include "cc/base/cc_export.h"
13 #include "ui/gfx/rect.h"
14 #include "ui/gfx/size.h"
22 class CC_EXPORT TilingData {
25 TilingData(const gfx::Size& max_texture_size,
26 const gfx::Size& tiling_size,
27 bool has_border_texels);
28 TilingData(const gfx::Size& max_texture_size,
29 const gfx::Size& tiling_size,
32 gfx::Size tiling_size() const { return tiling_size_; }
33 void SetTilingSize(const gfx::Size& tiling_size);
35 gfx::Size max_texture_size() const { return max_texture_size_; }
36 void SetMaxTextureSize(const gfx::Size& max_texture_size);
38 int border_texels() const { return border_texels_; }
39 void SetHasBorderTexels(bool has_border_texels);
40 void SetBorderTexels(int border_texels);
42 bool has_empty_bounds() const { return !num_tiles_x_ || !num_tiles_y_; }
43 int num_tiles_x() const { return num_tiles_x_; }
44 int num_tiles_y() const { return num_tiles_y_; }
45 // Return the tile index whose non-border texels include src_position.
46 int TileXIndexFromSrcCoord(int src_position) const;
47 int TileYIndexFromSrcCoord(int src_position) const;
48 // Return the lowest tile index whose border texels include src_position.
49 int FirstBorderTileXIndexFromSrcCoord(int src_position) const;
50 int FirstBorderTileYIndexFromSrcCoord(int src_position) const;
51 // Return the highest tile index whose border texels include src_position.
52 int LastBorderTileXIndexFromSrcCoord(int src_position) const;
53 int LastBorderTileYIndexFromSrcCoord(int src_position) const;
55 gfx::Rect ExpandRectIgnoringBordersToTileBoundsWithBorders(
56 const gfx::Rect& rect) const;
57 gfx::Rect ExpandRectToTileBounds(const gfx::Rect& rect) const;
59 gfx::Rect TileBounds(int i, int j) const;
60 gfx::Rect TileBoundsWithBorder(int i, int j) const;
61 int TilePositionX(int x_index) const;
62 int TilePositionY(int y_index) const;
63 int TileSizeX(int x_index) const;
64 int TileSizeY(int y_index) const;
66 // Difference between TileBound's and TileBoundWithBorder's origin().
67 gfx::Vector2d TextureOffset(int x_index, int y_index) const;
69 class CC_EXPORT BaseIterator {
71 operator bool() const { return index_x_ != -1 && index_y_ != -1; }
73 int index_x() const { return index_x_; }
74 int index_y() const { return index_y_; }
75 std::pair<int, int> index() const {
76 return std::make_pair(index_x_, index_y_);
80 explicit BaseIterator(const TilingData* tiling_data);
86 const TilingData* tiling_data_;
91 // Iterate through tiles whose bounds + optional border intersect with |rect|.
92 class CC_EXPORT Iterator : public BaseIterator {
95 Iterator(const TilingData* tiling_data,
96 const gfx::Rect& consider_rect,
97 bool include_borders);
98 Iterator& operator++();
106 // Iterate through all indices whose bounds + border intersect with
107 // |consider| but which also do not intersect with |ignore|.
108 class CC_EXPORT DifferenceIterator : public BaseIterator {
111 const TilingData* tiling_data,
112 const gfx::Rect& consider_rect,
113 const gfx::Rect& ignore_rect);
114 DifferenceIterator& operator++();
117 bool in_ignore_rect() const {
118 return index_x_ >= ignore_left_ && index_x_ <= ignore_right_ &&
119 index_y_ >= ignore_top_ && index_y_ <= ignore_bottom_;
125 int consider_bottom_;
132 // Iterate through all indices whose bounds + border intersect with
133 // |consider| but which also do not intersect with |ignore|. The iterator
134 // order is a counterclockwise spiral around the given center.
135 class CC_EXPORT SpiralDifferenceIterator : public BaseIterator {
137 SpiralDifferenceIterator();
138 SpiralDifferenceIterator(const TilingData* tiling_data,
139 const gfx::Rect& consider_rect,
140 const gfx::Rect& ignore_rect,
141 const gfx::Rect& center_rect);
142 SpiralDifferenceIterator& operator++();
145 bool in_consider_rect() const {
146 return index_x_ >= consider_left_ && index_x_ <= consider_right_ &&
147 index_y_ >= consider_top_ && index_y_ <= consider_bottom_;
149 bool in_ignore_rect() const {
150 return index_x_ >= ignore_left_ && index_x_ <= ignore_right_ &&
151 index_y_ >= ignore_top_ && index_y_ <= ignore_bottom_;
153 bool valid_column() const {
154 return index_x_ >= consider_left_ && index_x_ <= consider_right_;
156 bool valid_row() const {
157 return index_y_ >= consider_top_ && index_y_ <= consider_bottom_;
160 int current_step_count() const {
161 return (direction_ == UP || direction_ == DOWN) ? vertical_step_count_
162 : horizontal_step_count_;
165 bool needs_direction_switch() const;
166 void switch_direction();
171 int consider_bottom_;
177 enum Direction { UP, LEFT, DOWN, RIGHT };
179 Direction direction_;
183 int horizontal_step_count_;
184 int vertical_step_count_;
188 void AssertTile(int i, int j) const {
190 DCHECK_LT(i, num_tiles_x_);
192 DCHECK_LT(j, num_tiles_y_);
195 void RecomputeNumTiles();
197 gfx::Size max_texture_size_;
198 gfx::Size tiling_size_;
201 // These are computed values.
208 #endif // CC_BASE_TILING_DATA_H_