Extract GrDrawTarget::DrState into independent GrDrawState struct.
This is intended to be a first step towards making the stack of states
maintained by GrDrawTarget cheaper to maintain.



git-svn-id: http://skia.googlecode.com/svn/trunk@2544 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/GrTesselatedPathRenderer.cpp b/src/gpu/GrTesselatedPathRenderer.cpp
index 5c5a50e..51cea10 100644
--- a/src/gpu/GrTesselatedPathRenderer.cpp
+++ b/src/gpu/GrTesselatedPathRenderer.cpp
@@ -9,6 +9,7 @@
 
 #include "GrTesselatedPathRenderer.h"
 
+#include "GrDrawState.h"
 #include "GrPathUtils.h"
 #include "GrPoint.h"
 #include "GrTDArray.h"
@@ -18,7 +19,7 @@
 #include <limits.h>
 #include <sk_glu.h>
 
-typedef GrTDArray<GrDrawTarget::Edge> GrEdgeArray;
+typedef GrTDArray<GrDrawState::Edge> GrEdgeArray;
 typedef GrTDArray<GrPoint> GrPointArray;
 typedef GrTDArray<uint16_t> GrIndexArray;
 typedef void (*TESSCB)();
@@ -28,13 +29,13 @@
 // vertex components,
 const float kMaxVertexValue = 1e18f;
 
