void flatten(SkWriteBuffer&) const override;
sk_sp<SkSpecialImage> onFilterImage(SkSpecialImage* source, const Context&,
SkIPoint* offset) const override;
+ sk_sp<SkImageFilter> onMakeColorSpace(SkColorSpaceXformer*) const override;
private:
explicit SkPictureImageFilter(sk_sp<SkPicture> picture);
SkPictureImageFilter(sk_sp<SkPicture> picture, const SkRect& cropRect,
- PictureResolution, SkFilterQuality);
+ PictureResolution, SkFilterQuality, sk_sp<SkColorSpace>);
void drawPictureAtDeviceResolution(SkCanvas* canvas,
const SkIRect& deviceBounds,
PictureResolution fPictureResolution;
SkFilterQuality fFilterQuality;
+ // Should never be set by a public constructor. This is only used when onMakeColorSpace()
+ // forces a deferred color space xform.
+ sk_sp<SkColorSpace> fColorSpace;
+
typedef SkImageFilter INHERITED;
};
#include "SkPictureImageFilter.h"
#include "SkCanvas.h"
+#include "SkColorSpaceXformCanvas.h"
+#include "SkColorSpaceXformer.h"
#include "SkReadBuffer.h"
#include "SkSpecialImage.h"
#include "SkSpecialSurface.h"
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,
return sk_sp<SkImageFilter>(new SkPictureImageFilter(std::move(picture),
cropRect,
kLocalSpace_PictureResolution,
- filterQuality));
+ filterQuality,
+ nullptr));
}
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) {
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 ||
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 {