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