| Index: src/image/SkImage_Gpu.cpp
|
| diff --git a/src/image/SkImage_Gpu.cpp b/src/image/SkImage_Gpu.cpp
|
| index 740963a82407b7b2737d3cb7e48a75a9db97c7f0..6cce96c1f7507113afe9fa6d43c906512e74f50f 100644
|
| --- a/src/image/SkImage_Gpu.cpp
|
| +++ b/src/image/SkImage_Gpu.cpp
|
| @@ -357,31 +357,31 @@ sk_sp<SkImage> SkImage::MakeTextureFromPixmap(GrContext* ctx, const SkPixmap& pi
|
|
|
| ///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
| -class DeferredTextureImage {
|
| -public:
|
| - SkImage* newImage(GrContext* context, SkBudgeted) const;
|
| -
|
| -private:
|
| - uint32_t fContextUniqueID;
|
| - struct MipMapLevelData {
|
| - void* fPixelData;
|
| - size_t fRowBytes;
|
| - };
|
| - struct Data {
|
| - SkImageInfo fInfo;
|
| - int fColorTableCnt;
|
| - uint32_t* fColorTableData;
|
| - int fMipMapLevelCount;
|
| - // The fMipMapLevelData array may contain more than 1 element.
|
| - // It contains fMipMapLevelCount elements.
|
| - // That means this struct's size is not known at compile-time.
|
| - MipMapLevelData fMipMapLevelData[1];
|
| - };
|
| - Data fData;
|
| -
|
| - friend class SkImage;
|
| +namespace {
|
| +struct MipMapLevelData {
|
| + void* fPixelData;
|
| + size_t fRowBytes;
|
| };
|
|
|
| +struct DeferredTextureImage {
|
| + uint32_t fContextUniqueID;
|
| + // We don't store a SkImageInfo because it contains a ref-counted SkColorSpace.
|
| + int fWidth;
|
| + int fHeight;
|
| + SkColorType fColorType;
|
| + SkAlphaType fAlphaType;
|
| + void* fColorSpace;
|
| + size_t fColorSpaceSize;
|
| + int fColorTableCnt;
|
| + uint32_t* fColorTableData;
|
| + int fMipMapLevelCount;
|
| + // The fMipMapLevelData array may contain more than 1 element.
|
| + // It contains fMipMapLevelCount elements.
|
| + // That means this struct's size is not known at compile-time.
|
| + MipMapLevelData fMipMapLevelData[1];
|
| +};
|
| +} // anonymous namespace
|
| +
|
| size_t SkImage::getDeferredTextureImageData(const GrContextThreadSafeProxy& proxy,
|
| const DeferredTextureImageUsageParams params[],
|
| int paramCnt, void* buffer) const {
|
| @@ -466,11 +466,18 @@ size_t SkImage::getDeferredTextureImageData(const GrContextThreadSafeProxy& prox
|
| size_t size = 0;
|
| size_t dtiSize = SkAlign8(sizeof(DeferredTextureImage));
|
| size += dtiSize;
|
| - size += mipMapLevelCount * sizeof(DeferredTextureImage::MipMapLevelData);
|
| + size += mipMapLevelCount * sizeof(MipMapLevelData);
|
| size_t pixelOffset = size;
|
| size += pixelSize;
|
| size_t ctOffset = size;
|
| size += ctSize;
|
| + size_t colorSpaceOffset = 0;
|
| + size_t colorSpaceSize = 0;
|
| + if (info.colorSpace()) {
|
| + colorSpaceOffset = size;
|
| + colorSpaceSize = info.colorSpace()->writeToMemory(nullptr);
|
| + size += colorSpaceSize;
|
| + }
|
| if (!fillMode) {
|
| return size;
|
| }
|
| @@ -490,12 +497,23 @@ size_t SkImage::getDeferredTextureImageData(const GrContextThreadSafeProxy& prox
|
| size_t rowBytes = pixmap.rowBytes();
|
| DeferredTextureImage* dti = new (buffer) DeferredTextureImage();
|
| dti->fContextUniqueID = proxy.fContextUniqueID;
|
| - dti->fData.fInfo = info;
|
| - dti->fData.fColorTableCnt = ctCount;
|
| - dti->fData.fColorTableData = ct;
|
| - dti->fData.fMipMapLevelCount = mipMapLevelCount;
|
| - dti->fData.fMipMapLevelData[0].fPixelData = pixels;
|
| - dti->fData.fMipMapLevelData[0].fRowBytes = rowBytes;
|
| + dti->fWidth = info.width();
|
| + dti->fHeight = info.height();
|
| + dti->fColorType = info.colorType();
|
| + dti->fAlphaType = info.alphaType();
|
| + dti->fColorTableCnt = ctCount;
|
| + dti->fColorTableData = ct;
|
| + dti->fMipMapLevelCount = mipMapLevelCount;
|
| + dti->fMipMapLevelData[0].fPixelData = pixels;
|
| + dti->fMipMapLevelData[0].fRowBytes = rowBytes;
|
| + if (colorSpaceSize) {
|
| + dti->fColorSpace = reinterpret_cast<void*>(bufferAsInt + colorSpaceOffset);
|
| + dti->fColorSpaceSize = colorSpaceSize;
|
| + info.colorSpace()->writeToMemory(dti->fColorSpace);
|
| + } else {
|
| + dti->fColorSpace = nullptr;
|
| + dti->fColorSpaceSize = 0;
|
| + }
|
| return size;
|
| }
|
|
|
| @@ -510,14 +528,20 @@ sk_sp<SkImage> SkImage::MakeFromDeferredTextureImageData(GrContext* context, con
|
| return nullptr;
|
| }
|
| SkAutoTUnref<SkColorTable> colorTable;
|
| - if (dti->fData.fColorTableCnt) {
|
| - SkASSERT(dti->fData.fColorTableData);
|
| - colorTable.reset(new SkColorTable(dti->fData.fColorTableData, dti->fData.fColorTableCnt));
|
| + if (dti->fColorTableCnt) {
|
| + SkASSERT(dti->fColorTableData);
|
| + colorTable.reset(new SkColorTable(dti->fColorTableData, dti->fColorTableCnt));
|
| + }
|
| + SkASSERT(dti->fMipMapLevelCount == 1);
|
| + sk_sp<SkColorSpace> colorSpace;
|
| + if (dti->fColorSpaceSize) {
|
| + colorSpace = SkColorSpace::Deserialize(dti->fColorSpace, dti->fColorSpaceSize);
|
| }
|
| - SkASSERT(dti->fData.fMipMapLevelCount == 1);
|
| + SkImageInfo info = SkImageInfo::Make(dti->fWidth, dti->fHeight,
|
| + dti->fColorType, dti->fAlphaType, colorSpace);
|
| SkPixmap pixmap;
|
| - pixmap.reset(dti->fData.fInfo, dti->fData.fMipMapLevelData[0].fPixelData,
|
| - dti->fData.fMipMapLevelData[0].fRowBytes, colorTable.get());
|
| + pixmap.reset(info, dti->fMipMapLevelData[0].fPixelData,
|
| + dti->fMipMapLevelData[0].fRowBytes, colorTable.get());
|
| return SkImage::MakeTextureFromPixmap(context, pixmap, budgeted);
|
| }
|
|
|
|
|