aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Brian Osman <brianosman@google.com>2016-12-16 11:55:18 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2016-12-16 18:09:02 +0000
commit138ea97c1acaed4b968540220724dd5bf671e8db (patch)
treebd98e545885ec57bf16cc457e10766655b2fec22 /src
parent8ced688a3a3489ac696e5ee2d10557b389fd4ebf (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.cpp30
-rw-r--r--src/core/SkPictureShader.cpp9
-rw-r--r--src/core/SkPictureShader.h1
-rw-r--r--src/image/SkImage.cpp12
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,