| 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)) {
|
|
|