| Index: src/codec/SkCodec_libpng.cpp
|
| diff --git a/src/codec/SkCodec_libpng.cpp b/src/codec/SkCodec_libpng.cpp
|
| index 18574f70be705ae15a2ae959006d6399b86b2cea..33111cee67841938335fd6f7b0862d5f9ec0a9c6 100644
|
| --- a/src/codec/SkCodec_libpng.cpp
|
| +++ b/src/codec/SkCodec_libpng.cpp
|
| @@ -450,27 +450,39 @@ SkCodec::Result SkPngCodec::initializeSwizzler(const SkImageInfo& requestedInfo,
|
| return kSuccess;
|
| }
|
|
|
| +bool SkPngCodec::handleRewind() {
|
| + switch (this->rewindIfNeeded()) {
|
| + case kNoRewindNecessary_RewindState:
|
| + return true;
|
| + case kCouldNotRewind_RewindState:
|
| + return false;
|
| + case kRewound_RewindState: {
|
| + // This sets fPng_ptr and fInfo_ptr to NULL. If read_header
|
| + // succeeds, they will be repopulated, and if it fails, they will
|
| + // remain NULL. Any future accesses to fPng_ptr and fInfo_ptr will
|
| + // come through this function which will rewind and again attempt
|
| + // to reinitialize them.
|
| + this->destroyReadStruct();
|
| + png_structp png_ptr;
|
| + png_infop info_ptr;
|
| + if (read_header(this->stream(), &png_ptr, &info_ptr, NULL)) {
|
| + fPng_ptr = png_ptr;
|
| + fInfo_ptr = info_ptr;
|
| + return true;
|
| + }
|
| + return false;
|
| + }
|
| + default:
|
| + SkASSERT(false);
|
| + return false;
|
| + }
|
| +}
|
| +
|
| SkCodec::Result SkPngCodec::onGetPixels(const SkImageInfo& requestedInfo, void* dst,
|
| size_t rowBytes, const Options& options,
|
| SkPMColor ctable[], int* ctableCount) {
|
| - SkCodec::RewindState rewindState = this->rewindIfNeeded();
|
| - if (rewindState == kCouldNotRewind_RewindState) {
|
| + if (!this->handleRewind()) {
|
| return kCouldNotRewind;
|
| - } else if (rewindState == kRewound_RewindState) {
|
| - // This sets fPng_ptr and fInfo_ptr to NULL. If read_header succeeds,
|
| - // they will be repopulated, and if it fails, they will remain NULL.
|
| - // Any future accesses to fPng_ptr and fInfo_ptr will come through this
|
| - // function which will rewind and again attempt to reinitialize them.
|
| - this->destroyReadStruct();
|
| - png_structp png_ptr;
|
| - png_infop info_ptr;
|
| - if (read_header(this->stream(), &png_ptr, &info_ptr, NULL)) {
|
| - fPng_ptr = png_ptr;
|
| - fInfo_ptr = info_ptr;
|
| - } else {
|
| - return kCouldNotRewind;
|
| - }
|
| -
|
| }
|
| if (requestedInfo.dimensions() != this->getInfo().dimensions()) {
|
| return kInvalidScale;
|
| @@ -598,6 +610,10 @@ private:
|
| };
|
|
|
| SkScanlineDecoder* SkPngCodec::onGetScanlineDecoder(const SkImageInfo& dstInfo) {
|
| + if (!this->handleRewind()) {
|
| + return NULL;
|
| + }
|
| +
|
| // Check to see if scaling was requested.
|
| if (dstInfo.dimensions() != this->getInfo().dimensions()) {
|
| return NULL;
|
|
|