Index: src/utils/SkTextureCompressor_ASTC.cpp |
diff --git a/src/utils/SkTextureCompressor_ASTC.cpp b/src/utils/SkTextureCompressor_ASTC.cpp |
index 774fd157feda2a3d4e6b51d3d81483ed248cdbdd..402588e746aefd6ceac4e08e1cffe5fb093adc09 100644 |
--- a/src/utils/SkTextureCompressor_ASTC.cpp |
+++ b/src/utils/SkTextureCompressor_ASTC.cpp |
@@ -6,6 +6,7 @@ |
*/ |
#include "SkTextureCompressor_ASTC.h" |
+#include "SkTextureCompressor_Blitter.h" |
#include "SkBlitter.h" |
#include "SkEndian.h" |
@@ -132,13 +133,17 @@ static const int8_t k6x5To12x12Table[30][60] = { |
// Returns the alpha value of a texel at position (x, y) from src. |
// (x, y) are assumed to be in the range [0, 12). |
-static inline uint8_t get_alpha(const uint8_t *src, int rowBytes, int x, int y) { |
+inline uint8_t GetAlpha(const uint8_t *src, int rowBytes, int x, int y) { |
SkASSERT(x >= 0 && x < 12); |
SkASSERT(y >= 0 && y < 12); |
SkASSERT(rowBytes >= 12); |
return *(src + y*rowBytes + x); |
} |
+inline uint8_t GetAlphaTranspose(const uint8_t *src, int rowBytes, int x, int y) { |
+ return GetAlpha(src, rowBytes, y, x); |
+} |
+ |
// Output the 16 bytes stored in top and bottom and advance the pointer. The bytes |
// are stored as the integers are represented in memory, so they should be swapped |
// if necessary. |
@@ -151,6 +156,9 @@ static inline void send_packing(uint8_t** dst, const uint64_t top, const uint64_ |
// Compresses an ASTC block, by looking up the proper contributions from |
// k6x5To12x12Table and computing an index from the associated values. |
+typedef uint8_t (*GetAlphaProc)(const uint8_t* src, int rowBytes, int x, int y); |
+ |
+template<GetAlphaProc getAlphaProc> |
static void compress_a8_astc_block(uint8_t** dst, const uint8_t* src, int rowBytes) { |
// Check for single color |
bool constant = true; |
@@ -186,7 +194,7 @@ static void compress_a8_astc_block(uint8_t** dst, const uint8_t* src, int rowByt |
const int x = k6x5To12x12Table[idx][w*3 + 1]; |
const int y = k6x5To12x12Table[idx][w*3 + 2]; |
weightTot += weight; |
- alphaTot += weight * get_alpha(src, rowBytes, x, y); |
+ alphaTot += weight * getAlphaProc(src, rowBytes, x, y); |
} else { |
// In our table, not every entry has 20 weights, and all |
// of them are nonzero. Once we hit a negative weight, we |
@@ -248,6 +256,10 @@ static void compress_a8_astc_block(uint8_t** dst, const uint8_t* src, int rowByt |
send_packing(dst, SkEndian_SwapLE64(top), SkEndian_SwapLE64(bottom)); |
} |
+inline void compress_a8_astc_block_vertical(uint8_t* dst, const uint8_t* src) { |
+ compress_a8_astc_block<GetAlphaTranspose>(&dst, src, 12); |
+} |
+ |
//////////////////////////////////////////////////////////////////////////////// |
namespace SkTextureCompressor { |
@@ -260,7 +272,7 @@ bool CompressA8To12x12ASTC(uint8_t* dst, const uint8_t* src, int width, int heig |
uint8_t** dstPtr = &dst; |
for (int y = 0; y < height; y+=12) { |
for (int x = 0; x < width; x+=12) { |
- compress_a8_astc_block(dstPtr, src + y*rowBytes + x, rowBytes); |
+ compress_a8_astc_block<GetAlpha>(dstPtr, src + y*rowBytes + x, rowBytes); |
} |
} |
@@ -268,8 +280,9 @@ bool CompressA8To12x12ASTC(uint8_t* dst, const uint8_t* src, int width, int heig |
} |
SkBlitter* CreateASTCBlitter(int width, int height, void* outputBuffer) { |
- // TODO (krajcevski) |
- return NULL; |
+ return new |
+ SkTCompressedAlphaBlitter<12, 16, compress_a8_astc_block_vertical> |
+ (width, height, outputBuffer); |
} |
} // SkTextureCompressor |