skia2/src/images/SkCreateRLEPixelRef.cpp
epoger@google.com ec3ed6a5eb Automatic update of all copyright notices to reflect new license terms.
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
2011-07-28 14:26:00 +00:00

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()));
}