diff options
-rw-r--r-- | include/core/SkColorFilter.h | 8 | ||||
-rw-r--r-- | src/core/SkColorFilter.cpp | 12 | ||||
-rw-r--r-- | src/core/SkColorSpaceXformer.cpp | 17 | ||||
-rw-r--r-- | src/core/SkModeColorFilter.cpp | 17 | ||||
-rw-r--r-- | src/core/SkModeColorFilter.h | 2 |
5 files changed, 31 insertions, 25 deletions
diff --git a/include/core/SkColorFilter.h b/include/core/SkColorFilter.h index 3fb27fab7a..f843df7064 100644 --- a/include/core/SkColorFilter.h +++ b/include/core/SkColorFilter.h @@ -18,6 +18,7 @@ class GrFragmentProcessor; class SkArenaAlloc; class SkBitmap; class SkColorSpace; +class SkColorSpaceXformer; class SkRasterPipeline; /** @@ -163,6 +164,13 @@ protected: virtual bool onAppendStages(SkRasterPipeline*, SkColorSpace*, SkArenaAlloc*, bool shaderIsOpaque) const; + sk_sp<SkColorFilter> makeColorSpace(SkColorSpaceXformer* xformer) const { + return this->onMakeColorSpace(xformer); + } + virtual sk_sp<SkColorFilter> onMakeColorSpace(SkColorSpaceXformer*) const { + return sk_ref_sp(const_cast<SkColorFilter*>(this)); + } + private: /* * Returns 1 if this is a single filter (not a composition of other filters), otherwise it diff --git a/src/core/SkColorFilter.cpp b/src/core/SkColorFilter.cpp index 210ca6d346..b82808d585 100644 --- a/src/core/SkColorFilter.cpp +++ b/src/core/SkColorFilter.cpp @@ -5,16 +5,17 @@ * found in the LICENSE file. */ -#include "SkColorFilter.h" #include "SkArenaAlloc.h" +#include "SkColorFilter.h" +#include "SkColorSpaceXformer.h" +#include "SkNx.h" +#include "SkPM4f.h" #include "SkReadBuffer.h" #include "SkRefCnt.h" #include "SkString.h" #include "SkTDArray.h" #include "SkUnPreMultiply.h" #include "SkWriteBuffer.h" -#include "SkPM4f.h" -#include "SkNx.h" #if SK_SUPPORT_GPU #include "GrFragmentProcessor.h" @@ -161,6 +162,11 @@ private: return true; } + sk_sp<SkColorFilter> onMakeColorSpace(SkColorSpaceXformer* xformer) const override { + return SkColorFilter::MakeComposeFilter(xformer->apply(fOuter.get()), + xformer->apply(fInner.get())); + } + sk_sp<SkColorFilter> fOuter; sk_sp<SkColorFilter> fInner; const int fComposedFilterCount; diff --git a/src/core/SkColorSpaceXformer.cpp b/src/core/SkColorSpaceXformer.cpp index ce6fff679e..a51e2e6b41 100644 --- a/src/core/SkColorSpaceXformer.cpp +++ b/src/core/SkColorSpaceXformer.cpp @@ -44,23 +44,8 @@ sk_sp<SkImage> SkColorSpaceXformer::apply(const SkBitmap& src) { return xformed; } -// 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; - if (colorFilter->asColorMode(&color, &mode)) { - 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)); + return colorFilter->makeColorSpace(this); } sk_sp<SkImageFilter> SkColorSpaceXformer::apply(const SkImageFilter* imageFilter) { diff --git a/src/core/SkModeColorFilter.cpp b/src/core/SkModeColorFilter.cpp index d074482a6f..7978f939f5 100644 --- a/src/core/SkModeColorFilter.cpp +++ b/src/core/SkModeColorFilter.cpp @@ -5,21 +5,22 @@ * found in the LICENSE file. */ -#include "SkBlitRow.h" +#include "SkArenaAlloc.h" #include "SkBlendModePriv.h" +#include "SkBlitRow.h" #include "SkColorFilter.h" #include "SkColorPriv.h" -#include "SkArenaAlloc.h" +#include "SkColorSpaceXformer.h" #include "SkModeColorFilter.h" +#include "SkPM4f.h" #include "SkPM4fPriv.h" +#include "SkRandom.h" #include "SkRasterPipeline.h" #include "SkReadBuffer.h" -#include "SkWriteBuffer.h" -#include "SkUtils.h" -#include "SkRandom.h" #include "SkString.h" +#include "SkUtils.h" #include "SkValidationUtils.h" -#include "SkPM4f.h" +#include "SkWriteBuffer.h" ////////////////////////////////////////////////////////////////////////////////////////////////// @@ -103,6 +104,10 @@ bool SkModeColorFilter::onAppendStages(SkRasterPipeline* p, return true; } +sk_sp<SkColorFilter> SkModeColorFilter::onMakeColorSpace(SkColorSpaceXformer* xformer) const { + return SkColorFilter::MakeModeFilter(xformer->apply(fColor), fMode); +} + /////////////////////////////////////////////////////////////////////////////// #if SK_SUPPORT_GPU #include "GrBlend.h" diff --git a/src/core/SkModeColorFilter.h b/src/core/SkModeColorFilter.h index 4d0b172930..d51a623b87 100644 --- a/src/core/SkModeColorFilter.h +++ b/src/core/SkModeColorFilter.h @@ -47,6 +47,8 @@ protected: bool onAppendStages(SkRasterPipeline*, SkColorSpace*, SkArenaAlloc*, bool shaderIsOpaque) const override; + sk_sp<SkColorFilter> onMakeColorSpace(SkColorSpaceXformer*) const override; + private: SkColor fColor; SkBlendMode fMode; |