| Index: src/codec/SkCodec_libpng.cpp
|
| diff --git a/src/codec/SkCodec_libpng.cpp b/src/codec/SkCodec_libpng.cpp
|
| index 250d815f6bf2aecd3204d9eb3dbc070db19166aa..9cd382092e25da6ff77cd902ab1ae85c32a8ba31 100644
|
| --- a/src/codec/SkCodec_libpng.cpp
|
| +++ b/src/codec/SkCodec_libpng.cpp
|
| @@ -15,7 +15,6 @@
|
| #include "SkSize.h"
|
| #include "SkStream.h"
|
| #include "SkSwizzler.h"
|
| -#include "SkUtils.h"
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
| // Helper macros
|
| @@ -185,7 +184,6 @@ bool SkPngCodec::decodePalette(bool premultiply, int bitDepth, int* ctableCount)
|
|
|
| // Set the new color count
|
| if (ctableCount != NULL) {
|
| - SkASSERT(256 == *ctableCount);
|
| *ctableCount = colorCount;
|
| }
|
|
|
| @@ -429,6 +427,7 @@ static bool conversion_possible(const SkImageInfo& dst, const SkImageInfo& src)
|
| SkCodec::Result SkPngCodec::initializeSwizzler(const SkImageInfo& requestedInfo,
|
| void* dst, size_t rowBytes,
|
| const Options& options,
|
| + SkPMColor ctable[],
|
| int* ctableCount) {
|
| // FIXME: Could we use the return value of setjmp to specify the type of
|
| // error?
|
| @@ -464,6 +463,11 @@ SkCodec::Result SkPngCodec::initializeSwizzler(const SkImageInfo& requestedInfo,
|
| } else {
|
| fSrcConfig = SkSwizzler::kRGBA;
|
| }
|
| +
|
| + // Copy the color table to the client if they request kIndex8 mode
|
| + copy_color_table(requestedInfo, fColorTable, ctable, ctableCount);
|
| +
|
| + // Create the swizzler. SkPngCodec retains ownership of the color table.
|
| const SkPMColor* colors = fColorTable ? fColorTable->readColors() : NULL;
|
| fSwizzler.reset(SkSwizzler::CreateSwizzler(fSrcConfig, colors, requestedInfo,
|
| dst, rowBytes, options.fZeroInitialized));
|
| @@ -520,17 +524,9 @@ SkCodec::Result SkPngCodec::onGetPixels(const SkImageInfo& requestedInfo, void*
|
| return kInvalidConversion;
|
| }
|
|
|
| - // Note that ctableCount will be modified if there is a color table
|
| + // Note that ctable and ctableCount may be modified if there is a color table
|
| const Result result = this->initializeSwizzler(requestedInfo, dst, rowBytes,
|
| - options, ctableCount);
|
| -
|
| - // Copy the color table to the client if necessary
|
| - if (kIndex_8_SkColorType == requestedInfo.colorType()) {
|
| - SkASSERT(NULL != ctable);
|
| - SkASSERT(NULL != ctableCount);
|
| - SkASSERT(NULL != fColorTable.get());
|
| - sk_memcpy32(ctable, fColorTable->readColors(), *ctableCount);
|
| - }
|
| + options, ctable, ctableCount);
|
|
|
| if (result != kSuccess) {
|
| return result;
|
| @@ -648,7 +644,8 @@ private:
|
| typedef SkScanlineDecoder INHERITED;
|
| };
|
|
|
| -SkScanlineDecoder* SkPngCodec::onGetScanlineDecoder(const SkImageInfo& dstInfo) {
|
| +SkScanlineDecoder* SkPngCodec::onGetScanlineDecoder(const SkImageInfo& dstInfo,
|
| + const Options& options, SkPMColor ctable[], int* ctableCount) {
|
| if (!this->handleRewind()) {
|
| return NULL;
|
| }
|
| @@ -666,12 +663,8 @@ SkScanlineDecoder* SkPngCodec::onGetScanlineDecoder(const SkImageInfo& dstInfo)
|
| // Note: We set dst to NULL since we do not know it yet. rowBytes is not needed,
|
| // since we'll be manually updating the dstRow, but the SkSwizzler requires it to
|
| // be at least dstInfo.minRowBytes.
|
| - Options opts;
|
| - // FIXME: Pass this in to getScanlineDecoder?
|
| - opts.fZeroInitialized = kNo_ZeroInitialized;
|
| - // FIXME: onGetScanlineDecoder does not currently have a way to get color table information
|
| - // for a kIndex8 decoder.
|
| - if (this->initializeSwizzler(dstInfo, NULL, dstInfo.minRowBytes(), opts, NULL) != kSuccess) {
|
| + if (this->initializeSwizzler(dstInfo, NULL, dstInfo.minRowBytes(), options, ctable,
|
| + ctableCount) != kSuccess) {
|
| SkCodecPrintf("failed to initialize the swizzler.\n");
|
| return NULL;
|
| }
|
|
|