Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(157)

Unified Diff: src/core/SkDraw.cpp

Issue 189963004: Fix the rendering error of SkDraw::drawVertices in gpu path for solid color (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: drawVertices should stroke hairlines if both textures and colors are NULL Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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)) {

Powered by Google App Engine
This is Rietveld 408576698