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