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

Side by Side Diff: third_party/libpng/pngtrans.c

Issue 1591483003: XFA: Upgrade libpng to 1.6.20. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@xfa
Patch Set: rebase Created 4 years, 11 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 | « third_party/libpng/pngstruct.h ('k') | third_party/libpng/pngwio.c » ('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 /* pngtrans.c - transforms the data in a row (used by both readers and writers) 2 /* pngtrans.c - transforms the data in a row (used by both readers and writers)
2 * 3 *
3 * Last changed in libpng 1.6.2 [April 25, 2013] 4 * Last changed in libpng 1.6.18 [July 23, 2015]
4 * Copyright (c) 1998-2013 Glenn Randers-Pehrson 5 * Copyright (c) 1998-2015 Glenn Randers-Pehrson
5 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) 6 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
6 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) 7 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
7 * 8 *
8 * This code is released under the libpng license. 9 * This code is released under the libpng license.
9 * For conditions of distribution and use, see the disclaimer 10 * For conditions of distribution and use, see the disclaimer
10 * and license in png.h 11 * and license in png.h
11 */ 12 */
12 13
13 #include "pngpriv.h" 14 #include "pngpriv.h"
14 15
15 #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) 16 #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
16 17
17 #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) 18 #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
18 /* Turn on BGR-to-RGB mapping */ 19 /* Turn on BGR-to-RGB mapping */
19 void PNGAPI 20 void PNGAPI
20 png_set_bgr(png_structrp png_ptr) 21 png_set_bgr(png_structrp png_ptr)
21 { 22 {
22 png_debug(1, "in png_set_bgr"); 23 png_debug(1, "in png_set_bgr");
23 24
24 if (png_ptr == NULL) 25 if (png_ptr == NULL)
25 return; 26 return;
26 27
27 png_ptr->transformations |= PNG_BGR; 28 png_ptr->transformations |= PNG_BGR;
28 } 29 }
29 #endif 30 #endif
30 31
31 #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) 32 #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
32 /* Turn on 16 bit byte swapping */ 33 /* Turn on 16-bit byte swapping */
33 void PNGAPI 34 void PNGAPI
34 png_set_swap(png_structrp png_ptr) 35 png_set_swap(png_structrp png_ptr)
35 { 36 {
36 png_debug(1, "in png_set_swap"); 37 png_debug(1, "in png_set_swap");
37 38
38 if (png_ptr == NULL) 39 if (png_ptr == NULL)
39 return; 40 return;
40 41
41 if (png_ptr->bit_depth == 16) 42 if (png_ptr->bit_depth == 16)
42 png_ptr->transformations |= PNG_SWAP_BYTES; 43 png_ptr->transformations |= PNG_SWAP_BYTES;
43 } 44 }
44 #endif 45 #endif
45 46
46 #if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED) 47 #if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED)
47 /* Turn on pixel packing */ 48 /* Turn on pixel packing */
48 void PNGAPI 49 void PNGAPI
49 png_set_packing(png_structrp png_ptr) 50 png_set_packing(png_structrp png_ptr)
50 { 51 {
51 png_debug(1, "in png_set_packing"); 52 png_debug(1, "in png_set_packing");
52 53
53 if (png_ptr == NULL) 54 if (png_ptr == NULL)
54 return; 55 return;
55 56
56 if (png_ptr->bit_depth < 8) 57 if (png_ptr->bit_depth < 8)
57 { 58 {
58 png_ptr->transformations |= PNG_PACK; 59 png_ptr->transformations |= PNG_PACK;
59 png_ptr->usr_bit_depth = 8; 60 # ifdef PNG_WRITE_SUPPORTED
61 png_ptr->usr_bit_depth = 8;
62 # endif
60 } 63 }
61 } 64 }
62 #endif 65 #endif
63 66
64 #if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED) 67 #if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
65 /* Turn on packed pixel swapping */ 68 /* Turn on packed pixel swapping */
66 void PNGAPI 69 void PNGAPI
67 png_set_packswap(png_structrp png_ptr) 70 png_set_packswap(png_structrp png_ptr)
68 { 71 {
69 png_debug(1, "in png_set_packswap"); 72 png_debug(1, "in png_set_packswap");
(...skipping 20 matching lines...) Expand all
90 } 93 }
91 #endif 94 #endif
92 95
93 #if defined(PNG_READ_INTERLACING_SUPPORTED) || \ 96 #if defined(PNG_READ_INTERLACING_SUPPORTED) || \
94 defined(PNG_WRITE_INTERLACING_SUPPORTED) 97 defined(PNG_WRITE_INTERLACING_SUPPORTED)
95 int PNGAPI 98 int PNGAPI
96 png_set_interlace_handling(png_structrp png_ptr) 99 png_set_interlace_handling(png_structrp png_ptr)
97 { 100 {
98 png_debug(1, "in png_set_interlace handling"); 101 png_debug(1, "in png_set_interlace handling");
99 102
100 if (png_ptr && png_ptr->interlaced) 103 if (png_ptr != 0 && png_ptr->interlaced != 0)
101 { 104 {
102 png_ptr->transformations |= PNG_INTERLACE; 105 png_ptr->transformations |= PNG_INTERLACE;
103 return (7); 106 return (7);
104 } 107 }
105 108
106 return (1); 109 return (1);
107 } 110 }
108 #endif 111 #endif
109 112
110 #if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) 113 #if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)
111 /* Add a filler byte on read, or remove a filler or alpha byte on write. 114 /* Add a filler byte on read, or remove a filler or alpha byte on write.
112 * The filler type has changed in v0.95 to allow future 2-byte fillers 115 * The filler type has changed in v0.95 to allow future 2-byte fillers
113 * for 48-bit input data, as well as to avoid problems with some compilers 116 * for 48-bit input data, as well as to avoid problems with some compilers
114 * that don't like bytes as parameters. 117 * that don't like bytes as parameters.
115 */ 118 */
116 void PNGAPI 119 void PNGAPI
117 png_set_filler(png_structrp png_ptr, png_uint_32 filler, int filler_loc) 120 png_set_filler(png_structrp png_ptr, png_uint_32 filler, int filler_loc)
118 { 121 {
119 png_debug(1, "in png_set_filler"); 122 png_debug(1, "in png_set_filler");
120 123
121 if (png_ptr == NULL) 124 if (png_ptr == NULL)
122 return; 125 return;
123 126
124 /* In libpng 1.6 it is possible to determine whether this is a read or write 127 /* In libpng 1.6 it is possible to determine whether this is a read or write
125 * operation and therefore to do more checking here for a valid call. 128 * operation and therefore to do more checking here for a valid call.
126 */ 129 */
127 if (png_ptr->mode & PNG_IS_READ_STRUCT) 130 if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0)
128 { 131 {
129 # ifdef PNG_READ_FILLER_SUPPORTED 132 # ifdef PNG_READ_FILLER_SUPPORTED
130 /* On read png_set_filler is always valid, regardless of the base PNG 133 /* On read png_set_filler is always valid, regardless of the base PNG
131 * format, because other transformations can give a format where the 134 * format, because other transformations can give a format where the
132 * filler code can execute (basically an 8 or 16-bit component RGB or G 135 * filler code can execute (basically an 8 or 16-bit component RGB or G
133 * format.) 136 * format.)
134 * 137 *
135 * NOTE: usr_channels is not used by the read code! (This has led to 138 * NOTE: usr_channels is not used by the read code! (This has led to
136 * confusion in the past.) The filler is only used in the read code. 139 * confusion in the past.) The filler is only used in the read code.
137 */ 140 */
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
200 void PNGAPI 203 void PNGAPI
201 png_set_add_alpha(png_structrp png_ptr, png_uint_32 filler, int filler_loc) 204 png_set_add_alpha(png_structrp png_ptr, png_uint_32 filler, int filler_loc)
202 { 205 {
203 png_debug(1, "in png_set_add_alpha"); 206 png_debug(1, "in png_set_add_alpha");
204 207
205 if (png_ptr == NULL) 208 if (png_ptr == NULL)
206 return; 209 return;
207 210
208 png_set_filler(png_ptr, filler, filler_loc); 211 png_set_filler(png_ptr, filler, filler_loc);
209 /* The above may fail to do anything. */ 212 /* The above may fail to do anything. */
210 if (png_ptr->transformations & PNG_FILLER) 213 if ((png_ptr->transformations & PNG_FILLER) != 0)
211 png_ptr->transformations |= PNG_ADD_ALPHA; 214 png_ptr->transformations |= PNG_ADD_ALPHA;
212 } 215 }
213 216
214 #endif 217 #endif
215 218
216 #if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \ 219 #if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \
217 defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) 220 defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
218 void PNGAPI 221 void PNGAPI
219 png_set_swap_alpha(png_structrp png_ptr) 222 png_set_swap_alpha(png_structrp png_ptr)
220 { 223 {
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
303 *(rp + 1) = (png_byte)(~(*(rp + 1))); 306 *(rp + 1) = (png_byte)(~(*(rp + 1)));
304 rp += 4; 307 rp += 4;
305 } 308 }
306 } 309 }
307 #endif 310 #endif
308 } 311 }
309 #endif 312 #endif
310 313
311 #ifdef PNG_16BIT_SUPPORTED 314 #ifdef PNG_16BIT_SUPPORTED
312 #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) 315 #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
313 /* Swaps byte order on 16 bit depth images */ 316 /* Swaps byte order on 16-bit depth images */
314 void /* PRIVATE */ 317 void /* PRIVATE */
315 png_do_swap(png_row_infop row_info, png_bytep row) 318 png_do_swap(png_row_infop row_info, png_bytep row)
316 { 319 {
317 png_debug(1, "in png_do_swap"); 320 png_debug(1, "in png_do_swap");
318 321
319 if (row_info->bit_depth == 16) 322 if (row_info->bit_depth == 16)
320 { 323 {
321 png_bytep rp = row; 324 png_bytep rp = row;
322 png_uint_32 i; 325 png_uint_32 i;
323 png_uint_32 istop= row_info->width * row_info->channels; 326 png_uint_32 istop= row_info->width * row_info->channels;
324 327
325 for (i = 0; i < istop; i++, rp += 2) 328 for (i = 0; i < istop; i++, rp += 2)
326 { 329 {
330 #ifdef PNG_BUILTIN_BSWAP16_SUPPORTED
331 /* Feature added to libpng-1.6.11 for testing purposes, not
332 * enabled by default.
333 */
334 *(png_uint_16*)rp = __builtin_bswap16(*(png_uint_16*)rp);
335 #else
327 png_byte t = *rp; 336 png_byte t = *rp;
328 *rp = *(rp + 1); 337 *rp = *(rp + 1);
329 *(rp + 1) = t; 338 *(rp + 1) = t;
339 #endif
330 } 340 }
331 } 341 }
332 } 342 }
333 #endif 343 #endif
334 #endif 344 #endif
335 345
336 #if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED) 346 #if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
337 static PNG_CONST png_byte onebppswaptable[256] = { 347 static PNG_CONST png_byte onebppswaptable[256] = {
338 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 348 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,
339 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0, 349 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
461 else if (row_info->bit_depth == 4) 471 else if (row_info->bit_depth == 4)
462 table = fourbppswaptable; 472 table = fourbppswaptable;
463 473
464 else 474 else
465 return; 475 return;
466 476
467 for (rp = row; rp < end; rp++) 477 for (rp = row; rp < end; rp++)
468 *rp = table[*rp]; 478 *rp = table[*rp];
469 } 479 }
470 } 480 }
471 #endif /* PNG_READ_PACKSWAP_SUPPORTED or PNG_WRITE_PACKSWAP_SUPPORTED */ 481 #endif /* PACKSWAP || WRITE_PACKSWAP */
472 482
473 #if defined(PNG_WRITE_FILLER_SUPPORTED) || \ 483 #if defined(PNG_WRITE_FILLER_SUPPORTED) || \
474 defined(PNG_READ_STRIP_ALPHA_SUPPORTED) 484 defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
475 /* Remove a channel - this used to be 'png_do_strip_filler' but it used a 485 /* Remove a channel - this used to be 'png_do_strip_filler' but it used a
476 * somewhat weird combination of flags to determine what to do. All the calls 486 * somewhat weird combination of flags to determine what to do. All the calls
477 * to png_do_strip_filler are changed in 1.5.2 to call this instead with the 487 * to png_do_strip_filler are changed in 1.5.2 to call this instead with the
478 * correct arguments. 488 * correct arguments.
479 * 489 *
480 * The routine isn't general - the channel must be the channel at the start or 490 * The routine isn't general - the channel must be the channel at the start or
481 * end (not in the middle) of each pixel. 491 * end (not in the middle) of each pixel.
(...skipping 11 matching lines...) Expand all
493 * 503 *
494 * at_start: 0 -- convert AG, XG, ARGB, XRGB, AAGG, XXGG, etc. 504 * at_start: 0 -- convert AG, XG, ARGB, XRGB, AAGG, XXGG, etc.
495 * nonzero -- convert GA, GX, RGBA, RGBX, GGAA, RRGGBBXX, etc. 505 * nonzero -- convert GA, GX, RGBA, RGBX, GGAA, RRGGBBXX, etc.
496 */ 506 */
497 507
498 /* GA, GX, XG cases */ 508 /* GA, GX, XG cases */
499 if (row_info->channels == 2) 509 if (row_info->channels == 2)
500 { 510 {
501 if (row_info->bit_depth == 8) 511 if (row_info->bit_depth == 8)
502 { 512 {
503 if (at_start) /* Skip initial filler */ 513 if (at_start != 0) /* Skip initial filler */
504 ++sp; 514 ++sp;
505 else /* Skip initial channel and, for sp, the filler */ 515 else /* Skip initial channel and, for sp, the filler */
506 sp += 2, ++dp; 516 sp += 2, ++dp;
507 517
508 /* For a 1 pixel wide image there is nothing to do */ 518 /* For a 1 pixel wide image there is nothing to do */
509 while (sp < ep) 519 while (sp < ep)
510 *dp++ = *sp, sp += 2; 520 *dp++ = *sp, sp += 2;
511 521
512 row_info->pixel_depth = 8; 522 row_info->pixel_depth = 8;
513 } 523 }
514 524
515 else if (row_info->bit_depth == 16) 525 else if (row_info->bit_depth == 16)
516 { 526 {
517 if (at_start) /* Skip initial filler */ 527 if (at_start != 0) /* Skip initial filler */
518 sp += 2; 528 sp += 2;
519 else /* Skip initial channel and, for sp, the filler */ 529 else /* Skip initial channel and, for sp, the filler */
520 sp += 4, dp += 2; 530 sp += 4, dp += 2;
521 531
522 while (sp < ep) 532 while (sp < ep)
523 *dp++ = *sp++, *dp++ = *sp, sp += 3; 533 *dp++ = *sp++, *dp++ = *sp, sp += 3;
524 534
525 row_info->pixel_depth = 16; 535 row_info->pixel_depth = 16;
526 } 536 }
527 537
528 else 538 else
529 return; /* bad bit depth */ 539 return; /* bad bit depth */
530 540
531 row_info->channels = 1; 541 row_info->channels = 1;
532 542
533 /* Finally fix the color type if it records an alpha channel */ 543 /* Finally fix the color type if it records an alpha channel */
534 if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) 544 if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
535 row_info->color_type = PNG_COLOR_TYPE_GRAY; 545 row_info->color_type = PNG_COLOR_TYPE_GRAY;
536 } 546 }
537 547
538 /* RGBA, RGBX, XRGB cases */ 548 /* RGBA, RGBX, XRGB cases */
539 else if (row_info->channels == 4) 549 else if (row_info->channels == 4)
540 { 550 {
541 if (row_info->bit_depth == 8) 551 if (row_info->bit_depth == 8)
542 { 552 {
543 if (at_start) /* Skip initial filler */ 553 if (at_start != 0) /* Skip initial filler */
544 ++sp; 554 ++sp;
545 else /* Skip initial channels and, for sp, the filler */ 555 else /* Skip initial channels and, for sp, the filler */
546 sp += 4, dp += 3; 556 sp += 4, dp += 3;
547 557
548 /* Note that the loop adds 3 to dp and 4 to sp each time. */ 558 /* Note that the loop adds 3 to dp and 4 to sp each time. */
549 while (sp < ep) 559 while (sp < ep)
550 *dp++ = *sp++, *dp++ = *sp++, *dp++ = *sp, sp += 2; 560 *dp++ = *sp++, *dp++ = *sp++, *dp++ = *sp, sp += 2;
551 561
552 row_info->pixel_depth = 24; 562 row_info->pixel_depth = 24;
553 } 563 }
554 564
555 else if (row_info->bit_depth == 16) 565 else if (row_info->bit_depth == 16)
556 { 566 {
557 if (at_start) /* Skip initial filler */ 567 if (at_start != 0) /* Skip initial filler */
558 sp += 2; 568 sp += 2;
559 else /* Skip initial channels and, for sp, the filler */ 569 else /* Skip initial channels and, for sp, the filler */
560 sp += 8, dp += 6; 570 sp += 8, dp += 6;
561 571
562 while (sp < ep) 572 while (sp < ep)
563 { 573 {
564 /* Copy 6 bytes, skip 2 */ 574 /* Copy 6 bytes, skip 2 */
565 *dp++ = *sp++, *dp++ = *sp++; 575 *dp++ = *sp++, *dp++ = *sp++;
566 *dp++ = *sp++, *dp++ = *sp++; 576 *dp++ = *sp++, *dp++ = *sp++;
567 *dp++ = *sp++, *dp++ = *sp, sp += 3; 577 *dp++ = *sp++, *dp++ = *sp, sp += 3;
(...skipping 20 matching lines...) Expand all
588 } 598 }
589 #endif 599 #endif
590 600
591 #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) 601 #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
592 /* Swaps red and blue bytes within a pixel */ 602 /* Swaps red and blue bytes within a pixel */
593 void /* PRIVATE */ 603 void /* PRIVATE */
594 png_do_bgr(png_row_infop row_info, png_bytep row) 604 png_do_bgr(png_row_infop row_info, png_bytep row)
595 { 605 {
596 png_debug(1, "in png_do_bgr"); 606 png_debug(1, "in png_do_bgr");
597 607
598 if ((row_info->color_type & PNG_COLOR_MASK_COLOR)) 608 if ((row_info->color_type & PNG_COLOR_MASK_COLOR) != 0)
599 { 609 {
600 png_uint_32 row_width = row_info->width; 610 png_uint_32 row_width = row_info->width;
601 if (row_info->bit_depth == 8) 611 if (row_info->bit_depth == 8)
602 { 612 {
603 if (row_info->color_type == PNG_COLOR_TYPE_RGB) 613 if (row_info->color_type == PNG_COLOR_TYPE_RGB)
604 { 614 {
605 png_bytep rp; 615 png_bytep rp;
606 png_uint_32 i; 616 png_uint_32 i;
607 617
608 for (i = 0, rp = row; i < row_width; i++, rp += 3) 618 for (i = 0, rp = row; i < row_width; i++, rp += 3)
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
658 *(rp + 4) = save; 668 *(rp + 4) = save;
659 save = *(rp + 1); 669 save = *(rp + 1);
660 *(rp + 1) = *(rp + 5); 670 *(rp + 1) = *(rp + 5);
661 *(rp + 5) = save; 671 *(rp + 5) = save;
662 } 672 }
663 } 673 }
664 } 674 }
665 #endif 675 #endif
666 } 676 }
667 } 677 }
668 #endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */ 678 #endif /* READ_BGR || WRITE_BGR */
669 679
670 #if defined(PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED) || \ 680 #if defined(PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED) || \
671 defined(PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED) 681 defined(PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED)
672 /* Added at libpng-1.5.10 */ 682 /* Added at libpng-1.5.10 */
673 void /* PRIVATE */ 683 void /* PRIVATE */
674 png_do_check_palette_indexes(png_structrp png_ptr, png_row_infop row_info) 684 png_do_check_palette_indexes(png_structrp png_ptr, png_row_infop row_info)
675 { 685 {
676 if (png_ptr->num_palette < (1 << row_info->bit_depth) && 686 if (png_ptr->num_palette < (1 << row_info->bit_depth) &&
677 png_ptr->num_palette > 0) /* num_palette can be 0 in MNG files */ 687 png_ptr->num_palette > 0) /* num_palette can be 0 in MNG files */
678 { 688 {
679 /* Calculations moved outside switch in an attempt to stop different 689 /* Calculations moved outside switch in an attempt to stop different
680 * compiler warnings. 'padding' is in *bits* within the last byte, it is 690 * compiler warnings. 'padding' is in *bits* within the last byte, it is
681 * an 'int' because pixel_depth becomes an 'int' in the expression below, 691 * an 'int' because pixel_depth becomes an 'int' in the expression below,
682 * and this calculation is used because it avoids warnings that other 692 * and this calculation is used because it avoids warnings that other
683 * forms produced on either GCC or MSVC. 693 * forms produced on either GCC or MSVC.
684 */ 694 */
685 int padding = (-row_info->pixel_depth * row_info->width) & 7; 695 int padding = (-row_info->pixel_depth * row_info->width) & 7;
686 png_bytep rp = png_ptr->row_buf + row_info->rowbytes; 696 png_bytep rp = png_ptr->row_buf + row_info->rowbytes;
687 697
688 switch (row_info->bit_depth) 698 switch (row_info->bit_depth)
689 { 699 {
690 case 1: 700 case 1:
691 { 701 {
692 /* in this case, all bytes must be 0 so we don't need 702 /* in this case, all bytes must be 0 so we don't need
693 * to unpack the pixels except for the rightmost one. 703 * to unpack the pixels except for the rightmost one.
694 */ 704 */
695 for (; rp > png_ptr->row_buf; rp--) 705 for (; rp > png_ptr->row_buf; rp--)
696 { 706 {
697 if (*rp >> padding != 0) 707 if ((*rp >> padding) != 0)
698 png_ptr->num_palette_max = 1; 708 png_ptr->num_palette_max = 1;
699 padding = 0; 709 padding = 0;
700 } 710 }
701 711
702 break; 712 break;
703 } 713 }
704 714
705 case 2: 715 case 2:
706 { 716 {
707 for (; rp > png_ptr->row_buf; rp--) 717 for (; rp > png_ptr->row_buf; rp--)
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
761 } 771 }
762 772
763 break; 773 break;
764 } 774 }
765 775
766 default: 776 default:
767 break; 777 break;
768 } 778 }
769 } 779 }
770 } 780 }
771 #endif /* PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED */ 781 #endif /* CHECK_FOR_INVALID_INDEX */
772 782
773 #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ 783 #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
774 defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) 784 defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
775 #ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED 785 #ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED
776 void PNGAPI 786 void PNGAPI
777 png_set_user_transform_info(png_structrp png_ptr, png_voidp 787 png_set_user_transform_info(png_structrp png_ptr, png_voidp
778 user_transform_ptr, int user_transform_depth, int user_transform_channels) 788 user_transform_ptr, int user_transform_depth, int user_transform_channels)
779 { 789 {
780 png_debug(1, "in png_set_user_transform_info"); 790 png_debug(1, "in png_set_user_transform_info");
781 791
(...skipping 29 matching lines...) Expand all
811 return (NULL); 821 return (NULL);
812 822
813 return png_ptr->user_transform_ptr; 823 return png_ptr->user_transform_ptr;
814 } 824 }
815 #endif 825 #endif
816 826
817 #ifdef PNG_USER_TRANSFORM_INFO_SUPPORTED 827 #ifdef PNG_USER_TRANSFORM_INFO_SUPPORTED
818 png_uint_32 PNGAPI 828 png_uint_32 PNGAPI
819 png_get_current_row_number(png_const_structrp png_ptr) 829 png_get_current_row_number(png_const_structrp png_ptr)
820 { 830 {
821 /* See the comments in png.h - this is the sub-image row when reading and 831 /* See the comments in png.h - this is the sub-image row when reading an
822 * interlaced image. 832 * interlaced image.
823 */ 833 */
824 if (png_ptr != NULL) 834 if (png_ptr != NULL)
825 return png_ptr->row_number; 835 return png_ptr->row_number;
826 836
827 return PNG_UINT_32_MAX; /* help the app not to fail silently */ 837 return PNG_UINT_32_MAX; /* help the app not to fail silently */
828 } 838 }
829 839
830 png_byte PNGAPI 840 png_byte PNGAPI
831 png_get_current_pass_number(png_const_structrp png_ptr) 841 png_get_current_pass_number(png_const_structrp png_ptr)
832 { 842 {
833 if (png_ptr != NULL) 843 if (png_ptr != NULL)
834 return png_ptr->pass; 844 return png_ptr->pass;
835 return 8; /* invalid */ 845 return 8; /* invalid */
836 } 846 }
837 #endif /* PNG_USER_TRANSFORM_INFO_SUPPORTED */ 847 #endif /* USER_TRANSFORM_INFO */
838 #endif /* PNG_READ_USER_TRANSFORM_SUPPORTED || 848 #endif /* READ_USER_TRANSFORM || WRITE_USER_TRANSFORM */
839 PNG_WRITE_USER_TRANSFORM_SUPPORTED */ 849 #endif /* READ || WRITE */
840 #endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */
OLDNEW
« no previous file with comments | « third_party/libpng/pngstruct.h ('k') | third_party/libpng/pngwio.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698