| Index: src/gpu/SkGr.cpp
|
| diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp
|
| index 6bd04dec3a841ac8186b8644ab212aca6512fba8..9579866269d90a6a60c184fdbf6b6dc0c7419300 100644
|
| --- a/src/gpu/SkGr.cpp
|
| +++ b/src/gpu/SkGr.cpp
|
| @@ -8,9 +8,16 @@
|
| #include "SkGr.h"
|
| #include "SkColorFilter.h"
|
| #include "SkConfig8888.h"
|
| +#include "SkData.h"
|
| #include "SkMessageBus.h"
|
| #include "SkPixelRef.h"
|
| #include "GrResourceCache.h"
|
| +#include "GrGpu.h"
|
| +#include "GrDrawTargetCaps.h"
|
| +
|
| +#if SK_SUPPORT_ETC1
|
| +# include "etc1.h"
|
| +#endif
|
|
|
| /* Fill out buffer with the compressed format Ganesh expects from a colortable
|
| based bitmap. [palette (colortable) + indices].
|
| @@ -124,6 +131,50 @@ static void add_genID_listener(GrResourceKey key, SkPixelRef* pixelRef) {
|
| pixelRef->addGenIDChangeListener(SkNEW_ARGS(GrResourceInvalidator, (key)));
|
| }
|
|
|
| +#if SK_SUPPORT_ETC1
|
| +static GrTexture *load_etc1_texture(GrContext* ctx,
|
| + const GrTextureParams* params,
|
| + const SkBitmap &bm, GrTextureDesc desc) {
|
| + SkData *data = bm.pixelRef()->refEncodedData();
|
| +
|
| + // Is this even encoded data?
|
| + if (NULL == data) {
|
| + return NULL;
|
| + }
|
| +
|
| + // Is this a valid PKM encoded data?
|
| + const uint8_t *bytes = data->bytes();
|
| + if (!etc1_pkm_is_valid(bytes)) {
|
| + return NULL;
|
| + }
|
| +
|
| + 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;
|
| +
|
| + // This texture is likely to be used again so leave it in the cache
|
| + GrCacheID cacheID;
|
| + generate_bitmap_cache_id(bm, &cacheID);
|
| +
|
| + GrResourceKey key;
|
| + GrTexture* result = ctx->createTexture(params, desc, cacheID, bytes, 0, &key);
|
| + if (NULL != result) {
|
| + add_genID_listener(key, bm.pixelRef());
|
| + }
|
| + return result;
|
| +}
|
| +#endif // SK_SUPPORT_ETC1
|
| +
|
| static GrTexture* sk_gr_create_bitmap_texture(GrContext* ctx,
|
| bool cache,
|
| const GrTextureParams* params,
|
| @@ -172,7 +223,16 @@ static GrTexture* sk_gr_create_bitmap_texture(GrContext* ctx,
|
| bitmap = &tmpBitmap;
|
| desc.fConfig = SkImageInfo2GrPixelConfig(bitmap->info());
|
| }
|
| +
|
| + // Is this an ETC1 encoded texture?
|
| +#if SK_SUPPORT_ETC1
|
| + } else if (cache && ctx->getGpu()->caps()->isConfigTexturable(kETC1_GrPixelConfig)) {
|
| + GrTexture *texture = load_etc1_texture(ctx, params, *bitmap, desc);
|
| + if (NULL != texture) {
|
| + return texture;
|
| + }
|
| }
|
| +#endif // SK_SUPPORT_ETC1
|
|
|
| SkAutoLockPixels alp(*bitmap);
|
| if (!bitmap->readyToDraw()) {
|
|
|