Index: src/utils/SkTextureCompressor_R11EAC.cpp |
diff --git a/src/utils/SkTextureCompressor_R11EAC.cpp b/src/utils/SkTextureCompressor_R11EAC.cpp |
index 7baa219a28de88d05e2a6966b85b9d45ab2534e6..6410715bf745e374d2bfa3793a5cf3a85f504e26 100644 |
--- a/src/utils/SkTextureCompressor_R11EAC.cpp |
+++ b/src/utils/SkTextureCompressor_R11EAC.cpp |
@@ -8,6 +8,7 @@ |
#include "SkTextureCompressor.h" |
#include "SkTextureCompressor_Blitter.h" |
+#include "SkBlitter.h" |
#include "SkEndian.h" |
// #define COMPRESS_R11_EAC_SLOW 1 |
@@ -608,9 +609,26 @@ bool CompressA8ToR11EAC(uint8_t* dst, const uint8_t* src, int width, int height, |
#endif |
} |
-SkBlitter* CreateR11EACBlitter(int width, int height, void* outputBuffer) { |
- return new |
- SkTCompressedAlphaBlitter<4, 8, compress_block_vertical> |
+SkBlitter* CreateR11EACBlitter(int width, int height, void* outputBuffer, |
+ SkTBlitterAllocator* allocator) { |
+ |
+ if ((width % 4) != 0 || (height % 4) != 0) { |
+ return NULL; |
+ } |
+ |
+ // Memset the output buffer to an encoding that decodes to zero... |
+ // In the case of ASTC, if everything index is zero, then the interpolated value |
+ // will decode to zero provided we have the right header. We use the encoding |
+ // from recognizing all zero blocks from above. |
+ const int nBlocks = (width * height / 16); |
+ uint64_t *dst = reinterpret_cast<uint64_t *>(outputBuffer); |
+ for (int i = 0; i < nBlocks; ++i) { |
+ *dst = 0x0020000000002000ULL; |
+ ++dst; |
+ } |
+ |
+ return allocator->createT< |
+ SkTCompressedAlphaBlitter<4, 8, compress_block_vertical>, int, int, void*> |
(width, height, outputBuffer); |
} |