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 #include "cc/base/region.h" 6 #include "base/values.h" 7 8 namespace cc { 9 10 Region::Region() { 11 } 12 13 Region::Region(const Region& region) 14 : skregion_(region.skregion_) { 15 } 16 17 Region::Region(gfx::Rect rect) 18 : skregion_(gfx::RectToSkIRect(rect)) { 19 } 20 21 Region::~Region() { 22 } 23 24 const Region& Region::operator=(gfx::Rect rect) { 25 skregion_ = SkRegion(gfx::RectToSkIRect(rect)); 26 return *this; 27 } 28 29 const Region& Region::operator=(const Region& region) { 30 skregion_ = region.skregion_; 31 return *this; 32 } 33 34 void Region::Swap(Region* region) { 35 region->skregion_.swap(skregion_); 36 } 37 38 void Region::Clear() { 39 skregion_.setEmpty(); 40 } 41 42 bool Region::IsEmpty() const { 43 return skregion_.isEmpty(); 44 } 45 46 int Region::GetRegionComplexity() const { 47 return skregion_.computeRegionComplexity(); 48 } 49 50 bool Region::Contains(gfx::Point point) const { 51 return skregion_.contains(point.x(), point.y()); 52 } 53 54 bool Region::Contains(gfx::Rect rect) const { 55 if (rect.IsEmpty()) 56 return true; 57 return skregion_.contains(gfx::RectToSkIRect(rect)); 58 } 59 60 bool Region::Contains(const Region& region) const { 61 if (region.IsEmpty()) 62 return true; 63 return skregion_.contains(region.skregion_); 64 } 65 66 bool Region::Intersects(gfx::Rect rect) const { 67 return skregion_.intersects(gfx::RectToSkIRect(rect)); 68 } 69 70 bool Region::Intersects(const Region& region) const { 71 return skregion_.intersects(region.skregion_); 72 } 73 74 void Region::Subtract(gfx::Rect rect) { 75 skregion_.op(gfx::RectToSkIRect(rect), SkRegion::kDifference_Op); 76 } 77 78 void Region::Subtract(const Region& region) { 79 skregion_.op(region.skregion_, SkRegion::kDifference_Op); 80 } 81 82 void Region::Union(gfx::Rect rect) { 83 skregion_.op(gfx::RectToSkIRect(rect), SkRegion::kUnion_Op); 84 } 85 86 void Region::Union(const Region& region) { 87 skregion_.op(region.skregion_, SkRegion::kUnion_Op); 88 } 89 90 void Region::Intersect(gfx::Rect rect) { 91 skregion_.op(gfx::RectToSkIRect(rect), SkRegion::kIntersect_Op); 92 } 93 94 void Region::Intersect(const Region& region) { 95 skregion_.op(region.skregion_, SkRegion::kIntersect_Op); 96 } 97 98 std::string Region::ToString() const { 99 if (IsEmpty()) 100 return gfx::Rect().ToString(); 101 102 std::string result; 103 for (Iterator it(*this); it.has_rect(); it.next()) { 104 if (!result.empty()) 105 result += " | "; 106 result += it.rect().ToString(); 107 } 108 return result; 109 } 110 111 scoped_ptr<base::Value> Region::AsValue() const { 112 scoped_ptr<base::ListValue> result(new base::ListValue()); 113 for (Iterator it(*this); it.has_rect(); it.next()) { 114 gfx::Rect rect(it.rect()); 115 result->AppendInteger(rect.x()); 116 result->AppendInteger(rect.y()); 117 result->AppendInteger(rect.width()); 118 result->AppendInteger(rect.height()); 119 } 120 return result.PassAs<base::Value>(); 121 } 122 123 Region::Iterator::Iterator() { 124 } 125 126 Region::Iterator::Iterator(const Region& region) 127 : it_(region.skregion_) { 128 } 129 130 Region::Iterator::~Iterator() { 131 } 132 133 } // namespace cc 134