Home | History | Annotate | Download | only in base
      1 // Copyright (c) 2012 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_REGION_H_
      6 #define CC_BASE_REGION_H_
      7 
      8 #include <string>
      9 
     10 #include "base/memory/scoped_ptr.h"
     11 #include "cc/base/cc_export.h"
     12 #include "third_party/skia/include/core/SkRegion.h"
     13 #include "ui/gfx/rect.h"
     14 #include "ui/gfx/skia_util.h"
     15 
     16 namespace base {
     17 class Value;
     18 namespace debug {
     19 class TracedValue;
     20 }
     21 }
     22 
     23 namespace cc {
     24 class SimpleEnclosedRegion;
     25 
     26 class CC_EXPORT Region {
     27  public:
     28   Region();
     29   Region(const Region& region);
     30   Region(const gfx::Rect& rect);  // NOLINT(runtime/explicit)
     31   ~Region();
     32 
     33   const Region& operator=(const gfx::Rect& rect);
     34   const Region& operator=(const Region& region);
     35 
     36   void Swap(Region* region);
     37   void Clear();
     38   bool IsEmpty() const;
     39   int GetRegionComplexity() const;
     40 
     41   bool Contains(const gfx::Point& point) const;
     42   bool Contains(const gfx::Rect& rect) const;
     43   bool Contains(const Region& region) const;
     44 
     45   bool Intersects(const gfx::Rect& rect) const;
     46   bool Intersects(const Region& region) const;
     47 
     48   void Subtract(const gfx::Rect& rect);
     49   void Subtract(const Region& region);
     50   void Subtract(const SimpleEnclosedRegion& region);
     51   void Union(const gfx::Rect& rect);
     52   void Union(const Region& region);
     53   void Intersect(const gfx::Rect& rect);
     54   void Intersect(const Region& region);
     55 
     56   bool Equals(const Region& other) const {
     57     return skregion_ == other.skregion_;
     58   }
     59 
     60   gfx::Rect bounds() const {
     61     return gfx::SkIRectToRect(skregion_.getBounds());
     62   }
     63 
     64   std::string ToString() const;
     65   scoped_ptr<base::Value> AsValue() const;
     66   void AsValueInto(base::debug::TracedValue* array) const;
     67 
     68   class CC_EXPORT Iterator {
     69    public:
     70     Iterator();
     71     explicit Iterator(const Region& region);
     72     ~Iterator();
     73 
     74     gfx::Rect rect() const {
     75       return gfx::SkIRectToRect(it_.rect());
     76     }
     77 
     78     void next() {
     79       it_.next();
     80     }
     81 
     82     bool has_rect() const {
     83       return !it_.done();
     84     }
     85 
     86    private:
     87     SkRegion::Iterator it_;
     88   };
     89 
     90  private:
     91   SkRegion skregion_;
     92 };
     93 
     94 inline bool operator==(const Region& a, const Region& b) {
     95   return a.Equals(b);
     96 }
     97 
     98 inline bool operator!=(const Region& a, const Region& b) {
     99   return !(a == b);
    100 }
    101 
    102 inline Region SubtractRegions(const Region& a, const Region& b) {
    103   Region result = a;
    104   result.Subtract(b);
    105   return result;
    106 }
    107 
    108 inline Region SubtractRegions(const Region& a, const gfx::Rect& b) {
    109   Region result = a;
    110   result.Subtract(b);
    111   return result;
    112 }
    113 
    114 inline Region IntersectRegions(const Region& a, const Region& b) {
    115   Region result = a;
    116   result.Intersect(b);
    117   return result;
    118 }
    119 
    120 inline Region IntersectRegions(const Region& a, const gfx::Rect& b) {
    121   Region result = a;
    122   result.Intersect(b);
    123   return result;
    124 }
    125 
    126 inline Region UnionRegions(const Region& a, const Region& b) {
    127   Region result = a;
    128   result.Union(b);
    129   return result;
    130 }
    131 
    132 inline Region UnionRegions(const Region& a, const gfx::Rect& b) {
    133   Region result = a;
    134   result.Union(b);
    135   return result;
    136 }
    137 
    138 }  // namespace cc
    139 
    140 #endif  // CC_BASE_REGION_H_
    141