Chromium Code Reviews| Index: src/codec/SkJpegCodec.cpp |
| diff --git a/src/codec/SkJpegCodec.cpp b/src/codec/SkJpegCodec.cpp |
| index 84e90d444249142d69a68cd52cab59cebb37c30a..e160f0c4e29a124aa09b03fcb6fd8dea37f57b0e 100644 |
| --- a/src/codec/SkJpegCodec.cpp |
| +++ b/src/codec/SkJpegCodec.cpp |
| @@ -389,13 +389,47 @@ SkCodec::Result SkJpegCodec::onGetPixels(const SkImageInfo& dstInfo, |
| */ |
| class SkJpegScanlineDecoder : public SkScanlineDecoder { |
| public: |
| - SkJpegScanlineDecoder(const SkImageInfo& dstInfo, SkJpegCodec* codec, |
| - const SkCodec::Options& opts) |
| - : INHERITED(dstInfo) |
| + SkJpegScanlineDecoder(const SkImageInfo& srcInfo, SkJpegCodec* codec) |
| + : INHERITED(srcInfo) |
| , fCodec(codec) |
| - , fOpts(opts) |
| + , fOpts() |
|
scroggo_chromium
2015/08/03 18:35:58
The latest patch is a rebase, but I had to make so
|
| {} |
| + SkCodec::Result onStart(const SkImageInfo& dstInfo, const SkCodec::Options& options, |
| + SkPMColor ctable[], int* ctableCount) override { |
| + |
| + // Rewind the stream if needed |
| + if (!fCodec->handleRewind()) { |
| + return SkCodec::kCouldNotRewind; |
| + } |
| + |
| + // Set the jump location for libjpeg errors |
| + if (setjmp(fCodec->fDecoderMgr->getJmpBuf())) { |
| + SkCodecPrintf("setjmp: Error from libjpeg\n"); |
| + return SkCodec::kInvalidInput; |
| + } |
| + |
| + // Check if we can decode to the requested destination and set the output color space |
| + if (!fCodec->setOutputColorSpace(dstInfo)) { |
| + return SkCodec::kInvalidConversion; |
| + } |
| + |
| + // Perform the necessary scaling |
| + if (!fCodec->scaleToDimensions(dstInfo.width(), dstInfo.height())) { |
| + return SkCodec::kInvalidScale; |
| + } |
| + |
| + // Now, given valid output dimensions, we can start the decompress |
| + if (!turbo_jpeg_start_decompress(fCodec->fDecoderMgr->dinfo())) { |
| + SkCodecPrintf("start decompress failed\n"); |
| + return SkCodec::kInvalidInput; |
| + } |
| + |
| + fOpts = options; |
| + |
| + return SkCodec::kSuccess; |
| + } |
| + |
| virtual ~SkJpegScanlineDecoder() { |
| if (setjmp(fCodec->fDecoderMgr->getJmpBuf())) { |
| SkCodecPrintf("setjmp: Error in libjpeg finish_decompress\n"); |
| @@ -464,53 +498,18 @@ public: |
| private: |
| SkAutoTDelete<SkJpegCodec> fCodec; |
| - const SkCodec::Options& fOpts; |
| + SkCodec::Options fOpts; |
| typedef SkScanlineDecoder INHERITED; |
| }; |
| -SkScanlineDecoder* SkJpegCodec::onGetScanlineDecoder(const SkImageInfo& dstInfo, |
| - const Options& options, SkPMColor ctable[], int* ctableCount) { |
| - |
| - // Rewind the stream if needed |
| - if (!this->handleRewind()) { |
| - SkCodecPrintf("Could not rewind\n"); |
| - return NULL; |
| - } |
| - |
| - // Set the jump location for libjpeg errors |
| - if (setjmp(fDecoderMgr->getJmpBuf())) { |
| - SkCodecPrintf("setjmp: Error from libjpeg\n"); |
| - return NULL; |
| - } |
| - |
| - SkStream* stream = this->stream()->duplicate(); |
| - if (!stream) { |
| - return NULL; |
| - } |
| +SkScanlineDecoder* SkJpegCodec::NewSDFromStream(SkStream* stream) { |
| SkAutoTDelete<SkJpegCodec> codec(static_cast<SkJpegCodec*>(SkJpegCodec::NewFromStream(stream))); |
| if (!codec) { |
| return NULL; |
| } |
| - // Check if we can decode to the requested destination and set the output color space |
| - if (!codec->setOutputColorSpace(dstInfo)) { |
| - SkCodecPrintf("Cannot convert to output type\n"); |
| - return NULL; |
| - } |
| - |
| - // Perform the necessary scaling |
| - if (!codec->scaleToDimensions(dstInfo.width(), dstInfo.height())) { |
| - SkCodecPrintf("Cannot scale to output dimensions\n"); |
| - return NULL; |
| - } |
| - |
| - // Now, given valid output dimensions, we can start the decompress |
| - if (!turbo_jpeg_start_decompress(codec->fDecoderMgr->dinfo())) { |
| - SkCodecPrintf("start decompress failed\n"); |
| - return NULL; |
| - } |
| - |
| + const SkImageInfo& srcInfo = codec->getInfo(); |
| // Return the new scanline decoder |
| - return SkNEW_ARGS(SkJpegScanlineDecoder, (dstInfo, codec.detach(), options)); |
| + return SkNEW_ARGS(SkJpegScanlineDecoder, (srcInfo, codec.detach())); |
| } |