diff options
-rw-r--r-- | include/core/SkImageFilter.h | 18 | ||||
-rw-r--r-- | include/effects/SkPaintImageFilter.h | 1 | ||||
-rw-r--r-- | src/core/SkColorSpaceXformer.cpp | 7 | ||||
-rw-r--r-- | src/effects/SkArithmeticImageFilter.cpp | 20 | ||||
-rw-r--r-- | src/effects/SkPaintImageFilter.cpp | 5 |
5 files changed, 47 insertions, 4 deletions
diff --git a/include/core/SkImageFilter.h b/include/core/SkImageFilter.h index ea2afa2f2e..74e8d80c31 100644 --- a/include/core/SkImageFilter.h +++ b/include/core/SkImageFilter.h @@ -20,6 +20,7 @@ class GrContext; class GrFragmentProcessor; class SkColorFilter; +class SkColorSpaceXformer; struct SkIPoint; class SkSpecialImage; class SkImageFilterCache; @@ -283,6 +284,10 @@ protected: void flatten(SkWriteBuffer&) const override; + const CropRect* getCropRectIfSet() const { + return this->cropRectIsSet() ? &fCropRect : nullptr; + } + /** * This is the virtual which should be overridden by the derived class * to perform image filtering. @@ -395,8 +400,21 @@ protected: static sk_sp<SkSpecialImage> ImageToColorSpace(SkSpecialImage* src, const OutputProperties&); #endif + /** + * Returns an image filter transformed into a new color space via the |xformer|. + */ + sk_sp<SkImageFilter> makeColorSpace(SkColorSpaceXformer* xformer) const { + return this->onMakeColorSpace(xformer); + } + virtual sk_sp<SkImageFilter> onMakeColorSpace(SkColorSpaceXformer*) const { + return sk_ref_sp(const_cast<SkImageFilter*>(this)); + } + private: + friend class ArithmeticImageFilterImpl; + friend class SkColorSpaceXformer; friend class SkGraphics; + static void PurgeCache(); void init(sk_sp<SkImageFilter>* inputs, int inputCount, const CropRect* cropRect); diff --git a/include/effects/SkPaintImageFilter.h b/include/effects/SkPaintImageFilter.h index 36a3097600..435b677a72 100644 --- a/include/effects/SkPaintImageFilter.h +++ b/include/effects/SkPaintImageFilter.h @@ -33,6 +33,7 @@ protected: void flatten(SkWriteBuffer&) const override; sk_sp<SkSpecialImage> onFilterImage(SkSpecialImage* source, const Context&, SkIPoint* offset) const override; + sk_sp<SkImageFilter> onMakeColorSpace(SkColorSpaceXformer* xformer) const override; private: SkPaintImageFilter(const SkPaint& paint, const CropRect* rect); diff --git a/src/core/SkColorSpaceXformer.cpp b/src/core/SkColorSpaceXformer.cpp index 8a83dbc3ce..d256ddfbf9 100644 --- a/src/core/SkColorSpaceXformer.cpp +++ b/src/core/SkColorSpaceXformer.cpp @@ -11,6 +11,7 @@ #include "SkDrawLooper.h" #include "SkGradientShader.h" #include "SkImage_Base.h" +#include "SkImageFilter.h" #include "SkImagePriv.h" #include "SkMakeUnique.h" @@ -172,8 +173,10 @@ const SkPaint& SkColorSpaceXformer::apply(const SkPaint& src) { get_dst()->setDrawLooper(looper->makeColorSpace(this)); } - // TODO: - // - image filters? + if (auto imageFilter = src.getImageFilter()) { + get_dst()->setImageFilter(imageFilter->makeColorSpace(this)); + } + return *result; } diff --git a/src/effects/SkArithmeticImageFilter.cpp b/src/effects/SkArithmeticImageFilter.cpp index faf94ef4d6..cf85cfafec 100644 --- a/src/effects/SkArithmeticImageFilter.cpp +++ b/src/effects/SkArithmeticImageFilter.cpp @@ -28,7 +28,6 @@ #include "glsl/GrGLSLUniformHandler.h" #endif -namespace { class ArithmeticImageFilterImpl : public SkImageFilter { public: ArithmeticImageFilterImpl(float k1, float k2, float k3, float k4, bool enforcePMColor, @@ -62,6 +61,8 @@ protected: void drawForeground(SkCanvas* canvas, SkSpecialImage*, const SkIRect&) const; + sk_sp<SkImageFilter> onMakeColorSpace(SkColorSpaceXformer*) const override; + private: const float fK[4]; const bool fEnforcePMColor; @@ -70,7 +71,6 @@ private: typedef SkImageFilter INHERITED; }; -} sk_sp<SkFlattenable> ArithmeticImageFilterImpl::CreateProc(SkReadBuffer& buffer) { SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 2); @@ -457,6 +457,22 @@ void ArithmeticImageFilterImpl::drawForeground(SkCanvas* canvas, SkSpecialImage* } } +sk_sp<SkImageFilter> ArithmeticImageFilterImpl::onMakeColorSpace(SkColorSpaceXformer* xformer) +const { + SkASSERT(2 == this->countInputs()); + if (!this->getInput(0) && !this->getInput(1)) { + return sk_ref_sp(const_cast<ArithmeticImageFilterImpl*>(this)); + } + + sk_sp<SkImageFilter> background = + this->getInput(0) ? this->getInput(0)->makeColorSpace(xformer) : nullptr; + sk_sp<SkImageFilter> foreground = + this->getInput(1) ? this->getInput(1)->makeColorSpace(xformer) : nullptr; + return SkArithmeticImageFilter::Make(fK[0], fK[1], fK[2], fK[3], fEnforcePMColor, + std::move(background), std::move(foreground), + getCropRectIfSet()); +} + #ifndef SK_IGNORE_TO_STRING void ArithmeticImageFilterImpl::toString(SkString* str) const { str->appendf("SkArithmeticImageFilter: ("); diff --git a/src/effects/SkPaintImageFilter.cpp b/src/effects/SkPaintImageFilter.cpp index 0a0e4e92ed..c79385855f 100644 --- a/src/effects/SkPaintImageFilter.cpp +++ b/src/effects/SkPaintImageFilter.cpp @@ -7,6 +7,7 @@ #include "SkPaintImageFilter.h" #include "SkCanvas.h" +#include "SkColorSpaceXformer.h" #include "SkReadBuffer.h" #include "SkSpecialImage.h" #include "SkSpecialSurface.h" @@ -68,6 +69,10 @@ sk_sp<SkSpecialImage> SkPaintImageFilter::onFilterImage(SkSpecialImage* source, return surf->makeImageSnapshot(); } +sk_sp<SkImageFilter> SkPaintImageFilter::onMakeColorSpace(SkColorSpaceXformer* xformer) const { + return SkPaintImageFilter::Make(xformer->apply(fPaint), this->getCropRectIfSet()); +} + bool SkPaintImageFilter::affectsTransparentBlack() const { return true; } |