SkClipStack.h revision 8887ede82465687355c7a1c51e4553e99b2fb15a
1#ifndef SkClipStack_DEFINED
2#define SkClipStack_DEFINED
3
4#include "SkDeque.h"
5#include "SkRegion.h"
6
7struct SkRect;
8class SkPath;
9
10class SK_API SkClipStack {
11public:
12    SkClipStack();
13    SkClipStack(const SkClipStack& b);
14    ~SkClipStack() {}
15
16    SkClipStack& operator=(const SkClipStack& b);
17    bool operator==(const SkClipStack& b) const;
18    bool operator!=(const SkClipStack& b) const { return !(*this == b); }
19
20    void reset();
21
22    int getSaveCount() const { return fSaveCount; }
23    void save();
24    void restore();
25
26    void clipDevRect(const SkIRect& ir,
27                     SkRegion::Op op = SkRegion::kIntersect_Op) {
28        SkRect r;
29        r.set(ir);
30        this->clipDevRect(r, op);
31    }
32    void clipDevRect(const SkRect&, SkRegion::Op = SkRegion::kIntersect_Op);
33    void clipDevPath(const SkPath&, SkRegion::Op = SkRegion::kIntersect_Op);
34
35    class B2FIter {
36    public:
37        /**
38         * Creates an uninitialized iterator. Must be reset()
39         */
40        B2FIter();
41
42        B2FIter(const SkClipStack& stack);
43
44        struct Clip {
45            friend bool operator==(const Clip& a, const Clip& b);
46            friend bool operator!=(const Clip& a, const Clip& b);
47            const SkRect*   fRect;  // if non-null, this is a rect clip
48            const SkPath*   fPath;  // if non-null, this is a path clip
49            SkRegion::Op    fOp;
50        };
51
52        /**
53         *  Return the clip for this element in the iterator. If next() returns
54         *  NULL, then the iterator is done. The type of clip is determined by
55         *  the pointers fRect and fPath:
56         *
57         *  fRect==NULL  fPath!=NULL    path clip
58         *  fRect!=NULL  fPath==NULL    rect clip
59         *  fRect==NULL  fPath==NULL    empty clip
60         */
61        const Clip* next();
62
63        /**
64         * Restarts the iterator on a clip stack.
65         */
66        void reset(const SkClipStack& stack);
67
68    private:
69        Clip             fClip;
70        SkDeque::F2BIter fIter;
71    };
72
73private:
74    friend class B2FIter;
75    struct Rec;
76
77    SkDeque fDeque;
78    int     fSaveCount;
79};
80
81#endif
82
83