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)#ifndef CC_BASE_REGION_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CC_BASE_REGION_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/cc_export.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkRegion.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/skia_util.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)namespace base { 17a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)class Value; 185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace debug { 195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class TracedValue; 205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 21a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 22a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace cc { 2403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class SimpleEnclosedRegion; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CC_EXPORT Region { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Region(); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Region(const Region& region); 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Region(const gfx::Rect& rect); // NOLINT(runtime/explicit) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~Region(); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const Region& operator=(const gfx::Rect& rect); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Region& operator=(const Region& region); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void Swap(Region* region); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Clear(); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsEmpty() const; 39ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int GetRegionComplexity() const; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool Contains(const gfx::Point& point) const; 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool Contains(const gfx::Rect& rect) const; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Contains(const Region& region) const; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool Intersects(const gfx::Rect& rect) const; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Intersects(const Region& region) const; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void Subtract(const gfx::Rect& rect); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Subtract(const Region& region); 5003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void Subtract(const SimpleEnclosedRegion& region); 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void Union(const gfx::Rect& rect); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Union(const Region& region); 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void Intersect(const gfx::Rect& rect); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Intersect(const Region& region); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool Equals(const Region& other) const { 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return skregion_ == other.skregion_; 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bounds() const { 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::SkIRectToRect(skregion_.getBounds()); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string ToString() const; 65a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scoped_ptr<base::Value> AsValue() const; 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void AsValueInto(base::debug::TracedValue* array) const; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class CC_EXPORT Iterator { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Iterator(); 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) explicit Iterator(const Region& region); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~Iterator(); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect rect() const { 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::SkIRectToRect(it_.rect()); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void next() { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it_.next(); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_rect() const { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !it_.done(); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkRegion::Iterator it_; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkRegion skregion_; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool operator==(const Region& a, const Region& b) { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return a.Equals(b); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool operator!=(const Region& a, const Region& b) { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !(a == b); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Region SubtractRegions(const Region& a, const Region& b) { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Region result = a; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.Subtract(b); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)inline Region SubtractRegions(const Region& a, const gfx::Rect& b) { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Region result = a; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.Subtract(b); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Region IntersectRegions(const Region& a, const Region& b) { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Region result = a; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.Intersect(b); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)inline Region IntersectRegions(const Region& a, const gfx::Rect& b) { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Region result = a; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.Intersect(b); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Region UnionRegions(const Region& a, const Region& b) { 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Region result = a; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.Union(b); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)inline Region UnionRegions(const Region& a, const gfx::Rect& b) { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Region result = a; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.Union(b); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace cc 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CC_BASE_REGION_H_ 141