Upstream version 10.38.208.0
[platform/framework/web/crosswalk.git] / src / cc / base / tiling_data.h
index 9540c38..a2e0a13 100644 (file)
@@ -22,17 +22,15 @@ namespace cc {
 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);
@@ -54,6 +52,9 @@ class CC_EXPORT TilingData {
   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;
@@ -86,10 +87,13 @@ class CC_EXPORT TilingData {
     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:
@@ -98,14 +102,13 @@ class CC_EXPORT TilingData {
     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:
@@ -124,6 +127,61 @@ class CC_EXPORT TilingData {
     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);
@@ -135,7 +193,7 @@ class CC_EXPORT TilingData {
   void RecomputeNumTiles();
 
   gfx::Size max_texture_size_;
-  gfx::Size total_size_;
+  gfx::Size tiling_size_;
   int border_texels_;
 
   // These are computed values.