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_ 136