From: Matt Sarett Date: Mon, 17 Apr 2017 21:18:57 +0000 (-0400) Subject: SkColorSpaceXformer: Handle compose color filters X-Git-Tag: accepted/tizen/5.0/unified/20181102.025319~36^2~745 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c1b879f11b937142f5478bd3b416b26be93dea23;p=platform%2Fupstream%2FlibSkiaSharp.git SkColorSpaceXformer: Handle compose color filters 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 Commit-Queue: Mike Klein --- diff --git a/include/core/SkColorFilter.h b/include/core/SkColorFilter.h index a593087..3fb27fa 100644 --- a/include/core/SkColorFilter.h +++ b/include/core/SkColorFilter.h @@ -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; diff --git a/src/core/SkColorFilter.cpp b/src/core/SkColorFilter.cpp index 8f660e9..210ca6d 100644 --- a/src/core/SkColorFilter.cpp +++ b/src/core/SkColorFilter.cpp @@ -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 fOuter; sk_sp fInner; const int fComposedFilterCount; diff --git a/src/core/SkColorSpaceXformer.cpp b/src/core/SkColorSpaceXformer.cpp index fe66e74..7a9f24b 100644 --- a/src/core/SkColorSpaceXformer.cpp +++ b/src/core/SkColorSpaceXformer.cpp @@ -44,7 +44,9 @@ sk_sp 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 SkColorSpaceXformer::apply(const SkColorFilter* colorFilter) { SkColor color; SkBlendMode mode; @@ -52,6 +54,12 @@ sk_sp 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(colorFilter)); }