[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;
         }
     }