aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Matt Sarett <msarett@google.com>2017-04-12 16:26:21 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-04-15 12:15:36 +0000
commite22a6a29e2e5664ee907f1abccf615a900cbcfad (patch)
treebf37c1fae8bfed7be2f5703d672d0b5205c80140 /src
parentda3e596015f78645972c2cd2f562871dbb434418 (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.h2
-rw-r--r--src/effects/SkPictureImageFilter.cpp27
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 {