aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/image/SkImage_Gpu.cpp
diff options
context:
space:
mode:
authorGravatar Matt Sarett <msarett@google.com>2017-04-10 11:03:27 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-04-10 20:10:33 +0000
commit84c9cb7bd8f4c2b0cd4a378995ebbd8524efa390 (patch)
tree46b6875d665f3e0f9830b4b654a94123fe39a555 /src/image/SkImage_Gpu.cpp
parent891dde5b6f0d5110f0ea2d8fe516f7ce9c67fed5 (diff)
getDeferredTextureImageData(): preserve color space in legacy mode
Bug: skia: Change-Id: Ib205f6104827b734635df6932d6dcfdc2248d091 Reviewed-on: https://skia-review.googlesource.com/12103 Reviewed-by: Brian Osman <brianosman@google.com> Commit-Queue: Matt Sarett <msarett@google.com>
Diffstat (limited to 'src/image/SkImage_Gpu.cpp')
-rw-r--r--src/image/SkImage_Gpu.cpp26
1 files changed, 23 insertions, 3 deletions
diff --git a/src/image/SkImage_Gpu.cpp b/src/image/SkImage_Gpu.cpp
index 08c2e0d0ca..119eb911e8 100644
--- a/src/image/SkImage_Gpu.cpp
+++ b/src/image/SkImage_Gpu.cpp
@@ -682,10 +682,18 @@ size_t SkImage::getDeferredTextureImageData(const GrContextThreadSafeProxy& prox
size += pixelSize;
size_t colorSpaceOffset = 0;
size_t colorSpaceSize = 0;
+ SkColorSpaceTransferFn fn;
if (info.colorSpace()) {
colorSpaceOffset = size;
colorSpaceSize = info.colorSpace()->writeToMemory(nullptr);
size += colorSpaceSize;
+ } else if (this->colorSpace() && this->colorSpace()->isNumericalTransferFn(&fn)) {
+ // In legacy mode, preserve the color space tag on the SkImage. This is only
+ // supported if the color space has a parametric transfer function.
+ SkASSERT(!dstColorSpace);
+ colorSpaceOffset = size;
+ colorSpaceSize = this->colorSpace()->writeToMemory(nullptr);
+ size += colorSpaceSize;
}
if (!fillMode) {
return size;
@@ -730,7 +738,13 @@ size_t SkImage::getDeferredTextureImageData(const GrContextThreadSafeProxy& prox
void* colorSpace = bufferAsCharPtr + colorSpaceOffset;
FILL_MEMBER(dtiBufferFiller, fColorSpace, &colorSpace);
FILL_MEMBER(dtiBufferFiller, fColorSpaceSize, &colorSpaceSize);
- info.colorSpace()->writeToMemory(bufferAsCharPtr + colorSpaceOffset);
+ if (info.colorSpace()) {
+ info.colorSpace()->writeToMemory(bufferAsCharPtr + colorSpaceOffset);
+ } else {
+ SkASSERT(this->colorSpace() && this->colorSpace()->isNumericalTransferFn(&fn));
+ SkASSERT(!dstColorSpace);
+ this->colorSpace()->writeToMemory(bufferAsCharPtr + colorSpaceOffset);
+ }
} else {
memset(bufferAsCharPtr + offsetof(DeferredTextureImage, fColorSpace),
0, sizeof(DeferredTextureImage::fColorSpace));
@@ -803,8 +817,14 @@ sk_sp<SkImage> SkImage::MakeFromDeferredTextureImageData(GrContext* context, con
if (mipLevelCount == 1) {
SkPixmap pixmap;
pixmap.reset(info, dti->fMipMapLevelData[0].fPixelData, dti->fMipMapLevelData[0].fRowBytes);
- sk_sp<GrTextureProxy> proxy(GrUploadPixmapToTextureProxy(context->resourceProvider(),
- pixmap, budgeted));
+
+ // Use the NoCheck version because we have already validated the SkImage. The |data|
+ // used to be an SkImage before calling getDeferredTextureImageData(). In legacy mode,
+ // getDeferredTextureImageData() will allow parametric transfer functions for images
+ // generated from codecs - which is slightly more lenient than typical SkImage
+ // constructors.
+ sk_sp<GrTextureProxy> proxy(GrUploadPixmapToTextureProxyNoCheck(
+ context->resourceProvider(), pixmap, budgeted));
if (!proxy) {
return nullptr;
}