Rev the GrContext interface. Context has draw* functions that take a new GrPaint object. Removed many of the lower-level GrGpu function call-throughs on context.

Remove unused/unsupported point size (we don't draw non-hairline points using GL points).
Change current* getter functions to get* for consistency.
Fix bounds when drawing inverse-filled paths.


git-svn-id: http://skia.googlecode.com/svn/trunk@718 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gpu/include/GrContext_impl.h b/gpu/include/GrContext_impl.h
new file mode 100644
index 0000000..b54e927
--- /dev/null
+++ b/gpu/include/GrContext_impl.h
@@ -0,0 +1,135 @@
+/*

+    Copyright 2011 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 GrContext_impl_DEFINED

+#define GrContext_impl_DEFINED

+

+template <typename POS_SRC, typename TEX_SRC,

+          typename COL_SRC, typename IDX_SRC>

+inline void GrContext::drawCustomVertices(const GrPaint& paint,

+                                          GrDrawTarget::PrimitiveType primitiveType,

+                                          const POS_SRC& posSrc,

+                                          const TEX_SRC* texCoordSrc,

+                                          const COL_SRC* colorSrc,

+                                          const IDX_SRC* idxSrc) {

+

+    GrVertexLayout layout = 0;

+

+    GrDrawTarget::AutoReleaseGeometry geo;

+

+    this->prepareToDraw(paint);

+

+    if (NULL != paint.getTexture()) {

+        if (NULL != texCoordSrc) {

+            layout |= GrDrawTarget::StageTexCoordVertexLayoutBit(0,0);

+        } else {

+            layout |= GrDrawTarget::StagePosAsTexCoordVertexLayoutBit(0);

+        }

+    }

+

+    if (NULL != colorSrc) {

+        layout |= GrDrawTarget::kColor_VertexLayoutBit;

+    }

+

+    int vertexCount = posSrc.count();

+    int indexCount = (NULL != idxSrc) ? idxSrc->count() : 0;

+

+    if (!geo.set(fGpu, layout, vertexCount, indexCount)) {

+        GrPrintf("Failed to get space for vertices!");

+        return;

+    }

+

+    int texOffsets[GrDrawTarget::kMaxTexCoords];

+    int colorOffset;

+    int vsize = GrDrawTarget::VertexSizeAndOffsetsByIdx(layout,

+                                                        texOffsets,

+                                                        &colorOffset);

+    void* curVertex = geo.vertices();

+

+    for (int i = 0; i < vertexCount; ++i) {

+        posSrc.writeValue(i, (GrPoint*)curVertex);

+

+        if (texOffsets[0] > 0) {

+            texCoordSrc->writeValue(i, (GrPoint*)((intptr_t)curVertex + texOffsets[0]));

+        }

+        if (colorOffset > 0) {

+            colorSrc->writeValue(i, (GrColor*)((intptr_t)curVertex + colorOffset));

+        }

+        curVertex = (void*)((intptr_t)curVertex + vsize);

+    }

+

+    uint16_t* indices = (uint16_t*) geo.indices();

+    for (int i = 0; i < indexCount; ++i) {

+        idxSrc->writeValue(i, indices + i);

+    }

+

+    if (NULL == idxSrc) {

+        fGpu->drawNonIndexed(primitiveType, 0, vertexCount);

+    } else {

+        fGpu->drawIndexed(primitiveType, 0, 0, vertexCount, indexCount);

+    }

+}

+

+class GrNullTexCoordSource {

+public:

+    void writeValue(int i, GrPoint* dstCoord) const { GrAssert(false); }

+};

+

+class GrNullColorSource {

+public:

+    void writeValue(int i, GrColor* dstColor) const { GrAssert(false); }

+};

+

+class GrNullIndexSource {

+public:

+    void writeValue(int i, uint16_t* dstIndex) const { GrAssert(false); }

+    int count() const { GrAssert(false); return 0; }

+};

+

+template <typename POS_SRC>

+inline void GrContext::drawCustomVertices(const GrPaint& paint,

+                                          GrDrawTarget::PrimitiveType primitiveType,

+                                          const POS_SRC& posSrc) {

+    this->drawCustomVertices<POS_SRC,

+                             GrNullTexCoordSource,

+                             GrNullColorSource,

+                             GrNullIndexSource>(paint, primitiveType, posSrc,

+                                                NULL, NULL, NULL);

+}

+

+template <typename POS_SRC, typename TEX_SRC>

+inline void GrContext::drawCustomVertices(const GrPaint& paint,

+                                          GrDrawTarget::PrimitiveType primitiveType,

+                                          const POS_SRC& posSrc,

+                                          const TEX_SRC* texCoordSrc) {

+    this->drawCustomVertices<POS_SRC, TEX_SRC,

+                             GrNullColorSource,

+                             GrNullIndexSource>(paint, primitiveType, posSrc,

+                                                texCoordSrc, NULL, NULL);

+}

+

+template <typename POS_SRC, typename TEX_SRC, typename COL_SRC>

+inline void GrContext::drawCustomVertices(const GrPaint& paint,

+                                          GrDrawTarget::PrimitiveType primitiveType,

+                                          const POS_SRC& posSrc,

+                                          const TEX_SRC* texCoordSrc,

+                                          const COL_SRC* colorSrc) {

+    drawCustomVertices<POS_SRC, TEX_SRC, COL_SRC,

+                       GrNullIndexSource>(paint, primitiveType, posSrc, 

+                                          texCoordSrc, colorSrc, NULL);

+}

+

+#endif