OLD | NEW |
---|---|
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 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 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
192 png_bytep trans; | 192 png_bytep trans; |
193 int num_trans; | 193 int num_trans; |
194 | 194 |
195 if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) { | 195 if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) { |
196 png_get_tRNS(png_ptr, info_ptr, &trans, &num_trans, NULL); | 196 png_get_tRNS(png_ptr, info_ptr, &trans, &num_trans, NULL); |
197 return num_trans > 0; | 197 return num_trans > 0; |
198 } | 198 } |
199 return false; | 199 return false; |
200 } | 200 } |
201 | 201 |
202 void do_nothing(png_structp, png_const_charp) { /* do nothing */ } | |
scroggo
2013/10/01 22:04:14
More specific name?
| |
203 | |
204 | |
202 bool SkPNGImageDecoder::onDecodeInit(SkStream* sk_stream, png_structp *png_ptrp, | 205 bool SkPNGImageDecoder::onDecodeInit(SkStream* sk_stream, png_structp *png_ptrp, |
203 png_infop *info_ptrp) { | 206 png_infop *info_ptrp) { |
204 /* Create and initialize the png_struct with the desired error handler | 207 /* Create and initialize the png_struct with the desired error handler |
205 * functions. If you want to use the default stderr and longjump method, | 208 * functions. If you want to use the default stderr and longjump method, |
206 * you can supply NULL for the last three parameters. We also supply the | 209 * you can supply NULL for the last three parameters. We also supply the |
207 * the compiler header file version, so that we know if the application | 210 * the compiler header file version, so that we know if the application |
208 * was compiled with a compatible version of the library. */ | 211 * was compiled with a compatible version of the library. */ |
209 png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, | 212 png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, |
210 NULL, sk_error_fn, NULL); | 213 NULL, sk_error_fn, NULL); |
211 // png_voidp user_error_ptr, user_error_fn, user_warning_fn); | 214 // png_voidp user_error_ptr, user_error_fn, user_warning_fn); |
212 if (png_ptr == NULL) { | 215 if (png_ptr == NULL) { |
213 return false; | 216 return false; |
214 } | 217 } |
218 | |
219 png_error_ptr warning_fn = &do_nothing; | |
scroggo
2013/10/01 22:04:14
Again, this stuff should only be done
#if !define
| |
220 png_voidp error_ptr = png_get_error_ptr(png_ptr); | |
221 png_error_ptr error_fn = NULL; // leave as default | |
222 png_set_error_fn(png_ptr, error_ptr, error_fn, warning_fn); | |
223 | |
215 *png_ptrp = png_ptr; | 224 *png_ptrp = png_ptr; |
216 | 225 |
217 /* Allocate/initialize the memory for image information. */ | 226 /* Allocate/initialize the memory for image information. */ |
218 png_infop info_ptr = png_create_info_struct(png_ptr); | 227 png_infop info_ptr = png_create_info_struct(png_ptr); |
219 if (info_ptr == NULL) { | 228 if (info_ptr == NULL) { |
220 png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL); | 229 png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL); |
221 return false; | 230 return false; |
222 } | 231 } |
223 *info_ptrp = info_ptr; | 232 *info_ptrp = info_ptr; |
224 | 233 |
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
488 which means we will find more matches than we should. The real | 497 which means we will find more matches than we should. The real |
489 fix seems to be to see the actual 16bit components, do the | 498 fix seems to be to see the actual 16bit components, do the |
490 compare, and then knock it down to 8bits ourselves. | 499 compare, and then knock it down to 8bits ourselves. |
491 */ | 500 */ |
492 if (colorType & PNG_COLOR_MASK_COLOR) { | 501 if (colorType & PNG_COLOR_MASK_COLOR) { |
493 if (16 == bitDepth) { | 502 if (16 == bitDepth) { |
494 *theTranspColorp = SkPackARGB32(0xFF, transpColor->red >> 8, | 503 *theTranspColorp = SkPackARGB32(0xFF, transpColor->red >> 8, |
495 transpColor->green >> 8, | 504 transpColor->green >> 8, |
496 transpColor->blue >> 8); | 505 transpColor->blue >> 8); |
497 } else { | 506 } else { |
498 *theTranspColorp = SkPackARGB32(0xFF, transpColor->red, | 507 *theTranspColorp = SkPackARGB32(0xFF, |
499 transpColor->green, | 508 0xFF & (transpColor->red), |
500 transpColor->blue); | 509 0xFF & (transpColor->green), |
510 0xFF & (transpColor->blue)); | |
511 /* We apply the mask because in a very small | |
scroggo
2013/10/01 22:04:14
Shouldn't this go above the code it applies to?
| |
512 number of corrupt PNGs, (transpColor->red > 255) | |
513 and (bitDepth == 8), for certain versions of libpng. */ | |
501 } | 514 } |
502 } else { // gray | 515 } else { // gray |
503 if (16 == bitDepth) { | 516 if (16 == bitDepth) { |
504 *theTranspColorp = SkPackARGB32(0xFF, transpColor->gray >> 8 , | 517 *theTranspColorp = SkPackARGB32(0xFF, transpColor->gray >> 8 , |
505 transpColor->gray >> 8, | 518 transpColor->gray >> 8, |
506 transpColor->gray >> 8); | 519 transpColor->gray >> 8); |
507 } else { | 520 } else { |
508 *theTranspColorp = SkPackARGB32(0xFF, transpColor->gray, | 521 *theTranspColorp = SkPackARGB32(0xFF, |
scroggo
2013/10/01 22:04:14
Similar comment explaining the mask?
| |
509 transpColor->gray, | 522 0xFF & (transpColor->gray), |
510 transpColor->gray); | 523 0xFF & (transpColor->gray), |
524 0xFF & (transpColor->gray)); | |
511 } | 525 } |
512 } | 526 } |
513 } | 527 } |
514 | 528 |
515 if (valid || | 529 if (valid || |
516 PNG_COLOR_TYPE_RGB_ALPHA == colorType || | 530 PNG_COLOR_TYPE_RGB_ALPHA == colorType || |
517 PNG_COLOR_TYPE_GRAY_ALPHA == colorType) { | 531 PNG_COLOR_TYPE_GRAY_ALPHA == colorType) { |
518 *hasAlphap = true; | 532 *hasAlphap = true; |
519 } | 533 } |
520 | 534 |
(...skipping 671 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1192 return SkImageDecoder::kUnknown_Format; | 1206 return SkImageDecoder::kUnknown_Format; |
1193 } | 1207 } |
1194 | 1208 |
1195 SkImageEncoder* sk_libpng_efactory(SkImageEncoder::Type t) { | 1209 SkImageEncoder* sk_libpng_efactory(SkImageEncoder::Type t) { |
1196 return (SkImageEncoder::kPNG_Type == t) ? SkNEW(SkPNGImageEncoder) : NULL; | 1210 return (SkImageEncoder::kPNG_Type == t) ? SkNEW(SkPNGImageEncoder) : NULL; |
1197 } | 1211 } |
1198 | 1212 |
1199 static SkImageDecoder_DecodeReg gDReg(sk_libpng_dfactory); | 1213 static SkImageDecoder_DecodeReg gDReg(sk_libpng_dfactory); |
1200 static SkImageDecoder_FormatReg gFormatReg(get_format_png); | 1214 static SkImageDecoder_FormatReg gFormatReg(get_format_png); |
1201 static SkImageEncoder_EncodeReg gEReg(sk_libpng_efactory); | 1215 static SkImageEncoder_EncodeReg gEReg(sk_libpng_efactory); |
OLD | NEW |