7 * particular file as subject to the "Classpath" exception as provided
8 * by Oracle in the LICENSE file that accompanied this code.
9 *
10 * This code is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
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,
|
7 * particular file as subject to the "Classpath" exception as provided
8 * by Oracle in the LICENSE file that accompanied this code.
9 *
10 * This code is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
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 * Copyright (c) 2018 Cosmin Truta
28 * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
29 * Copyright (c) 1996-1997 Andreas Dilger
30 * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
31 *
32 * This code is released under the libpng license.
33 * For conditions of distribution and use, see the disclaimer
34 * and license in png.h
35 */
36
37 #include "pngpriv.h"
38
39 #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
40
41 #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
42 /* Turn on BGR-to-RGB mapping */
43 void PNGAPI
44 png_set_bgr(png_structrp png_ptr)
45 {
46 png_debug(1, "in png_set_bgr");
47
48 if (png_ptr == NULL)
49 return;
50
351
352 for (i = 0; i < istop; i++, rp += 2)
353 {
354 #ifdef PNG_BUILTIN_BSWAP16_SUPPORTED
355 /* Feature added to libpng-1.6.11 for testing purposes, not
356 * enabled by default.
357 */
358 *(png_uint_16*)rp = __builtin_bswap16(*(png_uint_16*)rp);
359 #else
360 png_byte t = *rp;
361 *rp = *(rp + 1);
362 *(rp + 1) = t;
363 #endif
364 }
365 }
366 }
367 #endif
368 #endif
369
370 #if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
371 static const png_byte onebppswaptable[256] = {
372 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,
373 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
374 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8,
375 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
376 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4,
377 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
378 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC,
379 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
380 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2,
381 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
382 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA,
383 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
384 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6,
385 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
386 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE,
387 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
388 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1,
389 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
390 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9,
391 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
392 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5,
393 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
394 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED,
395 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
396 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3,
397 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
398 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB,
399 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
400 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7,
401 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
402 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF,
403 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
404 };
405
406 static const png_byte twobppswaptable[256] = {
407 0x00, 0x40, 0x80, 0xC0, 0x10, 0x50, 0x90, 0xD0,
408 0x20, 0x60, 0xA0, 0xE0, 0x30, 0x70, 0xB0, 0xF0,
409 0x04, 0x44, 0x84, 0xC4, 0x14, 0x54, 0x94, 0xD4,
410 0x24, 0x64, 0xA4, 0xE4, 0x34, 0x74, 0xB4, 0xF4,
411 0x08, 0x48, 0x88, 0xC8, 0x18, 0x58, 0x98, 0xD8,
412 0x28, 0x68, 0xA8, 0xE8, 0x38, 0x78, 0xB8, 0xF8,
413 0x0C, 0x4C, 0x8C, 0xCC, 0x1C, 0x5C, 0x9C, 0xDC,
414 0x2C, 0x6C, 0xAC, 0xEC, 0x3C, 0x7C, 0xBC, 0xFC,
415 0x01, 0x41, 0x81, 0xC1, 0x11, 0x51, 0x91, 0xD1,
416 0x21, 0x61, 0xA1, 0xE1, 0x31, 0x71, 0xB1, 0xF1,
417 0x05, 0x45, 0x85, 0xC5, 0x15, 0x55, 0x95, 0xD5,
418 0x25, 0x65, 0xA5, 0xE5, 0x35, 0x75, 0xB5, 0xF5,
419 0x09, 0x49, 0x89, 0xC9, 0x19, 0x59, 0x99, 0xD9,
420 0x29, 0x69, 0xA9, 0xE9, 0x39, 0x79, 0xB9, 0xF9,
421 0x0D, 0x4D, 0x8D, 0xCD, 0x1D, 0x5D, 0x9D, 0xDD,
422 0x2D, 0x6D, 0xAD, 0xED, 0x3D, 0x7D, 0xBD, 0xFD,
423 0x02, 0x42, 0x82, 0xC2, 0x12, 0x52, 0x92, 0xD2,
424 0x22, 0x62, 0xA2, 0xE2, 0x32, 0x72, 0xB2, 0xF2,
425 0x06, 0x46, 0x86, 0xC6, 0x16, 0x56, 0x96, 0xD6,
426 0x26, 0x66, 0xA6, 0xE6, 0x36, 0x76, 0xB6, 0xF6,
427 0x0A, 0x4A, 0x8A, 0xCA, 0x1A, 0x5A, 0x9A, 0xDA,
428 0x2A, 0x6A, 0xAA, 0xEA, 0x3A, 0x7A, 0xBA, 0xFA,
429 0x0E, 0x4E, 0x8E, 0xCE, 0x1E, 0x5E, 0x9E, 0xDE,
430 0x2E, 0x6E, 0xAE, 0xEE, 0x3E, 0x7E, 0xBE, 0xFE,
431 0x03, 0x43, 0x83, 0xC3, 0x13, 0x53, 0x93, 0xD3,
432 0x23, 0x63, 0xA3, 0xE3, 0x33, 0x73, 0xB3, 0xF3,
433 0x07, 0x47, 0x87, 0xC7, 0x17, 0x57, 0x97, 0xD7,
434 0x27, 0x67, 0xA7, 0xE7, 0x37, 0x77, 0xB7, 0xF7,
435 0x0B, 0x4B, 0x8B, 0xCB, 0x1B, 0x5B, 0x9B, 0xDB,
436 0x2B, 0x6B, 0xAB, 0xEB, 0x3B, 0x7B, 0xBB, 0xFB,
437 0x0F, 0x4F, 0x8F, 0xCF, 0x1F, 0x5F, 0x9F, 0xDF,
438 0x2F, 0x6F, 0xAF, 0xEF, 0x3F, 0x7F, 0xBF, 0xFF
439 };
440
441 static const png_byte fourbppswaptable[256] = {
442 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70,
443 0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0,
444 0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71,
445 0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1,
446 0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72,
447 0x82, 0x92, 0xA2, 0xB2, 0xC2, 0xD2, 0xE2, 0xF2,
448 0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73,
449 0x83, 0x93, 0xA3, 0xB3, 0xC3, 0xD3, 0xE3, 0xF3,
450 0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74,
451 0x84, 0x94, 0xA4, 0xB4, 0xC4, 0xD4, 0xE4, 0xF4,
452 0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75,
453 0x85, 0x95, 0xA5, 0xB5, 0xC5, 0xD5, 0xE5, 0xF5,
454 0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76,
455 0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6,
456 0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77,
457 0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7,
458 0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78,
459 0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8,
460 0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79,
461 0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9,
|