SkColorSpaceXformer: Handle compose color filters
authorMatt Sarett <msarett@google.com>
Mon, 17 Apr 2017 21:18:57 +0000 (17:18 -0400)
committerSkia Commit-Bot <skia-commit-bot@chromium.org>
Mon, 17 Apr 2017 23:48:17 +0000 (23:48 +0000)
We could alternatively use the makeColorSpace() approach that we
adoped for loopers and imagefilters, but this seems fine.

This should finish xform canvas work on color filters.  We have
plenty of color filters that do math on colors, but only two
that might actually hold colors.

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

include/core/SkColorFilter.h
src/core/SkColorFilter.cpp
src/core/SkColorSpaceXformer.cpp

index a593087..3fb27fa 100644 (file)
@@ -172,6 +172,16 @@ private:
      *  e.g. compose(filter, compose(compose(filter, filter), filter)) --> 4
      */
     virtual int privateComposedFilterCount() const { return 1; }
+
+    /*
+     *  Returns true and sets |outer| and |inner| if this is a compose color filter.
+     *  Returns false otherwise.
+     */
+    virtual bool asACompose(SkColorFilter** /*outer*/, SkColorFilter** /*inner*/) const {
+        return false;
+    }
+
+    friend class SkColorSpaceXformer;
     friend class SkComposeColorFilter;
 
     typedef SkFlattenable INHERITED;
index 8f660e9..210ca6d 100644 (file)
@@ -155,6 +155,12 @@ private:
         return fComposedFilterCount;
     }
 
+    bool asACompose(SkColorFilter** outer, SkColorFilter** inner) const override {
+        *outer = fOuter.get();
+        *inner = fInner.get();
+        return true;
+    }
+
     sk_sp<SkColorFilter> fOuter;
     sk_sp<SkColorFilter> fInner;
     const int            fComposedFilterCount;
index fe66e74..7a9f24b 100644 (file)
@@ -44,7 +44,9 @@ sk_sp<SkImage> SkColorSpaceXformer::apply(const SkBitmap& src) {
     return xformed;
 }
 
-// As far as I know, SkModeColorFilter is the only color filter that holds a color.
+// Currently, SkModeColorFilter is the only color filter that holds a color.  And
+// SkComposeColorFilter is the only color filter that holds another color filter.  If this
+// changes, this function will need updating.
 sk_sp<SkColorFilter> SkColorSpaceXformer::apply(const SkColorFilter* colorFilter) {
     SkColor color;
     SkBlendMode mode;
@@ -52,6 +54,12 @@ sk_sp<SkColorFilter> SkColorSpaceXformer::apply(const SkColorFilter* colorFilter
         return SkColorFilter::MakeModeFilter(this->apply(color), mode);
     }
 
+    SkColorFilter* outer;
+    SkColorFilter* inner;
+    if (colorFilter->asACompose(&outer, &inner)) {
+        return SkColorFilter::MakeComposeFilter(this->apply(outer), this->apply(inner));
+    }
+
     return sk_ref_sp(const_cast<SkColorFilter*>(colorFilter));
 }