avoid rebuilding pipeline w/ only tricolors
patch_primitive: 2.0 --> 1.4
Bug: skia:
Change-Id: Ia43c31873b9438332c94958232f6367240ba9a62
Reviewed-on: https://skia-review.googlesource.com/18030
Reviewed-by: Mike Klein <mtklein@chromium.org>
Commit-Queue: Mike Reed <reed@google.com>
diff --git a/src/core/SkDraw_vertices.cpp b/src/core/SkDraw_vertices.cpp
index 7720acc..6b6ba9c 100644
--- a/src/core/SkDraw_vertices.cpp
+++ b/src/core/SkDraw_vertices.cpp
@@ -235,29 +235,46 @@
SkPaint p(paint);
p.setShader(sk_ref_sp(shader));
- while (vertProc(&state)) {
- SkSTArenaAlloc<2048> innerAlloc;
+ if (!textures) { // only tricolor shader
+ SkASSERT(matrix43);
+ auto blitter = SkCreateRasterPipelineBlitter(fDst, p, *fMatrix, &outerAlloc);
+ while (vertProc(&state)) {
+ if (!update_tricolor_matrix(ctmInv, vertices, dstColors,
+ state.f0, state.f1, state.f2,
+ matrix43)) {
+ continue;
+ }
- const SkMatrix* ctm = fMatrix;
- SkMatrix tmpCtm;
- if (textures) {
- SkMatrix localM;
- texture_to_matrix(state, vertices, textures, &localM);
- tmpCtm = SkMatrix::Concat(*fMatrix, localM);
- ctm = &tmpCtm;
+ SkPoint tmp[] = {
+ devVerts[state.f0], devVerts[state.f1], devVerts[state.f2]
+ };
+ SkScan::FillTriangle(tmp, *fRC, blitter);
}
+ } else {
+ while (vertProc(&state)) {
+ SkSTArenaAlloc<2048> innerAlloc;
- if (matrix43 && !update_tricolor_matrix(ctmInv, vertices, dstColors,
- state.f0, state.f1, state.f2,
- matrix43)) {
- continue;
+ const SkMatrix* ctm = fMatrix;
+ SkMatrix tmpCtm;
+ if (textures) {
+ SkMatrix localM;
+ texture_to_matrix(state, vertices, textures, &localM);
+ tmpCtm = SkMatrix::Concat(*fMatrix, localM);
+ ctm = &tmpCtm;
+ }
+
+ if (matrix43 && !update_tricolor_matrix(ctmInv, vertices, dstColors,
+ state.f0, state.f1, state.f2,
+ matrix43)) {
+ continue;
+ }
+
+ SkPoint tmp[] = {
+ devVerts[state.f0], devVerts[state.f1], devVerts[state.f2]
+ };
+ auto blitter = SkCreateRasterPipelineBlitter(fDst, p, *ctm, &innerAlloc);
+ SkScan::FillTriangle(tmp, *fRC, blitter);
}
-
- SkPoint tmp[] = {
- devVerts[state.f0], devVerts[state.f1], devVerts[state.f2]
- };
- auto blitter = SkCreateRasterPipelineBlitter(fDst, p, *ctm, &innerAlloc);
- SkScan::FillTriangle(tmp, *fRC, blitter);
}
} else {
// no colors[] and no texture, stroke hairlines with paint's color.