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

Unified Diff: src/core/SkClipStack.cpp

Issue 16160020: Compact the clipstack for kReplace_Op'd geometry (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Fix nits Created 7 years, 6 months 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 | « include/core/SkClipStack.h ('k') | tests/ClipStackTest.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/core/SkClipStack.cpp
diff --git a/src/core/SkClipStack.cpp b/src/core/SkClipStack.cpp
index 9afef3f31182bf647c99d7499886a3b5e272ecf6..2c0961ab83c8254654078782903364666e260209 100644
--- a/src/core/SkClipStack.cpp
+++ b/src/core/SkClipStack.cpp
@@ -443,9 +443,13 @@ void SkClipStack::save() {
void SkClipStack::restore() {
fSaveCount -= 1;
+ restoreTo(fSaveCount);
+}
+
+void SkClipStack::restoreTo(int saveCount) {
while (!fDeque.empty()) {
Element* element = (Element*)fDeque.back();
- if (element->fSaveCount <= fSaveCount) {
+ if (element->fSaveCount <= saveCount) {
break;
}
this->purgeClip(element);
@@ -528,32 +532,37 @@ void SkClipStack::clipDevRect(const SkRect& rect, SkRegion::Op op, bool doAA) {
SkDeque::Iter iter(fDeque, SkDeque::Iter::kBack_IterStart);
Element* element = (Element*) iter.prev();
- if (element && element->canBeIntersectedInPlace(fSaveCount, op)) {
- switch (element->fType) {
- case Element::kEmpty_Type:
- element->checkEmpty();
- return;
- case Element::kRect_Type:
- if (element->rectRectIntersectAllowed(rect, doAA)) {
- this->purgeClip(element);
- if (!element->fRect.intersect(rect)) {
+ if (NULL != element) {
+ if (element->canBeIntersectedInPlace(fSaveCount, op)) {
+ switch (element->fType) {
+ case Element::kEmpty_Type:
+ element->checkEmpty();
+ return;
+ case Element::kRect_Type:
+ if (element->rectRectIntersectAllowed(rect, doAA)) {
+ this->purgeClip(element);
+ if (!element->fRect.intersect(rect)) {
+ element->setEmpty();
+ return;
+ }
+
+ element->fDoAA = doAA;
+ Element* prev = (Element*) iter.prev();
+ element->updateBoundAndGenID(prev);
+ return;
+ }
+ break;
+ case Element::kPath_Type:
+ if (!SkRect::Intersects(element->fPath.getBounds(), rect)) {
+ this->purgeClip(element);
element->setEmpty();
return;
}
-
- element->fDoAA = doAA;
- Element* prev = (Element*) iter.prev();
- element->updateBoundAndGenID(prev);
- return;
- }
- break;
- case Element::kPath_Type:
- if (!SkRect::Intersects(element->fPath.getBounds(), rect)) {
- this->purgeClip(element);
- element->setEmpty();
- return;
- }
- break;
+ break;
+ }
+ } else if (SkRegion::kReplace_Op == op) {
+ this->restoreTo(fSaveCount - 1);
+ element = (Element*) fDeque.back();
}
}
new (fDeque.push_back()) Element(fSaveCount, rect, op, doAA);
@@ -571,26 +580,31 @@ void SkClipStack::clipDevPath(const SkPath& path, SkRegion::Op op, bool doAA) {
}
Element* element = (Element*)fDeque.back();
- if (element && element->canBeIntersectedInPlace(fSaveCount, op)) {
- const SkRect& pathBounds = path.getBounds();
- switch (element->fType) {
- case Element::kEmpty_Type:
- element->checkEmpty();
- return;
- case Element::kRect_Type:
- if (!SkRect::Intersects(element->fRect, pathBounds)) {
- this->purgeClip(element);
- element->setEmpty();
- return;
- }
- break;
- case Element::kPath_Type:
- if (!SkRect::Intersects(element->fPath.getBounds(), pathBounds)) {
- this->purgeClip(element);
- element->setEmpty();
+ if (NULL != element) {
+ if (element->canBeIntersectedInPlace(fSaveCount, op)) {
+ const SkRect& pathBounds = path.getBounds();
+ switch (element->fType) {
+ case Element::kEmpty_Type:
+ element->checkEmpty();
return;
- }
- break;
+ case Element::kRect_Type:
+ if (!SkRect::Intersects(element->fRect, pathBounds)) {
+ this->purgeClip(element);
+ element->setEmpty();
+ return;
+ }
+ break;
+ case Element::kPath_Type:
+ if (!SkRect::Intersects(element->fPath.getBounds(), pathBounds)) {
+ this->purgeClip(element);
+ element->setEmpty();
+ return;
+ }
+ break;
+ }
+ } else if (SkRegion::kReplace_Op == op) {
+ this->restoreTo(fSaveCount - 1);
+ element = (Element*) fDeque.back();
}
}
new (fDeque.push_back()) Element(fSaveCount, path, op, doAA);
« no previous file with comments | « include/core/SkClipStack.h ('k') | tests/ClipStackTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698