• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
Region()10 Region::Region() {
11 }
12 
Region(const Region & region)13 Region::Region(const Region& region)
14     : skregion_(region.skregion_) {
15 }
16 
Region(gfx::Rect rect)17 Region::Region(gfx::Rect rect)
18     : skregion_(gfx::RectToSkIRect(rect)) {
19 }
20 
~Region()21 Region::~Region() {
22 }
23 
operator =(gfx::Rect rect)24 const Region& Region::operator=(gfx::Rect rect) {
25   skregion_ = SkRegion(gfx::RectToSkIRect(rect));
26   return *this;
27 }
28 
operator =(const Region & region)29 const Region& Region::operator=(const Region& region) {
30   skregion_ = region.skregion_;
31   return *this;
32 }
33 
Swap(Region * region)34 void Region::Swap(Region* region) {
35   region->skregion_.swap(skregion_);
36 }
37 
Clear()38 void Region::Clear() {
39   skregion_.setEmpty();
40 }
41 
IsEmpty() const42 bool Region::IsEmpty() const {
43   return skregion_.isEmpty();
44 }
45 
GetRegionComplexity() const46 int Region::GetRegionComplexity() const {
47   return skregion_.computeRegionComplexity();
48 }
49 
Contains(gfx::Point point) const50 bool Region::Contains(gfx::Point point) const {
51   return skregion_.contains(point.x(), point.y());
52 }
53 
Contains(gfx::Rect rect) const54 bool Region::Contains(gfx::Rect rect) const {
55   if (rect.IsEmpty())
56     return true;
57   return skregion_.contains(gfx::RectToSkIRect(rect));
58 }
59 
Contains(const Region & region) const60 bool Region::Contains(const Region& region) const {
61   if (region.IsEmpty())
62     return true;
63   return skregion_.contains(region.skregion_);
64 }
65 
Intersects(gfx::Rect rect) const66 bool Region::Intersects(gfx::Rect rect) const {
67   return skregion_.intersects(gfx::RectToSkIRect(rect));
68 }
69 
Intersects(const Region & region) const70 bool Region::Intersects(const Region& region) const {
71   return skregion_.intersects(region.skregion_);
72 }
73 
Subtract(gfx::Rect rect)74 void Region::Subtract(gfx::Rect rect) {
75   skregion_.op(gfx::RectToSkIRect(rect), SkRegion::kDifference_Op);
76 }
77 
Subtract(const Region & region)78 void Region::Subtract(const Region& region) {
79   skregion_.op(region.skregion_, SkRegion::kDifference_Op);
80 }
81 
Union(gfx::Rect rect)82 void Region::Union(gfx::Rect rect) {
83   skregion_.op(gfx::RectToSkIRect(rect), SkRegion::kUnion_Op);
84 }
85 
Union(const Region & region)86 void Region::Union(const Region& region) {
87   skregion_.op(region.skregion_, SkRegion::kUnion_Op);
88 }
89 
Intersect(gfx::Rect rect)90 void Region::Intersect(gfx::Rect rect) {
91   skregion_.op(gfx::RectToSkIRect(rect), SkRegion::kIntersect_Op);
92 }
93 
Intersect(const Region & region)94 void Region::Intersect(const Region& region) {
95   skregion_.op(region.skregion_, SkRegion::kIntersect_Op);
96 }
97 
ToString() const98 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 
AsValue() const111 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 
Iterator()123 Region::Iterator::Iterator() {
124 }
125 
Iterator(const Region & region)126 Region::Iterator::Iterator(const Region& region)
127     : it_(region.skregion_) {
128 }
129 
~Iterator()130 Region::Iterator::~Iterator() {
131 }
132 
133 }  // namespace cc
134