Roll src/third_party/WebKit d9c6159:8139f33 (svn 201974:201975)
[chromium-blink-merge.git] / cc / base / simple_enclosed_region.h
blob5e8a6b210419a289fa1c9780a1497207edf6b4f4
1 // Copyright 2014 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.
5 #ifndef CC_BASE_SIMPLE_ENCLOSED_REGION_H_
6 #define CC_BASE_SIMPLE_ENCLOSED_REGION_H_
8 #include <string>
10 #include "cc/base/cc_export.h"
11 #include "ui/gfx/geometry/rect.h"
13 namespace cc {
15 class Region;
17 // A constant-sized approximation of a Region. The SimpleEnclosedRegion may
18 // exclude points in its approximation (may have false negatives) but will never
19 // include a point that would not be in the actual Region (no false positives).
20 class CC_EXPORT SimpleEnclosedRegion {
21 public:
22 SimpleEnclosedRegion() : rect_() {}
23 SimpleEnclosedRegion(const SimpleEnclosedRegion& region)
24 : rect_(region.rect_) {}
25 explicit SimpleEnclosedRegion(const gfx::Rect& rect) : rect_(rect) {}
26 SimpleEnclosedRegion(int x, int y, int w, int h) : rect_(x, y, w, h) {}
27 SimpleEnclosedRegion(int w, int h) : rect_(w, h) {}
28 explicit SimpleEnclosedRegion(const Region& region);
29 ~SimpleEnclosedRegion();
31 const SimpleEnclosedRegion& operator=(const gfx::Rect& rect) {
32 rect_ = rect;
33 return *this;
35 const SimpleEnclosedRegion& operator=(const SimpleEnclosedRegion& region) {
36 rect_ = region.rect_;
37 return *this;
40 bool IsEmpty() const { return rect_.IsEmpty(); }
41 void Clear() { rect_ = gfx::Rect(); }
42 size_t GetRegionComplexity() const { return rect_.IsEmpty() ? 0 : 1; }
44 bool Contains(const gfx::Point& point) const { return rect_.Contains(point); }
45 bool Contains(const gfx::Rect& rect) const { return rect_.Contains(rect); }
46 bool Contains(const SimpleEnclosedRegion& region) const {
47 return rect_.Contains(region.rect_);
50 bool Intersects(const gfx::Rect& rect) const {
51 return rect_.Intersects(rect);
53 bool Intersects(const SimpleEnclosedRegion& region) const {
54 return rect_.Intersects(region.rect_);
57 void Subtract(const gfx::Rect& sub_rect);
58 void Subtract(const SimpleEnclosedRegion& sub_region) {
59 Subtract(sub_region.rect_);
61 void Union(const gfx::Rect& new_rect);
62 void Union(const SimpleEnclosedRegion& new_region) {
63 Union(new_region.rect_);
65 void Intersect(const gfx::Rect& in_rect) { return rect_.Intersect(in_rect); }
66 void Intersect(const SimpleEnclosedRegion& in_region) {
67 Intersect(in_region.rect_);
70 bool Equals(const SimpleEnclosedRegion& other) const {
71 bool both_empty = rect_.IsEmpty() && other.rect_.IsEmpty();
72 return both_empty || rect_ == other.rect_;
75 gfx::Rect bounds() const { return rect_; }
77 // The value of |i| must be less than GetRegionComplexity().
78 gfx::Rect GetRect(size_t i) const;
80 std::string ToString() const { return rect_.ToString(); }
82 private:
83 gfx::Rect rect_;
86 inline bool operator==(const SimpleEnclosedRegion& a,
87 const SimpleEnclosedRegion& b) {
88 return a.Equals(b);
91 inline bool operator!=(const SimpleEnclosedRegion& a,
92 const SimpleEnclosedRegion& b) {
93 return !(a == b);
96 inline SimpleEnclosedRegion SubtractSimpleEnclosedRegions(
97 const SimpleEnclosedRegion& a,
98 const SimpleEnclosedRegion& b) {
99 SimpleEnclosedRegion result = a;
100 result.Subtract(b);
101 return result;
104 inline SimpleEnclosedRegion IntersectSimpleEnclosedRegions(
105 const SimpleEnclosedRegion& a,
106 const SimpleEnclosedRegion& b) {
107 SimpleEnclosedRegion result = a;
108 result.Intersect(b);
109 return result;
112 inline SimpleEnclosedRegion UnionSimpleEnclosedRegions(
113 const SimpleEnclosedRegion& a,
114 const SimpleEnclosedRegion& b) {
115 SimpleEnclosedRegion result = a;
116 result.Union(b);
117 return result;
120 } // namespace cc
122 #endif // CC_BASE_SIMPLE_ENCLOSED_REGION_H_