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