add gpu backend (not hooked up yet)



git-svn-id: http://skia.googlecode.com/svn/trunk@649 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gpu/include/GrClip.h b/gpu/include/GrClip.h
new file mode 100644
index 0000000..8e3030c
--- /dev/null
+++ b/gpu/include/GrClip.h
@@ -0,0 +1,115 @@
+/*
+    Copyright 2010 Google Inc.
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ */
+
+
+#ifndef GrClip_DEFINED
+#define GrClip_DEFINED
+
+#include "GrClipIterator.h"
+#include "GrRect.h"
+#include "GrTDArray.h"
+
+class GrClip {
+public:
+    GrClip();
+    GrClip(const GrClip& src);
+    GrClip(GrClipIterator* iter);
+    ~GrClip();
+
+    GrClip& operator=(const GrClip& src);
+
+    bool isEmpty() const { return fBounds.isEmpty(); }
+    bool isComplex() const { return fList.count() > 0; }
+    bool isRect() const {
+        return !this->isEmpty() && !this->isComplex();
+    }
+    
+    const GrIRect& getBounds() const { return fBounds; }
+
+    /**
+     *  Resets this clip to be empty (fBounds is empty, and fList is empty)
+     */
+    void setEmpty();
+
+    /**
+     *  Resets this clip to have fBounds == rect, and fList is empty.
+     */
+    void setRect(const GrIRect& rect);
+
+    /**
+     *  Append a rect to an existing clip. The call must ensure that rect does
+     *  not overlap with any previous rect in this clip (either from setRect
+     *  or addRect). fBounds is automatically updated to reflect the union of
+     *  all rects that have been added.
+     */
+    void addRect(const GrIRect&);
+
+    void setFromIterator(GrClipIterator* iter);
+
+    friend bool operator==(const GrClip& a, const GrClip& b) {
+        return a.fBounds == b.fBounds && a.fList == b.fList;
+    }
+    friend bool operator!=(const GrClip& a, const GrClip& b) {
+        return !(a == b);
+    }
+
+    /**
+     *  Return the number of rects in this clip: 0 for empty, 1 for a rect,
+     *  or N for a complex clip.
+     */
+    int countRects() const {
+        return this->isEmpty() ? 0 : GrMax<int>(1, fList.count());
+    }
+
+    /**
+     *  Return an array of rects for this clip. Use countRects() to know the
+     *  number of entries.
+     */
+    const GrIRect* getRects() const {
+        return fList.count() > 0 ? fList.begin() : &fBounds;
+    }
+
+#if GR_DEBUG
+    void validate() const;
+#else
+    void validate() const {}
+#endif
+
+private:
+    GrTDArray<GrIRect>  fList;
+    GrIRect             fBounds;
+};
+
+class GrClipIter : public GrClipIterator {
+public:
+    GrClipIter(const GrClip& clip) : fClip(&clip), fIndex(0) {}
+    GrClipIter() : fClip(NULL), fIndex(0) {}
+    
+    void reset(const GrClip& clip);
+    
+    virtual bool isDone();
+    virtual void rewind();
+    virtual void getRect(GrIRect* r);
+    virtual void next();
+    virtual void computeBounds(GrIRect* r);
+    
+private:
+    const GrClip*   fClip;
+    int             fIndex;
+};
+
+#endif
+