ec3ed6a5eb
I have manually examined all of these diffs and restored a few files that seem to require manual adjustment. The following files still need to be modified manually, in a separate CL: android_sample/SampleApp/AndroidManifest.xml android_sample/SampleApp/res/layout/layout.xml android_sample/SampleApp/res/menu/sample.xml android_sample/SampleApp/res/values/strings.xml android_sample/SampleApp/src/com/skia/sampleapp/SampleApp.java android_sample/SampleApp/src/com/skia/sampleapp/SampleView.java experimental/CiCarbonSampleMain.c experimental/CocoaDebugger/main.m experimental/FileReaderApp/main.m experimental/SimpleCocoaApp/main.m experimental/iOSSampleApp/Shared/SkAlertPrompt.h experimental/iOSSampleApp/Shared/SkAlertPrompt.m experimental/iOSSampleApp/SkiOSSampleApp-Base.xcconfig experimental/iOSSampleApp/SkiOSSampleApp-Debug.xcconfig experimental/iOSSampleApp/SkiOSSampleApp-Release.xcconfig gpu/src/android/GrGLDefaultInterface_android.cpp gyp/common.gypi gyp_skia include/ports/SkHarfBuzzFont.h include/views/SkOSWindow_wxwidgets.h make.bat make.py src/opts/memset.arm.S src/opts/memset16_neon.S src/opts/memset32_neon.S src/opts/opts_check_arm.cpp src/ports/SkDebug_brew.cpp src/ports/SkMemory_brew.cpp src/ports/SkOSFile_brew.cpp src/ports/SkXMLParser_empty.cpp src/utils/ios/SkImageDecoder_iOS.mm src/utils/ios/SkOSFile_iOS.mm src/utils/ios/SkStream_NSData.mm tests/FillPathTest.cpp Review URL: http://codereview.appspot.com/4816058 git-svn-id: http://skia.googlecode.com/svn/trunk@1982 2bbb7eff-a529-9590-31e7-b0007b416f81
128 lines
3.4 KiB
C++
128 lines
3.4 KiB
C++
|
|
/*
|
|
* Copyright 2011 Google Inc.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
#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;
|
|
SkSafeRef(ctable);
|
|
}
|
|
|
|
RLEPixelRef::~RLEPixelRef() {
|
|
SkDELETE(fRLEPixels);
|
|
SkSafeUnref(fCTable);
|
|
}
|
|
|
|
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()));
|
|
}
|
|
|