diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkClipStack.cpp | 32 |
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; |