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

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

Issue 19613002: A8 bitmaps from JPEG are not opaque. (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years, 5 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
« no previous file with comments | « no previous file | no next file » | 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 /* 2 /*
3 * Copyright 2007 The Android Open Source Project 3 * Copyright 2007 The Android Open Source Project
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 9
10 #include "SkImageDecoder.h" 10 #include "SkImageDecoder.h"
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after
326 } else if (SkBitmap::kRGB_565_Config == config && JCS_CMYK != cinfo.out_colo r_space) { 326 } else if (SkBitmap::kRGB_565_Config == config && JCS_CMYK != cinfo.out_colo r_space) {
327 cinfo.out_color_space = JCS_RGB_565; 327 cinfo.out_color_space = JCS_RGB_565;
328 if (this->getDitherImage()) { 328 if (this->getDitherImage()) {
329 cinfo.dither_mode = JDITHER_ORDERED; 329 cinfo.dither_mode = JDITHER_ORDERED;
330 } 330 }
331 } 331 }
332 #endif 332 #endif
333 333
334 if (1 == sampleSize && SkImageDecoder::kDecodeBounds_Mode == mode) { 334 if (1 == sampleSize && SkImageDecoder::kDecodeBounds_Mode == mode) {
335 bm->setConfig(config, cinfo.image_width, cinfo.image_height); 335 bm->setConfig(config, cinfo.image_width, cinfo.image_height);
336 bm->setIsOpaque(true); 336 bm->setIsOpaque(config != SkBitmap::kA8_Config);
337 return true; 337 return true;
338 } 338 }
339 339
340 /* image_width and image_height are the original dimensions, available 340 /* image_width and image_height are the original dimensions, available
341 after jpeg_read_header(). To see the scaled dimensions, we have to call 341 after jpeg_read_header(). To see the scaled dimensions, we have to call
342 jpeg_start_decompress(), and then read output_width and output_height. 342 jpeg_start_decompress(), and then read output_width and output_height.
343 */ 343 */
344 if (!jpeg_start_decompress(&cinfo)) { 344 if (!jpeg_start_decompress(&cinfo)) {
345 /* If we failed here, we may still have enough information to return 345 /* If we failed here, we may still have enough information to return
346 to the caller if they just wanted (subsampled bounds). If sampleSize 346 to the caller if they just wanted (subsampled bounds). If sampleSize
347 was 1, then we would have already returned. Thus we just check if 347 was 1, then we would have already returned. Thus we just check if
348 we're in kDecodeBounds_Mode, and that we have valid output sizes. 348 we're in kDecodeBounds_Mode, and that we have valid output sizes.
349 349
350 One reason to fail here is that we have insufficient stream data 350 One reason to fail here is that we have insufficient stream data
351 to complete the setup. However, output dimensions seem to get 351 to complete the setup. However, output dimensions seem to get
352 computed very early, which is why this special check can pay off. 352 computed very early, which is why this special check can pay off.
353 */ 353 */
354 if (SkImageDecoder::kDecodeBounds_Mode == mode && valid_output_dimension s(cinfo)) { 354 if (SkImageDecoder::kDecodeBounds_Mode == mode && valid_output_dimension s(cinfo)) {
355 SkScaledBitmapSampler smpl(cinfo.output_width, cinfo.output_height, 355 SkScaledBitmapSampler smpl(cinfo.output_width, cinfo.output_height,
356 recompute_sampleSize(sampleSize, cinfo)); 356 recompute_sampleSize(sampleSize, cinfo));
357 bm->setConfig(config, smpl.scaledWidth(), smpl.scaledHeight()); 357 bm->setConfig(config, smpl.scaledWidth(), smpl.scaledHeight());
358 bm->setIsOpaque(true); 358 bm->setIsOpaque(config != SkBitmap::kA8_Config);
359 return true; 359 return true;
360 } else { 360 } else {
361 return return_false(cinfo, *bm, "start_decompress"); 361 return return_false(cinfo, *bm, "start_decompress");
362 } 362 }
363 } 363 }
364 sampleSize = recompute_sampleSize(sampleSize, cinfo); 364 sampleSize = recompute_sampleSize(sampleSize, cinfo);
365 365
366 // should we allow the Chooser (if present) to pick a config for us??? 366 // should we allow the Chooser (if present) to pick a config for us???
367 if (!this->chooseFromOneChoice(config, cinfo.output_width, cinfo.output_heig ht)) { 367 if (!this->chooseFromOneChoice(config, cinfo.output_width, cinfo.output_heig ht)) {
368 return return_false(cinfo, *bm, "chooseFromOneChoice"); 368 return return_false(cinfo, *bm, "chooseFromOneChoice");
369 } 369 }
370 370
371 SkScaledBitmapSampler sampler(cinfo.output_width, cinfo.output_height, sampl eSize); 371 SkScaledBitmapSampler sampler(cinfo.output_width, cinfo.output_height, sampl eSize);
372 bm->setConfig(config, sampler.scaledWidth(), sampler.scaledHeight()); 372 bm->setConfig(config, sampler.scaledWidth(), sampler.scaledHeight());
373 bm->setIsOpaque(true); 373 bm->setIsOpaque(config != SkBitmap::kA8_Config);
374 if (SkImageDecoder::kDecodeBounds_Mode == mode) { 374 if (SkImageDecoder::kDecodeBounds_Mode == mode) {
375 return true; 375 return true;
376 } 376 }
377 if (!this->allocPixelRef(bm, NULL)) { 377 if (!this->allocPixelRef(bm, NULL)) {
378 return return_false(cinfo, *bm, "allocPixelRef"); 378 return return_false(cinfo, *bm, "allocPixelRef");
379 } 379 }
380 380
381 SkAutoLockPixels alp(*bm); 381 SkAutoLockPixels alp(*bm);
382 382
383 #ifdef ANDROID_RGB 383 #ifdef ANDROID_RGB
(...skipping 637 matching lines...) Expand 10 before | Expand all | Expand 10 after
1021 } 1021 }
1022 1022
1023 static SkImageEncoder* sk_libjpeg_efactory(SkImageEncoder::Type t) { 1023 static SkImageEncoder* sk_libjpeg_efactory(SkImageEncoder::Type t) {
1024 return (SkImageEncoder::kJPEG_Type == t) ? SkNEW(SkJPEGImageEncoder) : NULL; 1024 return (SkImageEncoder::kJPEG_Type == t) ? SkNEW(SkJPEGImageEncoder) : NULL;
1025 } 1025 }
1026 1026
1027 1027
1028 static SkTRegistry<SkImageDecoder*, SkStream*> gDReg(sk_libjpeg_dfactory); 1028 static SkTRegistry<SkImageDecoder*, SkStream*> gDReg(sk_libjpeg_dfactory);
1029 static SkTRegistry<SkImageDecoder::Format, SkStream*> gFormatReg(get_format_jpeg ); 1029 static SkTRegistry<SkImageDecoder::Format, SkStream*> gFormatReg(get_format_jpeg );
1030 static SkTRegistry<SkImageEncoder*, SkImageEncoder::Type> gEReg(sk_libjpeg_efact ory); 1030 static SkTRegistry<SkImageEncoder*, SkImageEncoder::Type> gEReg(sk_libjpeg_efact ory);
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698