Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(624)

Unified Diff: cc/region.cc

Issue 11369103: Compare SkRegion and android::Region performance. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/region.h ('k') | cc/region_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/region.cc
diff --git a/cc/region.cc b/cc/region.cc
index 7a5e83cd60fbce38d8f627c82f90fc06ce9e2cae..1b0ca7c9f1a5f1d422af4467122f3cf1c809e819 100644
--- a/cc/region.cc
+++ b/cc/region.cc
@@ -18,72 +18,162 @@ Region::Region() {
}
Region::Region(const Region& region)
+#ifdef USE_ANDROID_REGION
+ : droidregion_(region.droidregion_) {
+#else
: skregion_(region.skregion_) {
+#endif
}
Region::Region(gfx::Rect rect)
+#ifdef USE_ANDROID_REGION
+ : droidregion_(ToSkIRect(rect)) {
+#else
: skregion_(ToSkIRect(rect)) {
+#endif
}
Region::~Region() {
}
const Region& Region::operator=(gfx::Rect rect) {
+#ifdef USE_ANDROID_REGION
+ droidregion_.set(ToSkIRect(rect));
+#else
skregion_ = SkRegion(ToSkIRect(rect));
+#endif
return *this;
}
const Region& Region::operator=(const Region& region) {
+#ifdef USE_ANDROID_REGION
+ droidregion_ = region.droidregion_;
+#else
skregion_ = region.skregion_;
+#endif
return *this;
}
bool Region::IsEmpty() const {
+#ifdef USE_ANDROID_REGION
+ return droidregion_.isEmpty();
+#else
return skregion_.isEmpty();
+#endif
}
bool Region::Contains(gfx::Point point) const {
+#ifdef USE_ANDROID_REGION
+ return !droidregion_.intersect(ToSkIRect(gfx::Rect(point, gfx::Size(1, 1)))).isEmpty();
+#else
return skregion_.contains(point.x(), point.y());
+#endif
}
bool Region::Contains(gfx::Rect rect) const {
+#ifdef USE_ANDROID_REGION
+ if (rect.IsEmpty())
+ return false;
+ android::Region result = droidregion_.intersect(ToSkIRect(rect));
+ return result.isRect() && result.bounds() == ToSkIRect(rect);
+#else
return skregion_.contains(ToSkIRect(rect));
+#endif
}
bool Region::Contains(const Region& region) const {
+#ifdef USE_ANDROID_REGION
+ if (region.IsEmpty())
+ return false;
+ android::Region result = region.droidregion_.subtract(droidregion_);
+ return result.isEmpty();
+#else
return skregion_.contains(region.skregion_);
+#endif
}
bool Region::Intersects(gfx::Rect rect) const {
+#ifdef USE_ANDROID_REGION
+ return !droidregion_.intersect(ToSkIRect(rect)).isEmpty();
+#else
return skregion_.intersects(ToSkIRect(rect));
+#endif
}
bool Region::Intersects(const Region& region) const {
+#ifdef USE_ANDROID_REGION
+ return !droidregion_.intersect(region.droidregion_).isEmpty();
+#else
return skregion_.intersects(region.skregion_);
+#endif
}
void Region::Subtract(gfx::Rect rect) {
+#ifdef USE_ANDROID_REGION
+ droidregion_.subtractSelf(ToSkIRect(rect));
+#else
skregion_.op(ToSkIRect(rect), SkRegion::kDifference_Op);
+#endif
}
void Region::Subtract(const Region& region) {
+#ifdef USE_ANDROID_REGION
+ droidregion_.subtractSelf(region.droidregion_);
+#else
skregion_.op(region.skregion_, SkRegion::kDifference_Op);
+#endif
}
void Region::Union(gfx::Rect rect) {
+#ifdef USE_ANDROID_REGION
+ droidregion_.orSelf(ToSkIRect(rect));
+#else
skregion_.op(ToSkIRect(rect), SkRegion::kUnion_Op);
+#endif
}
void Region::Union(const Region& region) {
+#ifdef USE_ANDROID_REGION
+ droidregion_.orSelf(region.droidregion_);
+#else
skregion_.op(region.skregion_, SkRegion::kUnion_Op);
+#endif
}
void Region::Intersect(gfx::Rect rect) {
+#ifdef USE_ANDROID_REGION
+ droidregion_.andSelf(ToSkIRect(rect));
+#else
skregion_.op(ToSkIRect(rect), SkRegion::kIntersect_Op);
+#endif
}
void Region::Intersect(const Region& region) {
+#ifdef USE_ANDROID_REGION
+ droidregion_.andSelf(region.droidregion_);
+#else
skregion_.op(region.skregion_, SkRegion::kIntersect_Op);
+#endif
+}
+
+bool Region::Equals(const Region& other) const {
+#ifdef USE_ANDROID_REGION
+ if (droidregion_.bounds() != other.droidregion_.bounds())
+ return false;
+ android::Region::const_iterator it_me = droidregion_.begin();
+ android::Region::const_iterator it_them = other.droidregion_.begin();
+ for (; it_me != droidregion_.end() && it_them != droidregion_.end(); ++it_me, ++it_them) {
+ if (*it_me != *it_them)
+ return false;
+ }
+ if (it_me != droidregion_.end())
+ return false;
+ if (it_them != other.droidregion_.end())
+ return false;
+ return true;
+#else
+ return skregion_ == other.skregion_;
+#endif
}
std::string Region::ToString() const {
@@ -91,16 +181,29 @@ std::string Region::ToString() const {
return gfx::Rect().ToString();
std::string result;
+#ifdef USE_ANDROID_REGION
+ for (android::Region::const_iterator it = droidregion_.begin(); it != droidregion_.end(); ++it) {
+#else
for (Iterator it(*this); it.has_rect(); it.next()) {
+#endif
if (!result.empty())
result += " | ";
+#ifdef USE_ANDROID_REGION
+ result += gfx::Rect(it->x(), it->y(), it->width(), it->height()).ToString();
+#else
result += it.rect().ToString();
+#endif
}
return result;
}
Region::Iterator::Iterator(const Region& region)
+#ifdef USE_ANDROID_REGION
+ : droidregion_(region.droidregion_),
+ it_(droidregion_.begin()) {
+#else
: it_(region.skregion_) {
+#endif
}
Region::Iterator::~Iterator() {
« no previous file with comments | « cc/region.h ('k') | cc/region_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698