From 612364de87cb2012239c4f6435e8e11760617fdc Mon Sep 17 00:00:00 2001 From: dandov Date: Mon, 14 Jul 2014 14:26:04 -0700 Subject: [PATCH] Fixed the bug in drawVertices when no colors or texture coordinates are provided by modifying the grprimitive to klines and adjusting the indices. BUG=skia:2745 R=jvanverth@google.com, bsalomon@google.com, egdaniel@google.com Author: dandov@google.com Review URL: https://codereview.chromium.org/387113002 --- src/gpu/SkGpuDevice.cpp | 60 ++++++++++++++++++++++++++++------------- 1 file changed, 41 insertions(+), 19 deletions(-) diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp index 3f1908be20..58e532cd77 100644 --- a/src/gpu/SkGpuDevice.cpp +++ b/src/gpu/SkGpuDevice.cpp @@ -1612,37 +1612,59 @@ void SkGpuDevice::drawVertices(const SkDraw& draw, SkCanvas::VertexMode vmode, CHECK_SHOULD_DRAW(draw, false); GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawVertices", fContext); + + const uint16_t* outIndices; + SkAutoTDeleteArray outAlloc(NULL); + GrPrimitiveType primType; + GrPaint grPaint; + // If both textures and vertex-colors are NULL, strokes hairlines with the paint's color. if ((NULL == texs || NULL == paint.getShader()) && NULL == colors) { + texs = NULL; + SkPaint copy(paint); copy.setStyle(SkPaint::kStroke_Style); copy.setStrokeWidth(0); + + // we ignore the shader if texs is null. + SkPaint2GrPaintNoShader(this->context(), copy, SkColor2GrColor(copy.getColor()), + NULL == colors, &grPaint); + primType = kLines_GrPrimitiveType; + int triangleCount = 0; + switch (vmode) { + case SkCanvas::kTriangles_VertexMode: + triangleCount = indexCount / 3; + break; + case SkCanvas::kTriangleStrip_VertexMode: + case SkCanvas::kTriangleFan_VertexMode: + triangleCount = indexCount - 2; + break; + } + VertState state(vertexCount, indices, indexCount); VertState::Proc vertProc = state.chooseProc(vmode); - - SkPoint* pts = new SkPoint[vertexCount * 6]; + + //number of indices for lines per triangle with kLines + indexCount = triangleCount * 6; + + outAlloc.reset(SkNEW_ARRAY(uint16_t, indexCount)); + outIndices = outAlloc.get(); + uint16_t* auxIndices = outAlloc.get(); int i = 0; while (vertProc(&state)) { - pts[i] = vertices[state.f0]; - pts[i + 1] = vertices[state.f1]; - pts[i + 2] = vertices[state.f1]; - pts[i + 3] = vertices[state.f2]; - pts[i + 4] = vertices[state.f2]; - pts[i + 5] = vertices[state.f0]; + auxIndices[i] = state.f0; + auxIndices[i + 1] = state.f1; + auxIndices[i + 2] = state.f1; + auxIndices[i + 3] = state.f2; + auxIndices[i + 4] = state.f2; + auxIndices[i + 5] = state.f0; i += 6; } - draw.drawPoints(SkCanvas::kLines_PointMode, i, pts, copy, true); - return; - } - - GrPaint grPaint; - // we ignore the shader if texs is null. - if (NULL == texs) { - SkPaint2GrPaintNoShader(this->context(), paint, SkColor2GrColor(paint.getColor()), - NULL == colors, &grPaint); } else { + outIndices = indices; + primType = gVertexMode2PrimitiveType[vmode]; SkPaint2GrPaintShader(this->context(), paint, NULL == colors, &grPaint); } @@ -1670,12 +1692,12 @@ void SkGpuDevice::drawVertices(const SkDraw& draw, SkCanvas::VertexMode vmode, colors = convertedColors.get(); } fContext->drawVertices(grPaint, - gVertexMode2PrimitiveType[vmode], + primType, vertexCount, vertices, texs, colors, - indices, + outIndices, indexCount); } -- 2.34.1