diff options
author | Matt Sarett <msarett@google.com> | 2017-04-10 11:03:27 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-04-10 20:10:33 +0000 |
commit | 84c9cb7bd8f4c2b0cd4a378995ebbd8524efa390 (patch) | |
tree | 46b6875d665f3e0f9830b4b654a94123fe39a555 /src/image/SkImage_Gpu.cpp | |
parent | 891dde5b6f0d5110f0ea2d8fe516f7ce9c67fed5 (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.cpp | 26 |
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; } |