add clipstack to canvas. not used yet, but will be for devices (e.g. gpu) that
want to see how the clip was built



git-svn-id: http://skia.googlecode.com/svn/trunk@824 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/include/core/SkClipStack.h b/include/core/SkClipStack.h
new file mode 100644
index 0000000..bd64d66
--- /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
+