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>
diff --git a/src/effects/SkPictureImageFilter.cpp b/src/effects/SkPictureImageFilter.cpp
index 6539104..12ec3c2 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 @@
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 @@
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, 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 @@
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 @@
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 {