Use legacy color filter API when doing legacy paint conversion
authorBrian Osman <brianosman@google.com>
Mon, 17 Oct 2016 20:54:49 +0000 (16:54 -0400)
committerSkia Commit-Bot <skia-commit-bot@chromium.org>
Tue, 18 Oct 2016 12:44:04 +0000 (12:44 +0000)
Matt fixed mode color filter so that the 4f filter uses a linearized
version of the stored color. This restores previous behavior, where legacy
devices are doing everything in sRGB space.

BUG=skia:

GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=3581

Change-Id: I6abac176aaeab1242ca74b71ffb7f6df80ad9525
Reviewed-on: https://skia-review.googlesource.com/3581
Reviewed-by: Mike Klein <mtklein@chromium.org>
Commit-Queue: Mike Klein <mtklein@chromium.org>

src/gpu/SkGr.cpp

index 8f28d70..0eb9ee4 100644 (file)
@@ -665,8 +665,15 @@ static inline bool skpaint_to_grpaint_impl(GrContext* context,
     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) {