[graphite] Do not unpremul color data in gradient storage buffer This was likely a copy-pasta error from the color processing in the texture proxy gradient case. That used unpremul colors because it was setting data per pixel using the SkBitmap data that would then re-premul it. The gradient color stop transformer has already prepared everything for direct use, so there's no need to change it further when writing to the gradient storage buffer. Bug: b/401546700 Change-Id: I9687de7959a964fbf255d89a7dd5b47f3b36af7c Reviewed-on: https://skia-review.googlesource.com/c/skia/+/962280 Commit-Queue: Michael Ludwig <michaelludwig@google.com> Reviewed-by: Robert Phillips <robertphillips@google.com>
diff --git a/gm/gradients.cpp b/gm/gradients.cpp index ca168fa..d1044bf 100644 --- a/gm/gradients.cpp +++ b/gm/gradients.cpp
@@ -1271,6 +1271,38 @@ canvas->drawRect(SkRect::MakeXYWH(0, 0, 500, 500), p); } +DEF_SIMPLE_GM(gradients_alpha_many_stops, canvas, 100, 100) { + static const SkPoint kPts[] = {{0.f, 0.f}, {0.f, 100.f}}; + + // From https://issues.chromium.org/issues/401546700, this encounters Graphite's + // storage buffer option for storing gradient buffers AND uses colors that emphasize + // premul vs. unpremul handling of the color data. + static const float kPos[] = {0.f, 0.19f, 0.34f, 0.47f, 0.565f, 0.65f, + 0.73f, 0.802f, 0.861f, 0.91f, 0.952f, 0.982f, 1.f}; + + static constexpr float kG = 34 / 255.f; + static const SkColor4f kColors[] = {{kG, kG, kG, 1.f}, + {kG, kG, kG, 0.738f}, + {kG, kG, kG, 0.541f}, + {kG, kG, kG, 0.382f}, + {kG, kG, kG, 0.278f}, + {kG, kG, kG, 0.194f}, + {kG, kG, kG, 0.126f}, + {kG, kG, kG, 0.075f}, + {kG, kG, kG, 0.042f}, + {kG, kG, kG, 0.021f}, + {kG, kG, kG, 0.008f}, + {kG, kG, kG, 0.002f}, + {kG, kG, kG, 0.f}}; + + canvas->clear(SkColor4f{0.5f, 0.5f, 0.5f, 1.f}); + + SkPaint paint; + paint.setShader(SkGradientShader::MakeLinear( + kPts, kColors, /*colorSpace=*/nullptr, kPos, std::size(kPos), SkTileMode::kClamp)); + canvas->drawPaint(paint); +} + static void draw_powerless_hue_gradients(SkCanvas* canvas, SkGradientShader::Interpolation::ColorSpace colorSpace) { ToolUtils::draw_checkerboard(canvas);
diff --git a/src/gpu/graphite/KeyHelpers.cpp b/src/gpu/graphite/KeyHelpers.cpp index f89e1f0..a14ad75 100644 --- a/src/gpu/graphite/KeyHelpers.cpp +++ b/src/gpu/graphite/KeyHelpers.cpp
@@ -322,16 +322,14 @@ // Writes all offset data, then color data. This way when binary searching through the // offsets, there is better cache locality. for (int i = 0, colorIdx = numStops; i < numStops; i++, colorIdx+=4) { - SkColor4f unpremulColor = colors[i].unpremul(); - float offset = offsets ? offsets[i] : SkIntToFloat(i) / (numStops - 1); SkASSERT(offset >= 0.0f && offset <= 1.0f); dstData[i] = offset; - dstData[colorIdx + 0] = unpremulColor.fR; - dstData[colorIdx + 1] = unpremulColor.fG; - dstData[colorIdx + 2] = unpremulColor.fB; - dstData[colorIdx + 3] = unpremulColor.fA; + dstData[colorIdx + 0] = colors[i].fR; + dstData[colorIdx + 1] = colors[i].fG; + dstData[colorIdx + 2] = colors[i].fB; + dstData[colorIdx + 3] = colors[i].fA; } }