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