aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar krajcevski <krajcevski@google.com>2014-08-05 14:13:36 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2014-08-05 14:13:36 -0700
commit40a1e11ebebe81586f3fec96408fdfd4b51123d2 (patch)
treec2174293e43c71dd1d7de3d3568a4dc965f9e462
parent07544757c9fcf0f359f1686a3779eb2e75dd5b36 (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.gyp4
-rw-r--r--src/gpu/SkGr.cpp3
-rw-r--r--src/images/SkImageDecoder_ktx.cpp9
-rw-r--r--src/utils/SkTextureCompressor.h2
-rw-r--r--third_party/ktx/ktx.cpp33
-rw-r--r--third_party/ktx/ktx.h3
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;