| Index: src/codec/SkPngCodec.cpp
|
| diff --git a/src/codec/SkPngCodec.cpp b/src/codec/SkPngCodec.cpp
|
| index 66215a6c73eef2ffa6206ab30795b6b7d544932c..9691f12d4d6b210245d1a0992b5853a20b5fb3cc 100644
|
| --- a/src/codec/SkPngCodec.cpp
|
| +++ b/src/codec/SkPngCodec.cpp
|
| @@ -11,11 +11,29 @@
|
| #include "SkBitmap.h"
|
| #include "SkMath.h"
|
| #include "SkPngCodec.h"
|
| +#include "SkPngFilters.h"
|
| #include "SkSize.h"
|
| #include "SkStream.h"
|
| #include "SkSwizzler.h"
|
| #include "SkTemplates.h"
|
|
|
| +#if defined(__SSE2__)
|
| + #include "pngstruct.h"
|
| +
|
| + extern "C" void sk_png_init_filter_functions_sse2(png_structp png, unsigned int bpp) {
|
| + if (bpp == 3) {
|
| + png->read_filter[PNG_FILTER_VALUE_SUB -1] = sk_sub3_sse2;
|
| + png->read_filter[PNG_FILTER_VALUE_AVG -1] = sk_avg3_sse2;
|
| + png->read_filter[PNG_FILTER_VALUE_PAETH-1] = sk_paeth3_sse2;
|
| + }
|
| + if (bpp == 4) {
|
| + png->read_filter[PNG_FILTER_VALUE_SUB -1] = sk_sub4_sse2;
|
| + png->read_filter[PNG_FILTER_VALUE_AVG -1] = sk_avg4_sse2;
|
| + png->read_filter[PNG_FILTER_VALUE_PAETH-1] = sk_paeth4_sse2;
|
| + }
|
| + }
|
| +#endif
|
| +
|
| ///////////////////////////////////////////////////////////////////////////////
|
| // Helper macros
|
| ///////////////////////////////////////////////////////////////////////////////
|
| @@ -331,8 +349,8 @@ static bool read_header(SkStream* stream, SkPngChunkReader* chunkReader,
|
| }
|
| break;
|
| case PNG_COLOR_TYPE_GRAY_ALPHA:
|
| - //FIXME: support gray with alpha as a color type
|
| - //convert to RGBA
|
| + //FIXME: support gray with alpha as a color type
|
| + //convert to RGBA
|
| png_set_gray_to_rgb(png_ptr);
|
| skColorType = kN32_SkColorType;
|
| skAlphaType = kUnpremul_SkAlphaType;
|
| @@ -406,7 +424,7 @@ SkCodec::Result SkPngCodec::initializeSwizzler(const SkImageInfo& requestedInfo,
|
| SkCodecPrintf("setjmp long jump!\n");
|
| return kInvalidInput;
|
| }
|
| - png_read_update_info(fPng_ptr, fInfo_ptr);
|
| + png_read_update_info(fPng_ptr, fInfo_ptr);
|
|
|
| //srcColorType was determined in read_header() which determined png color type
|
| const SkColorType srcColorType = this->getInfo().colorType();
|
| @@ -422,7 +440,7 @@ SkCodec::Result SkPngCodec::initializeSwizzler(const SkImageInfo& requestedInfo,
|
| break;
|
| case kGray_8_SkColorType:
|
| fSrcConfig = SkSwizzler::kGray;
|
| - break;
|
| + break;
|
| case kN32_SkColorType:
|
| if (this->getInfo().alphaType() == kOpaque_SkAlphaType) {
|
| fSrcConfig = SkSwizzler::kRGB;
|
| @@ -433,7 +451,7 @@ SkCodec::Result SkPngCodec::initializeSwizzler(const SkImageInfo& requestedInfo,
|
| default:
|
| //would have exited before now if the colorType was supported by png
|
| SkASSERT(false);
|
| - }
|
| + }
|
|
|
| // Copy the color table to the client if they request kIndex8 mode
|
| copy_color_table(requestedInfo, fColorTable, ctable, ctableCount);
|
| @@ -624,8 +642,8 @@ public:
|
| SkCodecPrintf("setjmp long jump!\n");
|
| return false;
|
| }
|
| - //there is a potential tradeoff of memory vs speed created by putting this in a loop.
|
| - //calling png_read_rows in a loop is insignificantly slower than calling it once with count
|
| + //there is a potential tradeoff of memory vs speed created by putting this in a loop.
|
| + //calling png_read_rows in a loop is insignificantly slower than calling it once with count
|
| //as png_read_rows has it's own loop which calls png_read_row count times.
|
| for (int row = 0; row < count; row++) {
|
| png_read_rows(this->png_ptr(), &fSrcRow, png_bytepp_NULL, 1);
|
| @@ -656,7 +674,7 @@ public:
|
| Result onStartScanlineDecode(const SkImageInfo& dstInfo, const Options& options,
|
| SkPMColor ctable[], int* ctableCount) override {
|
| if (!conversion_possible(dstInfo, this->getInfo())) {
|
| - return kInvalidConversion;
|
| + return kInvalidConversion;
|
| }
|
|
|
| const Result result = this->initializeSwizzler(dstInfo, options, ctable,
|
|
|