Index: src/core/SkDraw.cpp |
diff --git a/src/core/SkDraw.cpp b/src/core/SkDraw.cpp |
index 24c80557168c8019adfb54f62e361520960b2c15..146caac8def72ff9372ae6383bb9b7cbfc94c979 100644 |
--- a/src/core/SkDraw.cpp |
+++ b/src/core/SkDraw.cpp |
@@ -6,6 +6,7 @@ |
*/ |
#include "SkDraw.h" |
+#include "SkVertState.h" |
#include "SkBlitter.h" |
#include "SkBounder.h" |
#include "SkCanvas.h" |
@@ -2202,133 +2203,6 @@ void SkDraw::drawTextOnPath(const char text[], size_t byteLength, |
/////////////////////////////////////////////////////////////////////////////// |
-struct VertState { |
- int f0, f1, f2; |
- |
- VertState(int vCount, const uint16_t indices[], int indexCount) |
- : fIndices(indices) { |
- fCurrIndex = 0; |
- if (indices) { |
- fCount = indexCount; |
- } else { |
- fCount = vCount; |
- } |
- } |
- |
- typedef bool (*Proc)(VertState*); |
- Proc chooseProc(SkCanvas::VertexMode mode); |
- |
-private: |
- int fCount; |
- int fCurrIndex; |
- const uint16_t* fIndices; |
- |
- static bool Triangles(VertState*); |
- static bool TrianglesX(VertState*); |
- static bool TriangleStrip(VertState*); |
- static bool TriangleStripX(VertState*); |
- static bool TriangleFan(VertState*); |
- static bool TriangleFanX(VertState*); |
-}; |
- |
-bool VertState::Triangles(VertState* state) { |
- int index = state->fCurrIndex; |
- if (index + 3 > state->fCount) { |
- return false; |
- } |
- state->f0 = index + 0; |
- state->f1 = index + 1; |
- state->f2 = index + 2; |
- state->fCurrIndex = index + 3; |
- return true; |
-} |
- |
-bool VertState::TrianglesX(VertState* state) { |
- const uint16_t* indices = state->fIndices; |
- int index = state->fCurrIndex; |
- if (index + 3 > state->fCount) { |
- return false; |
- } |
- state->f0 = indices[index + 0]; |
- state->f1 = indices[index + 1]; |
- state->f2 = indices[index + 2]; |
- state->fCurrIndex = index + 3; |
- return true; |
-} |
- |
-bool VertState::TriangleStrip(VertState* state) { |
- int index = state->fCurrIndex; |
- if (index + 3 > state->fCount) { |
- return false; |
- } |
- state->f2 = index + 2; |
- if (index & 1) { |
- state->f0 = index + 1; |
- state->f1 = index + 0; |
- } else { |
- state->f0 = index + 0; |
- state->f1 = index + 1; |
- } |
- state->fCurrIndex = index + 1; |
- return true; |
-} |
- |
-bool VertState::TriangleStripX(VertState* state) { |
- const uint16_t* indices = state->fIndices; |
- int index = state->fCurrIndex; |
- if (index + 3 > state->fCount) { |
- return false; |
- } |
- state->f2 = indices[index + 2]; |
- if (index & 1) { |
- state->f0 = indices[index + 1]; |
- state->f1 = indices[index + 0]; |
- } else { |
- state->f0 = indices[index + 0]; |
- state->f1 = indices[index + 1]; |
- } |
- state->fCurrIndex = index + 1; |
- return true; |
-} |
- |
-bool VertState::TriangleFan(VertState* state) { |
- int index = state->fCurrIndex; |
- if (index + 3 > state->fCount) { |
- return false; |
- } |
- state->f0 = 0; |
- state->f1 = index + 1; |
- state->f2 = index + 2; |
- state->fCurrIndex = index + 1; |
- return true; |
-} |
- |
-bool VertState::TriangleFanX(VertState* state) { |
- const uint16_t* indices = state->fIndices; |
- int index = state->fCurrIndex; |
- if (index + 3 > state->fCount) { |
- return false; |
- } |
- state->f0 = indices[0]; |
- state->f1 = indices[index + 1]; |
- state->f2 = indices[index + 2]; |
- state->fCurrIndex = index + 1; |
- return true; |
-} |
- |
-VertState::Proc VertState::chooseProc(SkCanvas::VertexMode mode) { |
- switch (mode) { |
- case SkCanvas::kTriangles_VertexMode: |
- return fIndices ? TrianglesX : Triangles; |
- case SkCanvas::kTriangleStrip_VertexMode: |
- return fIndices ? TriangleStripX : TriangleStrip; |
- case SkCanvas::kTriangleFan_VertexMode: |
- return fIndices ? TriangleFanX : TriangleFan; |
- default: |
- return NULL; |
- } |
-} |
- |
typedef void (*HairProc)(const SkPoint&, const SkPoint&, const SkRasterClip&, |
SkBlitter*); |
@@ -2605,7 +2479,7 @@ void SkDraw::drawVertices(SkCanvas::VertexMode vmode, int count, |
SkScan::FillTriangle(tmp, *fRC, blitter.get()); |
} |
} else { |
- // no colors[] and no texture |
+ // no colors[] and no texture, stroke hairlines with paint's color. |
HairProc hairProc = ChooseHairProc(paint.isAntiAlias()); |
const SkRasterClip& clip = *fRC; |
while (vertProc(&state)) { |