| Index: src/gpu/SkGr.cpp
|
| diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp
|
| index 596e574198a283543bb085e0e6c5c01de4f6fa63..31372cd02a1816cf378ecae4f71070465983955d 100644
|
| --- a/src/gpu/SkGr.cpp
|
| +++ b/src/gpu/SkGr.cpp
|
| @@ -16,6 +16,7 @@
|
| #include "GrDrawTargetCaps.h"
|
|
|
| #ifndef SK_IGNORE_ETC1_SUPPORT
|
| +# include "ktx.h"
|
| # include "etc1.h"
|
| #endif
|
|
|
| @@ -135,7 +136,7 @@ static void add_genID_listener(GrResourceKey key, SkPixelRef* pixelRef) {
|
| static GrTexture *load_etc1_texture(GrContext* ctx,
|
| const GrTextureParams* params,
|
| const SkBitmap &bm, GrTextureDesc desc) {
|
| - SkData *data = bm.pixelRef()->refEncodedData();
|
| + SkAutoTUnref<SkData> data(bm.pixelRef()->refEncodedData());
|
|
|
| // Is this even encoded data?
|
| if (NULL == data) {
|
| @@ -144,24 +145,40 @@ static GrTexture *load_etc1_texture(GrContext* ctx,
|
|
|
| // Is this a valid PKM encoded data?
|
| const uint8_t *bytes = data->bytes();
|
| - if (!etc1_pkm_is_valid(bytes)) {
|
| - return NULL;
|
| - }
|
| + if (etc1_pkm_is_valid(bytes)) {
|
| + uint32_t encodedWidth = etc1_pkm_get_width(bytes);
|
| + uint32_t encodedHeight = etc1_pkm_get_height(bytes);
|
| +
|
| + // Does the data match the dimensions of the bitmap? If not,
|
| + // then we don't know how to scale the image to match it...
|
| + if (encodedWidth != static_cast<uint32_t>(bm.width()) ||
|
| + encodedHeight != static_cast<uint32_t>(bm.height())) {
|
| + return NULL;
|
| + }
|
| +
|
| + // Everything seems good... skip ahead to the data.
|
| + bytes += ETC_PKM_HEADER_SIZE;
|
| + desc.fConfig = kETC1_GrPixelConfig;
|
| + } else if (SkKTXFile::is_ktx(bytes)) {
|
| + SkKTXFile ktx(data);
|
|
|
| - uint32_t encodedWidth = etc1_pkm_get_width(bytes);
|
| - uint32_t encodedHeight = etc1_pkm_get_height(bytes);
|
| + // Is it actually an ETC1 texture?
|
| + if (!ktx.isETC1()) {
|
| + return NULL;
|
| + }
|
| +
|
| + // Does the data match the dimensions of the bitmap? If not,
|
| + // then we don't know how to scale the image to match it...
|
| + if (ktx.width() != bm.width() || ktx.height() != bm.height()) {
|
| + return NULL;
|
| + }
|
|
|
| - // Does the data match the dimensions of the bitmap? If not,
|
| - // then we don't know how to scale the image to match it...
|
| - if (encodedWidth != static_cast<uint32_t>(bm.width()) ||
|
| - encodedHeight != static_cast<uint32_t>(bm.height())) {
|
| + bytes = ktx.pixelData();
|
| + desc.fConfig = kETC1_GrPixelConfig;
|
| + } else {
|
| return NULL;
|
| }
|
|
|
| - // Everything seems good... skip ahead to the data.
|
| - bytes += ETC_PKM_HEADER_SIZE;
|
| - desc.fConfig = kETC1_GrPixelConfig;
|
| -
|
| // This texture is likely to be used again so leave it in the cache
|
| GrCacheID cacheID;
|
| generate_bitmap_cache_id(bm, &cacheID);
|
|
|