Image filters: fix filtering of transparent black in CFIF.
authorsenorblanco <senorblanco@chromium.org>
Wed, 18 May 2016 14:00:08 +0000 (07:00 -0700)
committerCommit bot <commit-bot@chromium.org>
Wed, 18 May 2016 14:00:08 +0000 (07:00 -0700)
SkColorFilterImageFilter has a codepath to filter transparent black
regions outside of the input image. However, it was treating the
exterior as opaque black, rather than trasparent black.

Note: the results of imagefiltercropexpand GM will change, as it
was tweaked a bit to show this bug.

BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1978363002
NOTREECHECKS=true
NOTRY=true
NOPRESUBMIT=true

Review-Url: https://codereview.chromium.org/1978363002

gm/imagefilterscropexpand.cpp
src/effects/SkColorFilterImageFilter.cpp

index 4ce845d..9b9f7ee 100644 (file)
@@ -50,11 +50,13 @@ protected:
 
         sk_sp<SkImageFilter> gradientCircleSource(SkImageSource::Make(std::move(gradientCircle)));
         sk_sp<SkImageFilter> noopCropped(SkOffsetImageFilter::Make(0, 0, nullptr, &cropRect));
-        SkScalar sk255 = SkIntToScalar(255);
+        // This color matrix saturates the green component but only partly increases the opacity.
+        // For the opaque checkerboard, the opacity boost doesn't matter but it does impact the
+        // area outside the checkerboard.
         SkScalar matrix[20] = { 1, 0, 0, 0, 0,
-                                0, 1, 0, 0, sk255,
+                                0, 1, 0, 0, 255,
                                 0, 0, 1, 0, 0,
-                                0, 0, 0, 0, sk255 };
+                                0, 0, 0, 1, 32 };
         sk_sp<SkColorFilter> cfAlphaTrans(SkColorFilter::MakeMatrixFilterRowMajor255(matrix));
 
         SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64));
index 8d412cc..63d5942 100644 (file)
@@ -98,7 +98,9 @@ sk_sp<SkSpecialImage> SkColorFilterImageFilter::onFilterImage(SkSpecialImage* so
     if (fColorFilter->affectsTransparentBlack()) {
         // The subsequent input->draw() call may not fill the entire canvas. For filters which
         // affect transparent black, ensure that the filter is applied everywhere.
+        paint.setColor(SK_ColorTRANSPARENT);
         canvas->drawPaint(paint);
+        paint.setColor(SK_ColorBLACK);
     } else {
         canvas->clear(0x0);
     }