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