-static inline GrDrawTarget::Edge computeEdge(const GrPoint& p,
+static inline GrDrawState::Edge computeEdge(const GrPoint& p,
                                              const GrPoint& q,
                                              float sign) {
     GrVec tangent = GrVec::Make(p.fY - q.fY, q.fX - p.fX);
     float scale = sign / tangent.length();
     float cross2 = p.fX * q.fY - q.fX * p.fY;
-    return GrDrawTarget::Edge(tangent.fX * scale,
+    return GrDrawState::Edge(tangent.fX * scale,
                               tangent.fY * scale,
                               cross2 * scale);
 }
@@ -165,7 +166,7 @@
     ~GrEdgePolygonTess() {
         delete[] fEdges;
     }
-    const GrDrawTarget::Edge* edges() const { return fEdges; }
+    const GrDrawState::Edge* edges() const { return fEdges; }
 private:
     void addEdge(int index0, int index1) {
         GrPoint p = fVertices[index0];
@@ -175,15 +176,15 @@
         p = sanitizePoint(p);
         q = sanitizePoint(q);
         if (p == q) return;
-        GrDrawTarget::Edge edge = computeEdge(p, q, 1.0f);
+        GrDrawState::Edge edge = computeEdge(p, q, 1.0f);
         fEdges[index0 * 2 + 1] = edge;
         fEdges[index1 * 2] = edge;
     }
     virtual void begin(GLenum type) {
         GR_DEBUGASSERT(type == GL_TRIANGLES);
         int count = fVertices.count() * 2;
-        fEdges = new GrDrawTarget::Edge[count];
-        memset(fEdges, 0, count * sizeof(GrDrawTarget::Edge));
+        fEdges = new GrDrawState::Edge[count];
+        memset(fEdges, 0, count * sizeof(GrDrawState::Edge));
     }
     virtual void edgeFlag(bool flag) {
         fEdgeFlag = flag;
@@ -215,7 +216,7 @@
     GrMatrix fMatrix;
     bool fEdgeFlag;
     int fEdgeVertex, fTriStartVertex;
-    GrDrawTarget::Edge* fEdges;
+    GrDrawState::Edge* fEdges;
 };
 
 class GrBoundaryTess : public GrTess {
@@ -260,7 +261,7 @@
     return nearlyEqual(a.fX, b.fX) && nearlyEqual(a.fY, b.fY);
 }
 
-static bool parallel(const GrDrawTarget::Edge& a, const GrDrawTarget::Edge& b) {
+static bool parallel(const GrDrawState::Edge& a, const GrDrawState::Edge& b) {
     return (nearlyEqual(a.fX, b.fX) && nearlyEqual(a.fY, b.fY)) ||
            (nearlyEqual(a.fX, -b.fX) && nearlyEqual(a.fY, -b.fY));
 }
@@ -297,7 +298,7 @@
     return v1.cross(v2) < 0;
 }
 
-static bool validEdge(const GrDrawTarget::Edge& edge) {
+static bool validEdge(const GrDrawState::Edge& edge) {
     return !(edge.fX == 0.0f && edge.fY == 0.0f && edge.fZ == 0.0f);
 }
 
@@ -320,7 +321,7 @@
         if (p == q) {
             continue;
         }
-        GrDrawTarget::Edge edge = computeEdge(p, q, sign);
+        GrDrawState::Edge edge = computeEdge(p, q, sign);
         edge.fZ += 0.5f;    // Offset by half a pixel along the tangent.
         *edges->append() = edge;
         p = q;
@@ -329,9 +330,9 @@
     if (count == 0) {
         return 0;
     }
-    GrDrawTarget::Edge prev_edge = edges->at(0);
+    GrDrawState::Edge prev_edge = edges->at(0);
     for (int i = 0; i < count; ++i) {
-        GrDrawTarget::Edge edge = edges->at(i < count - 1 ? i + 1 : 0);
+        GrDrawState::Edge edge = edges->at(i < count - 1 ? i + 1 : 0);
         if (parallel(edge, prev_edge)) {
             // 3 points are collinear; offset by half the tangent instead
             vertices[i].fX -= edge.fX * 0.5f;
@@ -348,7 +349,7 @@
 void GrTesselatedPathRenderer::drawPath(GrDrawTarget::StageBitfield stages) {
     GrDrawTarget::AutoStateRestore asr(fTarget);
     // face culling doesn't make sense here
-    GrAssert(GrDrawTarget::kBoth_DrawFace == fTarget->getDrawFace());
+    GrAssert(GrDrawState::kBoth_DrawFace == fTarget->getDrawFace());
 
     GrMatrix viewM = fTarget->getViewMatrix();
 
@@ -360,7 +361,7 @@
     int maxPts = GrPathUtils::worstCasePointCount(*fPath, &subpathCnt, tol);
 
     GrVertexLayout layout = 0;
-    for (int s = 0; s < GrDrawTarget::kNumStages; ++s) {
+    for (int s = 0; s < GrDrawState::kNumStages; ++s) {
         if ((1 << s) & stages) {
             layout |= GrDrawTarget::StagePosAsTexCoordVertexLayoutBit(s);
         }
@@ -536,7 +537,7 @@
         fTarget->enableState(GrDrawTarget::kEdgeAAConcave_StateBit);
         const GrPointArray& vertices = ptess.vertices();
         const GrIndexArray& indices = ptess.indices();
-        const GrDrawTarget::Edge* edges = ptess.edges();
+        const GrDrawState::Edge* edges = ptess.edges();
         GR_DEBUGASSERT(indices.count() % 3 == 0);
         for (int i = 0; i < indices.count(); i += 3) {
             GrPoint tri_verts[3];
@@ -546,14 +547,14 @@
             tri_verts[0] = vertices[index0];
             tri_verts[1] = vertices[index1];
             tri_verts[2] = vertices[index2];
-            GrDrawTarget::Edge tri_edges[6];
+            GrDrawState::Edge tri_edges[6];
             int t = 0;
-            const GrDrawTarget::Edge& edge0 = edges[index0 * 2];
-            const GrDrawTarget::Edge& edge1 = edges[index0 * 2 + 1];
-            const GrDrawTarget::Edge& edge2 = edges[index1 * 2];
-            const GrDrawTarget::Edge& edge3 = edges[index1 * 2 + 1];
-            const GrDrawTarget::Edge& edge4 = edges[index2 * 2];
-            const GrDrawTarget::Edge& edge5 = edges[index2 * 2 + 1];
+            const GrDrawState::Edge& edge0 = edges[index0 * 2];
+            const GrDrawState::Edge& edge1 = edges[index0 * 2 + 1];
+            const GrDrawState::Edge& edge2 = edges[index1 * 2];
+            const GrDrawState::Edge& edge3 = edges[index1 * 2 + 1];
+            const GrDrawState::Edge& edge4 = edges[index2 * 2];
+            const GrDrawState::Edge& edge5 = edges[index2 * 2 + 1];
             if (validEdge(edge0) && validEdge(edge1)) {
                 tri_edges[t++] = edge0;
                 tri_edges[t++] = edge1;