Index: cc/resources/tile_task_worker_pool.cc |
diff --git a/cc/resources/tile_task_worker_pool.cc b/cc/resources/tile_task_worker_pool.cc |
index 1c0d6b980edfb273cbaa0bb28d0e87edd8edf309..2e308477a2f35ba783ee20938810ef753a45eeff 100644 |
--- a/cc/resources/tile_task_worker_pool.cc |
+++ b/cc/resources/tile_task_worker_pool.cc |
@@ -12,6 +12,7 @@ |
#include "base/threading/simple_thread.h" |
#include "cc/base/scoped_ptr_deque.h" |
#include "cc/resources/raster_source.h" |
+#include "cc/resources/texture_compress/texture_compress.h" |
#include "skia/ext/refptr.h" |
#include "third_party/skia/include/core/SkCanvas.h" |
#include "third_party/skia/include/core/SkSurface.h" |
@@ -195,6 +196,11 @@ void TileTaskWorkerPool::InsertNodesForRasterTask( |
static bool IsSupportedPlaybackToMemoryFormat(ResourceFormat format) { |
switch (format) { |
+ case ATC: |
+ case ATC_IA: |
+ case DXT1: |
+ case DXT5: |
+ case ETC1: |
case RGBA_4444: |
case RGBA_8888: |
case BGRA_8888: |
@@ -202,7 +208,6 @@ static bool IsSupportedPlaybackToMemoryFormat(ResourceFormat format) { |
case ALPHA_8: |
case LUMINANCE_8: |
case RGB_565: |
- case ETC1: |
case RED_8: |
return false; |
} |
@@ -220,6 +225,51 @@ void TileTaskWorkerPool::PlaybackToMemory(void* memory, |
float scale) { |
DCHECK(IsSupportedPlaybackToMemoryFormat(format)) << format; |
+ if (IsFormatCompressed(format)) { |
+ SkBitmap bitmap; |
+ bitmap.allocN32Pixels(size.width(), size.height()); |
+ |
+ SkCanvas canvas(bitmap); |
+ raster_source->PlaybackToCanvas(&canvas, rect, scale); |
+ |
+ switch (format) { |
+ case ATC: |
+ texture_compress::CompressATC( |
+ reinterpret_cast<const uint8_t*>(bitmap.getPixels()), |
+ reinterpret_cast<uint8_t*>(memory), bitmap.width(), |
+ bitmap.height()); |
+ break; |
+ case ATC_IA: |
+ texture_compress::CompressATCIA( |
+ reinterpret_cast<const uint8_t*>(bitmap.getPixels()), |
+ reinterpret_cast<uint8_t*>(memory), bitmap.width(), |
+ bitmap.height()); |
+ break; |
+ case DXT1: |
+ texture_compress::CompressDXT1( |
+ reinterpret_cast<const uint8_t*>(bitmap.getPixels()), |
+ reinterpret_cast<uint8_t*>(memory), bitmap.width(), |
+ bitmap.height()); |
+ break; |
+ case DXT5: |
+ texture_compress::CompressDXT5( |
+ reinterpret_cast<const uint8_t*>(bitmap.getPixels()), |
+ reinterpret_cast<uint8_t*>(memory), bitmap.width(), |
+ bitmap.height()); |
+ break; |
+ case ETC1: |
+ texture_compress::CompressETC1( |
+ reinterpret_cast<const uint8_t*>(bitmap.getPixels()), |
+ reinterpret_cast<uint8_t*>(memory), bitmap.width(), |
+ bitmap.height()); |
+ break; |
+ default: |
+ NOTREACHED(); |
+ break; |
+ } |
+ return; |
+ } |
+ |
// Uses kPremul_SkAlphaType since the result is not known to be opaque. |
SkImageInfo info = |
SkImageInfo::MakeN32(size.width(), size.height(), kPremul_SkAlphaType); |