12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 * version 2 for more details (a copy is included in the LICENSE file that
14 * accompanied this code).
15 *
16 * You should have received a copy of the GNU General Public License version
17 * 2 along with this work; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19 *
20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21 * or visit www.oracle.com if you need additional information or have any
22 * questions.
23 */
24
25 /* pngtrans.c - transforms the data in a row (used by both readers and writers)
26 *
27 * This file is available under and governed by the GNU General Public
28 * License version 2 only, as published by the Free Software Foundation.
29 * However, the following notice accompanied the original version of this
30 * file and, per its terms, should not be removed:
31 *
32 * Last changed in libpng 1.6.35 [July 15, 2018]
33 * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
34 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
35 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
36 *
37 * This code is released under the libpng license.
38 * For conditions of distribution and use, see the disclaimer
39 * and license in png.h
40 */
41
42 #include "pngpriv.h"
43
44 #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
45
46 #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
47 /* Turn on BGR-to-RGB mapping */
48 void PNGAPI
49 png_set_bgr(png_structrp png_ptr)
50 {
51 png_debug(1, "in png_set_bgr");
52
53 if (png_ptr == NULL)
54 return;
55
356
357 for (i = 0; i < istop; i++, rp += 2)
358 {
359 #ifdef PNG_BUILTIN_BSWAP16_SUPPORTED
360 /* Feature added to libpng-1.6.11 for testing purposes, not
361 * enabled by default.
362 */
363 *(png_uint_16*)rp = __builtin_bswap16(*(png_uint_16*)rp);
364 #else
365 png_byte t = *rp;
366 *rp = *(rp + 1);
367 *(rp + 1) = t;
368 #endif
369 }
370 }
371 }
372 #endif
373 #endif
374
375 #if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
376 static PNG_CONST png_byte onebppswaptable[256] = {
377 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,
378 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
379 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8,
380 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
381 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4,
382 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
383 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC,
384 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
385 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2,
386 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
387 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA,
388 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
389 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6,
390 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
391 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE,
392 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
393 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1,
394 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
395 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9,
396 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
397 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5,
398 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
399 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED,
400 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
401 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3,
402 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
403 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB,
404 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
405 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7,
406 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
407 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF,
408 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
409 };
410
411 static PNG_CONST png_byte twobppswaptable[256] = {
412 0x00, 0x40, 0x80, 0xC0, 0x10, 0x50, 0x90, 0xD0,
413 0x20, 0x60, 0xA0, 0xE0, 0x30, 0x70, 0xB0, 0xF0,
414 0x04, 0x44, 0x84, 0xC4, 0x14, 0x54, 0x94, 0xD4,
415 0x24, 0x64, 0xA4, 0xE4, 0x34, 0x74, 0xB4, 0xF4,
416 0x08, 0x48, 0x88, 0xC8, 0x18, 0x58, 0x98, 0xD8,
417 0x28, 0x68, 0xA8, 0xE8, 0x38, 0x78, 0xB8, 0xF8,
418 0x0C, 0x4C, 0x8C, 0xCC, 0x1C, 0x5C, 0x9C, 0xDC,
419 0x2C, 0x6C, 0xAC, 0xEC, 0x3C, 0x7C, 0xBC, 0xFC,
420 0x01, 0x41, 0x81, 0xC1, 0x11, 0x51, 0x91, 0xD1,
421 0x21, 0x61, 0xA1, 0xE1, 0x31, 0x71, 0xB1, 0xF1,
422 0x05, 0x45, 0x85, 0xC5, 0x15, 0x55, 0x95, 0xD5,
423 0x25, 0x65, 0xA5, 0xE5, 0x35, 0x75, 0xB5, 0xF5,
424 0x09, 0x49, 0x89, 0xC9, 0x19, 0x59, 0x99, 0xD9,
425 0x29, 0x69, 0xA9, 0xE9, 0x39, 0x79, 0xB9, 0xF9,
426 0x0D, 0x4D, 0x8D, 0xCD, 0x1D, 0x5D, 0x9D, 0xDD,
427 0x2D, 0x6D, 0xAD, 0xED, 0x3D, 0x7D, 0xBD, 0xFD,
428 0x02, 0x42, 0x82, 0xC2, 0x12, 0x52, 0x92, 0xD2,
429 0x22, 0x62, 0xA2, 0xE2, 0x32, 0x72, 0xB2, 0xF2,
430 0x06, 0x46, 0x86, 0xC6, 0x16, 0x56, 0x96, 0xD6,
431 0x26, 0x66, 0xA6, 0xE6, 0x36, 0x76, 0xB6, 0xF6,
432 0x0A, 0x4A, 0x8A, 0xCA, 0x1A, 0x5A, 0x9A, 0xDA,
433 0x2A, 0x6A, 0xAA, 0xEA, 0x3A, 0x7A, 0xBA, 0xFA,
434 0x0E, 0x4E, 0x8E, 0xCE, 0x1E, 0x5E, 0x9E, 0xDE,
435 0x2E, 0x6E, 0xAE, 0xEE, 0x3E, 0x7E, 0xBE, 0xFE,
436 0x03, 0x43, 0x83, 0xC3, 0x13, 0x53, 0x93, 0xD3,
437 0x23, 0x63, 0xA3, 0xE3, 0x33, 0x73, 0xB3, 0xF3,
438 0x07, 0x47, 0x87, 0xC7, 0x17, 0x57, 0x97, 0xD7,
439 0x27, 0x67, 0xA7, 0xE7, 0x37, 0x77, 0xB7, 0xF7,
440 0x0B, 0x4B, 0x8B, 0xCB, 0x1B, 0x5B, 0x9B, 0xDB,
441 0x2B, 0x6B, 0xAB, 0xEB, 0x3B, 0x7B, 0xBB, 0xFB,
442 0x0F, 0x4F, 0x8F, 0xCF, 0x1F, 0x5F, 0x9F, 0xDF,
443 0x2F, 0x6F, 0xAF, 0xEF, 0x3F, 0x7F, 0xBF, 0xFF
444 };
445
446 static PNG_CONST png_byte fourbppswaptable[256] = {
447 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70,
448 0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0,
449 0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71,
450 0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1,
451 0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72,
452 0x82, 0x92, 0xA2, 0xB2, 0xC2, 0xD2, 0xE2, 0xF2,
453 0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73,
454 0x83, 0x93, 0xA3, 0xB3, 0xC3, 0xD3, 0xE3, 0xF3,
455 0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74,
456 0x84, 0x94, 0xA4, 0xB4, 0xC4, 0xD4, 0xE4, 0xF4,
457 0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75,
458 0x85, 0x95, 0xA5, 0xB5, 0xC5, 0xD5, 0xE5, 0xF5,
459 0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76,
460 0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6,
461 0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77,
462 0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7,
463 0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78,
464 0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8,
465 0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79,
466 0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9,
|
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 * version 2 for more details (a copy is included in the LICENSE file that
14 * accompanied this code).
15 *
16 * You should have received a copy of the GNU General Public License version
17 * 2 along with this work; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19 *
20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21 * or visit www.oracle.com if you need additional information or have any
22 * questions.
23 */
24
25 /* pngtrans.c - transforms the data in a row (used by both readers and writers)
26 *
27 * This file is available under and governed by the GNU General Public
28 * License version 2 only, as published by the Free Software Foundation.
29 * However, the following notice accompanied the original version of this
30 * file and, per its terms, should not be removed:
31 *
32 * Copyright (c) 2018 Cosmin Truta
33 * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
34 * Copyright (c) 1996-1997 Andreas Dilger
35 * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
36 *
37 * This code is released under the libpng license.
38 * For conditions of distribution and use, see the disclaimer
39 * and license in png.h
40 */
41
42 #include "pngpriv.h"
43
44 #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
45
46 #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
47 /* Turn on BGR-to-RGB mapping */
48 void PNGAPI
49 png_set_bgr(png_structrp png_ptr)
50 {
51 png_debug(1, "in png_set_bgr");
52
53 if (png_ptr == NULL)
54 return;
55
356
357 for (i = 0; i < istop; i++, rp += 2)
358 {
359 #ifdef PNG_BUILTIN_BSWAP16_SUPPORTED
360 /* Feature added to libpng-1.6.11 for testing purposes, not
361 * enabled by default.
362 */
363 *(png_uint_16*)rp = __builtin_bswap16(*(png_uint_16*)rp);
364 #else
365 png_byte t = *rp;
366 *rp = *(rp + 1);
367 *(rp + 1) = t;
368 #endif
369 }
370 }
371 }
372 #endif
373 #endif
374
375 #if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
376 static const png_byte onebppswaptable[256] = {
377 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,
378 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
379 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8,
380 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
381 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4,
382 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
383 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC,
384 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
385 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2,
386 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
387 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA,
388 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
389 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6,
390 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
391 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE,
392 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
393 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1,
394 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
395 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9,
396 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
397 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5,
398 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
399 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED,
400 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
401 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3,
402 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
403 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB,
404 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
405 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7,
406 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
407 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF,
408 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
409 };
410
411 static const png_byte twobppswaptable[256] = {
412 0x00, 0x40, 0x80, 0xC0, 0x10, 0x50, 0x90, 0xD0,
413 0x20, 0x60, 0xA0, 0xE0, 0x30, 0x70, 0xB0, 0xF0,
414 0x04, 0x44, 0x84, 0xC4, 0x14, 0x54, 0x94, 0xD4,
415 0x24, 0x64, 0xA4, 0xE4, 0x34, 0x74, 0xB4, 0xF4,
416 0x08, 0x48, 0x88, 0xC8, 0x18, 0x58, 0x98, 0xD8,
417 0x28, 0x68, 0xA8, 0xE8, 0x38, 0x78, 0xB8, 0xF8,
418 0x0C, 0x4C, 0x8C, 0xCC, 0x1C, 0x5C, 0x9C, 0xDC,
419 0x2C, 0x6C, 0xAC, 0xEC, 0x3C, 0x7C, 0xBC, 0xFC,
420 0x01, 0x41, 0x81, 0xC1, 0x11, 0x51, 0x91, 0xD1,
421 0x21, 0x61, 0xA1, 0xE1, 0x31, 0x71, 0xB1, 0xF1,
422 0x05, 0x45, 0x85, 0xC5, 0x15, 0x55, 0x95, 0xD5,
423 0x25, 0x65, 0xA5, 0xE5, 0x35, 0x75, 0xB5, 0xF5,
424 0x09, 0x49, 0x89, 0xC9, 0x19, 0x59, 0x99, 0xD9,
425 0x29, 0x69, 0xA9, 0xE9, 0x39, 0x79, 0xB9, 0xF9,
426 0x0D, 0x4D, 0x8D, 0xCD, 0x1D, 0x5D, 0x9D, 0xDD,
427 0x2D, 0x6D, 0xAD, 0xED, 0x3D, 0x7D, 0xBD, 0xFD,
428 0x02, 0x42, 0x82, 0xC2, 0x12, 0x52, 0x92, 0xD2,
429 0x22, 0x62, 0xA2, 0xE2, 0x32, 0x72, 0xB2, 0xF2,
430 0x06, 0x46, 0x86, 0xC6, 0x16, 0x56, 0x96, 0xD6,
431 0x26, 0x66, 0xA6, 0xE6, 0x36, 0x76, 0xB6, 0xF6,
432 0x0A, 0x4A, 0x8A, 0xCA, 0x1A, 0x5A, 0x9A, 0xDA,
433 0x2A, 0x6A, 0xAA, 0xEA, 0x3A, 0x7A, 0xBA, 0xFA,
434 0x0E, 0x4E, 0x8E, 0xCE, 0x1E, 0x5E, 0x9E, 0xDE,
435 0x2E, 0x6E, 0xAE, 0xEE, 0x3E, 0x7E, 0xBE, 0xFE,
436 0x03, 0x43, 0x83, 0xC3, 0x13, 0x53, 0x93, 0xD3,
437 0x23, 0x63, 0xA3, 0xE3, 0x33, 0x73, 0xB3, 0xF3,
438 0x07, 0x47, 0x87, 0xC7, 0x17, 0x57, 0x97, 0xD7,
439 0x27, 0x67, 0xA7, 0xE7, 0x37, 0x77, 0xB7, 0xF7,
440 0x0B, 0x4B, 0x8B, 0xCB, 0x1B, 0x5B, 0x9B, 0xDB,
441 0x2B, 0x6B, 0xAB, 0xEB, 0x3B, 0x7B, 0xBB, 0xFB,
442 0x0F, 0x4F, 0x8F, 0xCF, 0x1F, 0x5F, 0x9F, 0xDF,
443 0x2F, 0x6F, 0xAF, 0xEF, 0x3F, 0x7F, 0xBF, 0xFF
444 };
445
446 static const png_byte fourbppswaptable[256] = {
447 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70,
448 0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0,
449 0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71,
450 0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1,
451 0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72,
452 0x82, 0x92, 0xA2, 0xB2, 0xC2, 0xD2, 0xE2, 0xF2,
453 0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73,
454 0x83, 0x93, 0xA3, 0xB3, 0xC3, 0xD3, 0xE3, 0xF3,
455 0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74,
456 0x84, 0x94, 0xA4, 0xB4, 0xC4, 0xD4, 0xE4, 0xF4,
457 0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75,
458 0x85, 0x95, 0xA5, 0xB5, 0xC5, 0xD5, 0xE5, 0xF5,
459 0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76,
460 0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6,
461 0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77,
462 0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7,
463 0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78,
464 0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8,
465 0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79,
466 0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9,
|