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

Side by Side Diff: src/images/SkImageDecoder_libjpeg.cpp

Issue 647023006: Qualify the return value of SkImageDecoder::decode (Closed) Base URL: https://skia.googlesource.com/skia.git/+/master
Patch Set: fix a sample Created 6 years, 2 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
« no previous file with comments | « src/images/SkImageDecoder_libico.cpp ('k') | src/images/SkImageDecoder_libpng.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2007 The Android Open Source Project 2 * Copyright 2007 The Android Open Source Project
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 8
9 #include "SkImageDecoder.h" 9 #include "SkImageDecoder.h"
10 #include "SkImageEncoder.h" 10 #include "SkImageEncoder.h"
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
231 231
232 virtual Format getFormat() const { 232 virtual Format getFormat() const {
233 return kJPEG_Format; 233 return kJPEG_Format;
234 } 234 }
235 235
236 protected: 236 protected:
237 #ifdef SK_BUILD_FOR_ANDROID 237 #ifdef SK_BUILD_FOR_ANDROID
238 virtual bool onBuildTileIndex(SkStreamRewindable *stream, int *width, int *h eight) SK_OVERRIDE; 238 virtual bool onBuildTileIndex(SkStreamRewindable *stream, int *width, int *h eight) SK_OVERRIDE;
239 virtual bool onDecodeSubset(SkBitmap* bitmap, const SkIRect& rect) SK_OVERRI DE; 239 virtual bool onDecodeSubset(SkBitmap* bitmap, const SkIRect& rect) SK_OVERRI DE;
240 #endif 240 #endif
241 virtual bool onDecode(SkStream* stream, SkBitmap* bm, Mode) SK_OVERRIDE; 241 virtual Result onDecode(SkStream* stream, SkBitmap* bm, Mode) SK_OVERRIDE;
242 virtual bool onDecodeYUV8Planes(SkStream* stream, SkISize componentSizes[3], 242 virtual bool onDecodeYUV8Planes(SkStream* stream, SkISize componentSizes[3],
243 void* planes[3], size_t rowBytes[3], 243 void* planes[3], size_t rowBytes[3],
244 SkYUVColorSpace* colorSpace) SK_OVERRIDE; 244 SkYUVColorSpace* colorSpace) SK_OVERRIDE;
245 245
246 private: 246 private:
247 #ifdef SK_BUILD_FOR_ANDROID 247 #ifdef SK_BUILD_FOR_ANDROID
248 SkJPEGImageIndex* fImageIndex; 248 SkJPEGImageIndex* fImageIndex;
249 int fImageWidth; 249 int fImageWidth;
250 int fImageHeight; 250 int fImageHeight;
251 #endif 251 #endif
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
318 JSAMPLE* rowptr = (JSAMPLE*)buffer; 318 JSAMPLE* rowptr = (JSAMPLE*)buffer;
319 int row_count = jpeg_read_tile_scanline(cinfo, index, &rowptr); 319 int row_count = jpeg_read_tile_scanline(cinfo, index, &rowptr);
320 if (1 != row_count) { 320 if (1 != row_count) {
321 return false; 321 return false;
322 } 322 }
323 } 323 }
324 return true; 324 return true;
325 } 325 }
326 #endif 326 #endif
327 327
328 ///////////////////////////////////////////////////////////////////////////////
329
328 // This guy exists just to aid in debugging, as it allows debuggers to just 330 // This guy exists just to aid in debugging, as it allows debuggers to just
329 // set a break-point in one place to see all error exists. 331 // set a break-point in one place to see all error exists.
330 static bool return_false(const jpeg_decompress_struct& cinfo, 332 static void print_jpeg_decoder_errors(const jpeg_decompress_struct& cinfo,
331 int width, int height, const char caller[]) { 333 int width, int height, const char caller[]) {
332 if (!(c_suppressJPEGImageDecoderErrors)) { 334 if (!(c_suppressJPEGImageDecoderErrors)) {
333 char buffer[JMSG_LENGTH_MAX]; 335 char buffer[JMSG_LENGTH_MAX];
334 cinfo.err->format_message((const j_common_ptr)&cinfo, buffer); 336 cinfo.err->format_message((const j_common_ptr)&cinfo, buffer);
335 SkDebugf("libjpeg error %d <%s> from %s [%d %d]\n", 337 SkDebugf("libjpeg error %d <%s> from %s [%d %d]\n",
336 cinfo.err->msg_code, buffer, caller, width, height); 338 cinfo.err->msg_code, buffer, caller, width, height);
337 } 339 }
338 return false; // must always return false 340 }
341
342 static bool return_false(const jpeg_decompress_struct& cinfo,
343 const char caller[]) {
344 print_jpeg_decoder_errors(cinfo, 0, 0, caller);
345 return false;
339 } 346 }
340 347
341 static bool return_false(const jpeg_decompress_struct& cinfo, 348 static bool return_false(const jpeg_decompress_struct& cinfo,
342 const SkBitmap& bm, const char caller[]) { 349 const SkBitmap& bm, const char caller[]) {
343 return return_false(cinfo, bm.width(), bm.height(), caller); 350 print_jpeg_decoder_errors(cinfo, bm.width(), bm.height(), caller);
351 return false;
344 } 352 }
345 353
354 static SkImageDecoder::Result return_failure(const jpeg_decompress_struct& cinfo ,
355 const SkBitmap& bm, const char call er[]) {
356 print_jpeg_decoder_errors(cinfo, bm.width(), bm.height(), caller);
357 return SkImageDecoder::kFailure;
358 }
359
360 ///////////////////////////////////////////////////////////////////////////////
361
346 // Convert a scanline of CMYK samples to RGBX in place. Note that this 362 // Convert a scanline of CMYK samples to RGBX in place. Note that this
347 // method moves the "scanline" pointer in its processing 363 // method moves the "scanline" pointer in its processing
348 static void convert_CMYK_to_RGB(uint8_t* scanline, unsigned int width) { 364 static void convert_CMYK_to_RGB(uint8_t* scanline, unsigned int width) {
349 // At this point we've received CMYK pixels from libjpeg. We 365 // At this point we've received CMYK pixels from libjpeg. We
350 // perform a crude conversion to RGB (based on the formulae 366 // perform a crude conversion to RGB (based on the formulae
351 // from easyrgb.com): 367 // from easyrgb.com):
352 // CMYK -> CMY 368 // CMYK -> CMY
353 // C = ( C * (1 - K) + K ) // for each CMY component 369 // C = ( C * (1 - K) + K ) // for each CMY component
354 // CMY -> RGB 370 // CMY -> RGB
355 // R = ( 1 - C ) * 255 // for each RGB component 371 // R = ( 1 - C ) * 255 // for each RGB component
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
484 if (decoder.getDitherImage()) { 500 if (decoder.getDitherImage()) {
485 cinfo->dither_mode = JDITHER_ORDERED; 501 cinfo->dither_mode = JDITHER_ORDERED;
486 } 502 }
487 break; 503 break;
488 default: 504 default:
489 break; 505 break;
490 } 506 }
491 #endif 507 #endif
492 } 508 }
493 509
494
495 /** 510 /**
496 Sets all pixels in given bitmap to SK_ColorWHITE for all rows >= y. 511 Sets all pixels in given bitmap to SK_ColorWHITE for all rows >= y.
497 Used when decoding fails partway through reading scanlines to fill 512 Used when decoding fails partway through reading scanlines to fill
498 remaining lines. */ 513 remaining lines. */
499 static void fill_below_level(int y, SkBitmap* bitmap) { 514 static void fill_below_level(int y, SkBitmap* bitmap) {
500 SkIRect rect = SkIRect::MakeLTRB(0, y, bitmap->width(), bitmap->height()); 515 SkIRect rect = SkIRect::MakeLTRB(0, y, bitmap->width(), bitmap->height());
501 SkCanvas canvas(*bitmap); 516 SkCanvas canvas(*bitmap);
502 canvas.clipRect(SkRect::Make(rect)); 517 canvas.clipRect(SkRect::Make(rect));
503 canvas.drawColor(SK_ColorWHITE); 518 canvas.drawColor(SK_ColorWHITE);
504 } 519 }
(...skipping 25 matching lines...) Expand all
530 } else if (1 == cinfo.out_color_components && 545 } else if (1 == cinfo.out_color_components &&
531 JCS_GRAYSCALE == cinfo.out_color_space) { 546 JCS_GRAYSCALE == cinfo.out_color_space) {
532 *sc = SkScaledBitmapSampler::kGray; 547 *sc = SkScaledBitmapSampler::kGray;
533 *srcBytesPerPixel = 1; 548 *srcBytesPerPixel = 1;
534 } else { 549 } else {
535 return false; 550 return false;
536 } 551 }
537 return true; 552 return true;
538 } 553 }
539 554
540 bool SkJPEGImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) { 555 SkImageDecoder::Result SkJPEGImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) {
541 #ifdef TIME_DECODE 556 #ifdef TIME_DECODE
542 SkAutoTime atm("JPEG Decode"); 557 SkAutoTime atm("JPEG Decode");
543 #endif 558 #endif
544 559
545 JPEGAutoClean autoClean; 560 JPEGAutoClean autoClean;
546 561
547 jpeg_decompress_struct cinfo; 562 jpeg_decompress_struct cinfo;
548 skjpeg_source_mgr srcManager(stream, this); 563 skjpeg_source_mgr srcManager(stream, this);
549 564
550 skjpeg_error_mgr errorManager; 565 skjpeg_error_mgr errorManager;
551 set_error_mgr(&cinfo, &errorManager); 566 set_error_mgr(&cinfo, &errorManager);
552 567
553 // All objects need to be instantiated before this setjmp call so that 568 // All objects need to be instantiated before this setjmp call so that
554 // they will be cleaned up properly if an error occurs. 569 // they will be cleaned up properly if an error occurs.
555 if (setjmp(errorManager.fJmpBuf)) { 570 if (setjmp(errorManager.fJmpBuf)) {
556 return return_false(cinfo, *bm, "setjmp"); 571 return return_failure(cinfo, *bm, "setjmp");
557 } 572 }
558 573
559 initialize_info(&cinfo, &srcManager); 574 initialize_info(&cinfo, &srcManager);
560 autoClean.set(&cinfo); 575 autoClean.set(&cinfo);
561 576
562 int status = jpeg_read_header(&cinfo, true); 577 int status = jpeg_read_header(&cinfo, true);
563 if (status != JPEG_HEADER_OK) { 578 if (status != JPEG_HEADER_OK) {
564 return return_false(cinfo, *bm, "read_header"); 579 return return_failure(cinfo, *bm, "read_header");
565 } 580 }
566 581
567 /* Try to fulfill the requested sampleSize. Since jpeg can do it (when it 582 /* Try to fulfill the requested sampleSize. Since jpeg can do it (when it
568 can) much faster that we, just use their num/denom api to approximate 583 can) much faster that we, just use their num/denom api to approximate
569 the size. 584 the size.
570 */ 585 */
571 int sampleSize = this->getSampleSize(); 586 int sampleSize = this->getSampleSize();
572 587
573 set_dct_method(*this, &cinfo); 588 set_dct_method(*this, &cinfo);
574 589
575 SkASSERT(1 == cinfo.scale_num); 590 SkASSERT(1 == cinfo.scale_num);
576 cinfo.scale_denom = sampleSize; 591 cinfo.scale_denom = sampleSize;
577 592
578 turn_off_visual_optimizations(&cinfo); 593 turn_off_visual_optimizations(&cinfo);
579 594
580 const SkColorType colorType = this->getBitmapColorType(&cinfo); 595 const SkColorType colorType = this->getBitmapColorType(&cinfo);
581 const SkAlphaType alphaType = kAlpha_8_SkColorType == colorType ? 596 const SkAlphaType alphaType = kAlpha_8_SkColorType == colorType ?
582 kPremul_SkAlphaType : kOpaque_SkAlphaType; 597 kPremul_SkAlphaType : kOpaque_SkAlphaType;
583 598
584 adjust_out_color_space_and_dither(&cinfo, colorType, *this); 599 adjust_out_color_space_and_dither(&cinfo, colorType, *this);
585 600
586 if (1 == sampleSize && SkImageDecoder::kDecodeBounds_Mode == mode) { 601 if (1 == sampleSize && SkImageDecoder::kDecodeBounds_Mode == mode) {
587 // Assume an A8 bitmap is not opaque to avoid the check of each 602 // Assume an A8 bitmap is not opaque to avoid the check of each
588 // individual pixel. It is very unlikely to be opaque, since 603 // individual pixel. It is very unlikely to be opaque, since
589 // an opaque A8 bitmap would not be very interesting. 604 // an opaque A8 bitmap would not be very interesting.
590 // Otherwise, a jpeg image is opaque. 605 // Otherwise, a jpeg image is opaque.
591 return bm->setInfo(SkImageInfo::Make(cinfo.image_width, cinfo.image_heig ht, 606 bool success = bm->setInfo(SkImageInfo::Make(cinfo.image_width, cinfo.im age_height,
592 colorType, alphaType)); 607 colorType, alphaType));
608 return success ? kSuccess : kFailure;
593 } 609 }
594 610
595 /* image_width and image_height are the original dimensions, available 611 /* image_width and image_height are the original dimensions, available
596 after jpeg_read_header(). To see the scaled dimensions, we have to call 612 after jpeg_read_header(). To see the scaled dimensions, we have to call
597 jpeg_start_decompress(), and then read output_width and output_height. 613 jpeg_start_decompress(), and then read output_width and output_height.
598 */ 614 */
599 if (!jpeg_start_decompress(&cinfo)) { 615 if (!jpeg_start_decompress(&cinfo)) {
600 /* If we failed here, we may still have enough information to return 616 /* If we failed here, we may still have enough information to return
601 to the caller if they just wanted (subsampled bounds). If sampleSize 617 to the caller if they just wanted (subsampled bounds). If sampleSize
602 was 1, then we would have already returned. Thus we just check if 618 was 1, then we would have already returned. Thus we just check if
603 we're in kDecodeBounds_Mode, and that we have valid output sizes. 619 we're in kDecodeBounds_Mode, and that we have valid output sizes.
604 620
605 One reason to fail here is that we have insufficient stream data 621 One reason to fail here is that we have insufficient stream data
606 to complete the setup. However, output dimensions seem to get 622 to complete the setup. However, output dimensions seem to get
607 computed very early, which is why this special check can pay off. 623 computed very early, which is why this special check can pay off.
608 */ 624 */
609 if (SkImageDecoder::kDecodeBounds_Mode == mode && valid_output_dimension s(cinfo)) { 625 if (SkImageDecoder::kDecodeBounds_Mode == mode && valid_output_dimension s(cinfo)) {
610 SkScaledBitmapSampler smpl(cinfo.output_width, cinfo.output_height, 626 SkScaledBitmapSampler smpl(cinfo.output_width, cinfo.output_height,
611 recompute_sampleSize(sampleSize, cinfo)); 627 recompute_sampleSize(sampleSize, cinfo));
612 // Assume an A8 bitmap is not opaque to avoid the check of each 628 // Assume an A8 bitmap is not opaque to avoid the check of each
613 // individual pixel. It is very unlikely to be opaque, since 629 // individual pixel. It is very unlikely to be opaque, since
614 // an opaque A8 bitmap would not be very interesting. 630 // an opaque A8 bitmap would not be very interesting.
615 // Otherwise, a jpeg image is opaque. 631 // Otherwise, a jpeg image is opaque.
616 return bm->setInfo(SkImageInfo::Make(smpl.scaledWidth(), smpl.scaled Height(), 632 bool success = bm->setInfo(SkImageInfo::Make(smpl.scaledWidth(), smp l.scaledHeight(),
617 colorType, alphaType)); 633 colorType, alphaType));
634 return success ? kSuccess : kFailure;
618 } else { 635 } else {
619 return return_false(cinfo, *bm, "start_decompress"); 636 return return_failure(cinfo, *bm, "start_decompress");
620 } 637 }
621 } 638 }
622 sampleSize = recompute_sampleSize(sampleSize, cinfo); 639 sampleSize = recompute_sampleSize(sampleSize, cinfo);
623 640
624 #ifdef SK_SUPPORT_LEGACY_IMAGEDECODER_CHOOSER 641 #ifdef SK_SUPPORT_LEGACY_IMAGEDECODER_CHOOSER
625 // should we allow the Chooser (if present) to pick a colortype for us??? 642 // should we allow the Chooser (if present) to pick a colortype for us???
626 if (!this->chooseFromOneChoice(colorType, cinfo.output_width, cinfo.output_h eight)) { 643 if (!this->chooseFromOneChoice(colorType, cinfo.output_width, cinfo.output_h eight)) {
627 return return_false(cinfo, *bm, "chooseFromOneChoice"); 644 return return_failure(cinfo, *bm, "chooseFromOneChoice");
628 } 645 }
629 #endif 646 #endif
630 647
631 SkScaledBitmapSampler sampler(cinfo.output_width, cinfo.output_height, sampl eSize); 648 SkScaledBitmapSampler sampler(cinfo.output_width, cinfo.output_height, sampl eSize);
632 // Assume an A8 bitmap is not opaque to avoid the check of each 649 // Assume an A8 bitmap is not opaque to avoid the check of each
633 // individual pixel. It is very unlikely to be opaque, since 650 // individual pixel. It is very unlikely to be opaque, since
634 // an opaque A8 bitmap would not be very interesting. 651 // an opaque A8 bitmap would not be very interesting.
635 // Otherwise, a jpeg image is opaque. 652 // Otherwise, a jpeg image is opaque.
636 bm->setInfo(SkImageInfo::Make(sampler.scaledWidth(), sampler.scaledHeight(), 653 bm->setInfo(SkImageInfo::Make(sampler.scaledWidth(), sampler.scaledHeight(),
637 colorType, alphaType)); 654 colorType, alphaType));
638 if (SkImageDecoder::kDecodeBounds_Mode == mode) { 655 if (SkImageDecoder::kDecodeBounds_Mode == mode) {
639 return true; 656 return kSuccess;
640 } 657 }
641 if (!this->allocPixelRef(bm, NULL)) { 658 if (!this->allocPixelRef(bm, NULL)) {
642 return return_false(cinfo, *bm, "allocPixelRef"); 659 return return_failure(cinfo, *bm, "allocPixelRef");
643 } 660 }
644 661
645 SkAutoLockPixels alp(*bm); 662 SkAutoLockPixels alp(*bm);
646 663
647 #ifdef ANDROID_RGB 664 #ifdef ANDROID_RGB
648 /* short-circuit the SkScaledBitmapSampler when possible, as this gives 665 /* short-circuit the SkScaledBitmapSampler when possible, as this gives
649 a significant performance boost. 666 a significant performance boost.
650 */ 667 */
651 if (sampleSize == 1 && 668 if (sampleSize == 1 &&
652 ((kN32_SkColorType == colorType && cinfo.out_color_space == JCS_RGBA_888 8) || 669 ((kN32_SkColorType == colorType && cinfo.out_color_space == JCS_RGBA_888 8) ||
653 (kRGB_565_SkColorType == colorType && cinfo.out_color_space == JCS_RGB_ 565))) 670 (kRGB_565_SkColorType == colorType && cinfo.out_color_space == JCS_RGB_ 565)))
654 { 671 {
655 JSAMPLE* rowptr = (JSAMPLE*)bm->getPixels(); 672 JSAMPLE* rowptr = (JSAMPLE*)bm->getPixels();
656 INT32 const bpr = bm->rowBytes(); 673 INT32 const bpr = bm->rowBytes();
657 674
658 while (cinfo.output_scanline < cinfo.output_height) { 675 while (cinfo.output_scanline < cinfo.output_height) {
659 int row_count = jpeg_read_scanlines(&cinfo, &rowptr, 1); 676 int row_count = jpeg_read_scanlines(&cinfo, &rowptr, 1);
660 if (0 == row_count) { 677 if (0 == row_count) {
661 // if row_count == 0, then we didn't get a scanline, 678 // if row_count == 0, then we didn't get a scanline,
662 // so return early. We will return a partial image. 679 // so return early. We will return a partial image.
663 fill_below_level(cinfo.output_scanline, bm); 680 fill_below_level(cinfo.output_scanline, bm);
664 cinfo.output_scanline = cinfo.output_height; 681 cinfo.output_scanline = cinfo.output_height;
665 break; // Skip to jpeg_finish_decompress() 682 jpeg_finish_decompress(&cinfo);
683 return kPartialSuccess;
666 } 684 }
667 if (this->shouldCancelDecode()) { 685 if (this->shouldCancelDecode()) {
668 return return_false(cinfo, *bm, "shouldCancelDecode"); 686 return return_failure(cinfo, *bm, "shouldCancelDecode");
669 } 687 }
670 rowptr += bpr; 688 rowptr += bpr;
671 } 689 }
672 jpeg_finish_decompress(&cinfo); 690 jpeg_finish_decompress(&cinfo);
673 return true; 691 return kSuccess;
674 } 692 }
675 #endif 693 #endif
676 694
677 // check for supported formats 695 // check for supported formats
678 SkScaledBitmapSampler::SrcConfig sc; 696 SkScaledBitmapSampler::SrcConfig sc;
679 int srcBytesPerPixel; 697 int srcBytesPerPixel;
680 698
681 if (!get_src_config(cinfo, &sc, &srcBytesPerPixel)) { 699 if (!get_src_config(cinfo, &sc, &srcBytesPerPixel)) {
682 return return_false(cinfo, *bm, "jpeg colorspace"); 700 return return_failure(cinfo, *bm, "jpeg colorspace");
683 } 701 }
684 702
685 if (!sampler.begin(bm, sc, *this)) { 703 if (!sampler.begin(bm, sc, *this)) {
686 return return_false(cinfo, *bm, "sampler.begin"); 704 return return_failure(cinfo, *bm, "sampler.begin");
687 } 705 }
688 706
689 SkAutoMalloc srcStorage(cinfo.output_width * srcBytesPerPixel); 707 SkAutoMalloc srcStorage(cinfo.output_width * srcBytesPerPixel);
690 uint8_t* srcRow = (uint8_t*)srcStorage.get(); 708 uint8_t* srcRow = (uint8_t*)srcStorage.get();
691 709
692 // Possibly skip initial rows [sampler.srcY0] 710 // Possibly skip initial rows [sampler.srcY0]
693 if (!skip_src_rows(&cinfo, srcRow, sampler.srcY0())) { 711 if (!skip_src_rows(&cinfo, srcRow, sampler.srcY0())) {
694 return return_false(cinfo, *bm, "skip rows"); 712 return return_failure(cinfo, *bm, "skip rows");
695 } 713 }
696 714
697 // now loop through scanlines until y == bm->height() - 1 715 // now loop through scanlines until y == bm->height() - 1
698 for (int y = 0;; y++) { 716 for (int y = 0;; y++) {
699 JSAMPLE* rowptr = (JSAMPLE*)srcRow; 717 JSAMPLE* rowptr = (JSAMPLE*)srcRow;
700 int row_count = jpeg_read_scanlines(&cinfo, &rowptr, 1); 718 int row_count = jpeg_read_scanlines(&cinfo, &rowptr, 1);
701 if (0 == row_count) { 719 if (0 == row_count) {
702 // if row_count == 0, then we didn't get a scanline, 720 // if row_count == 0, then we didn't get a scanline,
703 // so return early. We will return a partial image. 721 // so return early. We will return a partial image.
704 fill_below_level(y, bm); 722 fill_below_level(y, bm);
705 cinfo.output_scanline = cinfo.output_height; 723 cinfo.output_scanline = cinfo.output_height;
706 break; // Skip to jpeg_finish_decompress() 724 jpeg_finish_decompress(&cinfo);
725 return kSuccess;
707 } 726 }
708 if (this->shouldCancelDecode()) { 727 if (this->shouldCancelDecode()) {
709 return return_false(cinfo, *bm, "shouldCancelDecode"); 728 return return_failure(cinfo, *bm, "shouldCancelDecode");
710 } 729 }
711 730
712 if (JCS_CMYK == cinfo.out_color_space) { 731 if (JCS_CMYK == cinfo.out_color_space) {
713 convert_CMYK_to_RGB(srcRow, cinfo.output_width); 732 convert_CMYK_to_RGB(srcRow, cinfo.output_width);
714 } 733 }
715 734
716 sampler.next(srcRow); 735 sampler.next(srcRow);
717 if (bm->height() - 1 == y) { 736 if (bm->height() - 1 == y) {
718 // we're done 737 // we're done
719 break; 738 break;
720 } 739 }
721 740
722 if (!skip_src_rows(&cinfo, srcRow, sampler.srcDY() - 1)) { 741 if (!skip_src_rows(&cinfo, srcRow, sampler.srcDY() - 1)) {
723 return return_false(cinfo, *bm, "skip rows"); 742 return return_failure(cinfo, *bm, "skip rows");
724 } 743 }
725 } 744 }
726 745
727 // we formally skip the rest, so we don't get a complaint from libjpeg 746 // we formally skip the rest, so we don't get a complaint from libjpeg
728 if (!skip_src_rows(&cinfo, srcRow, 747 if (!skip_src_rows(&cinfo, srcRow,
729 cinfo.output_height - cinfo.output_scanline)) { 748 cinfo.output_height - cinfo.output_scanline)) {
730 return return_false(cinfo, *bm, "skip rows"); 749 return return_failure(cinfo, *bm, "skip rows");
731 } 750 }
732 jpeg_finish_decompress(&cinfo); 751 jpeg_finish_decompress(&cinfo);
733 752
734 return true; 753 return kSuccess;
735 } 754 }
736 755
756 ///////////////////////////////////////////////////////////////////////////////
757
737 enum SizeType { 758 enum SizeType {
738 kSizeForMemoryAllocation_SizeType, 759 kSizeForMemoryAllocation_SizeType,
739 kActualSize_SizeType 760 kActualSize_SizeType
740 }; 761 };
741 762
742 static SkISize compute_yuv_size(const jpeg_decompress_struct& info, int componen t, 763 static SkISize compute_yuv_size(const jpeg_decompress_struct& info, int componen t,
743 SizeType sizeType) { 764 SizeType sizeType) {
744 if (sizeType == kSizeForMemoryAllocation_SizeType) { 765 if (sizeType == kSizeForMemoryAllocation_SizeType) {
745 return SkISize::Make(info.cur_comp_info[component]->width_in_blocks * DC TSIZE, 766 return SkISize::Make(info.cur_comp_info[component]->width_in_blocks * DC TSIZE,
746 info.cur_comp_info[component]->height_in_blocks * D CTSIZE); 767 info.cur_comp_info[component]->height_in_blocks * D CTSIZE);
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
871 bufferraw2[16 + i] = uLastRow; 892 bufferraw2[16 + i] = uLastRow;
872 bufferraw2[24 + i] = vLastRow; 893 bufferraw2[24 + i] = vLastRow;
873 hasUVLastRow = true; 894 hasUVLastRow = true;
874 } else { 895 } else {
875 bufferraw2[16 + i] = dummyRow; 896 bufferraw2[16 + i] = dummyRow;
876 bufferraw2[24 + i] = dummyRow; 897 bufferraw2[24 + i] = dummyRow;
877 } 898 }
878 } 899 }
879 JDIMENSION scanlinesRead = jpeg_read_raw_data(&cinfo, bufferraw, yScanli nesToRead); 900 JDIMENSION scanlinesRead = jpeg_read_raw_data(&cinfo, bufferraw, yScanli nesToRead);
880 901
881 if (scanlinesRead == 0) 902 if (scanlinesRead == 0) {
882 return false; 903 return false;
904 }
883 905
884 if (hasYLastRow) { 906 if (hasYLastRow) {
885 memcpy(&outputY[yMaxH * rowBytesY], yLastRow, yWidth); 907 memcpy(&outputY[yMaxH * rowBytesY], yLastRow, yWidth);
886 } 908 }
887 if (hasUVLastRow) { 909 if (hasUVLastRow) {
888 memcpy(&outputU[uvMaxH * rowBytesU], uLastRow, uvSize.width()); 910 memcpy(&outputU[uvMaxH * rowBytesU], uLastRow, uvSize.width());
889 memcpy(&outputV[uvMaxH * rowBytesV], vLastRow, uvSize.width()); 911 memcpy(&outputV[uvMaxH * rowBytesV], vLastRow, uvSize.width());
890 } 912 }
891 } 913 }
892 914
(...skipping 17 matching lines...) Expand all
910 932
911 jpeg_decompress_struct cinfo; 933 jpeg_decompress_struct cinfo;
912 skjpeg_source_mgr srcManager(stream, this); 934 skjpeg_source_mgr srcManager(stream, this);
913 935
914 skjpeg_error_mgr errorManager; 936 skjpeg_error_mgr errorManager;
915 set_error_mgr(&cinfo, &errorManager); 937 set_error_mgr(&cinfo, &errorManager);
916 938
917 // All objects need to be instantiated before this setjmp call so that 939 // All objects need to be instantiated before this setjmp call so that
918 // they will be cleaned up properly if an error occurs. 940 // they will be cleaned up properly if an error occurs.
919 if (setjmp(errorManager.fJmpBuf)) { 941 if (setjmp(errorManager.fJmpBuf)) {
920 return return_false(cinfo, 0, 0, "setjmp YUV8"); 942 return return_false(cinfo, "setjmp YUV8");
921 } 943 }
922 944
923 initialize_info(&cinfo, &srcManager); 945 initialize_info(&cinfo, &srcManager);
924 autoClean.set(&cinfo); 946 autoClean.set(&cinfo);
925 947
926 int status = jpeg_read_header(&cinfo, true); 948 int status = jpeg_read_header(&cinfo, true);
927 if (status != JPEG_HEADER_OK) { 949 if (status != JPEG_HEADER_OK) {
928 return return_false(cinfo, 0, 0, "read_header YUV8"); 950 return return_false(cinfo, "read_header YUV8");
929 } 951 }
930 952
931 if (cinfo.jpeg_color_space != JCS_YCbCr) { 953 if (cinfo.jpeg_color_space != JCS_YCbCr) {
932 // It's not an error to not be encoded in YUV, so no need to use return_ false() 954 // It's not an error to not be encoded in YUV, so no need to use return_ false()
933 return false; 955 return false;
934 } 956 }
935 957
936 cinfo.out_color_space = JCS_YCbCr; 958 cinfo.out_color_space = JCS_YCbCr;
937 cinfo.raw_data_out = TRUE; 959 cinfo.raw_data_out = TRUE;
938 960
(...skipping 11 matching lines...) Expand all
950 972
951 #ifdef ANDROID_RGB 973 #ifdef ANDROID_RGB
952 cinfo.dither_mode = JDITHER_NONE; 974 cinfo.dither_mode = JDITHER_NONE;
953 #endif 975 #endif
954 976
955 /* image_width and image_height are the original dimensions, available 977 /* image_width and image_height are the original dimensions, available
956 after jpeg_read_header(). To see the scaled dimensions, we have to call 978 after jpeg_read_header(). To see the scaled dimensions, we have to call
957 jpeg_start_decompress(), and then read output_width and output_height. 979 jpeg_start_decompress(), and then read output_width and output_height.
958 */ 980 */
959 if (!jpeg_start_decompress(&cinfo)) { 981 if (!jpeg_start_decompress(&cinfo)) {
960 return return_false(cinfo, 0, 0, "start_decompress YUV8"); 982 return return_false(cinfo, "start_decompress YUV8");
961 } 983 }
962 984
963 if (!output_raw_data(cinfo, planes, rowBytes)) { 985 if (!output_raw_data(cinfo, planes, rowBytes)) {
964 return return_false(cinfo, 0, 0, "output_raw_data"); 986 return return_false(cinfo, "output_raw_data");
965 } 987 }
966 988
967 update_components_sizes(cinfo, componentSizes, kActualSize_SizeType); 989 update_components_sizes(cinfo, componentSizes, kActualSize_SizeType);
968 jpeg_finish_decompress(&cinfo); 990 jpeg_finish_decompress(&cinfo);
969 991
970 if (NULL != colorSpace) { 992 if (NULL != colorSpace) {
971 *colorSpace = kJPEG_SkYUVColorSpace; 993 *colorSpace = kJPEG_SkYUVColorSpace;
972 } 994 }
973 995
974 return true; 996 return true;
975 } 997 }
976 998
999 ///////////////////////////////////////////////////////////////////////////////
1000
977 #ifdef SK_BUILD_FOR_ANDROID 1001 #ifdef SK_BUILD_FOR_ANDROID
978 bool SkJPEGImageDecoder::onBuildTileIndex(SkStreamRewindable* stream, int *width , int *height) { 1002 bool SkJPEGImageDecoder::onBuildTileIndex(SkStreamRewindable* stream, int *width , int *height) {
979 1003
980 SkAutoTDelete<SkJPEGImageIndex> imageIndex(SkNEW_ARGS(SkJPEGImageIndex, (str eam, this))); 1004 SkAutoTDelete<SkJPEGImageIndex> imageIndex(SkNEW_ARGS(SkJPEGImageIndex, (str eam, this)));
981 jpeg_decompress_struct* cinfo = imageIndex->cinfo(); 1005 jpeg_decompress_struct* cinfo = imageIndex->cinfo();
982 1006
983 skjpeg_error_mgr sk_err; 1007 skjpeg_error_mgr sk_err;
984 set_error_mgr(cinfo, &sk_err); 1008 set_error_mgr(cinfo, &sk_err);
985 1009
986 // All objects need to be instantiated before this setjmp call so that 1010 // All objects need to be instantiated before this setjmp call so that
(...skipping 494 matching lines...) Expand 10 before | Expand all | Expand 10 after
1481 return SkImageDecoder::kUnknown_Format; 1505 return SkImageDecoder::kUnknown_Format;
1482 } 1506 }
1483 1507
1484 static SkImageEncoder* sk_libjpeg_efactory(SkImageEncoder::Type t) { 1508 static SkImageEncoder* sk_libjpeg_efactory(SkImageEncoder::Type t) {
1485 return (SkImageEncoder::kJPEG_Type == t) ? SkNEW(SkJPEGImageEncoder) : NULL; 1509 return (SkImageEncoder::kJPEG_Type == t) ? SkNEW(SkJPEGImageEncoder) : NULL;
1486 } 1510 }
1487 1511
1488 static SkImageDecoder_DecodeReg gDReg(sk_libjpeg_dfactory); 1512 static SkImageDecoder_DecodeReg gDReg(sk_libjpeg_dfactory);
1489 static SkImageDecoder_FormatReg gFormatReg(get_format_jpeg); 1513 static SkImageDecoder_FormatReg gFormatReg(get_format_jpeg);
1490 static SkImageEncoder_EncodeReg gEReg(sk_libjpeg_efactory); 1514 static SkImageEncoder_EncodeReg gEReg(sk_libjpeg_efactory);
OLDNEW
« no previous file with comments | « src/images/SkImageDecoder_libico.cpp ('k') | src/images/SkImageDecoder_libpng.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698