diff options
-rw-r--r-- | src/image/SkImage_Gpu.cpp | 96 |
1 files changed, 60 insertions, 36 deletions
diff --git a/src/image/SkImage_Gpu.cpp b/src/image/SkImage_Gpu.cpp index 740963a824..6cce96c1f7 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); } |