Index: src/utils/SkTextureCompressor_LATC.cpp |
diff --git a/src/utils/SkTextureCompressor_LATC.cpp b/src/utils/SkTextureCompressor_LATC.cpp |
index 9d42b4f71dcdeff40544ac7f9ae907bf407d3b0a..5db0fc6c04e609c4ad3c72a0393a3ec9ee870e51 100644 |
--- a/src/utils/SkTextureCompressor_LATC.cpp |
+++ b/src/utils/SkTextureCompressor_LATC.cpp |
@@ -17,6 +17,46 @@ |
//////////////////////////////////////////////////////////////////////////////// |
+// Generates an LATC palette. LATC constructs |
+// a palette of eight colors from LUM0 and LUM1 using the algorithm: |
+// |
+// LUM0, if lum0 > lum1 and code(x,y) == 0 |
+// LUM1, if lum0 > lum1 and code(x,y) == 1 |
+// (6*LUM0+ LUM1)/7, if lum0 > lum1 and code(x,y) == 2 |
+// (5*LUM0+2*LUM1)/7, if lum0 > lum1 and code(x,y) == 3 |
+// (4*LUM0+3*LUM1)/7, if lum0 > lum1 and code(x,y) == 4 |
+// (3*LUM0+4*LUM1)/7, if lum0 > lum1 and code(x,y) == 5 |
+// (2*LUM0+5*LUM1)/7, if lum0 > lum1 and code(x,y) == 6 |
+// ( LUM0+6*LUM1)/7, if lum0 > lum1 and code(x,y) == 7 |
+// |
+// LUM0, if lum0 <= lum1 and code(x,y) == 0 |
+// LUM1, if lum0 <= lum1 and code(x,y) == 1 |
+// (4*LUM0+ LUM1)/5, if lum0 <= lum1 and code(x,y) == 2 |
+// (3*LUM0+2*LUM1)/5, if lum0 <= lum1 and code(x,y) == 3 |
+// (2*LUM0+3*LUM1)/5, if lum0 <= lum1 and code(x,y) == 4 |
+// ( LUM0+4*LUM1)/5, if lum0 <= lum1 and code(x,y) == 5 |
+// 0, if lum0 <= lum1 and code(x,y) == 6 |
+// 255, if lum0 <= lum1 and code(x,y) == 7 |
+ |
+static const int kLATCPaletteSize = 8; |
+static void generate_latc_palette(uint8_t palette[], uint8_t lum0, uint8_t lum1) { |
+ palette[0] = lum0; |
+ palette[1] = lum1; |
+ if (lum0 > lum1) { |
+ for (int i = 1; i < 7; i++) { |
+ palette[i+1] = ((7-i)*lum0 + i*lum1) / 7; |
+ } |
+ } else { |
+ for (int i = 1; i < 5; i++) { |
+ palette[i+1] = ((5-i)*lum0 + i*lum1) / 5; |
+ } |
+ palette[6] = 0; |
+ palette[7] = 255; |
+ } |
+} |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+ |
#if COMPRESS_LATC_SLOW |
//////////////////////////////////////////////////////////////////////////////// |
@@ -79,47 +119,9 @@ static bool compress_4x4_a8_to_64bit(uint8_t* dst, const uint8_t* src, |
//////////////////////////////////////////////////////////////////////////////// |
// LATC compressed texels down into square 4x4 blocks |
-static const int kLATCPaletteSize = 8; |
static const int kLATCBlockSize = 4; |
static const int kLATCPixelsPerBlock = kLATCBlockSize * kLATCBlockSize; |
-// Generates an LATC palette. LATC constructs |
-// a palette of eight colors from LUM0 and LUM1 using the algorithm: |
-// |
-// LUM0, if lum0 > lum1 and code(x,y) == 0 |
-// LUM1, if lum0 > lum1 and code(x,y) == 1 |
-// (6*LUM0+ LUM1)/7, if lum0 > lum1 and code(x,y) == 2 |
-// (5*LUM0+2*LUM1)/7, if lum0 > lum1 and code(x,y) == 3 |
-// (4*LUM0+3*LUM1)/7, if lum0 > lum1 and code(x,y) == 4 |
-// (3*LUM0+4*LUM1)/7, if lum0 > lum1 and code(x,y) == 5 |
-// (2*LUM0+5*LUM1)/7, if lum0 > lum1 and code(x,y) == 6 |
-// ( LUM0+6*LUM1)/7, if lum0 > lum1 and code(x,y) == 7 |
-// |
-// LUM0, if lum0 <= lum1 and code(x,y) == 0 |
-// LUM1, if lum0 <= lum1 and code(x,y) == 1 |
-// (4*LUM0+ LUM1)/5, if lum0 <= lum1 and code(x,y) == 2 |
-// (3*LUM0+2*LUM1)/5, if lum0 <= lum1 and code(x,y) == 3 |
-// (2*LUM0+3*LUM1)/5, if lum0 <= lum1 and code(x,y) == 4 |
-// ( LUM0+4*LUM1)/5, if lum0 <= lum1 and code(x,y) == 5 |
-// 0, if lum0 <= lum1 and code(x,y) == 6 |
-// 255, if lum0 <= lum1 and code(x,y) == 7 |
- |
-static void generate_latc_palette(uint8_t palette[], uint8_t lum0, uint8_t lum1) { |
- palette[0] = lum0; |
- palette[1] = lum1; |
- if (lum0 > lum1) { |
- for (int i = 1; i < 7; i++) { |
- palette[i+1] = ((7-i)*lum0 + i*lum1) / 7; |
- } |
- } else { |
- for (int i = 1; i < 5; i++) { |
- palette[i+1] = ((5-i)*lum0 + i*lum1) / 5; |
- } |
- palette[6] = 0; |
- palette[7] = 255; |
- } |
-} |
- |
// Compress a block by using the bounding box of the pixels. It is assumed that |
// there are no extremal pixels in this block otherwise we would have used |
// compressBlockBBIgnoreExtremal. |
@@ -393,6 +395,24 @@ void CompressA8LATCBlockVertical(uint8_t* dst, const uint8_t block[]) { |
#endif // COMPRESS_LATC_FAST |
+void decompress_latc_block(uint8_t* dst, int dstRowBytes, const uint8_t* src) { |
+ uint64_t block = SkEndian_SwapLE64(*(reinterpret_cast<const uint64_t *>(src))); |
+ uint8_t lum0 = block & 0xFF; |
+ uint8_t lum1 = (block >> 8) & 0xFF; |
+ |
+ uint8_t palette[kLATCPaletteSize]; |
+ generate_latc_palette(palette, lum0, lum1); |
+ |
+ block >>= 16; |
+ for (int j = 0; j < 4; ++j) { |
+ for (int i = 0; i < 4; ++i) { |
+ dst[i] = palette[block & 0x7]; |
+ block >>= 3; |
+ } |
+ dst += dstRowBytes; |
+ } |
+} |
+ |
//////////////////////////////////////////////////////////////////////////////// |
namespace SkTextureCompressor { |
@@ -418,4 +438,14 @@ SkBlitter* CreateLATCBlitter(int width, int height, void* outputBuffer) { |
#endif |
} |
+void DecompressLATC(uint8_t* dst, int dstRowBytes, const uint8_t* src, int width, int height) { |
+ for (int j = 0; j < height; j += 4) { |
+ for (int i = 0; i < width; i += 4) { |
+ decompress_latc_block(dst + i, dstRowBytes, src); |
+ src += 8; |
+ } |
+ dst += 4 * dstRowBytes; |
+ } |
+} |
+ |
} // SkTextureCompressor |