Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(89)

Side by Side Diff: src/codec/SkJpegCodec.cpp

Issue 1288483002: Consolidate SkCodec functions for handling rewind (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright 2015 Google Inc. 2 * Copyright 2015 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkCodec.h" 8 #include "SkCodec.h"
9 #include "SkJpegCodec.h" 9 #include "SkJpegCodec.h"
10 #include "SkJpegDecoderMgr.h" 10 #include "SkJpegDecoderMgr.h"
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
182 dinfo.global_state = DSTATE_READY; 182 dinfo.global_state = DSTATE_READY;
183 dinfo.num_components = 0; 183 dinfo.num_components = 0;
184 dinfo.scale_num = num; 184 dinfo.scale_num = num;
185 dinfo.scale_denom = denom; 185 dinfo.scale_denom = denom;
186 turbo_jpeg_calc_output_dimensions(&dinfo); 186 turbo_jpeg_calc_output_dimensions(&dinfo);
187 187
188 // Return the calculated output dimensions for the given scale 188 // Return the calculated output dimensions for the given scale
189 return SkISize::Make(dinfo.output_width, dinfo.output_height); 189 return SkISize::Make(dinfo.output_width, dinfo.output_height);
190 } 190 }
191 191
192 /* 192 bool SkJpegCodec::onRewind() {
193 * Handles rewinding the input stream if it is necessary 193 JpegDecoderMgr* decoderMgr = NULL;
194 */ 194 if (!ReadHeader(this->stream(), NULL, &decoderMgr)) {
195 bool SkJpegCodec::handleRewind() { 195 return fDecoderMgr->returnFalse("could not rewind");
196 switch(this->rewindIfNeeded()) {
197 case kCouldNotRewind_RewindState:
198 return fDecoderMgr->returnFalse("could not rewind");
199 case kRewound_RewindState: {
200 JpegDecoderMgr* decoderMgr = NULL;
201 if (!ReadHeader(this->stream(), NULL, &decoderMgr)) {
202 return fDecoderMgr->returnFalse("could not rewind");
203 }
204 SkASSERT(NULL != decoderMgr);
205 fDecoderMgr.reset(decoderMgr);
206 return true;
207 }
208 case kNoRewindNecessary_RewindState:
209 return true;
210 default:
211 SkASSERT(false);
212 return false;
213 } 196 }
197 SkASSERT(NULL != decoderMgr);
198 fDecoderMgr.reset(decoderMgr);
199 return true;
214 } 200 }
215 201
216 /* 202 /*
217 * Checks if the conversion between the input image and the requested output 203 * Checks if the conversion between the input image and the requested output
218 * image has been implemented 204 * image has been implemented
219 * Sets the output color space 205 * Sets the output color space
220 */ 206 */
221 bool SkJpegCodec::setOutputColorSpace(const SkImageInfo& dst) { 207 bool SkJpegCodec::setOutputColorSpace(const SkImageInfo& dst) {
222 const SkImageInfo& src = this->getInfo(); 208 const SkImageInfo& src = this->getInfo();
223 209
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
297 return true; 283 return true;
298 } 284 }
299 285
300 /* 286 /*
301 * Performs the jpeg decode 287 * Performs the jpeg decode
302 */ 288 */
303 SkCodec::Result SkJpegCodec::onGetPixels(const SkImageInfo& dstInfo, 289 SkCodec::Result SkJpegCodec::onGetPixels(const SkImageInfo& dstInfo,
304 void* dst, size_t dstRowBytes, 290 void* dst, size_t dstRowBytes,
305 const Options& options, SkPMColor*, int *) { 291 const Options& options, SkPMColor*, int *) {
306 // Rewind the stream if needed 292 // Rewind the stream if needed
307 if (!this->handleRewind()) { 293 if (!this->rewindIfNeeded()) {
308 return fDecoderMgr->returnFailure("could not rewind stream", kCouldNotRe wind); 294 return fDecoderMgr->returnFailure("could not rewind stream", kCouldNotRe wind);
309 } 295 }
310 296
311 if (options.fSubset) { 297 if (options.fSubset) {
312 // Subsets are not supported. 298 // Subsets are not supported.
313 return kUnimplemented; 299 return kUnimplemented;
314 } 300 }
315 301
316 // Get a pointer to the decompress info since we will use it quite frequentl y 302 // Get a pointer to the decompress info since we will use it quite frequentl y
317 jpeg_decompress_struct* dinfo = fDecoderMgr->dinfo(); 303 jpeg_decompress_struct* dinfo = fDecoderMgr->dinfo();
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
392 SkJpegScanlineDecoder(const SkImageInfo& srcInfo, SkJpegCodec* codec) 378 SkJpegScanlineDecoder(const SkImageInfo& srcInfo, SkJpegCodec* codec)
393 : INHERITED(srcInfo) 379 : INHERITED(srcInfo)
394 , fCodec(codec) 380 , fCodec(codec)
395 , fOpts() 381 , fOpts()
396 {} 382 {}
397 383
398 SkCodec::Result onStart(const SkImageInfo& dstInfo, const SkCodec::Options& options, 384 SkCodec::Result onStart(const SkImageInfo& dstInfo, const SkCodec::Options& options,
399 SkPMColor ctable[], int* ctableCount) override { 385 SkPMColor ctable[], int* ctableCount) override {
400 386
401 // Rewind the stream if needed 387 // Rewind the stream if needed
402 if (!fCodec->handleRewind()) { 388 if (!fCodec->rewindIfNeeded()) {
403 return SkCodec::kCouldNotRewind; 389 return SkCodec::kCouldNotRewind;
404 } 390 }
405 391
406 // Set the jump location for libjpeg errors 392 // Set the jump location for libjpeg errors
407 if (setjmp(fCodec->fDecoderMgr->getJmpBuf())) { 393 if (setjmp(fCodec->fDecoderMgr->getJmpBuf())) {
408 SkCodecPrintf("setjmp: Error from libjpeg\n"); 394 SkCodecPrintf("setjmp: Error from libjpeg\n");
409 return SkCodec::kInvalidInput; 395 return SkCodec::kInvalidInput;
410 } 396 }
411 397
412 // Check if we can decode to the requested destination and set the outpu t color space 398 // Check if we can decode to the requested destination and set the outpu t color space
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
506 SkScanlineDecoder* SkJpegCodec::NewSDFromStream(SkStream* stream) { 492 SkScanlineDecoder* SkJpegCodec::NewSDFromStream(SkStream* stream) {
507 SkAutoTDelete<SkJpegCodec> codec(static_cast<SkJpegCodec*>(SkJpegCodec::NewF romStream(stream))); 493 SkAutoTDelete<SkJpegCodec> codec(static_cast<SkJpegCodec*>(SkJpegCodec::NewF romStream(stream)));
508 if (!codec) { 494 if (!codec) {
509 return NULL; 495 return NULL;
510 } 496 }
511 497
512 const SkImageInfo& srcInfo = codec->getInfo(); 498 const SkImageInfo& srcInfo = codec->getInfo();
513 // Return the new scanline decoder 499 // Return the new scanline decoder
514 return SkNEW_ARGS(SkJpegScanlineDecoder, (srcInfo, codec.detach())); 500 return SkNEW_ARGS(SkJpegScanlineDecoder, (srcInfo, codec.detach()));
515 } 501 }
OLDNEW
« src/codec/SkBmpCodec.h ('K') | « src/codec/SkJpegCodec.h ('k') | src/codec/SkWebpCodec.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698