Chromium Code Reviews| Index: src/gpu/SkGr.cpp |
| diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp |
| index 6bd04dec3a841ac8186b8644ab212aca6512fba8..4e18b3d2042ab4b9e6a567c5c4e6e1e362aff00e 100644 |
| --- a/src/gpu/SkGr.cpp |
| +++ b/src/gpu/SkGr.cpp |
| @@ -8,9 +8,14 @@ |
| #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" |
| + |
| +#include "etc1.h" |
| /* Fill out buffer with the compressed format Ganesh expects from a colortable |
| based bitmap. [palette (colortable) + indices]. |
| @@ -172,6 +177,46 @@ static GrTexture* sk_gr_create_bitmap_texture(GrContext* ctx, |
| bitmap = &tmpBitmap; |
| desc.fConfig = SkImageInfo2GrPixelConfig(bitmap->info()); |
| } |
| + } else if (cache && ctx->getGpu()->caps()->isConfigTexturable(kETC1_GrPixelConfig)) { |
| + SkData *data = bitmap->pixelRef()->refEncodedData(); |
|
robertphillips
2014/05/30 15:00:22
What do you think about making this a static funct
krajcevski
2014/05/30 16:21:50
Sounds good to me.
Done.
|
| + do { |
| + // Is this even encoded data? |
| + if (NULL == data) { |
| + break; |
| + } |
| + |
| + // Is this a valid PKM encoded data? |
| + const uint8_t *bytes = data->bytes(); |
| + if (!etc1_pkm_is_valid(bytes)) { |
| + break; |
| + } |
| + |
| + 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>(bitmap->width()) || |
| + encodedHeight != static_cast<uint32_t>(bitmap->height())) { |
| + break; |
| + } |
| + |
| + // 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(origBitmap, &cacheID); |
| + |
| + GrResourceKey key; |
| + GrTexture* result = ctx->createTexture(params, desc, cacheID, bytes, 0, &key); |
| + if (NULL != result) { |
| + add_genID_listener(key, origBitmap.pixelRef()); |
| + } |
| + return result; |
| + |
| + } while(0); |
| } |
| SkAutoLockPixels alp(*bitmap); |