11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc. 41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 871531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger#include "SkClipStack.h" 971531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger#include "SkPath.h" 1071531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger#include <new> 1171531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger 1271531ca1f484da5837be8017a0c83e5bff701587Derek Sollenbergerstruct SkClipStack::Rec { 1371531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger enum State { 1471531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger kEmpty_State, 1571531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger kRect_State, 1671531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger kPath_State 1771531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger }; 1871531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger 1971531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger SkPath fPath; 2071531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger SkRect fRect; 2171531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger int fSaveCount; 2271531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger SkRegion::Op fOp; 2371531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger State fState; 241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool fDoAA; 2571531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger 261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger Rec(int saveCount, const SkRect& rect, SkRegion::Op op, bool doAA) : fRect(rect) { 2771531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger fSaveCount = saveCount; 2871531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger fOp = op; 2971531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger fState = kRect_State; 301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fDoAA = doAA; 3171531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger } 3271531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger 331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger Rec(int saveCount, const SkPath& path, SkRegion::Op op, bool doAA) : fPath(path) { 341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fRect.setEmpty(); 3571531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger fSaveCount = saveCount; 3671531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger fOp = op; 3771531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger fState = kPath_State; 381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fDoAA = doAA; 3971531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger } 4071531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger 4135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger bool operator==(const Rec& b) const { 421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (fSaveCount != b.fSaveCount || fOp != b.fOp || fState != b.fState || 431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fDoAA != b.fDoAA) { 4435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger return false; 4535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger } 4635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger switch (fState) { 4735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger case kEmpty_State: 4835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger return true; 4935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger case kRect_State: 5035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger return fRect == b.fRect; 5135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger case kPath_State: 5235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger return fPath == b.fPath; 5335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger } 5435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger return false; // Silence the compiler. 5535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger } 5635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 5735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger bool operator!=(const Rec& b) const { 5835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger return !(*this == b); 5935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger } 6035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 6135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 6271531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger /** 6371531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger * Returns true if this Rec can be intersected in place with a new clip 6471531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger */ 6571531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger bool canBeIntersected(int saveCount, SkRegion::Op op) const { 6635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger if (kEmpty_State == fState && ( 6735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger SkRegion::kDifference_Op == op || 6835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger SkRegion::kIntersect_Op == op)) { 6971531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger return true; 7071531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger } 7171531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger return fSaveCount == saveCount && 7271531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger SkRegion::kIntersect_Op == fOp && 7371531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger SkRegion::kIntersect_Op == op; 7471531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger } 7571531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger}; 7671531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger 7771531ca1f484da5837be8017a0c83e5bff701587Derek SollenbergerSkClipStack::SkClipStack() : fDeque(sizeof(Rec)) { 7871531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger fSaveCount = 0; 7971531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger} 8071531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger 8135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek SollenbergerSkClipStack::SkClipStack(const SkClipStack& b) : fDeque(sizeof(Rec)) { 8235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger *this = b; 8335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger} 8435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 8535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek SollenbergerSkClipStack& SkClipStack::operator=(const SkClipStack& b) { 8635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger if (this == &b) { 8735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger return *this; 8835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger } 8935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger reset(); 9035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 9135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger fSaveCount = b.fSaveCount; 9235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger SkDeque::F2BIter recIter(b.fDeque); 9335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger for (const Rec* rec = (const Rec*)recIter.next(); 9435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger rec != NULL; 9535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger rec = (const Rec*)recIter.next()) { 9635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger new (fDeque.push_back()) Rec(*rec); 9735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger } 9835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 9935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger return *this; 10035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger} 10135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 10235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenbergerbool SkClipStack::operator==(const SkClipStack& b) const { 10335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger if (fSaveCount != b.fSaveCount || fDeque.count() != b.fDeque.count()) { 10435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger return false; 10535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger } 10635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger SkDeque::F2BIter myIter(fDeque); 10735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger SkDeque::F2BIter bIter(b.fDeque); 10835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger const Rec* myRec = (const Rec*)myIter.next(); 10935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger const Rec* bRec = (const Rec*)bIter.next(); 11035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 11135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger while (myRec != NULL && bRec != NULL) { 11235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger if (*myRec != *bRec) { 11335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger return false; 11435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger } 11535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger myRec = (const Rec*)myIter.next(); 11635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger bRec = (const Rec*)bIter.next(); 11735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger } 11835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger return myRec == NULL && bRec == NULL; 11935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger} 12035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 12171531ca1f484da5837be8017a0c83e5bff701587Derek Sollenbergervoid SkClipStack::reset() { 12271531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger // don't have a reset() on SkDeque, so fake it here 12371531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger fDeque.~SkDeque(); 12471531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger new (&fDeque) SkDeque(sizeof(Rec)); 12571531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger 12671531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger fSaveCount = 0; 12771531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger} 12871531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger 12971531ca1f484da5837be8017a0c83e5bff701587Derek Sollenbergervoid SkClipStack::save() { 13071531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger fSaveCount += 1; 13171531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger} 13271531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger 13371531ca1f484da5837be8017a0c83e5bff701587Derek Sollenbergervoid SkClipStack::restore() { 13471531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger fSaveCount -= 1; 13571531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger while (!fDeque.empty()) { 13671531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger Rec* rec = (Rec*)fDeque.back(); 13771531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger if (rec->fSaveCount <= fSaveCount) { 13871531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger break; 13971531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger } 14071531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger rec->~Rec(); 14171531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger fDeque.pop_back(); 14271531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger } 14371531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger} 14471531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger 1451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid SkClipStack::clipDevRect(const SkRect& rect, SkRegion::Op op, bool doAA) { 14671531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger Rec* rec = (Rec*)fDeque.back(); 14771531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger if (rec && rec->canBeIntersected(fSaveCount, op)) { 14871531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger switch (rec->fState) { 14971531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger case Rec::kEmpty_State: 15071531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger return; 15171531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger case Rec::kRect_State: 15271531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger if (!rec->fRect.intersect(rect)) { 15371531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger rec->fState = Rec::kEmpty_State; 15471531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger } 15571531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger return; 15671531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger case Rec::kPath_State: 15771531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger if (!SkRect::Intersects(rec->fPath.getBounds(), rect)) { 15871531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger rec->fState = Rec::kEmpty_State; 15971531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger return; 16071531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger } 16171531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger break; 16271531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger } 16371531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger } 1641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger new (fDeque.push_back()) Rec(fSaveCount, rect, op, doAA); 16571531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger} 16671531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger 1671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid SkClipStack::clipDevPath(const SkPath& path, SkRegion::Op op, bool doAA) { 16871531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger Rec* rec = (Rec*)fDeque.back(); 16971531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger if (rec && rec->canBeIntersected(fSaveCount, op)) { 17071531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger const SkRect& pathBounds = path.getBounds(); 17171531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger switch (rec->fState) { 17271531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger case Rec::kEmpty_State: 17371531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger return; 17471531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger case Rec::kRect_State: 17571531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger if (!SkRect::Intersects(rec->fRect, pathBounds)) { 17671531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger rec->fState = Rec::kEmpty_State; 17771531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger return; 17871531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger } 17971531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger break; 18071531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger case Rec::kPath_State: 18171531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger if (!SkRect::Intersects(rec->fPath.getBounds(), pathBounds)) { 18271531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger rec->fState = Rec::kEmpty_State; 18371531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger return; 18471531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger } 18571531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger break; 18671531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger } 18771531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger } 1881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger new (fDeque.push_back()) Rec(fSaveCount, path, op, doAA); 18971531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger} 19071531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger 19171531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger/////////////////////////////////////////////////////////////////////////////// 19271531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger 19305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerSkClipStack::B2FIter::B2FIter() { 19405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger} 19505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 19635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenbergerbool operator==(const SkClipStack::B2FIter::Clip& a, 19735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger const SkClipStack::B2FIter::Clip& b) { 1981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return a.fOp == b.fOp && a.fDoAA == b.fDoAA && 1991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger ((a.fRect == NULL && b.fRect == NULL) || 2001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger (a.fRect != NULL && b.fRect != NULL && *a.fRect == *b.fRect)) && 2011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger ((a.fPath == NULL && b.fPath == NULL) || 2021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger (a.fPath != NULL && b.fPath != NULL && *a.fPath == *b.fPath)); 20335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger} 20435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 2050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerbool operator!=(const SkClipStack::B2FIter::Clip& a, 2060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger const SkClipStack::B2FIter::Clip& b) { 2070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return !(a == b); 2080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 2090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 21005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerSkClipStack::B2FIter::B2FIter(const SkClipStack& stack) { 21105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger this->reset(stack); 21271531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger} 21371531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger 21471531ca1f484da5837be8017a0c83e5bff701587Derek Sollenbergerconst SkClipStack::B2FIter::Clip* SkClipStack::B2FIter::next() { 21571531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger const SkClipStack::Rec* rec = (const SkClipStack::Rec*)fIter.next(); 21671531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger if (NULL == rec) { 21771531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger return NULL; 21871531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger } 21971531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger 22071531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger switch (rec->fState) { 22171531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger case SkClipStack::Rec::kEmpty_State: 22271531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger fClip.fRect = NULL; 22371531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger fClip.fPath = NULL; 22471531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger break; 22571531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger case SkClipStack::Rec::kRect_State: 22671531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger fClip.fRect = &rec->fRect; 22771531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger fClip.fPath = NULL; 22871531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger break; 22971531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger case SkClipStack::Rec::kPath_State: 23071531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger fClip.fRect = NULL; 23171531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger fClip.fPath = &rec->fPath; 23271531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger break; 23371531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger } 23471531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger fClip.fOp = rec->fOp; 2351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fClip.fDoAA = rec->fDoAA; 23671531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger return &fClip; 23771531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger} 23805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 23905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergervoid SkClipStack::B2FIter::reset(const SkClipStack& stack) { 24005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger fIter.reset(stack.fDeque); 24105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger} 242