diff options
author | 2017-04-12 16:26:21 -0400 | |
---|---|---|
committer | 2017-04-15 12:15:36 +0000 | |
commit | e22a6a29e2e5664ee907f1abccf615a900cbcfad (patch) | |
tree | bf37c1fae8bfed7be2f5703d672d0b5205c80140 /src | |
parent | da3e596015f78645972c2cd2f562871dbb434418 (diff) |
SkPictureImageFilter::onMakeColorSpace()
Improves gm/recordopts.
Does not break gm/pictureimagefilter or gm/fastfilterbounds.
Bug: skia:
Change-Id: I67c8f02a9548bf751350dfa3c7029dd59b8a2d1d
Reviewed-on: https://skia-review.googlesource.com/13276
Commit-Queue: Mike Klein <mtklein@google.com>
Reviewed-by: Mike Klein <mtklein@google.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkColorSpaceXformer.h | 2 | ||||
-rw-r--r-- | src/effects/SkPictureImageFilter.cpp | 27 |
2 files changed, 25 insertions, 4 deletions
diff --git a/src/core/SkColorSpaceXformer.h b/src/core/SkColorSpaceXformer.h index 6d5aaacd61..5fc62e09f7 100644 --- a/src/core/SkColorSpaceXformer.h +++ b/src/core/SkColorSpaceXformer.h @@ -24,6 +24,8 @@ public: void apply(SkColor dst[], const SkColor src[], int n); SkColor apply(SkColor srgb); + sk_sp<SkColorSpace> dst() const { return fDst; } + private: sk_sp<SkShader> apply(const SkShader* shader); diff --git a/src/effects/SkPictureImageFilter.cpp b/src/effects/SkPictureImageFilter.cpp index 6539104a30..12ec3c2b36 100644 --- a/src/effects/SkPictureImageFilter.cpp +++ b/src/effects/SkPictureImageFilter.cpp @@ -8,6 +8,8 @@ #include "SkPictureImageFilter.h" #include "SkCanvas.h" +#include "SkColorSpaceXformCanvas.h" +#include "SkColorSpaceXformer.h" #include "SkReadBuffer.h" #include "SkSpecialImage.h" #include "SkSpecialSurface.h" @@ -23,7 +25,8 @@ sk_sp<SkImageFilter> SkPictureImageFilter::Make(sk_sp<SkPicture> picture, return sk_sp<SkImageFilter>(new SkPictureImageFilter(std::move(picture), cropRect, kDeviceSpace_PictureResolution, - kLow_SkFilterQuality)); + kLow_SkFilterQuality, + nullptr)); } sk_sp<SkImageFilter> SkPictureImageFilter::MakeForLocalSpace(sk_sp<SkPicture> picture, @@ -32,7 +35,8 @@ sk_sp<SkImageFilter> SkPictureImageFilter::MakeForLocalSpace(sk_sp<SkPicture> pi return sk_sp<SkImageFilter>(new SkPictureImageFilter(std::move(picture), cropRect, kLocalSpace_PictureResolution, - filterQuality)); + filterQuality, + nullptr)); } SkPictureImageFilter::SkPictureImageFilter(sk_sp<SkPicture> picture) @@ -45,12 +49,14 @@ SkPictureImageFilter::SkPictureImageFilter(sk_sp<SkPicture> picture) SkPictureImageFilter::SkPictureImageFilter(sk_sp<SkPicture> picture, const SkRect& cropRect, PictureResolution pictureResolution, - SkFilterQuality filterQuality) + SkFilterQuality filterQuality, + sk_sp<SkColorSpace> colorSpace) : INHERITED(nullptr, 0, nullptr) , fPicture(std::move(picture)) , fCropRect(cropRect) , fPictureResolution(pictureResolution) - , fFilterQuality(filterQuality) { + , fFilterQuality(filterQuality) + , fColorSpace(std::move(colorSpace)) { } sk_sp<SkFlattenable> SkPictureImageFilter::CreateProc(SkReadBuffer& buffer) { @@ -126,6 +132,14 @@ sk_sp<SkSpecialImage> SkPictureImageFilter::onFilterImage(SkSpecialImage* source SkCanvas* canvas = surf->getCanvas(); SkASSERT(canvas); + std::unique_ptr<SkCanvas> xformCanvas = nullptr; + if (fColorSpace) { + // Only non-null in the case where onMakeColorSpace() was called. This instructs + // us to do the color space xform on playback. + xformCanvas = SkCreateColorSpaceXformCanvas(canvas, fColorSpace); + canvas = xformCanvas.get(); + } + canvas->clear(0x0); if (kDeviceSpace_PictureResolution == fPictureResolution || @@ -140,6 +154,11 @@ sk_sp<SkSpecialImage> SkPictureImageFilter::onFilterImage(SkSpecialImage* source return surf->makeImageSnapshot(); } +sk_sp<SkImageFilter> SkPictureImageFilter::onMakeColorSpace(SkColorSpaceXformer* xformer) const { + return sk_sp<SkImageFilter>(new SkPictureImageFilter(fPicture, fCropRect, fPictureResolution, + fFilterQuality, xformer->dst())); +} + void SkPictureImageFilter::drawPictureAtDeviceResolution(SkCanvas* canvas, const SkIRect& deviceBounds, const Context& ctx) const { |