1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
|
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CC_BASE_REGION_H_
#define CC_BASE_REGION_H_
#include <iosfwd>
#include <memory>
#include <string>
#include "cc/base/base_export.h"
#include "third_party/skia/include/core/SkRegion.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/skia_conversions.h"
class SkPath;
namespace base {
namespace trace_event {
class TracedValue;
}
} // namespace base
namespace gfx {
class Vector2d;
}
namespace cc {
class SimpleEnclosedRegion;
class CC_BASE_EXPORT Region {
public:
Region();
explicit Region(const SkRegion& region);
Region(const Region& region);
Region(const gfx::Rect& rect); // NOLINT(runtime/explicit)
~Region();
const Region& operator=(const gfx::Rect& rect);
const Region& operator=(const Region& region);
const Region& operator+=(const gfx::Vector2d& offset);
// Returns a reference to a global empty Region. This should only be used for
// functions that need to return a reference to a Region, not instead of the
// default constructor.
static const Region& Empty();
void Swap(Region* region);
void Clear();
bool IsEmpty() const;
int GetRegionComplexity() const;
void GetBoundaryPath(SkPath* path) const;
bool Contains(const gfx::Point& point) const;
bool Contains(const gfx::Rect& rect) const;
bool Contains(const Region& region) const;
bool Intersects(const gfx::Rect& rect) const;
bool Intersects(const Region& region) const;
void Subtract(const gfx::Rect& rect);
void Subtract(const Region& region);
void Subtract(const SimpleEnclosedRegion& region);
void Union(const gfx::Rect& rect);
void Union(const Region& region);
void Intersect(const gfx::Rect& rect);
void Intersect(const Region& region);
bool Equals(const Region& other) const {
return skregion_ == other.skregion_;
}
gfx::Rect bounds() const {
return gfx::SkIRectToRect(skregion_.getBounds());
}
std::string ToString() const;
void AsValueInto(base::trace_event::TracedValue* array) const;
// Iterator for iterating through the gfx::Rects contained in this Region.
// We only support forward iteration as the underlying SkRegion::Iterator
// only supports forward iteration.
class CC_BASE_EXPORT Iterator {
public:
Iterator() = default;
~Iterator() = default;
gfx::Rect operator*() const { return gfx::SkIRectToRect(it_.rect()); }
Iterator& operator++() {
it_.next();
return *this;
}
bool operator==(const Iterator& b) const {
// This should only be used to compare to end().
DCHECK(b.it_.done());
return it_.done();
}
bool operator!=(const Iterator& b) const { return !(*this == b); }
private:
explicit Iterator(const Region& region);
friend class Region;
SkRegion::Iterator it_;
};
Iterator begin() const;
Iterator end() const { return Iterator(); }
private:
SkRegion skregion_;
};
inline bool operator==(const Region& a, const Region& b) {
return a.Equals(b);
}
inline bool operator!=(const Region& a, const Region& b) {
return !(a == b);
}
inline Region operator+(const Region& a, const gfx::Vector2d& b) {
Region result = a;
result += b;
return result;
}
inline Region SubtractRegions(const Region& a, const Region& b) {
Region result = a;
result.Subtract(b);
return result;
}
inline Region SubtractRegions(const Region& a, const gfx::Rect& b) {
Region result = a;
result.Subtract(b);
return result;
}
inline Region IntersectRegions(const Region& a, const Region& b) {
Region result = a;
result.Intersect(b);
return result;
}
inline Region IntersectRegions(const Region& a, const gfx::Rect& b) {
Region result = a;
result.Intersect(b);
return result;
}
inline Region UnionRegions(const Region& a, const Region& b) {
Region result = a;
result.Union(b);
return result;
}
inline Region UnionRegions(const Region& a, const gfx::Rect& b) {
Region result = a;
result.Union(b);
return result;
}
// This is declared here for use in gtest-based unit tests but is defined in
// the //cc:test_support target. Depend on that to use this in your unit test.
// This should not be used in production code - call ToString() instead.
void PrintTo(const Region& region, std::ostream* os);
} // namespace cc
#endif // CC_BASE_REGION_H_
|