Fix impl for OverdrawColorFilter to not rely on details of pmcolor,
esp. during serialization. We now store/serialize SkColor, which is
stable.

Change-Id: Ib453920a9a06647f44b33c9ae8af33936d6ead33
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/270997
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Mike Reed <reed@google.com>
diff --git a/include/effects/SkOverdrawColorFilter.h b/include/effects/SkOverdrawColorFilter.h
index 862587b..514c7c5 100644
--- a/include/effects/SkOverdrawColorFilter.h
+++ b/include/effects/SkOverdrawColorFilter.h
@@ -23,10 +23,13 @@
 public:
     static constexpr int kNumColors = 6;
 
+    // DEPRECATED
     // For historical reasons, this version of Make() assumes the array is RGBA-premul
     static sk_sp<SkColorFilter> Make(const uint32_t colors[kNumColors]);
 
-    static sk_sp<SkColorFilter> MakeWithSkColors(const SkColor colors[kNumColors]);
+    static sk_sp<SkColorFilter> MakeWithSkColors(const SkColor colors[kNumColors]) {
+        return sk_sp<SkColorFilter>(new SkOverdrawColorFilter(colors));
+    }
 
 #if SK_SUPPORT_GPU
     std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(GrRecordingContext*,
@@ -41,11 +44,13 @@
 private:
     SK_FLATTENABLE_HOOKS(SkOverdrawColorFilter)
 
-    SkOverdrawColorFilter(const SkPMColor colors[kNumColors]);
+    SkOverdrawColorFilter(const SkColor colors[kNumColors]) {
+        memcpy(fColors, colors, kNumColors * sizeof(SkColor));
+    }
 
     bool onAppendStages(const SkStageRec&, bool) const override;
 
-    SkPMColor fColors[kNumColors];
+    SkColor fColors[kNumColors];
 
     typedef SkColorFilter INHERITED;
 };
diff --git a/src/effects/SkOverdrawColorFilter.cpp b/src/effects/SkOverdrawColorFilter.cpp
index 83d3822..35664e48 100644
--- a/src/effects/SkOverdrawColorFilter.cpp
+++ b/src/effects/SkOverdrawColorFilter.cpp
@@ -5,6 +5,7 @@
  * found in the LICENSE file.
  */
 
+#include "include/core/SkUnPreMultiply.h"
 #include "include/effects/SkOverdrawColorFilter.h"
 #include "src/core/SkArenaAlloc.h"
 #include "src/core/SkEffectPriv.h"
@@ -44,41 +45,38 @@
 
 #ifdef SK_PMCOLOR_IS_BGRA
 static uint32_t swizzle_rb(uint32_t c) {
+    // c is not SkColor per-se, but these macros will correctly swap r/b channels
     return SkColorSetARGB(SkColorGetA(c), SkColorGetB(c), SkColorGetG(c), SkColorGetR(c));
 }
 #endif
 
+// Legacy factory, will go away
 sk_sp<SkColorFilter> SkOverdrawColorFilter::Make(const uint32_t rgba[kNumColors]) {
-    SkPMColor pm[kNumColors];
+    SkColor colors[kNumColors];
     for (int i = 0; i < kNumColors; ++i) {
 #ifdef SK_PMCOLOR_IS_BGRA
-        pm[i] = swizzle_rb(rgba[i]);
+        colors[i] = SkUnPreMultiply::PMColorToColor(swizzle_rb(rgba[i]));
 #else
-        pm[i] = rgba[i];
+        colors[i] = SkUnPreMultiply::PMColorToColor(rgba[i]);
 #endif
     }
-    return sk_sp<SkColorFilter>(new SkOverdrawColorFilter(pm));
+    return MakeWithSkColors(colors);
 }
 
-sk_sp<SkColorFilter> SkOverdrawColorFilter::MakeWithSkColors(const SkColor colors[kNumColors]) {
-    SkPMColor pm[kNumColors];
-    for (int i = 0; i < kNumColors; ++i) {
-        pm[i] = SkPreMultiplyColor(colors[i]);
+static void convert_to_pm4f(SkPMColor4f dst[], const SkColor src[]) {
+    for (int i = 0; i < SkOverdrawColorFilter::kNumColors; ++i) {
+        dst[i] = SkColor4f::FromColor(src[i]).premul();
     }
-    return sk_sp<SkColorFilter>(new SkOverdrawColorFilter(pm));
-}
-
-SkOverdrawColorFilter::SkOverdrawColorFilter(const SkPMColor colors[kNumColors]) {
-    memcpy(fColors, colors, kNumColors * sizeof(SkPMColor));
 }
 
 bool SkOverdrawColorFilter::onAppendStages(const SkStageRec& rec, bool shader_is_opaque) const {
     struct Ctx : public SkRasterPipeline_CallbackCtx {
-        const SkPMColor* colors;
+        SkPMColor4f colors[kNumColors];
     };
     // TODO: do we care about transforming to dstCS?
     auto ctx = rec.fAlloc->make<Ctx>();
-    ctx->colors = fColors;
+    convert_to_pm4f(ctx->colors, fColors);
+
     ctx->fn = [](SkRasterPipeline_CallbackCtx* arg, int active_pixels) {
         auto ctx = (Ctx*)arg;
         auto pixels = (SkPMColor4f*)ctx->rgba;
@@ -87,7 +85,7 @@
             if (alpha >= kNumColors) {
                 alpha = kNumColors - 1;
             }
-            pixels[i] = SkPMColor4f::FromPMColor(ctx->colors[alpha]);
+            pixels[i] = ctx->colors[alpha];
         }
     };
     rec.fPipeline->append(SkRasterPipeline::callback, ctx);
@@ -122,11 +120,10 @@
         GrRecordingContext* context, const GrColorInfo&) const {
     static auto effect = std::get<0>(SkRuntimeEffect::Make(SkString(SKSL_OVERDRAW_SRC)));
     SkASSERT(effect->inputSize() == (kNumColors * sizeof(SkPMColor4f)));
+
     auto inputs = SkData::MakeUninitialized(kNumColors * sizeof(SkPMColor4f));
-    SkPMColor4f* floatColors = reinterpret_cast<SkPMColor4f*>(inputs->writable_data());
-    for (int i = 0; i < kNumColors; ++i) {
-        floatColors[i] = SkPMColor4f::FromPMColor(fColors[i]);
-    }
+    convert_to_pm4f(reinterpret_cast<SkPMColor4f*>(inputs->writable_data()), fColors);
+
     return GrSkSLFP::Make(context, effect, "Overdraw", std::move(inputs));
 }