aboutsummaryrefslogtreecommitdiffhomepage
path: root/include/core
diff options
context:
space:
mode:
Diffstat (limited to 'include/core')
-rw-r--r--include/core/SkCanvas.h19
-rw-r--r--include/core/SkClipStack.h65
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
+