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); |