aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--gm/image.cpp6
-rw-r--r--gm/image_pict.cpp8
-rw-r--r--gm/image_shader.cpp3
-rw-r--r--gm/pictureimagegenerator.cpp11
-rw-r--r--gm/verylargebitmap.cpp3
-rw-r--r--include/core/SkImage.h9
-rw-r--r--include/core/SkImageGenerator.h2
-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
-rw-r--r--tests/ImageIsOpaqueTest.cpp3
-rw-r--r--tests/ImageTest.cpp3
-rw-r--r--tests/SkResourceCacheTest.cpp3
14 files changed, 74 insertions, 29 deletions
diff --git a/gm/image.cpp b/gm/image.cpp
index c1d3372db0..0bdd994b7e 100644
--- a/gm/image.cpp
+++ b/gm/image.cpp
@@ -246,7 +246,8 @@ static sk_sp<SkImage> make_picture(const SkImageInfo& info, GrContext*, void (*d
SkPictureRecorder recorder;
draw(recorder.beginRecording(SkRect::MakeIWH(info.width(), info.height())));
return SkImage::MakeFromPicture(recorder.finishRecordingAsPicture(),
- info.dimensions(), nullptr, nullptr);
+ info.dimensions(), nullptr, nullptr,
+ SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named));
}
static sk_sp<SkImage> make_codec(const SkImageInfo& info, GrContext*, void (*draw)(SkCanvas*)) {
@@ -343,7 +344,8 @@ static SkImageGenerator* gen_picture(const SkImageInfo& info) {
SkPictureRecorder recorder;
draw_opaque_contents(recorder.beginRecording(SkRect::MakeIWH(info.width(), info.height())));
sk_sp<SkPicture> pict(recorder.finishRecordingAsPicture());
- return SkImageGenerator::NewFromPicture(info.dimensions(), pict.get(), nullptr, nullptr);
+ return SkImageGenerator::NewFromPicture(info.dimensions(), pict.get(), nullptr, nullptr,
+ SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named));
}
static SkImageGenerator* gen_png(const SkImageInfo& info) {
diff --git a/gm/image_pict.cpp b/gm/image_pict.cpp
index d2e1ebad95..229f3c5054 100644
--- a/gm/image_pict.cpp
+++ b/gm/image_pict.cpp
@@ -62,14 +62,15 @@ protected:
// extract enough just for the oval.
const SkISize size = SkISize::Make(100, 100);
+ auto srgbColorSpace = SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named);
SkMatrix matrix;
matrix.setTranslate(-100, -100);
- fImage0 = SkImage::MakeFromPicture(fPicture, size, &matrix, nullptr);
+ fImage0 = SkImage::MakeFromPicture(fPicture, size, &matrix, nullptr, srgbColorSpace);
matrix.postTranslate(-50, -50);
matrix.postRotate(45);
matrix.postTranslate(50, 50);
- fImage1 = SkImage::MakeFromPicture(fPicture, size, &matrix, nullptr);
+ fImage1 = SkImage::MakeFromPicture(fPicture, size, &matrix, nullptr, srgbColorSpace);
}
void drawSet(SkCanvas* canvas) const {
@@ -107,7 +108,8 @@ DEF_GM( return new ImagePictGM; )
static SkImageGenerator* make_pic_generator(GrContext*, SkPicture* pic) {
SkMatrix matrix;
matrix.setTranslate(-100, -100);
- return SkImageGenerator::NewFromPicture(SkISize::Make(100, 100), pic, &matrix, nullptr);
+ return SkImageGenerator::NewFromPicture(SkISize::Make(100, 100), pic, &matrix, nullptr,
+ SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named));
}
class RasterGenerator : public SkImageGenerator {
diff --git a/gm/image_shader.cpp b/gm/image_shader.cpp
index 49b1ed524c..78037390b1 100644
--- a/gm/image_shader.cpp
+++ b/gm/image_shader.cpp
@@ -47,7 +47,8 @@ static sk_sp<SkImage> make_texture(GrContext* ctx, SkPicture* pic, const SkImage
}
static sk_sp<SkImage> make_pict_gen(GrContext*, SkPicture* pic, const SkImageInfo& info) {
- return SkImage::MakeFromPicture(sk_ref_sp(pic), info.dimensions(), nullptr, nullptr);
+ return SkImage::MakeFromPicture(sk_ref_sp(pic), info.dimensions(), nullptr, nullptr,
+ SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named));
}
static sk_sp<SkImage> make_encode_gen(GrContext* ctx, SkPicture* pic, const SkImageInfo& info) {
diff --git a/gm/pictureimagegenerator.cpp b/gm/pictureimagegenerator.cpp
index ab4c808fd1..b247af2f7a 100644
--- a/gm/pictureimagegenerator.cpp
+++ b/gm/pictureimagegenerator.cpp
@@ -138,6 +138,7 @@ protected:
{ SkISize::Make(200, 100), -1, -1, 0.5f },
};
+ auto srgbColorSpace = SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named);
const unsigned kDrawsPerRow = 4;
const SkScalar kDrawSize = 250;
@@ -154,10 +155,14 @@ protected:
}
std::unique_ptr<SkImageGenerator> gen(
SkImageGenerator::NewFromPicture(configs[i].size, fPicture.get(), &m,
- p.getAlpha() != 255 ? &p : nullptr));
+ p.getAlpha() != 255 ? &p : nullptr,
+ srgbColorSpace));
+
+ SkImageInfo bmInfo = gen->getInfo().makeColorSpace(
+ sk_ref_sp(canvas->imageInfo().colorSpace()));
+
SkBitmap bm;
- SkAssertResult(gen->tryGenerateBitmap(&bm, SkImageInfo::MakeN32Premul(configs[i].size),
- nullptr));
+ SkAssertResult(gen->tryGenerateBitmap(&bm, bmInfo, nullptr));
const SkScalar x = kDrawSize * (i % kDrawsPerRow);
const SkScalar y = kDrawSize * (i / kDrawsPerRow);
diff --git a/gm/verylargebitmap.cpp b/gm/verylargebitmap.cpp
index 08ca481c43..280d117684 100644
--- a/gm/verylargebitmap.cpp
+++ b/gm/verylargebitmap.cpp
@@ -32,7 +32,8 @@ static sk_sp<SkImage> make_picture_image(int width, int height, SkColor colors[2
SkPictureRecorder recorder;
draw(recorder.beginRecording(SkRect::MakeIWH(width, height)), width, height, colors);
return SkImage::MakeFromPicture(recorder.finishRecordingAsPicture(),
- SkISize::Make(width, height), nullptr, nullptr);
+ SkISize::Make(width, height), nullptr, nullptr,
+ SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named));
}
typedef sk_sp<SkImage> (*ImageMakerProc)(int width, int height, SkColor colors[2]);
diff --git a/include/core/SkImage.h b/include/core/SkImage.h
index 2cbcb0ac0d..100298a434 100644
--- a/include/core/SkImage.h
+++ b/include/core/SkImage.h
@@ -154,8 +154,15 @@ public:
const SkISize nv12Sizes[2], GrSurfaceOrigin,
sk_sp<SkColorSpace> = nullptr);
+ /**
+ * Create a new image from the specified picture. The color space becomes a preferred
+ * color space for playback of the picture when retrieving the rasterized image contents.
+ */
static sk_sp<SkImage> MakeFromPicture(sk_sp<SkPicture>, const SkISize& dimensions,
- const SkMatrix*, const SkPaint*);
+ const SkMatrix*, const SkPaint*, sk_sp<SkColorSpace>);
+
+ static sk_sp<SkImage> MakeFromPicture(sk_sp<SkPicture> picture, const SkISize& dimensions,
+ const SkMatrix* matrix, const SkPaint* paint);
static sk_sp<SkImage> MakeTextureFromPixmap(GrContext*, const SkPixmap&, SkBudgeted budgeted);
diff --git a/include/core/SkImageGenerator.h b/include/core/SkImageGenerator.h
index eace286828..0d24d3a8c3 100644
--- a/include/core/SkImageGenerator.h
+++ b/include/core/SkImageGenerator.h
@@ -241,7 +241,7 @@ public:
* time.
*/
static SkImageGenerator* NewFromPicture(const SkISize&, const SkPicture*, const SkMatrix*,
- const SkPaint*);
+ const SkPaint*, sk_sp<SkColorSpace>);
bool tryGenerateBitmap(SkBitmap* bm, const SkImageInfo& info, SkBitmap::Allocator* allocator);
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,
diff --git a/tests/ImageIsOpaqueTest.cpp b/tests/ImageIsOpaqueTest.cpp
index cc7255d37a..21ddb5da48 100644
--- a/tests/ImageIsOpaqueTest.cpp
+++ b/tests/ImageIsOpaqueTest.cpp
@@ -124,7 +124,8 @@ DEF_TEST(Image_isAlphaOnly, reporter) {
SkImage::MakeRasterCopy(pmap),
GetResourceAsImage("mandrill_128.png"),
GetResourceAsImage("color_wheel.jpg"),
- SkImage::MakeFromPicture(make_picture(), { 10, 10 }, nullptr, nullptr),
+ SkImage::MakeFromPicture(make_picture(), { 10, 10 }, nullptr, nullptr,
+ SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named)),
})
{
REPORTER_ASSERT(reporter, image->isAlphaOnly() == false);
diff --git a/tests/ImageTest.cpp b/tests/ImageTest.cpp
index 3b99394165..c801d67d67 100644
--- a/tests/ImageTest.cpp
+++ b/tests/ImageTest.cpp
@@ -129,7 +129,8 @@ static sk_sp<SkImage> create_picture_image() {
SkCanvas* canvas = recorder.beginRecording(10, 10);
canvas->clear(SK_ColorCYAN);
return SkImage::MakeFromPicture(recorder.finishRecordingAsPicture(), SkISize::Make(10, 10),
- nullptr, nullptr);
+ nullptr, nullptr,
+ SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named));
};
#endif
// Want to ensure that our Release is called when the owning image is destroyed
diff --git a/tests/SkResourceCacheTest.cpp b/tests/SkResourceCacheTest.cpp
index c8da135b0d..ed2ff74b56 100644
--- a/tests/SkResourceCacheTest.cpp
+++ b/tests/SkResourceCacheTest.cpp
@@ -329,7 +329,8 @@ DEF_TEST(BitmapCache_discarded_image, reporter) {
SkCanvas* canvas = recorder.beginRecording(10, 10);
canvas->clear(SK_ColorCYAN);
return SkImage::MakeFromPicture(recorder.finishRecordingAsPicture(),
- SkISize::Make(10, 10), nullptr, nullptr);
+ SkISize::Make(10, 10), nullptr, nullptr,
+ SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named));
});
}
}