SkColorFilter* colorFilter = skPaint.getColorFilter();
if (colorFilter) {
if (applyColorFilterToPaintColor) {
- grPaint->setColor4f(GrColor4f::FromSkColor4f(
- colorFilter->filterColor4f(origColor.toSkColor4f())).premul());
+ // If we're in legacy mode, we *must* avoid using the 4f version of the color filter,
+ // because that will combine with the linearized version of the stored color.
+ if (dc->isGammaCorrect()) {
+ grPaint->setColor4f(GrColor4f::FromSkColor4f(
+ colorFilter->filterColor4f(origColor.toSkColor4f())).premul());
+ } else {
+ grPaint->setColor4f(SkColorToPremulGrColor4f(
+ colorFilter->filterColor(skPaint.getColor()), false, nullptr));
+ }
} else {
sk_sp<GrFragmentProcessor> cfFP(colorFilter->asFragmentProcessor(context));
if (cfFP) {