diff options
author | krajcevski <krajcevski@google.com> | 2014-08-05 14:13:36 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-08-05 14:13:36 -0700 |
commit | 40a1e11ebebe81586f3fec96408fdfd4b51123d2 (patch) | |
tree | c2174293e43c71dd1d7de3d3568a4dc965f9e462 | |
parent | 07544757c9fcf0f359f1686a3779eb2e75dd5b36 (diff) |
Add support for all compressed formats in KTX file format
R=robertphillips@google.com
Author: krajcevski@google.com
Review URL: https://codereview.chromium.org/440783004
-rw-r--r-- | gyp/ktx.gyp | 4 | ||||
-rw-r--r-- | src/gpu/SkGr.cpp | 3 | ||||
-rw-r--r-- | src/images/SkImageDecoder_ktx.cpp | 9 | ||||
-rw-r--r-- | src/utils/SkTextureCompressor.h | 2 | ||||
-rw-r--r-- | third_party/ktx/ktx.cpp | 33 | ||||
-rw-r--r-- | third_party/ktx/ktx.h | 3 |
6 files changed, 44 insertions, 10 deletions
diff --git a/gyp/ktx.gyp b/gyp/ktx.gyp index 141eba1fd1..32a5c32ce8 100644 --- a/gyp/ktx.gyp +++ b/gyp/ktx.gyp @@ -8,7 +8,9 @@ 'type': 'static_library', 'include_dirs' : [ '../third_party/ktx', - '../src/gpu' + '../include/gpu', + '../src/gpu', + '../src/utils', ], 'sources': [ '../third_party/ktx/ktx.cpp', diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp index 5c0464da20..0a45100521 100644 --- a/src/gpu/SkGr.cpp +++ b/src/gpu/SkGr.cpp @@ -11,6 +11,7 @@ #include "SkData.h" #include "SkMessageBus.h" #include "SkPixelRef.h" +#include "SkTextureCompressor.h" #include "GrResourceCache.h" #include "GrGpu.h" #include "effects/GrDitherEffect.h" @@ -165,7 +166,7 @@ static GrTexture *load_etc1_texture(GrContext* ctx, SkKTXFile ktx(data); // Is it actually an ETC1 texture? - if (!ktx.isETC1()) { + if (!ktx.isCompressedFormat(SkTextureCompressor::kETC1_Format)) { return NULL; } diff --git a/src/images/SkImageDecoder_ktx.cpp b/src/images/SkImageDecoder_ktx.cpp index 058ab72646..c06450c631 100644 --- a/src/images/SkImageDecoder_ktx.cpp +++ b/src/images/SkImageDecoder_ktx.cpp @@ -105,7 +105,7 @@ 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.isETC1()) { + if (ktxFile.isCompressedFormat(SkTextureCompressor::kETC1_Format)) { if (!sampler.begin(bm, SkScaledBitmapSampler::kRGB, *this)) { return false; } @@ -113,11 +113,12 @@ bool SkKTXImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) { // ETC1 Data is encoded as RGB pixels, so we should extract it as such int nPixels = width * height; SkAutoMalloc outRGBData(nPixels * 3); - etc1_byte *outRGBDataPtr = reinterpret_cast<etc1_byte *>(outRGBData.get()); + uint8_t *outRGBDataPtr = reinterpret_cast<uint8_t *>(outRGBData.get()); // Decode ETC1 - const etc1_byte *buf = reinterpret_cast<const etc1_byte *>(ktxFile.pixelData()); - if (etc1_decode_image(buf, outRGBDataPtr, width, height, 3, width*3)) { + const uint8_t *buf = reinterpret_cast<const uint8_t *>(ktxFile.pixelData()); + if (!SkTextureCompressor::DecompressBufferFromFormat( + outRGBDataPtr, width*3, buf, width, height, SkTextureCompressor::kETC1_Format)) { return false; } diff --git a/src/utils/SkTextureCompressor.h b/src/utils/SkTextureCompressor.h index 4254ae76fb..e44e7b353d 100644 --- a/src/utils/SkTextureCompressor.h +++ b/src/utils/SkTextureCompressor.h @@ -9,9 +9,9 @@ #define SkTextureCompressor_DEFINED #include "SkImageInfo.h" -#include "SkBlitter.h" class SkBitmap; +class SkBlitter; class SkData; namespace SkTextureCompressor { diff --git a/third_party/ktx/ktx.cpp b/third_party/ktx/ktx.cpp index a05498b7e8..ebcc5eb187 100644 --- a/third_party/ktx/ktx.cpp +++ b/third_party/ktx/ktx.cpp @@ -12,9 +12,27 @@ #include "SkEndian.h" #include "gl/GrGLDefines.h" +#include "GrConfig.h" #include "etc1.h" +static inline uint32_t compressed_fmt_to_gl_define(SkTextureCompressor::Format fmt) { + static const uint32_t kGLDefineMap[SkTextureCompressor::kFormatCnt] = { + GR_GL_COMPRESSED_LUMINANCE_LATC1, // kLATC_Format + GR_GL_COMPRESSED_R11, // kR11_EAC_Format + GR_GL_COMPRESSED_RGB8_ETC1, // kETC1_Format + GR_GL_COMPRESSED_RGBA_ASTC_12x12, // kASTC_12x12_Format + }; + + GR_STATIC_ASSERT(0 == SkTextureCompressor::kLATC_Format); + GR_STATIC_ASSERT(1 == SkTextureCompressor::kR11_EAC_Format); + GR_STATIC_ASSERT(2 == SkTextureCompressor::kETC1_Format); + GR_STATIC_ASSERT(3 == SkTextureCompressor::kASTC_12x12_Format); + GR_STATIC_ASSERT(SK_ARRAY_COUNT(kGLDefineMap) == SkTextureCompressor::kFormatCnt); + + return kGLDefineMap[fmt]; +} + #define KTX_FILE_IDENTIFIER_SIZE 12 static const uint8_t KTX_FILE_IDENTIFIER[KTX_FILE_IDENTIFIER_SIZE] = { 0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A @@ -123,8 +141,19 @@ SkString SkKTXFile::getValueForKey(const SkString& key) const { return SkString(); } -bool SkKTXFile::isETC1() const { - return this->valid() && GR_GL_COMPRESSED_RGB8_ETC1 == fHeader.fGLInternalFormat; +bool SkKTXFile::isCompressedFormat(SkTextureCompressor::Format fmt) const { + if (!this->valid()) { + return false; + } + + // This has many aliases + bool isFmt = false; + if (fmt == SkTextureCompressor::kLATC_Format) { + isFmt = GR_GL_COMPRESSED_RED_RGTC1 == fHeader.fGLInternalFormat || + GR_GL_COMPRESSED_3DC_X == fHeader.fGLInternalFormat; + } + + return isFmt || compressed_fmt_to_gl_define(fmt) == fHeader.fGLInternalFormat; } bool SkKTXFile::isRGBA8() const { diff --git a/third_party/ktx/ktx.h b/third_party/ktx/ktx.h index 2f445a817a..1114b49bf9 100644 --- a/third_party/ktx/ktx.h +++ b/third_party/ktx/ktx.h @@ -11,6 +11,7 @@ #define SkKTXFile_DEFINED #include "SkData.h" +#include "SkTextureCompressor.h" #include "SkTypes.h" #include "SkTDArray.h" #include "SkString.h" @@ -58,7 +59,7 @@ public: int numMipmaps() const { return static_cast<int>(fHeader.fNumberOfMipmapLevels); } - bool isETC1() const; + bool isCompressedFormat(SkTextureCompressor::Format fmt) const; bool isRGBA8() const; bool isRGB8() const; |