aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-08-16 15:59:59 +0000
committerGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-08-16 15:59:59 +0000
commit0557d9ea94d5435a9072c9b4141a05190d648442 (patch)
tree471f6656f89603509a8cec6cf96c6442aeab64d9 /src
parente7249bd5cacf7fc5c0fd8c00ef656acea1e42ab4 (diff)
add SkClipStack::clipEmpty() as an optimized way to say clipDevRect(empty, intersect)
if the caller knows up-front that it wants the clipstact to become empty. Review URL: https://codereview.appspot.com/6443132 git-svn-id: http://skia.googlecode.com/svn/trunk@5127 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src')
-rw-r--r--src/core/SkClipStack.cpp32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/core/SkClipStack.cpp b/src/core/SkClipStack.cpp
index ff771c1cbe..8857244f09 100644
--- a/src/core/SkClipStack.cpp
+++ b/src/core/SkClipStack.cpp
@@ -48,6 +48,12 @@ struct SkClipStack::Rec {
int fGenID;
+ Rec(int saveCount)
+ : fGenID(kInvalidGenID) {
+ fSaveCount = saveCount;
+ this->setEmpty();
+ }
+
Rec(int saveCount, const SkRect& rect, SkRegion::Op op, bool doAA)
: fRect(rect)
, fGenID(kInvalidGenID) {
@@ -352,6 +358,8 @@ struct SkClipStack::Rec {
}
} else {
+ SkASSERT(kPath_State == fState);
+
fFiniteBound = fPath.getBounds();
if (fPath.isInverseFillType()) {
@@ -638,6 +646,30 @@ void SkClipStack::clipDevPath(const SkPath& path, SkRegion::Op op, bool doAA) {
}
}
+void SkClipStack::clipEmpty() {
+
+ SkDeque::Iter iter(fDeque, SkDeque::Iter::kBack_IterStart);
+ Rec* rec = (Rec*) iter.prev();
+
+ if (rec && rec->canBeIntersectedInPlace(fSaveCount, SkRegion::kIntersect_Op)) {
+ switch (rec->fState) {
+ case Rec::kEmpty_State:
+ rec->checkEmpty();
+ return;
+ case Rec::kRect_State:
+ case Rec::kPath_State:
+ this->purgeClip(rec);
+ rec->setEmpty();
+ return;
+ }
+ }
+ new (fDeque.push_back()) Rec(fSaveCount);
+
+ if (rec && rec->fSaveCount == fSaveCount) {
+ this->purgeClip(rec);
+ }
+}
+
bool SkClipStack::isWideOpen() const {
if (0 == fDeque.count()) {
return true;