diff options
author | Matt Sarett <msarett@google.com> | 2017-04-05 11:41:27 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-04-05 16:17:15 +0000 |
commit | cb87423cffb22467033a9e4f932399fb970faab6 (patch) | |
tree | c923cbbd1f368f83e506d377aee8622d77f66c10 /src | |
parent | 944feea3d345616d62750faba6875a35c8d6712b (diff) |
Add SkImage::makeColorSpace() to public API
Gives Chrome the flexibility to xform and cache
SkImages before they reach the
SkColorSpaceXformCanvas.
Bug: skia:
Change-Id: I1f188f385b953b5a958c15578ea66deffb4dc6c5
Reviewed-on: https://skia-review.googlesource.com/11290
Commit-Queue: Matt Sarett <msarett@google.com>
Reviewed-by: Mike Klein <mtklein@chromium.org>
Reviewed-by: Mike Reed <reed@google.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkColorSpaceXformer.cpp | 4 | ||||
-rw-r--r-- | src/image/SkImage.cpp | 15 | ||||
-rw-r--r-- | src/image/SkImage_Base.h | 9 |
3 files changed, 14 insertions, 14 deletions
diff --git a/src/core/SkColorSpaceXformer.cpp b/src/core/SkColorSpaceXformer.cpp index 4d93fae327..8a83dbc3ce 100644 --- a/src/core/SkColorSpaceXformer.cpp +++ b/src/core/SkColorSpaceXformer.cpp @@ -28,7 +28,7 @@ std::unique_ptr<SkColorSpaceXformer> SkColorSpaceXformer::Make(sk_sp<SkColorSpac } sk_sp<SkImage> SkColorSpaceXformer::apply(const SkImage* src) { - return as_IB(src)->makeColorSpace(fDst); + return src->makeColorSpace(fDst, SkTransferFunctionBehavior::kIgnore); } sk_sp<SkImage> SkColorSpaceXformer::apply(const SkBitmap& src) { @@ -37,7 +37,7 @@ sk_sp<SkImage> SkColorSpaceXformer::apply(const SkBitmap& src) { return nullptr; } - sk_sp<SkImage> xformed = as_IB(image)->makeColorSpace(fDst); + sk_sp<SkImage> xformed = image->makeColorSpace(fDst, SkTransferFunctionBehavior::kIgnore); // We want to be sure we don't let the kNever_SkCopyPixelsMode image escape this stack frame. SkASSERT(xformed != image); return xformed; diff --git a/src/image/SkImage.cpp b/src/image/SkImage.cpp index e45bbd7cf3..0847eb1c57 100644 --- a/src/image/SkImage.cpp +++ b/src/image/SkImage.cpp @@ -302,7 +302,13 @@ bool SkImage::isAlphaOnly() const { return as_IB(this)->onImageInfo().colorType() == kAlpha_8_SkColorType; } -sk_sp<SkImage> SkImage_Base::makeColorSpace(sk_sp<SkColorSpace> target) const { +sk_sp<SkImage> SkImage::makeColorSpace(sk_sp<SkColorSpace> target, + SkTransferFunctionBehavior premulBehavior) const { + if (SkTransferFunctionBehavior::kRespect == premulBehavior) { + // TODO (msarett, brianosman): Implement this. + return nullptr; + } + SkColorSpaceTransferFn fn; if (!target || !target->isNumericalTransferFn(&fn)) { return nullptr; @@ -313,11 +319,12 @@ sk_sp<SkImage> SkImage_Base::makeColorSpace(sk_sp<SkColorSpace> target) const { // (2) The color type is kAlpha8. if ((!this->colorSpace() && target->isSRGB()) || SkColorSpace::Equals(this->colorSpace(), target.get()) || - kAlpha_8_SkColorType == this->onImageInfo().colorType()) { - return sk_ref_sp(const_cast<SkImage_Base*>(this)); + kAlpha_8_SkColorType == as_IB(this)->onImageInfo().colorType()) { + return sk_ref_sp(const_cast<SkImage*>(this)); } - return this->onMakeColorSpace(std::move(target)); + // TODO: We might consider making this a deferred conversion? + return as_IB(this)->onMakeColorSpace(std::move(target)); } ////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/image/SkImage_Base.h b/src/image/SkImage_Base.h index 5bdf9403e5..062d785679 100644 --- a/src/image/SkImage_Base.h +++ b/src/image/SkImage_Base.h @@ -86,17 +86,10 @@ public: fAddedToCache.store(true); } - // Transforms image into the input color space. - sk_sp<SkImage> makeColorSpace(sk_sp<SkColorSpace> target) const; - virtual bool onPinAsTexture(GrContext*) const { return false; } virtual void onUnpinAsTexture(GrContext*) const {} -protected: - virtual sk_sp<SkImage> onMakeColorSpace(sk_sp<SkColorSpace>) const { - // TODO: Make this pure virtual. - return sk_ref_sp(const_cast<SkImage_Base*>(this)); - } + virtual sk_sp<SkImage> onMakeColorSpace(sk_sp<SkColorSpace>) const = 0; private: // Set true by caches when they cache content that's derived from the current pixels. |