class CC_EXPORT TilingData {
public:
TilingData();
- TilingData(
- const gfx::Size& max_texture_size,
- const gfx::Size& total_size,
- bool has_border_texels);
- TilingData(
- const gfx::Size& max_texture_size,
- const gfx::Size& total_size,
- int border_texels);
-
- gfx::Size total_size() const { return total_size_; }
- void SetTotalSize(const gfx::Size& total_size);
+ TilingData(const gfx::Size& max_texture_size,
+ const gfx::Size& tiling_size,
+ bool has_border_texels);
+ TilingData(const gfx::Size& max_texture_size,
+ const gfx::Size& tiling_size,
+ int border_texels);
+
+ gfx::Size tiling_size() const { return tiling_size_; }
+ void SetTilingSize(const gfx::Size& tiling_size);
gfx::Size max_texture_size() const { return max_texture_size_; }
void SetMaxTextureSize(const gfx::Size& max_texture_size);
int LastBorderTileXIndexFromSrcCoord(int src_position) const;
int LastBorderTileYIndexFromSrcCoord(int src_position) const;
+ gfx::Rect ExpandRectIgnoringBordersToTileBounds(const gfx::Rect& rect) const;
+ gfx::Rect ExpandRectToTileBounds(const gfx::Rect& rect) const;
+
gfx::Rect TileBounds(int i, int j) const;
gfx::Rect TileBoundsWithBorder(int i, int j) const;
int TilePositionX(int x_index) const;
int index_y_;
};
- // Iterate through all indices whose bounds + border intersect with |rect|.
+ // Iterate through tiles whose bounds + optional border intersect with |rect|.
class CC_EXPORT Iterator : public BaseIterator {
public:
- Iterator(const TilingData* tiling_data, const gfx::Rect& tiling_rect);
+ Iterator();
+ Iterator(const TilingData* tiling_data,
+ const gfx::Rect& consider_rect,
+ bool include_borders);
Iterator& operator++();
private:
int bottom_;
};
- // Iterate through all indices whose bounds + border intersect with
- // |consider| but which also do not intersect with |ignore|.
+ // Iterate through all indices whose bounds (not including borders) intersect
+ // with |consider| but which also do not intersect with |ignore|.
class CC_EXPORT DifferenceIterator : public BaseIterator {
public:
- DifferenceIterator(
- const TilingData* tiling_data,
- const gfx::Rect& consider_rect,
- const gfx::Rect& ignore_rect);
+ DifferenceIterator(const TilingData* tiling_data,
+ const gfx::Rect& consider_rect,
+ const gfx::Rect& ignore_rect);
DifferenceIterator& operator++();
private:
int ignore_bottom_;
};
+ // Iterate through all indices whose bounds + border intersect with
+ // |consider| but which also do not intersect with |ignore|. The iterator
+ // order is a counterclockwise spiral around the given center.
+ class CC_EXPORT SpiralDifferenceIterator : public BaseIterator {
+ public:
+ SpiralDifferenceIterator();
+ SpiralDifferenceIterator(const TilingData* tiling_data,
+ const gfx::Rect& consider_rect,
+ const gfx::Rect& ignore_rect,
+ const gfx::Rect& center_rect);
+ SpiralDifferenceIterator& operator++();
+
+ private:
+ bool in_consider_rect() const {
+ return index_x_ >= consider_left_ && index_x_ <= consider_right_ &&
+ index_y_ >= consider_top_ && index_y_ <= consider_bottom_;
+ }
+ bool in_ignore_rect() const {
+ return index_x_ >= ignore_left_ && index_x_ <= ignore_right_ &&
+ index_y_ >= ignore_top_ && index_y_ <= ignore_bottom_;
+ }
+ bool valid_column() const {
+ return index_x_ >= consider_left_ && index_x_ <= consider_right_;
+ }
+ bool valid_row() const {
+ return index_y_ >= consider_top_ && index_y_ <= consider_bottom_;
+ }
+
+ int current_step_count() const {
+ return (direction_ == UP || direction_ == DOWN) ? vertical_step_count_
+ : horizontal_step_count_;
+ }
+
+ bool needs_direction_switch() const;
+ void switch_direction();
+
+ int consider_left_;
+ int consider_top_;
+ int consider_right_;
+ int consider_bottom_;
+ int ignore_left_;
+ int ignore_top_;
+ int ignore_right_;
+ int ignore_bottom_;
+
+ enum Direction { UP, LEFT, DOWN, RIGHT };
+
+ Direction direction_;
+ int delta_x_;
+ int delta_y_;
+ int current_step_;
+ int horizontal_step_count_;
+ int vertical_step_count_;
+ };
+
private:
void AssertTile(int i, int j) const {
DCHECK_GE(i, 0);
void RecomputeNumTiles();
gfx::Size max_texture_size_;
- gfx::Size total_size_;
+ gfx::Size tiling_size_;
int border_texels_;
// These are computed values.