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

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

Issue 25275004: store SkAlphaType inside SkBitmap, on road to support unpremul (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 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 | Annotate | Revision Log
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 472 matching lines...) Expand 10 before | Expand all | Expand 10 after
483 483
484 turn_off_visual_optimizations(&cinfo); 484 turn_off_visual_optimizations(&cinfo);
485 485
486 const SkBitmap::Config config = this->getBitmapConfig(&cinfo); 486 const SkBitmap::Config config = this->getBitmapConfig(&cinfo);
487 487
488 #ifdef ANDROID_RGB 488 #ifdef ANDROID_RGB
489 adjust_out_color_space_and_dither(&cinfo, config, *this); 489 adjust_out_color_space_and_dither(&cinfo, config, *this);
490 #endif 490 #endif
491 491
492 if (1 == sampleSize && SkImageDecoder::kDecodeBounds_Mode == mode) { 492 if (1 == sampleSize && SkImageDecoder::kDecodeBounds_Mode == mode) {
493 bm->setConfig(config, cinfo.image_width, cinfo.image_height); 493 return bm->setConfig(config, cinfo.image_width, cinfo.image_height, 0,
494 bm->setIsOpaque(config != SkBitmap::kA8_Config); 494 SkBitmap::kA8_Config == config ?
495 return true; 495 kPremul_SkAlphaType : kOpaque_SkAlphaType);
496 } 496 }
497 497
498 /* image_width and image_height are the original dimensions, available 498 /* image_width and image_height are the original dimensions, available
499 after jpeg_read_header(). To see the scaled dimensions, we have to call 499 after jpeg_read_header(). To see the scaled dimensions, we have to call
500 jpeg_start_decompress(), and then read output_width and output_height. 500 jpeg_start_decompress(), and then read output_width and output_height.
501 */ 501 */
502 if (!jpeg_start_decompress(&cinfo)) { 502 if (!jpeg_start_decompress(&cinfo)) {
503 /* If we failed here, we may still have enough information to return 503 /* If we failed here, we may still have enough information to return
504 to the caller if they just wanted (subsampled bounds). If sampleSize 504 to the caller if they just wanted (subsampled bounds). If sampleSize
505 was 1, then we would have already returned. Thus we just check if 505 was 1, then we would have already returned. Thus we just check if
506 we're in kDecodeBounds_Mode, and that we have valid output sizes. 506 we're in kDecodeBounds_Mode, and that we have valid output sizes.
507 507
508 One reason to fail here is that we have insufficient stream data 508 One reason to fail here is that we have insufficient stream data
509 to complete the setup. However, output dimensions seem to get 509 to complete the setup. However, output dimensions seem to get
510 computed very early, which is why this special check can pay off. 510 computed very early, which is why this special check can pay off.
511 */ 511 */
512 if (SkImageDecoder::kDecodeBounds_Mode == mode && valid_output_dimension s(cinfo)) { 512 if (SkImageDecoder::kDecodeBounds_Mode == mode && valid_output_dimension s(cinfo)) {
513 SkScaledBitmapSampler smpl(cinfo.output_width, cinfo.output_height, 513 SkScaledBitmapSampler smpl(cinfo.output_width, cinfo.output_height,
514 recompute_sampleSize(sampleSize, cinfo)); 514 recompute_sampleSize(sampleSize, cinfo));
515 bm->setConfig(config, smpl.scaledWidth(), smpl.scaledHeight()); 515 return bm->setConfig(config, smpl.scaledWidth(), smpl.scaledHeight() ,
516 bm->setIsOpaque(config != SkBitmap::kA8_Config); 516 0, SkBitmap::kA8_Config == config ?
517 return true; 517 kPremul_SkAlphaType : kOpaque_SkAlphaType);
518 } else { 518 } else {
519 return return_false(cinfo, *bm, "start_decompress"); 519 return return_false(cinfo, *bm, "start_decompress");
520 } 520 }
521 } 521 }
522 sampleSize = recompute_sampleSize(sampleSize, cinfo); 522 sampleSize = recompute_sampleSize(sampleSize, cinfo);
523 523
524 // should we allow the Chooser (if present) to pick a config for us??? 524 // should we allow the Chooser (if present) to pick a config for us???
525 if (!this->chooseFromOneChoice(config, cinfo.output_width, cinfo.output_heig ht)) { 525 if (!this->chooseFromOneChoice(config, cinfo.output_width, cinfo.output_heig ht)) {
526 return return_false(cinfo, *bm, "chooseFromOneChoice"); 526 return return_false(cinfo, *bm, "chooseFromOneChoice");
527 } 527 }
528 528
529 SkScaledBitmapSampler sampler(cinfo.output_width, cinfo.output_height, sampl eSize); 529 SkScaledBitmapSampler sampler(cinfo.output_width, cinfo.output_height, sampl eSize);
530 bm->setConfig(config, sampler.scaledWidth(), sampler.scaledHeight()); 530 bm->setConfig(config, sampler.scaledWidth(), sampler.scaledHeight(), 0,
531 bm->setIsOpaque(config != SkBitmap::kA8_Config); 531 SkBitmap::kA8_Config != config ? kOpaque_SkAlphaType : kPremul _SkAlphaType);
532 if (SkImageDecoder::kDecodeBounds_Mode == mode) { 532 if (SkImageDecoder::kDecodeBounds_Mode == mode) {
533 return true; 533 return true;
534 } 534 }
535 if (!this->allocPixelRef(bm, NULL)) { 535 if (!this->allocPixelRef(bm, NULL)) {
536 return return_false(cinfo, *bm, "allocPixelRef"); 536 return return_false(cinfo, *bm, "allocPixelRef");
537 } 537 }
538 538
539 SkAutoLockPixels alp(*bm); 539 SkAutoLockPixels alp(*bm);
540 540
541 #ifdef ANDROID_RGB 541 #ifdef ANDROID_RGB
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
735 int height = rect.height(); 735 int height = rect.height();
736 736
737 jpeg_init_read_tile_scanline(cinfo, fImageIndex->huffmanIndex(), 737 jpeg_init_read_tile_scanline(cinfo, fImageIndex->huffmanIndex(),
738 &startX, &startY, &width, &height); 738 &startX, &startY, &width, &height);
739 int skiaSampleSize = recompute_sampleSize(requestedSampleSize, *cinfo); 739 int skiaSampleSize = recompute_sampleSize(requestedSampleSize, *cinfo);
740 int actualSampleSize = skiaSampleSize * (DCTSIZE / cinfo->min_DCT_scaled_siz e); 740 int actualSampleSize = skiaSampleSize * (DCTSIZE / cinfo->min_DCT_scaled_siz e);
741 741
742 SkScaledBitmapSampler sampler(width, height, skiaSampleSize); 742 SkScaledBitmapSampler sampler(width, height, skiaSampleSize);
743 743
744 SkBitmap bitmap; 744 SkBitmap bitmap;
745 bitmap.setConfig(config, sampler.scaledWidth(), sampler.scaledHeight()); 745 bitmap.setConfig(config, sampler.scaledWidth(), sampler.scaledHeight(), 0,
746 bitmap.setIsOpaque(true); 746 kOpaque_SkAlphaType);
747 747
748 // Check ahead of time if the swap(dest, src) is possible or not. 748 // Check ahead of time if the swap(dest, src) is possible or not.
749 // If yes, then we will stick to AllocPixelRef since it's cheaper with the 749 // If yes, then we will stick to AllocPixelRef since it's cheaper with the
750 // swap happening. If no, then we will use alloc to allocate pixels to 750 // swap happening. If no, then we will use alloc to allocate pixels to
751 // prevent garbage collection. 751 // prevent garbage collection.
752 int w = rect.width() / actualSampleSize; 752 int w = rect.width() / actualSampleSize;
753 int h = rect.height() / actualSampleSize; 753 int h = rect.height() / actualSampleSize;
754 bool swapOnly = (rect == region) && bm->isNull() && 754 bool swapOnly = (rect == region) && bm->isNull() &&
755 (w == bitmap.width()) && (h == bitmap.height()) && 755 (w == bitmap.width()) && (h == bitmap.height()) &&
756 ((startX - rect.x()) / actualSampleSize == 0) && 756 ((startX - rect.x()) / actualSampleSize == 0) &&
(...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after
1152 return SkImageDecoder::kUnknown_Format; 1152 return SkImageDecoder::kUnknown_Format;
1153 } 1153 }
1154 1154
1155 static SkImageEncoder* sk_libjpeg_efactory(SkImageEncoder::Type t) { 1155 static SkImageEncoder* sk_libjpeg_efactory(SkImageEncoder::Type t) {
1156 return (SkImageEncoder::kJPEG_Type == t) ? SkNEW(SkJPEGImageEncoder) : NULL; 1156 return (SkImageEncoder::kJPEG_Type == t) ? SkNEW(SkJPEGImageEncoder) : NULL;
1157 } 1157 }
1158 1158
1159 static SkImageDecoder_DecodeReg gDReg(sk_libjpeg_dfactory); 1159 static SkImageDecoder_DecodeReg gDReg(sk_libjpeg_dfactory);
1160 static SkImageDecoder_FormatReg gFormatReg(get_format_jpeg); 1160 static SkImageDecoder_FormatReg gFormatReg(get_format_jpeg);
1161 static SkImageEncoder_EncodeReg gEReg(sk_libjpeg_efactory); 1161 static SkImageEncoder_EncodeReg gEReg(sk_libjpeg_efactory);
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698