| Index: src/utils/SkTextureCompressor_Blitter.h
|
| diff --git a/src/utils/SkTextureCompressor_Blitter.h b/src/utils/SkTextureCompressor_Blitter.h
|
| index 93d158dad8d646e17015a9040a8f9789b83fb45e..e44a5deade5a8eb63e0dffd73b9b822e95781b42 100644
|
| --- a/src/utils/SkTextureCompressor_Blitter.h
|
| +++ b/src/utils/SkTextureCompressor_Blitter.h
|
| @@ -13,16 +13,30 @@
|
|
|
| namespace SkTextureCompressor {
|
|
|
| -// The function used to compress an A8 block. This function is expected to be
|
| -// used as a template argument to SkCompressedAlphaBlitter. The layout of the
|
| -// block is also expected to be in column-major order.
|
| -typedef void (*CompressA8Proc)(uint8_t* dst, const uint8_t block[]);
|
| -
|
| // This class implements a blitter that blits directly into a buffer that will
|
| // be used as an compressed alpha texture. We compute this buffer by
|
| // buffering scan lines and then outputting them all at once. The number of
|
| // scan lines buffered is controlled by kBlockSize
|
| -template<int BlockDim, int EncodedBlockSize, CompressA8Proc CompressionProc>
|
| +//
|
| +// The CompressorType is a struct with a bunch of static methods that provides
|
| +// the specialized compression functionality of the blitter. A complete CompressorType
|
| +// will implement the following static functions;
|
| +//
|
| +// struct CompressorType {
|
| +// // The function used to compress an A8 block. The layout of the
|
| +// // block is also expected to be in column-major order.
|
| +// static void CompressA8Vertical(uint8_t* dst, const uint8_t block[]);
|
| +//
|
| +// // The function used to compress an A8 block. The layout of the
|
| +// // block is also expected to be in row-major order.
|
| +// static void CompressA8Horizontal(uint8_t* dst, const uint8_t block[]);
|
| +//
|
| +// // The function used to update an already compressed block. This will
|
| +// // most likely be implementation dependent.
|
| +// static void UpdateBlock(uint8_t* dst, const uint8_t* src);
|
| +// };
|
| +//
|
| +template<int BlockDim, int EncodedBlockSize, typename CompressorType>
|
| class SkTCompressedAlphaBlitter : public SkBlitter {
|
| public:
|
| SkTCompressedAlphaBlitter(int width, int height, void *compressedBuffer)
|
| @@ -339,7 +353,7 @@ private:
|
| this->updateBlockColumns(block, col, colsLeft, curAlphaColumn);
|
|
|
| // Write this block
|
| - CompressionProc(outPtr, reinterpret_cast<uint8_t*>(block));
|
| + CompressorType::CompressA8Vertical(outPtr, reinterpret_cast<uint8_t*>(block));
|
| outPtr += EncodedBlockSize;
|
| curX += colsLeft;
|
| }
|
| @@ -355,7 +369,7 @@ private:
|
|
|
| // While we can keep advancing, just keep writing the block.
|
| uint8_t lastBlock[EncodedBlockSize];
|
| - CompressionProc(lastBlock, reinterpret_cast<uint8_t*>(block));
|
| + CompressorType::CompressA8Vertical(lastBlock, reinterpret_cast<uint8_t*>(block));
|
| while((finalX - curX) >= BlockDim) {
|
| memcpy(outPtr, lastBlock, EncodedBlockSize);
|
| outPtr += EncodedBlockSize;
|
| @@ -393,7 +407,7 @@ private:
|
|
|
| // If we didn't land on a block boundary, output the block...
|
| if ((curX % BlockDim) > 1) {
|
| - CompressionProc(outPtr, reinterpret_cast<uint8_t*>(block));
|
| + CompressorType::CompressA8Vertical(outPtr, reinterpret_cast<uint8_t*>(block));
|
| }
|
|
|
| fNextRun = 0;
|
|
|