Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / cc / base / tiling_data.h
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.
4
5 #ifndef CC_BASE_TILING_DATA_H_
6 #define CC_BASE_TILING_DATA_H_
7
8 #include <utility>
9
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"
15
16 namespace gfx {
17 class Vector2d;
18 }
19
20 namespace cc {
21
22 class CC_EXPORT TilingData {
23  public:
24   TilingData();
25   TilingData(const gfx::Size& max_texture_size,
26              const gfx::Rect& tiling_rect,
27              bool has_border_texels);
28   TilingData(const gfx::Size& max_texture_size,
29              const gfx::Rect& tiling_rect,
30              int border_texels);
31
32   gfx::Rect tiling_rect() const { return tiling_rect_; }
33   void SetTilingRect(const gfx::Rect& tiling_rect);
34
35   gfx::Size max_texture_size() const { return max_texture_size_; }
36   void SetMaxTextureSize(const gfx::Size& max_texture_size);
37
38   int border_texels() const { return border_texels_; }
39   void SetHasBorderTexels(bool has_border_texels);
40   void SetBorderTexels(int border_texels);
41
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;
54
55   gfx::Rect ExpandRectToTileBoundsWithBorders(const gfx::Rect rect) const;
56
57   gfx::Rect TileBounds(int i, int j) const;
58   gfx::Rect TileBoundsWithBorder(int i, int j) const;
59   int TilePositionX(int x_index) const;
60   int TilePositionY(int y_index) const;
61   int TileSizeX(int x_index) const;
62   int TileSizeY(int y_index) const;
63
64   // Difference between TileBound's and TileBoundWithBorder's origin().
65   gfx::Vector2d TextureOffset(int x_index, int y_index) const;
66
67   class CC_EXPORT BaseIterator {
68    public:
69     operator bool() const { return index_x_ != -1 && index_y_ != -1; }
70
71     int index_x() const { return index_x_; }
72     int index_y() const { return index_y_; }
73     std::pair<int, int> index() const {
74      return std::make_pair(index_x_, index_y_);
75     }
76
77    protected:
78     explicit BaseIterator(const TilingData* tiling_data);
79     void done() {
80       index_x_ = -1;
81       index_y_ = -1;
82     }
83
84     const TilingData* tiling_data_;
85     int index_x_;
86     int index_y_;
87   };
88
89   // Iterate through tiles whose bounds + optional border intersect with |rect|.
90   class CC_EXPORT Iterator : public BaseIterator {
91    public:
92     Iterator();
93     Iterator(const TilingData* tiling_data,
94              const gfx::Rect& tiling_rect,
95              bool include_borders);
96     Iterator& operator++();
97
98    private:
99     int left_;
100     int right_;
101     int bottom_;
102   };
103
104   // Iterate through all indices whose bounds + border intersect with
105   // |consider| but which also do not intersect with |ignore|.
106   class CC_EXPORT DifferenceIterator : public BaseIterator {
107    public:
108     DifferenceIterator(
109       const TilingData* tiling_data,
110       const gfx::Rect& consider_rect,
111       const gfx::Rect& ignore_rect);
112     DifferenceIterator& operator++();
113
114    private:
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_;
118     }
119
120     int consider_left_;
121     int consider_top_;
122     int consider_right_;
123     int consider_bottom_;
124     int ignore_left_;
125     int ignore_top_;
126     int ignore_right_;
127     int ignore_bottom_;
128   };
129
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 {
134    public:
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++();
141
142    private:
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_;
146     }
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_;
150     }
151     bool valid_column() const {
152       return index_x_ >= consider_left_ && index_x_ <= consider_right_;
153     }
154     bool valid_row() const {
155       return index_y_ >= consider_top_ && index_y_ <= consider_bottom_;
156     }
157
158     int current_step_count() const {
159       return (direction_ == UP || direction_ == DOWN) ? vertical_step_count_
160                                                       : horizontal_step_count_;
161     }
162
163     bool needs_direction_switch() const;
164     void switch_direction();
165
166     int consider_left_;
167     int consider_top_;
168     int consider_right_;
169     int consider_bottom_;
170     int ignore_left_;
171     int ignore_top_;
172     int ignore_right_;
173     int ignore_bottom_;
174
175     enum Direction { UP, LEFT, DOWN, RIGHT };
176
177     Direction direction_;
178     int delta_x_;
179     int delta_y_;
180     int current_step_;
181     int horizontal_step_count_;
182     int vertical_step_count_;
183   };
184
185  private:
186   void AssertTile(int i, int j) const {
187     DCHECK_GE(i,  0);
188     DCHECK_LT(i, num_tiles_x_);
189     DCHECK_GE(j, 0);
190     DCHECK_LT(j, num_tiles_y_);
191   }
192
193   void RecomputeNumTiles();
194
195   gfx::Size max_texture_size_;
196   gfx::Rect tiling_rect_;
197   int border_texels_;
198
199   // These are computed values.
200   int num_tiles_x_;
201   int num_tiles_y_;
202 };
203
204 }  // namespace cc
205
206 #endif  // CC_BASE_TILING_DATA_H_