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/geometry/rect.h"
14 #include "ui/gfx/geometry/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
ExpandRectIgnoringBordersToTileBounds(const gfx::Rect
& rect
) const;
56 gfx::Rect
ExpandRectToTileBounds(const gfx::Rect
& rect
) const;
58 gfx::Rect
TileBounds(int i
, int j
) const;
59 gfx::Rect
TileBoundsWithBorder(int i
, int j
) const;
60 int TilePositionX(int x_index
) const;
61 int TilePositionY(int y_index
) const;
62 int TileSizeX(int x_index
) const;
63 int TileSizeY(int y_index
) const;
65 // Difference between TileBound's and TileBoundWithBorder's origin().
66 gfx::Vector2d
TextureOffset(int x_index
, int y_index
) const;
68 class CC_EXPORT BaseIterator
{
70 operator bool() const { return index_x_
!= -1 && index_y_
!= -1; }
72 int index_x() const { return index_x_
; }
73 int index_y() const { return index_y_
; }
74 std::pair
<int, int> index() const {
75 return std::make_pair(index_x_
, index_y_
);
79 explicit BaseIterator(const TilingData
* tiling_data
);
85 const TilingData
* tiling_data_
;
90 // Iterate through tiles whose bounds + optional border intersect with |rect|.
91 class CC_EXPORT Iterator
: public BaseIterator
{
94 Iterator(const TilingData
* tiling_data
,
95 const gfx::Rect
& consider_rect
,
96 bool include_borders
);
97 Iterator
& operator++();
105 // Iterate through all indices whose bounds (not including borders) intersect
106 // with |consider| but which also do not intersect with |ignore|.
107 class CC_EXPORT DifferenceIterator
: public BaseIterator
{
109 DifferenceIterator(const TilingData
* tiling_data
,
110 const gfx::Rect
& consider_rect
,
111 const gfx::Rect
& ignore_rect
);
112 DifferenceIterator
& operator++();
115 bool in_ignore_rect() const {
116 return index_x_
>= ignore_left_
&& index_x_
<= ignore_right_
&&
117 index_y_
>= ignore_top_
&& index_y_
<= ignore_bottom_
;
123 int consider_bottom_
;
130 // Iterate through all indices whose bounds + border intersect with
131 // |consider| but which also do not intersect with |ignore|. The iterator
132 // order is a counterclockwise spiral around the given center.
133 class CC_EXPORT SpiralDifferenceIterator
: public BaseIterator
{
135 SpiralDifferenceIterator();
136 SpiralDifferenceIterator(const TilingData
* tiling_data
,
137 const gfx::Rect
& consider_rect
,
138 const gfx::Rect
& ignore_rect
,
139 const gfx::Rect
& center_rect
);
140 SpiralDifferenceIterator
& operator++();
143 bool in_consider_rect() const {
144 return index_x_
>= consider_left_
&& index_x_
<= consider_right_
&&
145 index_y_
>= consider_top_
&& index_y_
<= consider_bottom_
;
147 bool in_ignore_rect() const {
148 return index_x_
>= ignore_left_
&& index_x_
<= ignore_right_
&&
149 index_y_
>= ignore_top_
&& index_y_
<= ignore_bottom_
;
151 bool valid_column() const {
152 return index_x_
>= consider_left_
&& index_x_
<= consider_right_
;
154 bool valid_row() const {
155 return index_y_
>= consider_top_
&& index_y_
<= consider_bottom_
;
158 int current_step_count() const {
159 return (direction_
== UP
|| direction_
== DOWN
) ? vertical_step_count_
160 : horizontal_step_count_
;
163 bool needs_direction_switch() const;
164 void switch_direction();
169 int consider_bottom_
;
175 enum Direction
{ UP
, LEFT
, DOWN
, RIGHT
};
177 Direction direction_
;
181 int horizontal_step_count_
;
182 int vertical_step_count_
;
185 class CC_EXPORT ReverseSpiralDifferenceIterator
: public BaseIterator
{
187 ReverseSpiralDifferenceIterator();
188 ReverseSpiralDifferenceIterator(const TilingData
* tiling_data
,
189 const gfx::Rect
& consider_rect
,
190 const gfx::Rect
& ignore_rect
,
191 const gfx::Rect
& center_rect
);
192 ReverseSpiralDifferenceIterator
& operator++();
195 bool in_consider_rect() const {
196 return index_x_
>= consider_left_
&& index_x_
<= consider_right_
&&
197 index_y_
>= consider_top_
&& index_y_
<= consider_bottom_
;
199 bool in_around_rect() const {
200 return index_x_
>= around_left_
&& index_x_
<= around_right_
&&
201 index_y_
>= around_top_
&& index_y_
<= around_bottom_
;
203 bool in_ignore_rect() const {
204 return index_x_
>= ignore_left_
&& index_x_
<= ignore_right_
&&
205 index_y_
>= ignore_top_
&& index_y_
<= ignore_bottom_
;
207 bool valid_column() const {
208 return index_x_
>= consider_left_
&& index_x_
<= consider_right_
;
210 bool valid_row() const {
211 return index_y_
>= consider_top_
&& index_y_
<= consider_bottom_
;
214 int current_step_count() const {
215 return (direction_
== UP
|| direction_
== DOWN
) ? vertical_step_count_
216 : horizontal_step_count_
;
219 bool needs_direction_switch() const;
220 void switch_direction();
225 int consider_bottom_
;
235 enum Direction
{ LEFT
, UP
, RIGHT
, DOWN
};
237 Direction direction_
;
241 int horizontal_step_count_
;
242 int vertical_step_count_
;
246 void AssertTile(int i
, int j
) const {
248 DCHECK_LT(i
, num_tiles_x_
);
250 DCHECK_LT(j
, num_tiles_y_
);
253 void RecomputeNumTiles();
255 gfx::Size max_texture_size_
;
256 gfx::Size tiling_size_
;
259 // These are computed values.
266 #endif // CC_BASE_TILING_DATA_H_