diff options
author | Brian Osman <brianosman@google.com> | 2016-12-16 11:55:18 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2016-12-16 18:09:02 +0000 |
commit | 138ea97c1acaed4b968540220724dd5bf671e8db (patch) | |
tree | bd98e545885ec57bf16cc457e10766655b2fec22 /src | |
parent | 8ced688a3a3489ac696e5ee2d10557b389fd4ebf (diff) |
Add color space to picture image as a creation parameter
This gives a picture image a preferred "native" color space, which
facilitates caching and other things.
BUG=skia:
Change-Id: I95988c14d17f96d7d870b3d1c3b723c36e2c170d
Reviewed-on: https://skia-review.googlesource.com/6158
Reviewed-by: Mike Reed <reed@google.com>
Reviewed-by: Florin Malita <fmalita@chromium.org>
Commit-Queue: Brian Osman <brianosman@google.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkPictureImageGenerator.cpp | 30 | ||||
-rw-r--r-- | src/core/SkPictureShader.cpp | 9 | ||||
-rw-r--r-- | src/core/SkPictureShader.h | 1 | ||||
-rw-r--r-- | src/image/SkImage.cpp | 12 |
4 files changed, 38 insertions, 14 deletions
diff --git a/src/core/SkPictureImageGenerator.cpp b/src/core/SkPictureImageGenerator.cpp index d4cf92eb94..8e42d275ed 100644 --- a/src/core/SkPictureImageGenerator.cpp +++ b/src/core/SkPictureImageGenerator.cpp @@ -17,7 +17,7 @@ class SkPictureImageGenerator : SkImageGenerator { public: static SkImageGenerator* Create(const SkISize&, const SkPicture*, const SkMatrix*, - const SkPaint*); + const SkPaint*, sk_sp<SkColorSpace>); protected: bool onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, SkPMColor ctable[], @@ -30,7 +30,8 @@ protected: #endif private: - SkPictureImageGenerator(const SkISize&, const SkPicture*, const SkMatrix*, const SkPaint*); + SkPictureImageGenerator(const SkImageInfo& info, const SkPicture*, const SkMatrix*, + const SkPaint*); sk_sp<const SkPicture> fPicture; SkMatrix fMatrix; @@ -40,17 +41,29 @@ private: }; SkImageGenerator* SkPictureImageGenerator::Create(const SkISize& size, const SkPicture* picture, - const SkMatrix* matrix, const SkPaint* paint) { + const SkMatrix* matrix, const SkPaint* paint, + sk_sp<SkColorSpace> colorSpace) { if (!picture || size.isEmpty()) { return nullptr; } - return new SkPictureImageGenerator(size, picture, matrix, paint); + SkColorType colorType; + if (!colorSpace || colorSpace->gammaCloseToSRGB()) { + colorType = kN32_SkColorType; + } else if (colorSpace->gammaIsLinear()) { + colorType = kRGBA_F16_SkColorType; + } else { + return nullptr; + } + + SkImageInfo info = SkImageInfo::Make(size.width(), size.height(), colorType, + kPremul_SkAlphaType, std::move(colorSpace)); + return new SkPictureImageGenerator(info, picture, matrix, paint); } -SkPictureImageGenerator::SkPictureImageGenerator(const SkISize& size, const SkPicture* picture, +SkPictureImageGenerator::SkPictureImageGenerator(const SkImageInfo& info, const SkPicture* picture, const SkMatrix* matrix, const SkPaint* paint) - : INHERITED(SkImageInfo::MakeS32(size.width(), size.height(), kPremul_SkAlphaType)) + : INHERITED(info) , fPicture(SkRef(picture)) { if (matrix) { @@ -123,8 +136,9 @@ bool SkPictureImageGenerator::onGenerateScaledPixels(const SkISize& scaledSize, /////////////////////////////////////////////////////////////////////////////////////////////////// SkImageGenerator* SkImageGenerator::NewFromPicture(const SkISize& size, const SkPicture* picture, - const SkMatrix* matrix, const SkPaint* paint) { - return SkPictureImageGenerator::Create(size, picture, matrix, paint); + const SkMatrix* matrix, const SkPaint* paint, + sk_sp<SkColorSpace> colorSpace) { + return SkPictureImageGenerator::Create(size, picture, matrix, paint, std::move(colorSpace)); } /////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/core/SkPictureShader.cpp b/src/core/SkPictureShader.cpp index 23f2e31166..e34ca99e0c 100644 --- a/src/core/SkPictureShader.cpp +++ b/src/core/SkPictureShader.cpp @@ -157,6 +157,7 @@ void SkPictureShader::flatten(SkWriteBuffer& buffer) const { } sk_sp<SkShader> SkPictureShader::refBitmapShader(const SkMatrix& viewMatrix, const SkMatrix* localM, + SkColorSpace* dstColorSpace, const int maxTextureSize) const { SkASSERT(fPicture && !fPicture->cullRect().isEmpty()); @@ -225,7 +226,8 @@ sk_sp<SkShader> SkPictureShader::refBitmapShader(const SkMatrix& viewMatrix, con SkMatrix::kFill_ScaleToFit); sk_sp<SkImage> tileImage( - SkImage::MakeFromPicture(fPicture, tileSize, &tileMatrix, nullptr)); + SkImage::MakeFromPicture(fPicture, tileSize, &tileMatrix, nullptr, + sk_ref_sp(dstColorSpace))); if (!tileImage) { return nullptr; } @@ -245,7 +247,8 @@ size_t SkPictureShader::onContextSize(const ContextRec&) const { } SkShader::Context* SkPictureShader::onCreateContext(const ContextRec& rec, void* storage) const { - sk_sp<SkShader> bitmapShader(this->refBitmapShader(*rec.fMatrix, rec.fLocalMatrix)); + sk_sp<SkShader> bitmapShader(this->refBitmapShader(*rec.fMatrix, rec.fLocalMatrix, + rec.fDstColorSpace)); if (!bitmapShader) { return nullptr; } @@ -323,7 +326,7 @@ sk_sp<GrFragmentProcessor> SkPictureShader::asFragmentProcessor(const AsFPArgs& maxTextureSize = args.fContext->caps()->maxTextureSize(); } sk_sp<SkShader> bitmapShader(this->refBitmapShader(*args.fViewMatrix, args.fLocalMatrix, - maxTextureSize)); + args.fDstColorSpace, maxTextureSize)); if (!bitmapShader) { return nullptr; } diff --git a/src/core/SkPictureShader.h b/src/core/SkPictureShader.h index f2927a0321..6de7e4a249 100644 --- a/src/core/SkPictureShader.h +++ b/src/core/SkPictureShader.h @@ -41,6 +41,7 @@ private: SkPictureShader(sk_sp<SkPicture>, TileMode, TileMode, const SkMatrix*, const SkRect*); sk_sp<SkShader> refBitmapShader(const SkMatrix&, const SkMatrix* localMatrix, + SkColorSpace* dstColorSpace, const int maxTextureSize = 0) const; sk_sp<SkPicture> fPicture; diff --git a/src/image/SkImage.cpp b/src/image/SkImage.cpp index 9aff8203c8..7a7154619b 100644 --- a/src/image/SkImage.cpp +++ b/src/image/SkImage.cpp @@ -314,12 +314,18 @@ bool SkImage_Base::onAsLegacyBitmap(SkBitmap* bitmap, LegacyBitmapMode mode) con } sk_sp<SkImage> SkImage::MakeFromPicture(sk_sp<SkPicture> picture, const SkISize& dimensions, - const SkMatrix* matrix, const SkPaint* paint) { + const SkMatrix* matrix, const SkPaint* paint, + sk_sp<SkColorSpace> colorSpace) { if (!picture) { return nullptr; } - return MakeFromGenerator(SkImageGenerator::NewFromPicture(dimensions, picture.get(), - matrix, paint)); + return MakeFromGenerator(SkImageGenerator::NewFromPicture(dimensions, picture.get(), matrix, + paint, std::move(colorSpace))); +} + +sk_sp<SkImage> SkImage::MakeFromPicture(sk_sp<SkPicture> picture, const SkISize& dimensions, + const SkMatrix* matrix, const SkPaint* paint) { + return MakeFromPicture(std::move(picture), dimensions, matrix, paint, nullptr); } sk_sp<SkImage> SkImage::makeWithFilter(const SkImageFilter* filter, const SkIRect& subset, |