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/GrPathIter.h b/gpu/include/GrPathIter.h
new file mode 100644
index 0000000..028faaa
--- /dev/null
+++ b/gpu/include/GrPathIter.h
@@ -0,0 +1,110 @@
+/*
+    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 GrPathIter_DEFINED
+#define GrPathIter_DEFINED
+
+#include "GrTypes.h"
+
+struct GrPoint;
+
+/**
+ 2D Path iterator. Porting layer creates a subclass of this. It allows Ganesh to
+ parse the top-level API's 2D paths. Supports lines, quadratics, and cubic
+ pieces and moves (multi-part paths).
+ */
+class GrPathIter {
+public:
+    /**
+     Returned by next(). Indicates the next piece of the path. 
+     */
+    enum Command {
+        kMove_Command,      //!< next() returns 1 pt
+                            //   Starts a new subpath at
+                            //   at the returned point
+        kLine_Command,      //!< next() returns 2 pts
+                            //   Adds a line segment
+        kQuadratic_Command, //!< next() returns 3 pts
+                            //   Adds a quadratic segment
+        kCubic_Command,     //!< next() returns 4 pts
+                            //   Adds a cubic segment
+        kClose_Command,     //!< next() returns 0 pts
+        kEnd_Command        //!< next() returns 0 pts
+                            //   Implictly closes the last 
+                            //   point
+    };
+    
+    enum ConvexHint {
+        kNone_ConvexHint,                         //<! No hint about convexity 
+                                                  //   of the path
+        kConvex_ConvexHint,                       //<! Path is one convex piece
+        kNonOverlappingConvexPieces_ConvexHint,   //<! Multiple convex pieces, 
+                                                  //   pieces are known to be
+                                                  //   disjoint
+        kSameWindingConvexPieces_ConvexHint,      //<! Multiple convex pieces, 
+                                                  //   may or may not intersect,
+                                                  //   either all wind cw or all 
+                                                  //   wind ccw.
+        kConcave_ConvexHint                       //<! Path is known to be 
+                                                  //   concave
+    };
+    
+    static int NumCommandPoints(Command cmd) {
+        static const int numPoints[] = {
+            1, 2, 3, 4, 0, 0
+        };
+        return numPoints[cmd];
+    }
+    
+    virtual ~GrPathIter() {};
+
+    /** 
+     Iterates through the path. Should not be called after
+     kEnd_Command has been returned once. This version retrieves the
+     points for the command.
+     @param points  The points relevant to returned commend. See Command
+                    enum for number of points valid for each command.
+     @return The next command of the path.
+     */
+    virtual Command next(GrPoint points[4]) = 0;
+
+    /**
+     * If the host API has knowledge of the convexity of the path
+     * it can be communicated by this hint. Ganesh can make these
+     * determinations itself. So it is not necessary to compute 
+     * convexity status if it isn't already determined.
+     *
+     * @return a hint about the convexity of the path.
+     */     
+    virtual ConvexHint hint() const { return kNone_ConvexHint; }
+
+     /** 
+     Iterates through the path. Should not be called after
+     kEnd_Command has been returned once. This version does not retrieve the
+     points for the command.
+     @return The next command of the path.
+     */
+     virtual Command next() = 0;
+
+    /**
+     Restarts iteration from the beginning.
+     */
+    virtual void rewind() = 0;
+
+};
+
+#endif