15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/region.h" 603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/debug/trace_event_argument.h" 8a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "base/values.h" 903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "cc/base/simple_enclosed_region.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace cc { 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Region::Region() { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Region::Region(const Region& region) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : skregion_(region.skregion_) { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)Region::Region(const gfx::Rect& rect) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : skregion_(gfx::RectToSkIRect(rect)) { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Region::~Region() { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const Region& Region::operator=(const gfx::Rect& rect) { 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) skregion_ = SkRegion(gfx::RectToSkIRect(rect)); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Region& Region::operator=(const Region& region) { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) skregion_ = region.skregion_; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void Region::Swap(Region* region) { 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) region->skregion_.swap(skregion_); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Region::Clear() { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) skregion_.setEmpty(); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Region::IsEmpty() const { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return skregion_.isEmpty(); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochint Region::GetRegionComplexity() const { 50ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return skregion_.computeRegionComplexity(); 51ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 52ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool Region::Contains(const gfx::Point& point) const { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return skregion_.contains(point.x(), point.y()); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Region::Contains(const gfx::Rect& rect) const { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rect.IsEmpty()) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return skregion_.contains(gfx::RectToSkIRect(rect)); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Region::Contains(const Region& region) const { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (region.IsEmpty()) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return skregion_.contains(region.skregion_); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Region::Intersects(const gfx::Rect& rect) const { 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return skregion_.intersects(gfx::RectToSkIRect(rect)); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Region::Intersects(const Region& region) const { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return skregion_.intersects(region.skregion_); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Region::Subtract(const gfx::Rect& rect) { 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) skregion_.op(gfx::RectToSkIRect(rect), SkRegion::kDifference_Op); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Region::Subtract(const Region& region) { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) skregion_.op(region.skregion_, SkRegion::kDifference_Op); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void Region::Subtract(const SimpleEnclosedRegion& region) { 8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) for (size_t i = 0; i < region.GetRegionComplexity(); ++i) { 8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) skregion_.op(gfx::RectToSkIRect(region.GetRect(i)), 8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SkRegion::kDifference_Op); 8903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 9103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Region::Union(const gfx::Rect& rect) { 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) skregion_.op(gfx::RectToSkIRect(rect), SkRegion::kUnion_Op); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Region::Union(const Region& region) { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) skregion_.op(region.skregion_, SkRegion::kUnion_Op); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Region::Intersect(const gfx::Rect& rect) { 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) skregion_.op(gfx::RectToSkIRect(rect), SkRegion::kIntersect_Op); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Region::Intersect(const Region& region) { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) skregion_.op(region.skregion_, SkRegion::kIntersect_Op); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string Region::ToString() const { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsEmpty()) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Rect().ToString(); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (Iterator it(*this); it.has_rect(); it.next()) { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result.empty()) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result += " | "; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result += it.rect().ToString(); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 121a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)scoped_ptr<base::Value> Region::AsValue() const { 122a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scoped_ptr<base::ListValue> result(new base::ListValue()); 123a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) for (Iterator it(*this); it.has_rect(); it.next()) { 124a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) gfx::Rect rect(it.rect()); 125a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) result->AppendInteger(rect.x()); 126a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) result->AppendInteger(rect.y()); 127a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) result->AppendInteger(rect.width()); 128a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) result->AppendInteger(rect.height()); 129a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 130a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return result.PassAs<base::Value>(); 131a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 132a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void Region::AsValueInto(base::debug::TracedValue* result) const { 1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) for (Iterator it(*this); it.has_rect(); it.next()) { 1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) gfx::Rect rect(it.rect()); 1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) result->AppendInteger(rect.x()); 1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) result->AppendInteger(rect.y()); 1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) result->AppendInteger(rect.width()); 1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) result->AppendInteger(rect.height()); 1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Region::Iterator::Iterator() { 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Region::Iterator::Iterator(const Region& region) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : it_(region.skregion_) { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Region::Iterator::~Iterator() { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace cc 154