Index: src/image/SkImage_Gpu.cpp |
diff --git a/src/image/SkImage_Gpu.cpp b/src/image/SkImage_Gpu.cpp |
index 7c08b1313ec1c2a72b17fb8b7b7be267b6716943..cb9173de26cbb921eb2576b58cbd8ce074449afc 100644 |
--- a/src/image/SkImage_Gpu.cpp |
+++ b/src/image/SkImage_Gpu.cpp |
@@ -20,11 +20,12 @@ |
#include "SkPixelRef.h" |
SkImage_Gpu::SkImage_Gpu(int w, int h, uint32_t uniqueID, SkAlphaType at, GrTexture* tex, |
- SkBudgeted budgeted) |
+ sk_sp<SkColorSpace> colorSpace, SkBudgeted budgeted) |
: INHERITED(w, h, uniqueID) |
, fTexture(SkRef(tex)) |
, fAlphaType(at) |
, fBudgeted(budgeted) |
+ , fColorSpace(std::move(colorSpace)) |
, fAddedRasterVersionToCache(false) |
{ |
SkASSERT(tex->width() == w); |
@@ -43,8 +44,9 @@ extern void SkTextureImageApplyBudgetedDecision(SkImage* image) { |
} |
} |
-static SkImageInfo make_info(int w, int h, bool isOpaque) { |
- return SkImageInfo::MakeN32(w, h, isOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType); |
+static SkImageInfo make_info(int w, int h, bool isOpaque, sk_sp<SkColorSpace> colorSpace) { |
+ return SkImageInfo::MakeN32(w, h, isOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType, |
+ std::move(colorSpace)); |
} |
bool SkImage_Gpu::getROPixels(SkBitmap* dst, CachingHint chint) const { |
@@ -55,7 +57,8 @@ bool SkImage_Gpu::getROPixels(SkBitmap* dst, CachingHint chint) const { |
return true; |
} |
- if (!dst->tryAllocPixels(make_info(this->width(), this->height(), this->isOpaque()))) { |
+ if (!dst->tryAllocPixels(make_info(this->width(), this->height(), this->isOpaque(), |
+ this->fColorSpace))) { |
return false; |
} |
if (!fTexture->readPixels(0, 0, dst->width(), dst->height(), kSkia8888_GrPixelConfig, |
@@ -72,7 +75,7 @@ bool SkImage_Gpu::getROPixels(SkBitmap* dst, CachingHint chint) const { |
} |
bool SkImage_Gpu::asBitmapForImageFilters(SkBitmap* bitmap) const { |
- bitmap->setInfo(make_info(this->width(), this->height(), this->isOpaque())); |
+ bitmap->setInfo(make_info(this->width(), this->height(), this->isOpaque(), fColorSpace)); |
bitmap->setPixelRef(new SkGrPixelRef(bitmap->info(), fTexture))->unref(); |
bitmap->pixelRef()->setImmutableWithID(this->uniqueID()); |
return true; |
@@ -147,13 +150,14 @@ sk_sp<SkImage> SkImage_Gpu::onMakeSubset(const SkIRect& subset) const { |
} |
ctx->copySurface(subTx.get(), fTexture, subset, SkIPoint::Make(0, 0)); |
return sk_make_sp<SkImage_Gpu>(desc.fWidth, desc.fHeight, kNeedNewImageUniqueID, |
- fAlphaType, subTx.get(), fBudgeted); |
+ fAlphaType, subTx.get(), fColorSpace, fBudgeted); |
} |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
static sk_sp<SkImage> new_wrapped_texture_common(GrContext* ctx, const GrBackendTextureDesc& desc, |
- SkAlphaType at, GrWrapOwnership ownership, |
+ SkAlphaType at, sk_sp<SkColorSpace> colorSpace, |
+ GrWrapOwnership ownership, |
SkImage::TextureReleaseProc releaseProc, |
SkImage::ReleaseContext releaseCtx) { |
if (desc.fWidth <= 0 || desc.fHeight <= 0) { |
@@ -169,25 +173,28 @@ static sk_sp<SkImage> new_wrapped_texture_common(GrContext* ctx, const GrBackend |
const SkBudgeted budgeted = SkBudgeted::kNo; |
return sk_make_sp<SkImage_Gpu>(desc.fWidth, desc.fHeight, kNeedNewImageUniqueID, |
- at, tex, budgeted); |
+ at, tex, colorSpace, budgeted); |
} |
sk_sp<SkImage> SkImage::MakeFromTexture(GrContext* ctx, const GrBackendTextureDesc& desc, |
- SkAlphaType at, TextureReleaseProc releaseP, |
- ReleaseContext releaseC) { |
- return new_wrapped_texture_common(ctx, desc, at, kBorrow_GrWrapOwnership, releaseP, releaseC); |
+ SkAlphaType at, sk_sp<SkColorSpace> cs, |
+ TextureReleaseProc releaseP, ReleaseContext releaseC) { |
+ return new_wrapped_texture_common(ctx, desc, at, std::move(cs), kBorrow_GrWrapOwnership, |
+ releaseP, releaseC); |
} |
sk_sp<SkImage> SkImage::MakeFromAdoptedTexture(GrContext* ctx, const GrBackendTextureDesc& desc, |
- SkAlphaType at) { |
- return new_wrapped_texture_common(ctx, desc, at, kAdopt_GrWrapOwnership, nullptr, nullptr); |
+ SkAlphaType at, sk_sp<SkColorSpace> cs) { |
+ return new_wrapped_texture_common(ctx, desc, at, std::move(cs), kAdopt_GrWrapOwnership, |
+ nullptr, nullptr); |
} |
static sk_sp<SkImage> make_from_yuv_textures_copy(GrContext* ctx, SkYUVColorSpace colorSpace, |
bool nv12, |
const GrBackendObject yuvTextureHandles[], |
const SkISize yuvSizes[], |
- GrSurfaceOrigin origin) { |
+ GrSurfaceOrigin origin, |
+ sk_sp<SkColorSpace> imageColorSpace) { |
const SkBudgeted budgeted = SkBudgeted::kYes; |
if (yuvSizes[0].fWidth <= 0 || yuvSizes[0].fHeight <= 0 || yuvSizes[1].fWidth <= 0 || |
@@ -262,21 +269,25 @@ static sk_sp<SkImage> make_from_yuv_textures_copy(GrContext* ctx, SkYUVColorSpac |
drawContext->drawRect(GrNoClip(), paint, SkMatrix::I(), rect); |
ctx->flushSurfaceWrites(drawContext->accessRenderTarget()); |
return sk_make_sp<SkImage_Gpu>(width, height, kNeedNewImageUniqueID, |
- kOpaque_SkAlphaType, |
- drawContext->asTexture().get(), budgeted); |
+ kOpaque_SkAlphaType, drawContext->asTexture().get(), |
+ std::move(imageColorSpace), budgeted); |
} |
sk_sp<SkImage> SkImage::MakeFromYUVTexturesCopy(GrContext* ctx, SkYUVColorSpace colorSpace, |
const GrBackendObject yuvTextureHandles[3], |
- const SkISize yuvSizes[3], GrSurfaceOrigin origin) { |
- return make_from_yuv_textures_copy(ctx, colorSpace, false, yuvTextureHandles, yuvSizes, origin); |
+ const SkISize yuvSizes[3], GrSurfaceOrigin origin, |
+ sk_sp<SkColorSpace> imageColorSpace) { |
+ return make_from_yuv_textures_copy(ctx, colorSpace, false, yuvTextureHandles, yuvSizes, origin, |
+ std::move(imageColorSpace)); |
} |
sk_sp<SkImage> SkImage::MakeFromNV12TexturesCopy(GrContext* ctx, SkYUVColorSpace colorSpace, |
const GrBackendObject yuvTextureHandles[2], |
const SkISize yuvSizes[2], |
- GrSurfaceOrigin origin) { |
- return make_from_yuv_textures_copy(ctx, colorSpace, true, yuvTextureHandles, yuvSizes, origin); |
+ GrSurfaceOrigin origin, |
+ sk_sp<SkColorSpace> imageColorSpace) { |
+ return make_from_yuv_textures_copy(ctx, colorSpace, true, yuvTextureHandles, yuvSizes, origin, |
+ std::move(imageColorSpace)); |
} |
static sk_sp<SkImage> create_image_from_maker(GrTextureMaker* maker, SkAlphaType at, uint32_t id) { |
@@ -286,7 +297,7 @@ static sk_sp<SkImage> create_image_from_maker(GrTextureMaker* maker, SkAlphaType |
return nullptr; |
} |
return sk_make_sp<SkImage_Gpu>(texture->width(), texture->height(), id, at, texture, |
- SkBudgeted::kNo); |
+ sk_ref_sp(maker->getColorSpace()), SkBudgeted::kNo); |
} |
sk_sp<SkImage> SkImage::makeTextureImage(GrContext *context) const { |
@@ -346,7 +357,8 @@ sk_sp<SkImage> SkImage::MakeTextureFromPixmap(GrContext* ctx, const SkPixmap& pi |
return nullptr; |
} |
return sk_make_sp<SkImage_Gpu>(texture->width(), texture->height(), kNeedNewImageUniqueID, |
- pixmap.alphaType(), texture, budgeted); |
+ pixmap.alphaType(), texture, |
+ sk_ref_sp(pixmap.info().colorSpace()), budgeted); |
} |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
@@ -544,5 +556,6 @@ sk_sp<SkImage> SkImage::MakeTextureFromMipMap(GrContext* ctx, const SkImageInfo& |
return nullptr; |
} |
return sk_make_sp<SkImage_Gpu>(texture->width(), texture->height(), kNeedNewImageUniqueID, |
- info.alphaType(), texture, budgeted); |
+ info.alphaType(), texture, sk_ref_sp(info.colorSpace()), |
+ budgeted); |
} |