diff options
Diffstat (limited to 'include/core')
-rw-r--r-- | include/core/SkCanvas.h | 19 | ||||
-rw-r--r-- | include/core/SkClipStack.h | 65 |
2 files changed, 84 insertions, 0 deletions
diff --git a/include/core/SkCanvas.h b/include/core/SkCanvas.h index a95a5993e9..c19fd2f463 100644 --- a/include/core/SkCanvas.h +++ b/include/core/SkCanvas.h @@ -20,6 +20,7 @@ #include "SkTypes.h" #include "SkBitmap.h" #include "SkDeque.h" +#include "SkClipStack.h" #include "SkPaint.h" #include "SkRefCnt.h" #include "SkPath.h" @@ -776,6 +777,7 @@ protected: private: class MCRec; + SkClipStack fClipStack; SkDeque fMCStack; // points to top of stack MCRec* fMCRec; @@ -835,6 +837,23 @@ private: SkMatrix fExternalMatrix, fExternalInverse; bool fUseExternalMatrix; + + class AutoValidateClip : ::SkNoncopyable { + public: + explicit AutoValidateClip(SkCanvas* canvas) : fCanvas(canvas) { + fCanvas->validateClip(); + } + ~AutoValidateClip() { fCanvas->validateClip(); } + + private: + const SkCanvas* fCanvas; + }; + +#ifdef SK_DEBUG + void validateClip() const; +#else + void validateClip() const {} +#endif }; /** Stack helper class to automatically call restoreToCount() on the canvas diff --git a/include/core/SkClipStack.h b/include/core/SkClipStack.h new file mode 100644 index 0000000000..bd64d66df8 --- /dev/null +++ b/include/core/SkClipStack.h @@ -0,0 +1,65 @@ +#ifndef SkClipStack_DEFINED +#define SkClipStack_DEFINED + +#include "SkDeque.h" +#include "SkRegion.h" + +class SkRect; +class SkPath; + +class SkClipStack { +public: + SkClipStack(); + ~SkClipStack() {} + + void reset(); + + int getSaveCount() const { return fSaveCount; } + void save(); + void restore(); + + void clipDevRect(const SkIRect& ir, + SkRegion::Op op = SkRegion::kIntersect_Op) { + SkRect r; + r.set(ir); + this->clipDevRect(r, op); + } + void clipDevRect(const SkRect&, SkRegion::Op = SkRegion::kIntersect_Op); + void clipDevPath(const SkPath&, SkRegion::Op = SkRegion::kIntersect_Op); + + class B2FIter { + public: + B2FIter(const SkClipStack& stack); + + struct Clip { + const SkRect* fRect; // if non-null, this is a rect clip + const SkPath* fPath; // if non-null, this is a path clip + SkRegion::Op fOp; + }; + + /** + * Return the clip for this element in the iterator. If next() returns + * NULL, then the iterator is done. The type of clip is determined by + * the pointers fRect and fPath: + * + * fRect==NULL fPath!=NULL path clip + * fRect!=NULL fPath==NULL rect clip + * fRect==NULL fPath==NULL empty clip + */ + const Clip* next(); + + private: + Clip fClip; + SkDeque::F2BIter fIter; + }; + +private: + friend class B2FIter; + struct Rec; + + SkDeque fDeque; + int fSaveCount; +}; + +#endif + |