Index: skia/images/SkCreateRLEPixelRef.cpp |
=================================================================== |
--- skia/images/SkCreateRLEPixelRef.cpp (revision 16859) |
+++ skia/images/SkCreateRLEPixelRef.cpp (working copy) |
@@ -1,120 +0,0 @@ |
-#include "SkChunkAlloc.h" |
-#include "SkPackBits.h" |
-#include "SkBitmap.h" |
-#include "SkPixelRef.h" |
- |
-class RLEPixelRef : public SkPixelRef { |
-public: |
- RLEPixelRef(SkBitmap::RLEPixels* rlep, SkColorTable* ctable); |
- virtual ~RLEPixelRef(); |
- |
-protected: |
- // overrides from SkPixelRef |
- virtual void* onLockPixels(SkColorTable**); |
- virtual void onUnlockPixels(); |
- |
-private: |
- SkBitmap::RLEPixels* fRLEPixels; |
- SkColorTable* fCTable; |
-}; |
- |
-RLEPixelRef::RLEPixelRef(SkBitmap::RLEPixels* rlep, SkColorTable* ctable) |
- : SkPixelRef(NULL) { |
- fRLEPixels = rlep; // we now own this ptr |
- fCTable = ctable; |
- ctable->safeRef(); |
-} |
- |
-RLEPixelRef::~RLEPixelRef() { |
- SkDELETE(fRLEPixels); |
- fCTable->safeUnref(); |
-} |
- |
-void* RLEPixelRef::onLockPixels(SkColorTable** ct) { |
- *ct = fCTable; |
- return fRLEPixels; |
-} |
- |
-void RLEPixelRef::onUnlockPixels() { |
- // nothing to do |
-} |
- |
-///////////////////////////////////////////////////////////////////////////// |
- |
-class ChunkRLEPixels : public SkBitmap::RLEPixels { |
-public: |
- ChunkRLEPixels(int width, int height, size_t chunkSize) |
- : SkBitmap::RLEPixels(width, height), fStorage(chunkSize) { |
- } |
- |
- SkChunkAlloc fStorage; |
-}; |
- |
-SkPixelRef* SkCreateRLEPixelRef(const SkBitmap& src); |
-SkPixelRef* SkCreateRLEPixelRef(const SkBitmap& src) { |
- |
- if (SkBitmap::kIndex8_Config != src.config() && |
- SkBitmap::kA8_Config != src.config()) { |
- return NULL; |
- } |
- |
- size_t maxPacked = SkPackBits::ComputeMaxSize8(src.width()); |
- |
- // estimate the rle size based on the original size |
- size_t size = src.getSize() >> 3; |
- if (size < maxPacked) { |
- size = maxPacked; |
- } |
- |
- ChunkRLEPixels* rlePixels = SkNEW_ARGS(ChunkRLEPixels, |
- (src.width(), src.height(), size)); |
- |
- uint8_t* dstRow = NULL; |
- size_t free = 0; |
- size_t totalPacked = 0; |
- |
- for (int y = 0; y < src.height(); y++) { |
- const uint8_t* srcRow = src.getAddr8(0, y); |
- |
- if (free < maxPacked) { |
- dstRow = (uint8_t*)rlePixels->fStorage.allocThrow(size); |
- free = size; |
- } |
- size_t packedSize = SkPackBits::Pack8(srcRow, src.width(), dstRow); |
- SkASSERT(packedSize <= free); |
- rlePixels->setPackedAtY(y, dstRow); |
- |
- dstRow += packedSize; |
- free -= packedSize; |
- |
- totalPacked += packedSize; |
- } |
- |
-//#ifdef SK_DEBUG |
-#if 0 |
- // test |
- uint8_t* buffer = new uint8_t[src.width()]; |
- for (int y = 0; y < src.height(); y++) { |
- const uint8_t* srcRow = src.getAddr8(0, y); |
- SkPackBits::Unpack8(buffer, 0, src.width(), rlePixels->packedAtY(y)); |
- int n = memcmp(buffer, srcRow, src.width()); |
- if (n) { |
- SkDebugf("----- memcmp returned %d on line %d\n", n, y); |
- } |
- SkASSERT(n == 0); |
- } |
- delete[] buffer; |
- |
- size_t totalAlloc = src.height() * sizeof(uint8_t*) + totalPacked; |
- |
- SkDebugf("--- RLE: orig [%d %d] %d, rle %d %d savings %g\n", |
- src.width(), src.height(), src.getSize(), |
- src.height() * sizeof(uint8_t*), totalPacked, |
- (float)totalAlloc / src.getSize()); |
- |
-#endif |
- |
- // transfer ownership of rlePixels to our pixelref |
- return SkNEW_ARGS(RLEPixelRef, (rlePixels, src.getColorTable())); |
-} |
- |