Index: src/images/SkImageDecoder_ktx.cpp |
diff --git a/src/images/SkImageDecoder_ktx.cpp b/src/images/SkImageDecoder_ktx.cpp |
index c06450c6315bf08df8c20a9967500f58623c60de..64a37d9e9ba31315fb9211f0a8581bd6f2618902 100644 |
--- a/src/images/SkImageDecoder_ktx.cpp |
+++ b/src/images/SkImageDecoder_ktx.cpp |
@@ -91,12 +91,39 @@ bool SkKTXImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) { |
} |
} |
- // Set the config... |
- bm->setInfo(SkImageInfo::MakeN32(sampler.scaledWidth(), sampler.scaledHeight(), alphaType)); |
+ // Search through the compressed formats to see if the KTX file is holding |
+ // compressed data |
+ bool ktxIsCompressed = false; |
+ SkTextureCompressor::Format ktxCompressedFormat; |
+ for (int i = 0; i < SkTextureCompressor::kFormatCnt; ++i) { |
+ SkTextureCompressor::Format fmt = static_cast<SkTextureCompressor::Format>(i); |
+ if (ktxFile.isCompressedFormat(fmt)) { |
+ ktxIsCompressed = true; |
+ ktxCompressedFormat = fmt; |
+ break; |
+ } |
+ } |
+ |
+ // If the compressed format is a grayscale image, then setup the bitmap properly... |
+ bool isCompressedAlpha = ktxIsCompressed && |
+ ((SkTextureCompressor::kLATC_Format == ktxCompressedFormat) || |
+ (SkTextureCompressor::kR11_EAC_Format == ktxCompressedFormat)); |
+ |
+ // Set the image dimensions and underlying pixel type. |
+ if (isCompressedAlpha) { |
+ const int w = sampler.scaledWidth(); |
+ const int h = sampler.scaledHeight(); |
+ bm->setInfo(SkImageInfo::MakeA8(w, h)); |
+ } else { |
+ const int w = sampler.scaledWidth(); |
+ const int h = sampler.scaledHeight(); |
+ bm->setInfo(SkImageInfo::MakeN32(w, h, alphaType)); |
+ } |
+ |
if (SkImageDecoder::kDecodeBounds_Mode == mode) { |
return true; |
} |
- |
+ |
// If we've made it this far, then we know how to grok the data. |
if (!this->allocPixelRef(bm, NULL)) { |
return false; |
@@ -105,7 +132,36 @@ bool SkKTXImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) { |
// Lock the pixels, since we're about to write to them... |
SkAutoLockPixels alp(*bm); |
- if (ktxFile.isCompressedFormat(SkTextureCompressor::kETC1_Format)) { |
+ if (isCompressedAlpha) { |
+ if (!sampler.begin(bm, SkScaledBitmapSampler::kGray, *this)) { |
+ return false; |
+ } |
+ |
+ // Alpha data is only a single byte per pixel. |
+ int nPixels = width * height; |
+ SkAutoMalloc outRGBData(nPixels); |
+ uint8_t *outRGBDataPtr = reinterpret_cast<uint8_t *>(outRGBData.get()); |
+ |
+ // Decode the compressed format |
+ const uint8_t *buf = reinterpret_cast<const uint8_t *>(ktxFile.pixelData()); |
+ if (!SkTextureCompressor::DecompressBufferFromFormat( |
+ outRGBDataPtr, width, buf, width, height, ktxCompressedFormat)) { |
+ return false; |
+ } |
+ |
+ // Set each of the pixels... |
+ const int srcRowBytes = width; |
+ const int dstHeight = sampler.scaledHeight(); |
+ const uint8_t *srcRow = reinterpret_cast<uint8_t *>(outRGBDataPtr); |
+ srcRow += sampler.srcY0() * srcRowBytes; |
+ for (int y = 0; y < dstHeight; ++y) { |
+ sampler.next(srcRow); |
+ srcRow += sampler.srcDY() * srcRowBytes; |
+ } |
+ |
+ return true; |
+ |
robertphillips
2014/08/07 16:37:29
Couldn't we say "ktxIsCompressed && SkTextureCompr
|
+ } else if (ktxFile.isCompressedFormat(SkTextureCompressor::kETC1_Format)) { |
if (!sampler.begin(bm, SkScaledBitmapSampler::kRGB, *this)) { |
return false; |
} |