| 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;
 | 
| 
 |