| Index: src/codec/SkCodec_libpng.cpp
|
| diff --git a/src/codec/SkCodec_libpng.cpp b/src/codec/SkCodec_libpng.cpp
|
| index 6916ba7c39496c5e70c1e9847609bf1014109d12..e8fd2a3cdd05485a8064dd90d418a29769a88b8d 100644
|
| --- a/src/codec/SkCodec_libpng.cpp
|
| +++ b/src/codec/SkCodec_libpng.cpp
|
| @@ -154,7 +154,6 @@ bool SkPngCodec::decodePalette(bool premultiply, int* ctableCount) {
|
| }
|
|
|
| int index = 0;
|
| - int transLessThanFF = 0;
|
|
|
| // Choose which function to use to create the color table. If the final destination's
|
| // colortype is unpremultiplied, the color table will store unpremultiplied colors.
|
| @@ -165,16 +164,10 @@ bool SkPngCodec::decodePalette(bool premultiply, int* ctableCount) {
|
| proc = &SkPackARGB32NoCheck;
|
| }
|
| for (; index < numTrans; index++) {
|
| - transLessThanFF |= (int)*trans - 0xFF;
|
| *colorPtr++ = proc(*trans++, palette->red, palette->green, palette->blue);
|
| palette++;
|
| }
|
|
|
| - if (transLessThanFF >= 0) {
|
| - // No transparent colors were found.
|
| - fAlphaState = kOpaque_AlphaState;
|
| - }
|
| -
|
| for (; index < numPalette; index++) {
|
| *colorPtr++ = SkPackARGB32(0xFF, palette->red, palette->green, palette->blue);
|
| palette++;
|
| @@ -385,13 +378,7 @@ SkPngCodec::SkPngCodec(const SkImageInfo& info, SkStream* stream, SkPngChunkRead
|
| , fSrcConfig(SkSwizzler::kUnknown)
|
| , fNumberPasses(numberPasses)
|
| , fBitDepth(bitDepth)
|
| -{
|
| - if (info.alphaType() == kOpaque_SkAlphaType) {
|
| - fAlphaState = kOpaque_AlphaState;
|
| - } else {
|
| - fAlphaState = kUnknown_AlphaState;
|
| - }
|
| -}
|
| +{}
|
|
|
| SkPngCodec::~SkPngCodec() {
|
| this->destroyReadStruct();
|
| @@ -527,7 +514,6 @@ SkCodec::Result SkPngCodec::onGetPixels(const SkImageInfo& requestedInfo, void*
|
| return kIncompleteInput;
|
| }
|
|
|
| - bool hasAlpha = false;
|
| // FIXME: We could split these out based on subclass.
|
| void* dstRow = dst;
|
| if (fNumberPasses > 1) {
|
| @@ -551,7 +537,7 @@ SkCodec::Result SkPngCodec::onGetPixels(const SkImageInfo& requestedInfo, void*
|
| // Now swizzle it.
|
| uint8_t* srcRow = base;
|
| for (int y = 0; y < height; y++) {
|
| - hasAlpha |= !SkSwizzler::IsOpaque(fSwizzler->swizzle(dstRow, srcRow));
|
| + fSwizzler->swizzle(dstRow, srcRow);
|
| dstRow = SkTAddOffset<void>(dstRow, dstRowBytes);
|
| srcRow += srcRowBytes;
|
| }
|
| @@ -561,17 +547,11 @@ SkCodec::Result SkPngCodec::onGetPixels(const SkImageInfo& requestedInfo, void*
|
| for (; row < requestedInfo.height(); row++) {
|
| png_read_rows(fPng_ptr, &srcRow, png_bytepp_NULL, 1);
|
| // FIXME: Only call IsOpaque once, outside the loop. Same for onGetScanlines.
|
| - hasAlpha |= !SkSwizzler::IsOpaque(fSwizzler->swizzle(dstRow, srcRow));
|
| + fSwizzler->swizzle(dstRow, srcRow);
|
| dstRow = SkTAddOffset<void>(dstRow, dstRowBytes);
|
| }
|
| }
|
|
|
| - if (hasAlpha) {
|
| - fAlphaState = kHasAlpha_AlphaState;
|
| - } else {
|
| - fAlphaState = kOpaque_AlphaState;
|
| - }
|
| -
|
| // FIXME: do we need substituteTranspColor? Note that we cannot do it for
|
| // scanline decoding, but we could do it here. Alternatively, we could do
|
| // it as we go, instead of in post-processing like SkPNGImageDecoder.
|
| @@ -595,38 +575,12 @@ uint32_t SkPngCodec::onGetFillValue(SkColorType colorType, SkAlphaType alphaType
|
| return INHERITED::onGetFillValue(colorType, alphaType);
|
| }
|
|
|
| -bool SkPngCodec::onReallyHasAlpha() const {
|
| - switch (fAlphaState) {
|
| - case kOpaque_AlphaState:
|
| - return false;
|
| - case kUnknown_AlphaState:
|
| - // Maybe the subclass knows?
|
| - return this->alphaInScanlineDecode() == kHasAlpha_AlphaState;
|
| - case kHasAlpha_AlphaState:
|
| - switch (this->alphaInScanlineDecode()) {
|
| - case kUnknown_AlphaState:
|
| - // Scanline decoder must not have been used. Return our knowledge.
|
| - return true;
|
| - case kOpaque_AlphaState:
|
| - // Scanline decoder was used, and did not find alpha in its subset.
|
| - return false;
|
| - case kHasAlpha_AlphaState:
|
| - return true;
|
| - }
|
| - }
|
| -
|
| - // All valid AlphaStates have been covered, so this should not be reached.
|
| - SkASSERT(false);
|
| - return true;
|
| -}
|
| -
|
| // Subclass of SkPngCodec which supports scanline decoding
|
| class SkPngScanlineDecoder : public SkPngCodec {
|
| public:
|
| SkPngScanlineDecoder(const SkImageInfo& srcInfo, SkStream* stream,
|
| SkPngChunkReader* chunkReader, png_structp png_ptr, png_infop info_ptr, int bitDepth)
|
| : INHERITED(srcInfo, stream, chunkReader, png_ptr, info_ptr, bitDepth, 1)
|
| - , fAlphaState(kUnknown_AlphaState)
|
| , fSrcRow(nullptr)
|
| {}
|
|
|
| @@ -642,7 +596,6 @@ public:
|
| return result;
|
| }
|
|
|
| - fAlphaState = kUnknown_AlphaState;
|
| fStorage.reset(this->getInfo().width() * SkSwizzler::BytesPerPixel(this->srcConfig()));
|
| fSrcRow = fStorage.get();
|
|
|
| @@ -658,22 +611,12 @@ public:
|
| }
|
|
|
| void* dstRow = dst;
|
| - bool hasAlpha = false;
|
| for (; row < count; row++) {
|
| png_read_rows(this->png_ptr(), &fSrcRow, png_bytepp_NULL, 1);
|
| - hasAlpha |= !SkSwizzler::IsOpaque(this->swizzler()->swizzle(dstRow, fSrcRow));
|
| + this->swizzler()->swizzle(dstRow, fSrcRow);
|
| dstRow = SkTAddOffset<void>(dstRow, rowBytes);
|
| }
|
|
|
| - if (hasAlpha) {
|
| - fAlphaState = kHasAlpha_AlphaState;
|
| - } else {
|
| - if (kUnknown_AlphaState == fAlphaState) {
|
| - fAlphaState = kOpaque_AlphaState;
|
| - }
|
| - // Otherwise, the AlphaState is unchanged.
|
| - }
|
| -
|
| return row;
|
| }
|
|
|
| @@ -692,12 +635,7 @@ public:
|
| return true;
|
| }
|
|
|
| - AlphaState alphaInScanlineDecode() const override {
|
| - return fAlphaState;
|
| - }
|
| -
|
| private:
|
| - AlphaState fAlphaState;
|
| SkAutoTMalloc<uint8_t> fStorage;
|
| uint8_t* fSrcRow;
|
|
|
| @@ -711,7 +649,6 @@ public:
|
| SkPngChunkReader* chunkReader, png_structp png_ptr, png_infop info_ptr,
|
| int bitDepth, int numberPasses)
|
| : INHERITED(srcInfo, stream, chunkReader, png_ptr, info_ptr, bitDepth, numberPasses)
|
| - , fAlphaState(kUnknown_AlphaState)
|
| , fHeight(-1)
|
| , fCanSkipRewind(false)
|
| {
|
| @@ -730,7 +667,6 @@ public:
|
| return result;
|
| }
|
|
|
| - fAlphaState = kUnknown_AlphaState;
|
| fHeight = dstInfo.height();
|
| // FIXME: This need not be called on a second call to onStartScanlineDecode.
|
| fSrcRowBytes = this->getInfo().width() * SkSwizzler::BytesPerPixel(this->srcConfig());
|
| @@ -794,22 +730,12 @@ public:
|
| //swizzle the rows we care about
|
| srcRow = storagePtr;
|
| void* dstRow = dst;
|
| - bool hasAlpha = false;
|
| for (int y = 0; y < count; y++) {
|
| - hasAlpha |= !SkSwizzler::IsOpaque(this->swizzler()->swizzle(dstRow, srcRow));
|
| + this->swizzler()->swizzle(dstRow, srcRow);
|
| dstRow = SkTAddOffset<void>(dstRow, dstRowBytes);
|
| srcRow += fSrcRowBytes;
|
| }
|
|
|
| - if (hasAlpha) {
|
| - fAlphaState = kHasAlpha_AlphaState;
|
| - } else {
|
| - if (kUnknown_AlphaState == fAlphaState) {
|
| - fAlphaState = kOpaque_AlphaState;
|
| - }
|
| - // Otherwise, the AlphaState is unchanged.
|
| - }
|
| -
|
| return count;
|
| }
|
|
|
| @@ -818,16 +744,11 @@ public:
|
| return true;
|
| }
|
|
|
| - AlphaState alphaInScanlineDecode() const override {
|
| - return fAlphaState;
|
| - }
|
| -
|
| SkScanlineOrder onGetScanlineOrder() const override {
|
| return kNone_SkScanlineOrder;
|
| }
|
|
|
| private:
|
| - AlphaState fAlphaState;
|
| int fHeight;
|
| size_t fSrcRowBytes;
|
| SkAutoMalloc fGarbageRow;
|
|
|