--- a/third_party/skia/src/gpu/ganesh/ops/AAHairLinePathRenderer.cpp +++ b/third_party/skia/src/gpu/ganesh/ops/AAHairLinePathRenderer.cpp @@ -681,6 +681,19 @@ void set_conic_coeffs(const SkPoint p[3], } } +// On bloat_quad failure, fill the slot with degenerate offscreen vertices and +// advance anyway -- mirrors the existing add_line() else-branch. The vertex +// slot was already allocated and counted toward setIndexedPatterned in +// onPrepareDraws; leaving the cursor unmoved would submit stale buffer +// contents. +static void backfill_degenerate_bezier(BezierVertex** vert) { + for (int i = 0; i < kQuadNumVertices; ++i) { + (*vert)[i].fPos.set(SK_ScalarMax, SK_ScalarMax); + (*vert)[i].fConic.fKLM[0] = (*vert)[i].fConic.fKLM[1] = (*vert)[i].fConic.fKLM[2] = 0; + } + *vert += kQuadNumVertices; +} + void add_conics(const SkPoint p[3], const SkScalar weight, const SkMatrix* toDevice, @@ -689,6 +702,8 @@ void add_conics(const SkPoint p[3], if (bloat_quad(p, toDevice, toSrc, *vert)) { set_conic_coeffs(p, *vert, weight); *vert += kQuadNumVertices; + } else { + backfill_degenerate_bezier(vert); } } @@ -720,6 +735,8 @@ void add_quads(const SkPoint p[3], set_uv_quad(choppedQuadPts, outVerts); memcpy(*vert, outVerts, kQuadNumVertices * sizeof(BezierVertex)); *vert += kQuadNumVertices; + } else { + backfill_degenerate_bezier(vert); } --stepCount; } @@ -729,6 +746,8 @@ void add_quads(const SkPoint p[3], set_uv_quad(&choppedQuadPts[2], outVerts); memcpy(*vert, outVerts, kQuadNumVertices * sizeof(BezierVertex)); *vert += kQuadNumVertices; + } else { + backfill_degenerate_bezier(vert); } }