Home | History | Annotate | Download | only in base
      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