summaryrefslogtreecommitdiff
path: root/pngpriv.h
blob: b6ceb95d05c0282a554ed8e3bdeb7fc524fad0c5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261

/* pngpriv.h - private declarations for use inside libpng
 *
 * Last changed in libpng 1.7.0 [(PENDING RELEASE)]
 * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
 *
 * This code is released under the libpng license.
 * For conditions of distribution and use, see the disclaimer
 * and license in png.h
 */

/* The symbols declared in this file (including the functions declared
 * as extern) are PRIVATE.  They are not part of the libpng public
 * interface, and are not recommended for use by regular applications.
 * Some of them may become public in the future; others may stay private,
 * change in an incompatible way, or even disappear.
 * Although the libpng users are not forbidden to include this header,
 * they should be well aware of the issues that may arise from doing so.
 */

#ifndef PNGPRIV_H
#define PNGPRIV_H

/* Feature Test Macros.  The following are defined here to ensure that correctly
 * implemented libraries reveal the APIs libpng needs to build and hide those
 * that are not needed and potentially damaging to the compilation.
 *
 * Feature Test Macros must be defined before any system header is included (see
 * POSIX 1003.1 2.8.2 "POSIX Symbols."
 *
 * These macros only have an effect if the operating system supports either
 * POSIX 1003.1 or C99, or both.  On other operating systems (particularly
 * Windows/Visual Studio) there is no effect; the OS specific tests below are
 * still required (as of 2011-05-02.)
 */
#define _POSIX_SOURCE 1 /* Just the POSIX 1003.1 and C89 APIs */

#ifndef PNG_VERSION_INFO_ONLY
/* Keep standard libraries at the top of this file */

/* Standard library headers not required by png.h: */
#  include <stdlib.h>
#  include <string.h>

/* For headers only required with some build configurations see the lines after
 * pnglibconf.h is included!
 */

#endif /* VERSION_INFO_ONLY */

#define PNGLIB_BUILD /*libpng is being built, not used*/

/* If HAVE_CONFIG_H is defined during the build then the build system must
 * provide an appropriate "config.h" file on the include path.  The header file
 * must provide definitions as required below (search for "HAVE_CONFIG_H");
 * see configure.ac for more details of the requirements.  The macro
 * "PNG_NO_CONFIG_H" is provided for maintainers to test for dependencies on
 * 'configure'; define this macro to prevent the configure build including the
 * configure generated config.h.  Libpng is expected to compile without *any*
 * special build system support on a reasonably ANSI-C compliant system.
 */
#if defined(HAVE_CONFIG_H) && !defined(PNG_NO_CONFIG_H)
#  include <config.h>

   /* Pick up the definition of 'restrict' from config.h if it was read: */
#  define PNG_RESTRICT restrict
#endif

/* To support symbol prefixing it is necessary to know *before* including png.h
 * whether the fixed point (and maybe other) APIs are exported, because if they
 * are not internal definitions may be required.  This is handled below just
 * before png.h is included, but load the configuration now if it is available.
 */
#ifndef PNGLCONF_H
#  include "pnglibconf.h"
#endif

/* Local renames may change non-exported API functions from png.h */
#if defined(PNG_PREFIX) && !defined(PNGPREFIX_H)
#  include "pngprefix.h"
#endif

#ifdef PNG_USER_CONFIG
#  include "pngusr.h"
   /* These should have been defined in pngusr.h */
#  ifndef PNG_USER_PRIVATEBUILD
#    define PNG_USER_PRIVATEBUILD "Custom libpng build"
#  endif
#  ifndef PNG_USER_DLLFNAME_POSTFIX
#    define PNG_USER_DLLFNAME_POSTFIX "Cb"
#  endif
#endif

#ifndef PNG_VERSION_INFO_ONLY
/* Additional standard libaries required in certain cases, put only standard
 * ANSI-C89 headers here.  If not available, or non-functional, the problem
 * should be fixed by writing a wrapper for the header and the file on your
 * include path.
 */
#if defined(PNG_sCAL_SUPPORTED) && defined(PNG_FLOATING_POINT_SUPPORTED)
   /* png.c requires the following ANSI-C constants if the conversion of
    * floating point to ASCII is implemented therein:
    *
    *  DBL_MIN_10_EXP Minimum negative integer such that 10^integer is a
    *                 normalized (double) value.
    *  DBL_DIG  Maximum number of decimal digits (can be set to any constant)
    *  DBL_MIN  Smallest normalized fp number (can be set to an arbitrary value)
    *  DBL_MAX  Maximum floating point number (can be set to an arbitrary value)
    */
#  include <float.h>
#endif /* sCAL && FLOATING_POINT */

#if defined(PNG_FLOATING_ARITHMETIC_SUPPORTED) ||\
   defined(PNG_FLOATING_POINT_SUPPORTED)
   /* ANSI-C90 math functions are required.  Full compliance with the standard
    * is probably not a requirement, but the functions must exist and be
    * declared in <math.h>
    */
#  include <math.h>
#endif /* FLOATING_ARITHMETIC || FLOATING_POINT */

#endif /* VERSION_INFO_ONLY */

/* Is this a build of a DLL where compilation of the object modules requires
 * different preprocessor settings to those required for a simple library?  If
 * so PNG_BUILD_DLL must be set.
 *
 * If libpng is used inside a DLL but that DLL does not export the libpng APIs
 * PNG_BUILD_DLL must not be set.  To avoid the code below kicking in build a
 * static library of libpng then link the DLL against that.
 */
#ifndef PNG_BUILD_DLL
#  ifdef DLL_EXPORT
      /* This is set by libtool when files are compiled for a DLL; libtool
       * always compiles twice, even on systems where it isn't necessary.  Set
       * PNG_BUILD_DLL in case it is necessary:
       */
#     define PNG_BUILD_DLL
#  else
#     ifdef _WINDLL
         /* This is set by the Microsoft Visual Studio IDE in projects that
          * build a DLL.  It can't easily be removed from those projects (it
          * isn't visible in the Visual Studio UI) so it is a fairly reliable
          * indication that PNG_IMPEXP needs to be set to the DLL export
          * attributes.
          */
#        define PNG_BUILD_DLL
#     else
#        ifdef __DLL__
            /* This is set by the Borland C system when compiling for a DLL
             * (as above.)
             */
#           define PNG_BUILD_DLL
#        else
            /* Add additional compiler cases here. */
#        endif
#     endif
#  endif
#endif /* Setting PNG_BUILD_DLL if required */

/* See pngconf.h for more details: the builder of the library may set this on
 * the command line to the right thing for the specific compilation system or it
 * may be automagically set above (at present we know of no system where it does
 * need to be set on the command line.)
 *
 * PNG_IMPEXP must be set here when building the library to prevent pngconf.h
 * setting it to the "import" setting for a DLL build.
 */
#ifndef PNG_IMPEXP
#  ifdef PNG_BUILD_DLL
#     define PNG_IMPEXP PNG_DLL_EXPORT
#  else
      /* Not building a DLL, or the DLL doesn't require specific export
       * definitions.
       */
#     define PNG_IMPEXP
#  endif
#endif

/* No warnings for private or deprecated functions in the build: */
#ifndef PNG_DEPRECATED
#  define PNG_DEPRECATED
#endif
#ifndef PNG_PRIVATE
#  define PNG_PRIVATE
#endif

/* Symbol preprocessing support.
 *
 * To enable listing global, but internal, symbols the following macros should
 * always be used to declare an extern data or function object in this file.
 */
#ifndef PNG_INTERNAL_DATA
#  define PNG_INTERNAL_DATA(type, name, array) extern type name array
#endif

#ifndef PNG_INTERNAL_FUNCTION
#  define PNG_INTERNAL_FUNCTION(type, name, args, attributes)\
      extern PNG_FUNCTION(type, name, args, PNG_EMPTY attributes)
#endif

#ifndef PNG_INTERNAL_CALLBACK
#  define PNG_INTERNAL_CALLBACK(type, name, args, attributes)\
      extern PNG_FUNCTION(type, (PNGCBAPI name), args, PNG_EMPTY attributes)
#endif

/* If floating or fixed point APIs are disabled they may still be compiled
 * internally.  To handle this make sure they are declared as the appropriate
 * internal extern function (otherwise the symbol prefixing stuff won't work and
 * the functions will be used without definitions.)
 *
 * NOTE: although all the API functions are declared here they are not all
 * actually built!  Because the declarations are still made it is necessary to
 * fake out types that they depend on.
 */
#ifndef PNG_FP_EXPORT
#  ifndef PNG_FLOATING_POINT_SUPPORTED
#     define PNG_FP_EXPORT(ordinal, type, name, args)\
         PNG_INTERNAL_FUNCTION(type, name, args, PNG_EMPTY);
#     ifndef PNG_VERSION_INFO_ONLY
         typedef struct png_incomplete png_double;
         typedef png_double*           png_doublep;
         typedef const png_double*     png_const_doublep;
         typedef png_double**          png_doublepp;
#     endif
#  endif
#endif
#ifndef PNG_FIXED_EXPORT
#  ifndef PNG_FIXED_POINT_SUPPORTED
#     define PNG_FIXED_EXPORT(ordinal, type, name, args)\
         PNG_INTERNAL_FUNCTION(type, name, args, PNG_EMPTY);
#  endif
#endif

/* Include png.h here to get the version info and other macros, pngstruct.h and
 * pnginfo.h are included later under the protection of !PNG_VERSION_INFO_ONLY
 */
#include "png.h"

/* pngconf.h does not set PNG_DLL_EXPORT unless it is required, so: */
#ifndef PNG_DLL_EXPORT
#  define PNG_DLL_EXPORT
#endif

/* This is a global switch to set the compilation for an installed system
 * (a release build).  It can be set for testing debug builds to ensure that
 * they will compile when the build type is switched to RC or STABLE, the
 * default is just to use PNG_LIBPNG_BUILD_BASE_TYPE.  Set this in CPPFLAGS
 * with either:
 *
 *   -DPNG_RELEASE_BUILD Turns on the release compile path
 *   -DPNG_RELEASE_BUILD=0 Turns it off
 * or in your pngusr.h with
 *   #define PNG_RELEASE_BUILD=1 Turns on the release compile path
 *   #define PNG_RELEASE_BUILD=0 Turns it off
 */
#ifndef PNG_RELEASE_BUILD
#  define PNG_RELEASE_BUILD (PNG_LIBPNG_BUILD_BASE_TYPE >= PNG_LIBPNG_BUILD_RC)
#endif

/* General purpose macros avoid the need to put #if PNG_RELEASE_BUILD
 * macro blocks around function declarations and definitions when the
 * parameter number varies.  Using these results in slightly cleaner code.
 */
#if PNG_RELEASE_BUILD
#  define only_rel(text) text
#  define only_deb(text)
#  define param_rel(param) param,
#  define param_deb(param)
#else
#  define only_rel(text)
#  define only_deb(text) text
#  define param_rel(param)
#  define param_deb(param) param,
#endif

/* The affirm mechanism results in a minimal png_error() in released versions
 * ('STABLE' versions) and a more descriptive PNG_ABORT in all other cases,
 * when the "condition" is false (zero).  If "condition" is true (nonzero),
 * then the affirm mechanism does nothing.
 *
 * The PNG_RELEASE_BUILD macro, defined above, controls the behavior of
 * 'affirm': if set to 1 affirm will call png_error (or png_err) rather than
 * abort.  The png_error text is the minimal (file location) text in this case,
 * if it is produced. This flag indicates a STABLE (or RC) build.
 *
 * The macros rely on the naming convention throughout this code - png_ptr
 * exists and is of type png_const_structrp or a compatible type - and the
 * presence in each file of a uniquely defined macro PNG_SRC_FILE; a number
 * indicating which file this is (this is to save space in released versions).
 *
 * 'affirm' is intended to look like the ANSI-C <assert.h> macro; note that
 * this macro can coexist with the assert macro if <assert.h> is
 * included.
 *
 * PNG_SRC_LINE is the position of the affirm macro.  There are currently 15
 * main source files (4 bits) and the biggest (pngrtran.c) has more than 4095
 * lines (12 bits).  However, to ensure the number will fit into 16-bits in the
 * future and to allow hardware files to use affirm, the encoding is a bit-wise
 * encoding based on the current number of lines.
 *
 * 'debug' is a version of 'affirm' that is completely removed from RELEASE
 * builds.  This is used when either an unexpected condition is completely
 * handled or when it can't be handled even by png_error, for example after a
 * memory overwrite.
 *
 * UNTESTED is used to mark code that has not been tested; it causes an assert
 * if the code is executed and (therefore) tested.  UNTESTED should not remain
 * in release candidate code.
 *
 * PNG_AFFIRM_TEXT is set to 1 if affirm text should be produced, either
 * the minimal text or, if PNG_RELEASE_BUILD is 0, the more verbose text
 * including the 'condition' string.  This value depends on whether the
 * build supports an appropriate way of outputting the message.
 *
 * Note that PNG_AFFIRM_TEXT is not configurable but is worked out here: this
 * is just the affirm code; there's no reason to allow configuration of this
 * option.
 */
#define PNG_AFFIRM_TEXT (PNG_RELEASE_BUILD ?\
         (defined PNG_ERROR_TEXT_SUPPORTED) :\
         (defined PNG_WARNINGS_SUPPORTED) || (defined PNG_CONSOLE_IO_SUPPORTED))

#define PNG_SRC_LINE (PNG_SRC_FILE + __LINE__)

/* png_affirmpp and png_impossiblepp are macros to make the correct call to the
 * png_affirm function; these macros do not assume that the png_structp is
 * called png_ptr.
 */
#if PNG_RELEASE_BUILD
#  define png_affirmpp(pp, cond)\
      do\
         if (!(cond)) png_affirm(pp, PNG_SRC_LINE);\
      while (0)
#  define png_affirmexp(pp, cond)\
      ((cond) ? (void)0 : png_affirm(pp, PNG_SRC_LINE))
#  define png_handled(pp, m) ((void)0)
#  define png_impossiblepp(pp, reason) png_affirm(pp, PNG_SRC_LINE)

#  define debug(cond) do {} while (0)
#  define debug_handled(cond) do {} while (0)
#  if PNG_LIBPNG_BUILD_BASE_TYPE >= PNG_LIBPNG_BUILD_RC
     /* Make sure there are no 'UNTESTED' macros in released code: */
#    define UNTESTED libpng untested code
#  endif
#  define NOT_REACHED do {} while (0)
#else
#  define png_affirmpp(pp, cond)\
      do\
         if (!(cond)) png_affirm(pp, #cond, PNG_SRC_LINE);\
      while (0)
#  define png_affirmexp(pp, cond)\
      ((cond) ? (void)0 : png_affirm(pp, #cond, PNG_SRC_LINE))
#  define png_handled(pp, m) (png_handled_affirm((pp), (m), PNG_SRC_LINE))
#  define png_impossiblepp(pp, reason) png_affirm(pp, reason, PNG_SRC_LINE)

#  define debug(cond) png_affirmpp(png_ptr, cond)
#  define debug_handled(cond)\
      do\
         if (!(cond)) png_handled(png_ptr, #cond);\
      while (0)
#  define UNTESTED png_affirm(png_ptr, "untested code", PNG_SRC_LINE);
#  define NOT_REACHED png_affirm(png_ptr, "NOT REACHED", PNG_SRC_LINE)
#endif

#define affirm(cond) png_affirmpp(png_ptr, cond)
#define affirmexp(cond) png_affirmexp(png_ptr, cond)
#define handled(m) png_handled(png_ptr, (m))
#define impossible(cond) png_impossiblepp(png_ptr, cond)
#define implies(a, b) debug(!(a) || (b))

/* The defines for PNG_SRC_FILE: */
#define PNG_SRC_FILE_(f,lines) PNG_SRC_FILE_ ## f + lines

#define PNG_SRC_FILE_png      0
#define PNG_SRC_FILE_pngerror (PNG_SRC_FILE_png      +8192)
#define PNG_SRC_FILE_pngget   (PNG_SRC_FILE_pngerror +2048)
#define PNG_SRC_FILE_pngmem   (PNG_SRC_FILE_pngget   +2048)
#define PNG_SRC_FILE_pngpread (PNG_SRC_FILE_pngmem   +1024)
#define PNG_SRC_FILE_pngread  (PNG_SRC_FILE_pngpread +2048)
#define PNG_SRC_FILE_pngrio   (PNG_SRC_FILE_pngread  +8192)
#define PNG_SRC_FILE_pngrtran (PNG_SRC_FILE_pngrio   +1024)
#define PNG_SRC_FILE_pngrutil (PNG_SRC_FILE_pngrtran +8192)
#define PNG_SRC_FILE_pngset   (PNG_SRC_FILE_pngrutil +8192)
#define PNG_SRC_FILE_pngtrans (PNG_SRC_FILE_pngset   +2048)
#define PNG_SRC_FILE_pngwio   (PNG_SRC_FILE_pngtrans +4096)
#define PNG_SRC_FILE_pngwrite (PNG_SRC_FILE_pngwio   +1024)
#define PNG_SRC_FILE_pngwtran (PNG_SRC_FILE_pngwrite +4096)
#define PNG_SRC_FILE_pngwutil (PNG_SRC_FILE_pngwtran +1024)

#define PNG_SRC_FILE_arm_arm_init (PNG_SRC_FILE_pngwutil +8192)
#define PNG_SRC_FILE_arm_filter_neon_intrinsics\
             (PNG_SRC_FILE_arm_arm_init +1024)

/* Add new files by changing the following line: */
#define PNG_SRC_FILE_LAST (PNG_SRC_FILE_arm_filter_neon_intrinsics +1024)

/* The following #define must list the files in exactly the same order as
 * the above.
 */
#define PNG_FILES\
   PNG_apply(png)\
   PNG_apply(pngerror)\
   PNG_apply(pngget)\
   PNG_apply(pngmem)\
   PNG_apply(pngpread)\
   PNG_apply(pngread)\
   PNG_apply(pngrio)\
   PNG_apply(pngrtran)\
   PNG_apply(pngrutil)\
   PNG_apply(pngset)\
   PNG_apply(pngtrans)\
   PNG_apply(pngwio)\
   PNG_apply(pngwrite)\
   PNG_apply(pngwtran)\
   PNG_apply(pngwutil)\
   PNG_apply(arm_arm_init)\
   PNG_apply(arm_filter_neon_intrinsics)\
   PNG_end

/* SECURITY and SAFETY:
 *
 * libpng is built with support for internal limits on image dimensions and
 * memory usage.  These are documented in scripts/pnglibconf.dfa of the
 * source and recorded in the machine generated header file pnglibconf.h.
 */

/* If you are running on a machine where you cannot allocate more
 * than 64K of memory at once, uncomment this.  While libpng will not
 * normally need that much memory in a chunk (unless you load up a very
 * large file), zlib needs to know how big of a chunk it can use, and
 * libpng thus makes sure to check any memory allocation to verify it
 * will fit into memory.
 *
 * zlib provides 'MAXSEG_64K' which, if defined, indicates the
 * same limit and pngconf.h (already included) sets the limit
 * if certain operating systems are detected.
 */
#if defined(MAXSEG_64K) && !defined(PNG_MAX_MALLOC_64K)
#  define PNG_MAX_MALLOC_64K
#endif

#ifndef PNG_UNUSED
/* Unused formal parameter warnings are silenced using the following macro
 * which is expected to have no bad effects on performance (optimizing
 * compilers will probably remove it entirely).  Note that if you replace
 * it with something other than whitespace, you must include the terminating
 * semicolon.
 */
#  define PNG_UNUSED(param) (void)param;
#endif

/* This is a convenience for parameters which are not used in release
 * builds.
 */
#define PNG_UNUSEDRC(param) only_rel(PNG_UNUSED(param))

/* Just a little check that someone hasn't tried to define something
 * contradictory.
 */
#if (PNG_ZBUF_SIZE > 32768) && defined(PNG_MAX_MALLOC_64K)
#  undef PNG_ZBUF_SIZE
#  define PNG_ZBUF_SIZE 32768
#endif

/* If warnings or errors are turned off the code is disabled or redirected here.
 * From 1.5.4 functions have been added to allow very limited formatting of
 * error and warning messages - this code will also be disabled here.
 */
#ifdef PNG_WARNINGS_SUPPORTED
#  define PNG_WARNING_PARAMETERS(p) png_warning_parameters p;
#else
#  define png_warning_parameter(p,number,string) ((void)0)
#  define png_warning_parameter_unsigned(p,number,format,value) ((void)0)
#  define png_warning_parameter_signed(p,number,format,value) ((void)0)
#  define png_formatted_warning(pp,p,message) ((void)(pp))
#  define PNG_WARNING_PARAMETERS(p)
#endif
#ifndef PNG_ERROR_TEXT_SUPPORTED
#  define png_fixed_error(s1,s2) png_err(s1)
#endif

/* C allows up-casts from (void*) to any pointer and (const void*) to any
 * pointer to a const object.  C++ regards this as a type error and requires an
 * explicit, static, cast and provides the static_cast<> rune to ensure that
 * const is not cast away.
 */
#ifdef __cplusplus
#  define png_voidcast(type, value) static_cast<type>(value)
#  define png_upcast(type, value) static_cast<type>(value)
#  define png_constcast(type, value) const_cast<type>(value)
#  define png_aligncast(type, value) \
   static_cast<type>(static_cast<void*>(value))
#  define png_aligncastconst(type, value) \
   static_cast<type>(static_cast<const void*>(value))
#else
#  define png_voidcast(type, value) (value)
#  define png_upcast(type, value) ((type)(value))
#  define png_constcast(type, value) ((type)(value))
#  define png_aligncast(type, value) ((void*)(value))
#  define png_aligncastconst(type, value) ((const void*)(value))
#endif /* __cplusplus */

/* Some fixed point APIs are still required even if not exported because
 * they get used by the corresponding floating point APIs.  This magic
 * deals with this:
 */
#ifdef PNG_FIXED_POINT_SUPPORTED
#  define PNGFAPI PNGAPI
#else
#  define PNGFAPI /* PRIVATE */
#endif

/* These macros may need to be architecture dependent. */
#define PNG_ALIGN_NONE   0 /* do not use data alignment */
#define PNG_ALIGN_ALWAYS 1 /* assume unaligned accesses are OK */
#ifdef offsetof
#  define PNG_ALIGN_OFFSET 2 /* use offsetof to determine alignment */
#else
#  define PNG_ALIGN_OFFSET -1 /* prevent the use of this */
#endif
#define PNG_ALIGN_SIZE   3 /* use sizeof to determine alignment */

#ifndef PNG_ALIGN_TYPE
   /* Default to using aligned access optimizations and requiring alignment to a
    * multiple of the data type size.  Override in a compiler specific fashion
    * if necessary by inserting tests here:
    */
#  define PNG_ALIGN_TYPE PNG_ALIGN_SIZE
#endif

#if PNG_ALIGN_TYPE == PNG_ALIGN_SIZE
   /* This is used because in some compiler implementations non-aligned
    * structure members are supported, so the offsetof approach below fails.
    * Set PNG_ALIGN_SIZE=0 for compiler combinations where unaligned access
    * is good for performance.  Do not do this unless you have tested the result
    * and understand it.
    */
#  define png_alignof(type) (sizeof (type))
#else
#  if PNG_ALIGN_TYPE == PNG_ALIGN_OFFSET
#     define png_alignof(type) offsetof(struct{char c; type t;}, t)
#  else
#     if PNG_ALIGN_TYPE == PNG_ALIGN_ALWAYS
#        define png_alignof(type) (1)
#     endif
      /* Else leave png_alignof undefined to prevent use thereof */
#  endif
#endif

/* This implicitly assumes alignment is always to a power of 2. */
#ifdef png_alignof
#  define png_isaligned(ptr, type)\
   ((((const char*)ptr-(const char*)0) & (png_alignof(type)-1)) == 0)
#else
#  define png_isaligned(ptr, type) 0
#endif

/* Buffer alignment control.  These #defines control how the buffers used during
 * read are aligned and how big they are.
 */
#ifndef PNG_ROW_BUFFER_ALIGN_TYPE
   /* The absolute minimum alignment for a row buffer is that required for
    * png_uint_32 direct access.  The #define is of a legal C type that can be
    * used as the type in the definition of the first member of a C union; give
    * a typedef name if in doubt.
    */
#  define PNG_ROW_BUFFER_ALIGN_TYPE png_uint_32
#endif /* !ROW_BUFFER_ALIGN_TYPE */
#ifndef PNG_ROW_BUFFER_BYTE_ALIGN
   /* This is the minimum size in bytes of the buffer used while processing
    * parts of row.  Except at the end of the row pixels will always be
    * processed in blocks such that the block size is a multiple of this number
    */
#  define PNG_ROW_BUFFER_BYTE_ALIGN\
   ((unsigned int)/*SAFE*/(sizeof (PNG_ROW_BUFFER_ALIGN_TYPE)))
#endif /* !ROW_BUFFER_BYTE_ALIGN */
#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED
#  define PNG_MAX_PIXEL_BYTES 16U /* 4x32-bit channels */
#else /* !READ_USER_TRANSFORM */
#  define PNG_MAX_PIXEL_BYTES  8U /* 4x16-bit channels */
#endif /* !READ_USER_TRANSFORM */
/* PNG_ROW_BUFFER_SIZE is a compile time constant for the size of the row
 * buffer.  The minimum size of 2048 bytes is intended to allow the buffer to
 * hold a complete 256 entry color map of 64-bit (8-byte) pixels.  This is a
 * requirement at some points of the colormap handling code.
 *
 * The maximum size is intended to allow (unsigned int) indexing of the buffer,
 * it only affects systems with a 16-bit unsigned value where it limits the
 * maximum to 4096 bytes.
 */
#define PNG_MIN_ROW_BUFFER_SIZE\
   (PNG_MAX_PIXEL_BYTES * PNG_ROW_BUFFER_BYTE_ALIGN * 8U)
#define PNG_MAX_ROW_BUFFER_SIZE ((UINT_MAX / 16U) + 1U)
#ifndef PNG_ROW_BUFFER_SIZE
#  define PNG_ROW_BUFFER_SIZE\
   (PNG_MIN_ROW_BUFFER_SIZE < 2048U ? 2048U : PNG_MIN_ROW_BUFFER_SIZE)
#endif /* ROW_BUFFER_SIZE */

/* End of memory model/platform independent support */
/* End of 1.5.0beta36 move from pngconf.h */

/* CONSTANTS and UTILITY MACROS
 * These are used internally by libpng and not exposed in the API
 */

/* Various modes of operation.  Note that after an init, mode is set to
 * zero automatically when the structure is created.  Three of these
 * are defined in png.h because they need to be visible to applications
 * that call png_set_unknown_chunk().
 */
/* #define PNG_HAVE_IHDR            0x01 (defined as (int) in png.h) */
/* #define PNG_HAVE_PLTE            0x02 (defined as (int) in png.h) */
#define PNG_HAVE_IDAT               0x04U
/* #define PNG_AFTER_IDAT           0x08 (defined as (int) in png.h) */
#define PNG_HAVE_IEND               0x10U
#define PNG_HAVE_PNG_SIGNATURE      0x20U

#if defined(PNG_SIMPLIFIED_READ_SUPPORTED) ||\
   defined(PNG_SIMPLIFIED_WRITE_SUPPORTED)
/* See below for the definitions of the tables used in these macros */
#define PNG_sRGB_FROM_LINEAR(pp, linear) png_check_byte(pp,\
   (png_sRGB_base[(linear)>>15] +\
    ((((linear)&0x7fffU)*png_sRGB_delta[(linear)>>15])>>12)) >> 8)
   /* Given a value 'linear' in the range 0..255*65535 calculate the 8-bit sRGB
    * encoded value with maximum error 0.646365.  Note that the input is not a
    * 16-bit value; it has been multiplied by 255! */
#endif /* PNG_SIMPLIFIED_READ/WRITE */

/* Added to libpng-1.6.0: scale a 16-bit value in the range 0..65535 to 0..255
 * by dividing by 257 *with rounding*.  This macro is exact for the given range.
 * See the discourse in pngrtran.c png_do_scale_16_to_8.  The values in the
 * macro were established by experiment (modifying the added value).  The macro
 * has a second variant that takes a value already scaled by 255 and divides by
 * 65535 - this has a maximum error of .502.  Over the range 0..65535*65535 it
 * only gives off-by-one errors and only for 0.5% (1 in 200) of the values.
 */
#define PNG_DIV65535(v24) (((v24) + 32895U) >> 16)
#define PNG_DIV257(v16) PNG_DIV65535((png_uint_32)(v16) * 255U)

/* Added to libpng-1.2.6 JB
 * Modified in libpng-1.7.0 to avoid the intermediate calculation overflow
 * when:
 *
 *  pixel_bits == 4: any width over 0x3FFFFFFEU overflows
 *  pixel_bits == 2: any width over 0x7FFFFFFCU overflows
 *
 * In both these cases any width results in a rowbytes that fits in 32 bits.
 * The problem arose in previous versions because the calculation used was
 * simply ((width x pixel-bit-depth)+7)/8.  At the cost of more calculations
 * on pixel_depth this avoids the problem.
 */
#define PNG_SHIFTOF(pixel_bits/*<8*/) \
   ( (pixel_bits) == 1 ? 3 : \
   ( (pixel_bits) == 2 ? 2 : \
   ( (pixel_bits) == 4 ? 1 : \
                         0/*force bytes*/ ) ) )
#define PNG_ADDOF(pixel_bits/*<8*/) ((1U<<PNG_SHIFTOF(pixel_bits))-1)
#define PNG_ROWBYTES(pixel_bits, width) \
   ((pixel_bits) >= 8 ? \
   ((png_alloc_size_t)(width) * ((pixel_bits) >> 3)) : \
   (((png_alloc_size_t)(width) + PNG_ADDOF(pixel_bits)) >> \
      PNG_SHIFTOF(pixel_bits)) )

/* This macros, added in 1.7.0, makes it easy to deduce the number of channels
 * and therefore the pixel depth from the color type.  The PNG specification
 * numbers are used in preference to the png.h constants to make it more clear
 * why the macro works.
 */
#define PNG_COLOR_TYPE_CHANNELS(ct)\
   (((ct) & PNG_COLOR_MASK_PALETTE) ?\
      1U : 1U+((ct) & 2U/*COLOR*/)+(((ct)>>2)&1U/*ALPHA*/))
#define PNG_CHANNELS(ps) PNG_COLOR_TYPE_CHANNELS((ps).color_type)
#define PNG_PIXEL_DEPTH(ps) (PNG_CHANNELS(ps) * (ps).bit_depth)

/* PNG_OUT_OF_RANGE returns true if value is outside the range
 * ideal-delta..ideal+delta.  Each argument is evaluated twice.
 * "ideal" and "delta" should be constants, normally simple
 * integers, "value" a variable. Added to libpng-1.2.6 JB
 */
#define PNG_OUT_OF_RANGE(value, ideal, delta) \
   ( (value) < (ideal)-(delta) || (value) > (ideal)+(delta) )

/* Handling of bit-field masks.  Because the expression:
 *
 *     bit_field & ~mask
 *
 * has implementation defined behavior in ANSI C-90 for many (int) values of
 * 'mask' and because some of these are defined in png.h and passed in (int)
 * parameters use of '~' has been expunged in libpng 1.7 and replaced by this
 * macro, which is well defined in ANSI C-90 (there is a similar, 16-bit,
 * version in pngstruct.h for the colorspace flags.)
 */
#define PNG_BIC_MASK(flags) (0xFFFFFFFFU - (flags))

/* Conversions between fixed and floating point, only defined if
 * required (to make sure the code doesn't accidentally use float
 * when it is supposedly disabled.)
 */
#ifdef PNG_FLOATING_POINT_SUPPORTED
/* The floating point conversion can't overflow, though it can and
 * does lose accuracy relative to the original fixed point value.
 * In practice this doesn't matter because png_fixed_point only
 * stores numbers with very low precision.  The png_ptr and s
 * arguments are unused by default but are there in case error
 * checking becomes a requirement.
 */
#define png_float(png_ptr, fixed, s) (.00001 * (fixed))

/* The fixed point conversion performs range checking and evaluates
 * its argument multiple times, so must be used with care.  The
 * range checking uses the PNG specification values for a signed
 * 32 bit fixed point value except that the values are deliberately
 * rounded-to-zero to an integral value - 21474 (21474.83 is roughly
 * (2^31-1) * 100000). 's' is a string that describes the value being
 * converted.
 *
 * NOTE: this macro will raise a png_error if the range check fails,
 * therefore it is normally only appropriate to use this on values
 * that come from API calls or other sources where an out of range
 * error indicates a programming error, not a data error!
 *
 * NOTE: by default this is off - the macro is not used - because the
 * function call saves a lot of code.
 */
#ifdef PNG_FIXED_POINT_MACRO_SUPPORTED
#define png_fixed(png_ptr, fp, s) ((fp) <= 21474 && (fp) >= -21474 ?\
    ((png_fixed_point)(100000 * (fp))) : (png_fixed_error(png_ptr, s),0))
#endif
/* else the corresponding function is defined below, inside the scope of the
 * cplusplus test.
 */
#endif

/* Gamma values (new at libpng-1.5.4): */
#define PNG_GAMMA_MAC_OLD 151724  /* Assume '1.8' is really 2.2/1.45! */
#define PNG_GAMMA_MAC_INVERSE 65909
#define PNG_GAMMA_sRGB_INVERSE 45455

/* Almost everything below is C specific; the #defines above can be used in
 * non-C code (so long as it is C-preprocessed) the rest of this stuff cannot.
 */
#ifndef PNG_VERSION_INFO_ONLY

#include "pngstruct.h"
#include "pnginfo.h"

/* Validate the include paths - the include path used to generate pnglibconf.h
 * must match that used in the build, or we must be using pnglibconf.h.prebuilt:
 */
#if PNG_ZLIB_VERNUM != 0 && PNG_ZLIB_VERNUM != ZLIB_VERNUM
#  error ZLIB_VERNUM != PNG_ZLIB_VERNUM \
      "-I (include path) error: see the notes in pngpriv.h"
   /* This means that when pnglibconf.h was built the copy of zlib.h that it
    * used is not the same as the one being used here.  Because the build of
    * libpng makes decisions to use inflateInit2 and inflateReset2 based on the
    * zlib version number and because this affects handling of certain broken
    * PNG files the -I directives must match.
    *
    * The most likely explanation is that you passed a -I in CFLAGS. This will
    * not work; all the preprocessor directories and in particular all the -I
    * directives must be in CPPFLAGS.
    */
#endif

/* This is used for 16 bit gamma tables -- only the top level pointers are
 * const; this could be changed:
 */
typedef const png_uint_16p * png_const_uint_16pp;

/* Added to libpng-1.5.7: sRGB conversion tables */
#if defined(PNG_SIMPLIFIED_READ_SUPPORTED) ||\
   defined(PNG_SIMPLIFIED_WRITE_SUPPORTED)
#ifdef PNG_SIMPLIFIED_READ_SUPPORTED
PNG_INTERNAL_DATA(const png_uint_16, png_sRGB_table, [256]);
   /* Convert from an sRGB encoded value 0..255 to a 16-bit linear value,
    * 0..65535.  This table gives the closest 16-bit answers (no errors).
    */
#endif

PNG_INTERNAL_DATA(const png_uint_16, png_sRGB_base, [512]);
PNG_INTERNAL_DATA(const png_byte, png_sRGB_delta, [512]);
#endif /* PNG_SIMPLIFIED_READ/WRITE */


/* Inhibit C++ name-mangling for libpng functions but not for system calls. */
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/* Internal functions; these are not exported from a DLL however because they
 * are used within several of the C source files they have to be C extern.
 *
 * All of these functions must be declared with PNG_INTERNAL_FUNCTION.
 */
/* Affirm handling */
PNG_INTERNAL_FUNCTION(void, png_affirm,(png_const_structrp png_ptr,
    param_deb(png_const_charp condition) unsigned int position), PNG_NORETURN);

#if !PNG_RELEASE_BUILD
PNG_INTERNAL_FUNCTION(void, png_handled_affirm,(png_const_structrp png_ptr,
      png_const_charp message, unsigned int position), PNG_EMPTY);
   /* This is not marked PNG_NORETURN because in PNG_RELEASE_BUILD it will
    * disappear and control will pass through it.
    */
#endif /* !RELEASE_BUILD */

/* Character/byte range checking. */
/* GCC complains about assignments of an (int) expression to a (char) even when
 * it can readily determine that the value is in range.  This makes arithmetic
 * on (char) or (png_byte) values tedious.  The warning is not issued by
 * default, but libpng coding rules require no warnings leading to excessive,
 * ridiculous and dangerous expressions of the form:
 *
 *     <char> = (char)(expression & 0xff)
 *
 * They are dangerous because they hide the warning, which might actually be
 * valid, and therefore merely enable introduction of undetected overflows when
 * code is modified.
 *
 * The following macros exist to reliably detect any overflow in non-release
 * builds.  The theory here is that we really want to know about overflows, not
 * merely hide a basically flawed compiler warning by throwing unnecessary casts
 * into the code.  The warnings disappear in RC builds so that the released
 * (STABLE) version just assigns the value (with, possibly, a warning if someone
 * turns on the -Wconversion GCC warning.)
 *
 * Doing it this way ensures that the code meets two very important aims:
 *
 * 1) Overflows are detected in pre-release tests; previously versions of libpng
 *    have been released that really did have overflows in the RGB calculations.
 * 2) In release builds GCC specific operations, which may reduce the ability
 *    of other compilers and even GCC to optimize the code, are avoided.
 *
 * There is one important extra consequence for pre-release code; it is
 * performing a lot of checks in pixel arithmetic that the release code won't
 * perform.  As a consequence a build time option, RANGE_CHECK, is provided
 * to allow the checks to be turned off in pre-release when building for
 * performance testing.  This is a standard "_SUPPORTED" option except that it
 * cannot be set in the system configuration (pnglibconf.h, pnglibconf.dfa).
 *
 * A separate macro PNG_BYTE() is provided to safely convert an unsigned value
 * to the PNG byte range 0..255.  This handles the fact that, technically,
 * an ANSI-C (unsigned char), hence a (png_byte), may be able to store values
 * outside this range.  Note that if you are building on a system where this is
 * true libpng is almost certainly going to produce errors; it has never been
 * tested on such a system.  For the moment pngconf.h ensures that this will
 * not happen.
 *
 * PNG_UINT_16 does the same thing for a 16-bit value passed in an (int) or
 * (png_uint_32) (where checking is not expected.)
 */
#if !PNG_RELEASE_BUILD
#  ifndef PNG_NO_RANGE_CHECK /* Turn off even in pre-release */
#     define PNG_RANGE_CHECK_SUPPORTED
#  endif
#endif

#ifdef PNG_RANGE_CHECK_SUPPORTED
PNG_INTERNAL_FUNCTION(unsigned int, png_bit_affirm,(png_const_structrp png_ptr,
      unsigned int position, unsigned int u, unsigned int bits), PNG_EMPTY);

PNG_INTERNAL_FUNCTION(char, png_char_affirm,(png_const_structrp png_ptr,
      unsigned int position, int c), PNG_EMPTY);

PNG_INTERNAL_FUNCTION(png_byte, png_byte_affirm,(png_const_structrp png_ptr,
      unsigned int position, int b), PNG_EMPTY);

#if INT_MAX >= 65535
PNG_INTERNAL_FUNCTION(png_uint_16, png_u16_affirm,(png_const_structrp png_ptr,
      unsigned int position, int u), PNG_EMPTY);
#  define png_check_u16(pp, u) (png_u16_affirm((pp), PNG_SRC_LINE, (u)))
#else
   /* (int) cannot hold a (png_uint_16) so the above function just won't
    * compile correctly, for the moment just do this:
    */
#  define png_check_u16(pp, u) (u)
#endif

#  define png_check_bits(pp, u, bits)\
   (((1U<<(bits))-1) & png_bit_affirm((pp), PNG_SRC_LINE, (u), (bits)))
#  define png_check_char(pp, c) (png_char_affirm((pp), PNG_SRC_LINE, (c)))
#  define png_check_byte(pp, b) (png_byte_affirm((pp), PNG_SRC_LINE, (b)))
#  define PNG_BYTE(b)           ((png_byte)((b) & 0xFFU))
#  define PNG_UINT_16(u)        ((png_uint_16)((u) & 0xFFFFU))
#elif !(defined PNG_REMOVE_CASTS) /* && !RANGE_CHECK */
#  define png_check_bits(pp, u, bits) (((1U<<(bits))-1U) & (u))
#  define png_check_char(pp, c) ((char)(c))
#  define png_check_byte(pp, b) ((png_byte)(b))
#  define png_check_u16(pp, u)  ((png_uint_16)(u))
#  define PNG_BYTE(b)           ((png_byte)((b) & 0xFFU))
#  define PNG_UINT_16(u)        ((png_uint_16)((u) & 0xFFFFU))
#else /* !RANGE_CHECK */
   /* This is somewhat trust-me-it-works: if PNG_REMOVE_CASTS is defined then
    * the casts, which might otherwise change the values, are completely
    * removed.  Use this to test your compiler to see if it makes *any*
    * difference (code size or speed.)  Currently NOT SUPPORTED.
    *
    * It also makes the PNG_BYTE and PNG_UINT_16 macros do nothing either
    * NOTE: this seems safe at present but might lead to unexpected results
    * if someone writes code to depend on the truncation.
    */
#  define png_check_bits(pp, u, bits) (u)
#  define png_check_char(pp, c) (c)
#  define png_check_byte(pp, b) (b)
#  define png_check_u16(pp, u)  (u)
#  define PNG_BYTE(b)           (b)
#  define PNG_UINT_16(u)        (u)
#endif /* RANGE_CHECK */

/* Safe calculation of a rowbytes value; does a png_error if the system limits
 * are exceeded.
 */
PNG_INTERNAL_FUNCTION(png_alloc_size_t,png_calc_rowbytes,
   (png_const_structrp png_ptr, unsigned int pixel_depth,
    png_uint_32 row_width),PNG_EMPTY);

/* Common code to calculate the maximum number of pixels to transform or filter
 * at one time; controlled by PNG_ROW_BUFFER_SIZE above:
 */
PNG_INTERNAL_FUNCTION(unsigned int,png_max_pixel_block,
      (png_const_structrp png_ptr),PNG_EMPTY);

/* Copy the row in row_buffer; this is the non-interlaced copy used in both the
 * read and write code.  'x_in_dest' specifies whether the 'x' applies to
 * the destination (sp->dp[x], x_in_dest tru) or the source (sp[x]->dp,
 * x_in_dest false).
 */
PNG_INTERNAL_FUNCTION(void, png_copy_row,(png_const_structrp png_ptr,
   png_bytep dp, png_const_bytep sp, png_uint_32 x/*in INPUT*/,
   png_uint_32 width/*of INPUT*/, unsigned int pixel_depth,
   int clear/*clear the final byte*/, int x_in_dest),PNG_EMPTY);

/* Zlib support */
#define PNG_UNEXPECTED_ZLIB_RETURN (-7)
PNG_INTERNAL_FUNCTION(void, png_zstream_error,(z_stream *zstream, int ret),
   PNG_EMPTY);
   /* Used by the zlib handling functions to ensure that z_stream::msg is always
    * set before they return.
    */

#if defined(PNG_FLOATING_POINT_SUPPORTED) && \
   !defined(PNG_FIXED_POINT_MACRO_SUPPORTED) && \
   (defined(PNG_gAMA_SUPPORTED) || defined(PNG_cHRM_SUPPORTED) || \
   defined(PNG_sCAL_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) || \
   defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)) || \
   (defined(PNG_sCAL_SUPPORTED) && \
   defined(PNG_FLOATING_ARITHMETIC_SUPPORTED))
PNG_INTERNAL_FUNCTION(png_fixed_point,png_fixed,(png_const_structrp png_ptr,
   double fp, png_const_charp text),PNG_EMPTY);
#endif

/* Internal base allocator - no messages, NULL on failure to allocate.  This
 * does, however, call the application provided allocator and that could call
 * png_error (although that would be a bug in the application implementation.)
 */
PNG_INTERNAL_FUNCTION(png_voidp,png_malloc_base,(png_const_structrp png_ptr,
   png_alloc_size_t size),PNG_ALLOCATED);

#if defined(PNG_TEXT_SUPPORTED) || defined(PNG_sPLT_SUPPORTED) ||\
   defined(PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED)
/* Internal array allocator, outputs no error or warning messages on failure,
 * just returns NULL.
 */
PNG_INTERNAL_FUNCTION(png_voidp,png_malloc_array,(png_const_structrp png_ptr,
   int nelements, size_t element_size),PNG_ALLOCATED);

/* The same but an existing array is extended by add_elements.  This function
 * also memsets the new elements to 0 and copies the old elements.  The old
 * array is not freed or altered.
 */
PNG_INTERNAL_FUNCTION(png_voidp,png_realloc_array,(png_structrp png_ptr,
   png_const_voidp array, int old_elements, int add_elements,
   size_t element_size),PNG_ALLOCATED);
#endif /* text, sPLT or unknown chunks */

/* Magic to create a struct when there is no struct to call the user supplied
 * memory allocators.  Because error handling has not been set up the memory
 * handlers can't safely call png_error, but this is an obscure and undocumented
 * restriction so libpng has to assume that the 'free' handler, at least, might
 * call png_error.
 */
PNG_INTERNAL_FUNCTION(png_structp,png_create_png_struct,
   (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn,
    png_error_ptr warn_fn, png_voidp mem_ptr, png_malloc_ptr malloc_fn,
    png_free_ptr free_fn),PNG_ALLOCATED);

/* Free memory from internal libpng struct */
PNG_INTERNAL_FUNCTION(void,png_destroy_png_struct,(png_structrp png_ptr),
   PNG_EMPTY);

/* Free an allocated jmp_buf (always succeeds) */
PNG_INTERNAL_FUNCTION(void,png_free_jmpbuf,(png_structrp png_ptr),PNG_EMPTY);

/* Function to allocate memory for zlib.  PNGAPI is disallowed. */
PNG_INTERNAL_FUNCTION(voidpf,png_zalloc,(voidpf png_ptr, uInt items, uInt size),
   PNG_ALLOCATED);

/* Function to free memory for zlib.  PNGAPI is disallowed. */
PNG_INTERNAL_FUNCTION(void,png_zfree,(voidpf png_ptr, voidpf ptr),PNG_EMPTY);

/* The next three functions are used by png_init_io to set the default
 * implementations for reading or writing to a stdio (png_FILE_p) stream.
 * They can't be static because in 1.7 png_init_io needs to reference them.
 */
#ifdef PNG_STDIO_SUPPORTED
#  ifdef PNG_READ_SUPPORTED
PNG_INTERNAL_FUNCTION(void PNGCBAPI,png_default_read_data,(png_structp png_ptr,
    png_bytep data, png_size_t length),PNG_EMPTY);
#  endif /* READ */

#  ifdef PNG_WRITE_SUPPORTED
PNG_INTERNAL_FUNCTION(void PNGCBAPI,png_default_write_data,(png_structp png_ptr,
    png_bytep data, png_size_t length),PNG_EMPTY);

#     ifdef PNG_WRITE_FLUSH_SUPPORTED
PNG_INTERNAL_FUNCTION(void PNGCBAPI,png_default_flush,(png_structp png_ptr),
   PNG_EMPTY);
#     endif /* WRITE_FLUSH */
#  endif /* WRITE */
#endif /* STDIO */

/* Reset the CRC variable.  The CRC is initialized with the chunk tag (4 bytes).
 * NOTE: at present png_struct::chunk_name MUST be set before this as well so
 * that png_struct::current_crc is initialized correctly!
 */
PNG_INTERNAL_FUNCTION(void,png_reset_crc,(png_structrp png_ptr,
         png_const_bytep chunk_tag), PNG_EMPTY);

/* Write the "data" buffer to whatever output you are using */
PNG_INTERNAL_FUNCTION(void,png_write_data,(png_structrp png_ptr,
    png_const_voidp data, png_size_t length),PNG_EMPTY);

/* Read and check the PNG file signature */
PNG_INTERNAL_FUNCTION(void,png_read_sig,(png_structrp png_ptr,
   png_inforp info_ptr),PNG_EMPTY);

/* Read data from whatever input you are using into the "data" buffer */
PNG_INTERNAL_FUNCTION(void,png_read_data,(png_structrp png_ptr, png_voidp data,
    png_size_t length),PNG_EMPTY);

/* Read bytes into buf, and update png_ptr->crc */
PNG_INTERNAL_FUNCTION(void,png_crc_read,(png_structrp png_ptr, png_voidp buf,
    png_uint_32 length),PNG_EMPTY);

/* Read "skip" bytes, read the file crc, and (optionally) verify png_ptr->crc */
PNG_INTERNAL_FUNCTION(int,png_crc_finish,(png_structrp png_ptr,
   png_uint_32 skip),PNG_EMPTY);

/* Calculate the CRC over a section of data.  Note that we are only
 * passing a maximum of 64K on systems that have this as a memory limit,
 * since this is the maximum buffer size we can specify.
 */
PNG_INTERNAL_FUNCTION(void,png_calculate_crc,(png_structrp png_ptr,
   png_const_voidp ptr, png_size_t length),PNG_EMPTY);

/* Write various chunks */

/* Write the IHDR chunk, and update the png_struct with the necessary
 * information.
 */
PNG_INTERNAL_FUNCTION(void,png_write_IHDR,(png_structrp png_ptr,
   png_uint_32 width, png_uint_32 height, int bit_depth, int color_type,
   int compression_method, int filter_method, int interlace_method),PNG_EMPTY);

PNG_INTERNAL_FUNCTION(void,png_write_PLTE,(png_structrp png_ptr,
   png_const_colorp palette, unsigned int num_pal),PNG_EMPTY);

PNG_INTERNAL_FUNCTION(void,png_write_IEND,(png_structrp png_ptr),PNG_EMPTY);

#ifdef PNG_WRITE_gAMA_SUPPORTED
PNG_INTERNAL_FUNCTION(void,png_write_gAMA_fixed,(png_structrp png_ptr,
    png_fixed_point file_gamma),PNG_EMPTY);
#endif

#ifdef PNG_WRITE_sBIT_SUPPORTED
PNG_INTERNAL_FUNCTION(void,png_write_sBIT,(png_structrp png_ptr,
    png_const_color_8p sbit, int color_type),PNG_EMPTY);
#endif

#ifdef PNG_WRITE_cHRM_SUPPORTED
PNG_INTERNAL_FUNCTION(void,png_write_cHRM_fixed,(png_structrp png_ptr,
    const png_xy *xy), PNG_EMPTY);
   /* The xy value must have been previously validated */
#endif

#ifdef PNG_WRITE_sRGB_SUPPORTED
PNG_INTERNAL_FUNCTION(void,png_write_sRGB,(png_structrp png_ptr,
    int intent),PNG_EMPTY);
#endif

#ifdef PNG_WRITE_iCCP_SUPPORTED
PNG_INTERNAL_FUNCTION(void,png_write_iCCP,(png_structrp png_ptr,
   png_const_charp name, png_const_voidp profile), PNG_EMPTY);
   /* The profile must have been previously validated for correctness, the
    * length comes from the first four bytes.  Only the base, deflate,
    * compression is supported.
    */
#endif

#ifdef PNG_WRITE_sPLT_SUPPORTED
PNG_INTERNAL_FUNCTION(void,png_write_sPLT,(png_structrp png_ptr,
    png_const_sPLT_tp palette),PNG_EMPTY);
#endif

#ifdef PNG_WRITE_tRNS_SUPPORTED
PNG_INTERNAL_FUNCTION(void,png_write_tRNS,(png_structrp png_ptr,
    png_const_bytep trans, png_const_color_16p values, int number,
    int color_type),PNG_EMPTY);
#endif

#ifdef PNG_WRITE_bKGD_SUPPORTED
PNG_INTERNAL_FUNCTION(void,png_write_bKGD,(png_structrp png_ptr,
    png_const_color_16p values, int color_type),PNG_EMPTY);
#endif

#ifdef PNG_WRITE_hIST_SUPPORTED
PNG_INTERNAL_FUNCTION(void,png_write_hIST,(png_structrp png_ptr,
    png_const_uint_16p hist, int num_hist),PNG_EMPTY);
#endif

/* Chunks that have keywords */
#ifdef PNG_WRITE_tEXt_SUPPORTED
PNG_INTERNAL_FUNCTION(void,png_write_tEXt,(png_structrp png_ptr,
    png_const_charp key, png_const_charp text, png_size_t text_len),PNG_EMPTY);
#endif

#ifdef PNG_WRITE_zTXt_SUPPORTED
PNG_INTERNAL_FUNCTION(void,png_write_zTXt,(png_structrp png_ptr,
    png_const_charp key, png_const_charp text, int compression),PNG_EMPTY);
#endif

#ifdef PNG_WRITE_iTXt_SUPPORTED
PNG_INTERNAL_FUNCTION(void,png_write_iTXt,(png_structrp png_ptr,
    int compression, png_const_charp key, png_const_charp lang,
    png_const_charp lang_key, png_const_charp text),PNG_EMPTY);
#endif

#ifdef PNG_TEXT_SUPPORTED  /* Added at version 1.0.14 and 1.2.4 */
PNG_INTERNAL_FUNCTION(int,png_set_text_2,(png_structrp png_ptr,
    png_inforp info_ptr, png_const_textp text_ptr, int num_text),PNG_EMPTY);
#endif

#ifdef PNG_WRITE_oFFs_SUPPORTED
PNG_INTERNAL_FUNCTION(void,png_write_oFFs,(png_structrp png_ptr,
    png_int_32 x_offset, png_int_32 y_offset, int unit_type),PNG_EMPTY);
#endif

#ifdef PNG_WRITE_pCAL_SUPPORTED
PNG_INTERNAL_FUNCTION(void,png_write_pCAL,(png_structrp png_ptr,
    png_charp purpose, png_int_32 X0, png_int_32 X1, int type, int nparams,
    png_const_charp units, png_charpp params),PNG_EMPTY);
#endif

#ifdef PNG_WRITE_pHYs_SUPPORTED
PNG_INTERNAL_FUNCTION(void,png_write_pHYs,(png_structrp png_ptr,
    png_uint_32 x_pixels_per_unit, png_uint_32 y_pixels_per_unit,
    int unit_type),PNG_EMPTY);
#endif

#ifdef PNG_WRITE_tIME_SUPPORTED
PNG_INTERNAL_FUNCTION(void,png_write_tIME,(png_structrp png_ptr,
    png_const_timep mod_time),PNG_EMPTY);
#endif

#ifdef PNG_WRITE_sCAL_SUPPORTED
PNG_INTERNAL_FUNCTION(void,png_write_sCAL_s,(png_structrp png_ptr,
    int unit, png_const_charp width, png_const_charp height),PNG_EMPTY);
#endif

#ifdef PNG_WRITE_SUPPORTED
PNG_INTERNAL_FUNCTION(void,png_write_start_IDAT,(png_structrp png_ptr),
      PNG_EMPTY);
   /* Do any required initialization before IDAT or row processing starts. */

/* Choose the best filter to use and filter the row data then write it out.  If
 * WRITE_FILTERING is not supported this just writes the data out with a zero
 * (NONE) filter byte.
 *
 * This may be called multiple times per row, but calls must be in 'x' order;
 * first a call with x 0 to mark the start of the row and, at the end, one with
 * PNG_ROW_END set (this can be done in the same function call if the whole row
 * is passed.)  The following flags are used internally to control pass
 * filtering and deflate:
 */
enum
{
   png_pass_last      =0x1U, /* This is the last pass in the image */
   png_pass_last_row  =0x2U, /* This is the last row in a pass */
   png_pass_first_row =0x4U, /* This is the first row in a pass */
   png_row_end        =0x8U, /* This is the last block in the row */
   png_no_row_info    =0x0U  /* Placeholder */

   /* A useful macro; return true if this is the last block of the last row in
    * the image.
    */
#  define PNG_IDAT_END(f) (((f) & ~png_pass_first_row) == \
      (png_row_end+png_pass_last_row+png_pass_last))
};
PNG_INTERNAL_FUNCTION(void,png_write_png_data,(png_structrp png_ptr,
    png_bytep prev_pixels, png_const_bytep unfiltered_row, png_uint_32 x,
    unsigned int width/*pixels*/, unsigned int row_info_flags),
   PNG_EMPTY);

PNG_INTERNAL_FUNCTION(void,png_write_png_rows,(png_structrp png_ptr,
    png_const_bytep *rows, png_uint_32 num_rows), PNG_EMPTY);
   /* As above but rows[num_rows] of correctly (PNG) formated but unfiltered
    * data are passed in.  For an interlaced image the rows will be interlaced
    * rows and therefore may be narrower than the image width.
    *
    * This function advances png_structp::pass and png_structp::row_number as
    * required.
    */

/* Release memory used by the deflate mechanism */
PNG_INTERNAL_FUNCTION(void, png_deflate_destroy, (png_structp png_ptr),
   PNG_EMPTY);
#endif /* WRITE */

#ifdef PNG_TRANSFORM_MECH_SUPPORTED
PNG_INTERNAL_FUNCTION(void,png_transform_free,(png_const_structrp png_ptr,
         png_transformp *list),PNG_EMPTY);
   /* Free the entire transform list, from the given point on. the argument is
    * set to NULL.
    */

PNG_INTERNAL_FUNCTION(void,png_init_transform_control,(
   png_transform_controlp out, png_structp png_ptr),PNG_EMPTY);
   /* Initialize a transform control for running the transform list forward (the
    * read case, and write initialization, but the write case is called within
    * pngtrans.c by the above function.)
    */

#ifdef PNG_READ_TRANSFORMS_SUPPORTED
PNG_INTERNAL_FUNCTION(unsigned int,png_run_this_transform_list_forwards,
   (png_transform_controlp tc, png_transformp *start, png_transformp end),
   PNG_EMPTY);
   /* Used by the transform cache code to run a sub-list, from *start to the
    * transform end.
    */
#endif /* READ_TRANSFORMS */

#ifdef PNG_READ_SUPPORTED
PNG_INTERNAL_FUNCTION(unsigned int,png_run_transform_list_forwards,
   (png_structp png_ptr, png_transform_controlp tc),PNG_EMPTY);
   /* Run the transform list in the forwards direction (from PNG format to
    * memory format).  The transform control must be initialized completely by
    * the caller.  This function takes account of transforms which delete
    * themselves during the run; it must be used.
    */
#endif /* READ */

#ifdef PNG_WRITE_SUPPORTED
PNG_INTERNAL_FUNCTION(void,png_run_transform_list_backwards,
   (png_structp png_ptr, png_transform_controlp tc),PNG_EMPTY);
   /* Run the transform list in the backwards direction (from memory format to
    * PNG format).  The transform control must be initialized completely by
    * the caller.  This function takes account of transforms which delete
    * themselves during the run; it must be used.
    */
#endif /* WRITE */

PNG_INTERNAL_FUNCTION(png_transformp,png_add_transform,(png_structrp png_ptr,
   size_t size, png_transform_fn fn, unsigned int order),PNG_EMPTY);
   /* Add a transform, using the information in 'order' to control the position
    * of the transform in the list, returning a pointer to the transform.  The
    * top 8 bits of 'order' control the position in the list.  If a transform
    * does not already exist in the list with the given value a new transform
    * will be created and 'fn' and 'order' set.  If there is a transform with
    * that value 'fn' must match and 'order' will be updated by combining the
    * new value in with a bitwise or (|).  It is up to the function (fn) or the
    * caller of png_add_transform to determine whether the combination is valid.
    *
    * 'size' is used when creating a new transform, it may be larger than
    * (sizeof png_transform) if required to accomodate extra data.
    *
    * Prior to 1.7.0 transforms were executed in an order hard-wired into the
    * code that executed the transform functions.  This was summarized in the
    * read case by the following comment from pngrtran.c
    * (png_init_read_transformations), note that this has been marked up to
    * indicate which PNG formats the transforms in the list apply to:
    *
    * *: applies to most formats
    * A: only formats with alpha
    * L: only low-bit-depth (less than 8 bits per component/pixel)
    * H: only high-bit-depth (16-bits per component)
    *
    > From the code of png_do_read_transformations the order is:
    *
    * GGRR   For example column: . no action
    *  AGG                       r acts on read
    *   BB                       w acts on write
    *    A                       B acts on both read and write
    >
    > r.r.  1) PNG_EXPAND (including PNG_EXPAND_tRNS)
    > .r.r  2) PNG_STRIP_ALPHA (if no compose)
    > ..rr  3) PNG_RGB_TO_GRAY
    > rr..  4) PNG_GRAY_TO_RGB iff !PNG_FLAG_BACKGROUND_IS_GRAY
    > rrrr  5) PNG_COMPOSE
    > rrrr  6) PNG_GAMMA
    > .r.r  7) PNG_STRIP_ALPHA (if compose)
    > .r.r  8) PNG_ENCODE_ALPHA
    > rrrr  9) PNG_SCALE_16_TO_8
    > rrrr 10) PNG_16_TO_8
    > ..rr 11) PNG_QUANTIZE (converts to palette)
    > rrrr 12) PNG_EXPAND_16
    > rr.. 13) PNG_GRAY_TO_RGB iff PNG_FLAG_BACKGROUND_IS_GRAY
    > BB.. 14) PNG_INVERT_MONO
    > .B.B 15) PNG_INVERT_ALPHA
    > BBBB 16) PNG_SHIFT
    *
    * Note that transforms from this point on are used in 1.7.0 on palette
    * indices as well; a png_set_pack request (for example) packs the palette
    * index values if the output will be palettized and the grayscale values
    * if it will not be (if the output is low-bit-grayscale, not palette.)
    *
    > B... 17) PNG_PACK
    > ..BB 18) PNG_BGR
    > B... 19) PNG_PACKSWAP
    > rwrw 20) PNG_FILLER (includes PNG_ADD_ALPHA)
    > .B.B 21) PNG_SWAP_ALPHA
    > BBBB 22) PNG_SWAP_BYTES
    > BBBB 23) PNG_USER_TRANSFORM [must be last]
    *
    * Finally, outside the set of transforms prior to 1.7.0, the libpng
    * interlace handling required the pixels to be replicated to match the pixel
    * spacing in the image row; the first part the pre-1.7.0 interlace support,
    * this is still the case when reading, but for writing the interlace is now
    * a transform:
    *
    > BBBB 24) png_do_{read,write}_interlace (interlaced images only).
    *
    * First transforms are grouped according to basic function using the top 3
    * bits of the order code:
    */
#  define PNG_TR_START         0x0000U /* initial ops on the PNG data */
#  define PNG_TR_ARITHMETIC    0x2000U /* arithmetic linear operations */
#  define PNG_TR_CHANNEL       0x4000U /* PNG conformant format changes */
#  define PNG_TR_QUANTIZE      0x6000U /* quantize and following operations */
#  define PNG_TR_ENCODING      0x8000U /* Row encoding transforms */
#  define PNG_TR_INTERLACE     0xA000U /* write interlace transform */
   /*
    * In libpng 1.7.0 the check on palette index values is moved to the start
    * (of read, end of write, which is where it was before) immediately after
    * the MNG filter handling
    */
#  define PNG_TR_MNG_INTRAPIXEL (PNG_TR_START + 0x0100U)
   /* Perform intra-pixel differencing (write) or un-differencing on read. */
#  define PNG_TR_CHECK_PALETTE  (PNG_TR_START + 0x0200U)
   /* Done before at the start on read, at the end on write to give a
    * consistent postion:
    *
    *    PNG_RWTR_CHECK_PALETTE PI W11: happens in pngwrite.c last
    */
#  define PNG_TR_START_CACHE    (PNG_TR_START + 0x0300U)
   /* Not used on a transform; this is just a marker for the point at which
    * palette or low-bit-depth caching can start on read.  (The previous
    * operations cannot be cached).
    */
#  define PNG_TR_INIT_ALPHA     (PNG_TR_START + 0x0400U)
   /* This just handles alpha/tRNS initialization issues to resolve the
    * inter-dependencies with tRNS expansion and background composition; it
    * doesn't do anything itself, just sets flags and pushes transforms.
    */
   /*
    * Prior to 1.7 the arithmetic operations interleaved with the RGB-to-gray
    * and alpha strip byte level ops.  This was done to reduce the amount of
    * data processed, i.e. it was an optimization not a requirement.  These
    * operations were preceded by the 'expand' operations, which is the
    * opposite; it was done to simplify the code and actually slows things down
    * in the low bit depth gray case.  The full list of operations after expand,
    * in the 1.6 order, is:
    *
    *    PNG_TR_STRIP_ALPHA     png_do_strip_channel (sometimes)
    *    PNG_TR_RGB_TO_GRAY     png_do_rgb_to_gray
    *    PNG_TR_GRAY_TO_RGB     png_do_gray_to_rgb (sometimes)
    *    PNG_TR_COMPOSE         png_do_compose
    *    PNG_TR_GAMMA           png_do_gamma (if no RGB_TO_GRAY)
    *    PNG_TR_STRIP_ALPHA     png_do_strip_channel (other times)
    *    PNG_TR_ENCODE_ALPHA    png_do_encode_alpha
    *
    * In 1.7 the operations are moved round somewhat, including moving alpha and
    * 16-to-8 bit reduction later.  This leaves the following operations:
    *
    *    PNG_TR_RGB_TO_GRAY     png_do_rgb_to_gray
    *    PNG_TR_COMPOSE         png_do_compose
    *    PNG_TR_GAMMA           png_do_gamma (if no RGB_TO_GRAY)
    *    PNG_TR_ENCODE_ALPHA    png_do_encode_alpha
    *
    * Prior to 1.7 some combinations of transforms would do gamma correction
    * twice, the actual implementation in 1.7 is to use the following order and
    * rely on the cache code to optimize gray 1,2,4,8 and (of course) palette.
    */
#  define PNG_TR_COMPOSE          (PNG_TR_ARITHMETIC + 0x0100U)
      /* Handle background composition.  This may need to push a gray-to-rgb
       * transform if the background is RGB for gray input.  This precedes RGB
       * to gray convertion so that it can handle tRNS appropriately when the
       * background is in the PNG encoding however, typically, the processing
       * happens at PNG_TR_COMPOSE_ALPHA below.
       *
       * NOTE: this must be the first arithmetic transform because the code in
       * png_init_background relies on png_transform_control::gamma being the
       * original PNG gamma.
       */
#  define PNG_TR_RGB_TO_GRAY      (PNG_TR_ARITHMETIC + 0x0200U) /* to gray */
      /* Convert any RGB input (8/16 bit depth, RGB, RGBA) to linear gray
       * 16-bit.  This happens first because it cannot be cached; the input data
       * has 24 or 48 bits of uncorrelated data so the transform has to happen
       * pixel-by-pixel.  Internally the transform may maintain an 8 or 16-bit
       * gamma correction table (to 16-bit linear) to speed things up.
       *
       * NOTE: this transform must follow PNG_TR_COMPOSE with no intervening
       * transforms; see the code in png_init_background (pngrtran.c) which
       * relies on this during PNG_TC_INIT_FORMAT.
       */
#  define PNG_TR_COMPOSE_ALPHA    (PNG_TR_ARITHMETIC + 0x0300U)
       /* Compose alpha composition and tRNS handling when the background is a
        * screen color.  Pushed by PNG_TR_COMPOSE as required.
        */
#  define PNG_TR_GAMMA_ENCODE     (PNG_TR_ARITHMETIC + 0x1F00U) /* last */
      /* Gamma encode the input.  This encodes the gray or RGB channels to the
       * required bit depth and either scales the alpha channel or encodes it as
       * well, depending on the requested alpha encoding.
       */
   /*
    * The 'expand' operations come after the arithmetic ones in libpng 1.7, this
    * forces the arithmetic stuff to do the expand, but since arithmetic is (in
    * 1.7) normally done in 16-bit linear this avoids spurious expands.
    */
#  define PNG_TR_EXPAND        (PNG_TR_CHANNEL    + 0x0100U)
   /* Includes:
    *
    *    PNG_TR_EXPAND_PALETTE  palette images only, includes tRNS
    *    PNG_TR_EXPAND_LBP_GRAY grayscale low-bit depth only
    *    PNG_TR_EXPAND_tRNS     non-palette images only
    */
#  define PNG_TR_SCALE_16_TO_8 (PNG_TR_CHANNEL    + 0x0200U)
   /* Comes after the expand and before the chop version; note that it works on
    * the pixel values directly, so it is a linear transform on a non-linear
    * value.
    */
   /*
    * To handle transforms that affect the palette entries, not the palette
    * indices in the row data, libpng 1.7 reorders some of the post-quantize
    * transformations to put all the "PC" transforms ahead of all the "PI"
    * transforms.  The "PC" transforms that came after png_do_quantize in libpng
    * 1.6 cannot be ordered to be before so they are included in the
    * PNG_TR_QUANTIZE section.  The PI transforms are all in PNG_TR_ENCODING,
    * PNG_GRAY_TO_RGB is moved before PNG_TR_QUANTIZE to avoid the unpredictable
    * behavior of png_set_quantize that otherwise arises.
    *
    * The transforms in the PNG_TR_QUANTIZE section are:
    *
    *    PNG_TR_EXPAND_16       !P !W
    *    PNG_RWTR_INVERT_MONO   !P W10: invert the gray channel
    *    PNG_RWTR_INVERT_ALPHA  PC W8: invert the alpha channel
    *    PNG_RWTR_SHIFT         PC W6: read: down, write: scale up
    *    PNG_RWTR_BGR           !P W9
    *    PNG_RWTR_FILLER        !P W2: add on R, remove on W
    *    PNG_RWTR_SWAP_ALPHA    !P W7
    *    PNG_RWTR_SWAP_16       !P W5
    *
    * The ones in PNG_TR_ENCODING are:
    *
    *    PNG_RWTR_PACK          PI W4: R: unpack bytes, W: pack
    *    PNG_RWTR_PIXEL_SWAP    PI W3: Swap pixels in a byte
    *    PNG_RWTR_USER          PI W1
    */

#  define PNG_TR_CHANNEL_PREQ  (PNG_TR_CHANNEL    + 0x1F00U)
   /* The channel swap transforms that must happen before PNG_TR_QUANTIZE:
    *
    *    PNG_TR_STRIP_ALPHA
    *    PNG_TR_CHOP_16_TO_8
    *    PNG_TR_GRAY_TO_RGB
    */
#  define PNG_TR_CHANNEL_POSTQ (PNG_TR_QUANTIZE   + 0x0100U)
   /* The post-quantize channel swap transforms:
    *
    *    PNG_TR_EXPAND_16       !P !W
    *    PNG_RWTR_BGR           !P W9
    *    PNG_RWTR_FILLER        !P W2: (filler) add on R, remove on W
    *    PNG_RWTR_SWAP_ALPHA    !P W7
    *    PNG_RWTR_SWAP_16       !P W5
    *
    * The 'CHANNEL' operation sets the transform_control channel_add flag for
    * use below.
    */
#  define PNG_TR_INVERT        (PNG_TR_QUANTIZE   + 0x0200U)
   /* Invert MONO and ALPHA.  If the channel_add flag is set in the transform
    * control INVERT_ALPHA will not be done; the png_add_alpha/filler APIs
    * happened after png_set_invert_alpha in earlier versions so the filler
    * value had to include the invert.
    *
    *    PNG_RWTR_INVERT_MONO   !P W10: invert the gray channel
    *    PNG_RWTR_INVERT_ALPHA  PC W8: invert the alpha channel
    */
#  define PNG_TR_SHIFT         (PNG_TR_QUANTIZE   + 0x0300U)
   /* The channel shift, except that if the channel_add flag has been set the
    * alpha channel is not shifted.
    *
    *    PNG_RWTR_SHIFT         PC W6: read: down, write: scale up
    */
#  define PNG_TR_PACK          (PNG_TR_ENCODING   + 0x0200U)
   /*    PNG_RWTR_PACK          PI W4: R: unpack bytes, W: pack */
#  define PNG_TR_PIXEL_SWAP    (PNG_TR_ENCODING   + 0x0300U)
   /*    PNG_RWTR_PIXEL_SWAP    PI W3: Swap pixels in a byte */
#  define PNG_TR_USER          (PNG_TR_ENCODING   + 0x1F00U)
   /* The user transform; must be last before the interlace handling because it
    * does unpredictable things to the format.
    *
    *    PNG_RWTR_USER          PI W1
    */

PNG_INTERNAL_FUNCTION(png_transformp,png_push_transform,(png_structrp png_ptr,
   size_t size, png_transform_fn fn, png_transformp *transform,
   png_transform_controlp tc),PNG_EMPTY);
   /* As png_add_transform except that the new transform is inserted ahead of
    * the given transform (*transform).  The new transform is returned, but it
    * will also invariably be in *transform.  If 'tc' is not NULL the transform
    * callback will also be called; it needs to be called if this function is
    * called while transforms are being run.
    *
    * 'fn' must not be NULL.
    *
    * The transform is inserted with the same 'order' as the passed in
    * *transform, that transform and following transforms are moved up ('order'
    * is incremented) as required to make space.  Consequently, unlike with
    * png_add_transform, the transform will always be new.  To detect loops
    * (*transform)->fn must not be the same as the passed in 'fn'.
    */

PNG_INTERNAL_FUNCTION(png_voidp,png_transform_cast_check,
   (png_const_structp png_ptr, unsigned int src_line, png_transformp tr,
    size_t size),PNG_EMPTY);
   /* Given a pointer to a transform, 'tr' validate that the underlying derived
    * class has size 'size' using the tr->size field and return the same
    * pointer.  If there is a size mismatch the function does an affirm using
    * the given line number.
    */
#define png_transform_cast(type, pointer) png_voidcast(type*,\
   png_transform_cast_check(png_ptr, PNG_SRC_LINE, (pointer), sizeof (type)))
   /* This takes a pointer to a transform and safely returns a pointer to a
    * derived transform class (type); type must not have the pointer.  It
    * validates the 'size' field.  Derived classes start with a png_transform
    * as the first member called 'tr'.
    */
#endif /* TRANSFORM_MECH_SUPPORTED */

#ifdef PNG_READ_TRANSFORMS_SUPPORTED
/* Remove a transform from a list, moving the next transform down into
 * *transform.
 */
PNG_INTERNAL_FUNCTION(void,png_remove_transform,(png_const_structp png_ptr,
   png_transformp *transform),PNG_EMPTY);

/* Initializer for read transforms that handles caching, palette update and
 * palette expansion.
 */
PNG_INTERNAL_FUNCTION(unsigned int,png_read_init_transform_mech,
   (png_structp png_ptr, png_transform_control *tc),PNG_EMPTY);

/* Optional call to update the users info structure */
PNG_INTERNAL_FUNCTION(void,png_read_transform_info,(png_structrp png_ptr,
   png_inforp info_ptr),PNG_EMPTY);
#endif

/* APIs which do a tranform on both read and write but where the implementation
 * is separate for each; the read and write init functions are in pngrtran.c or
 * pngwtran.c, the API is in pngtrans.c
 */
#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_READ_EXPAND_SUPPORTED)
PNG_INTERNAL_FUNCTION(void,png_init_read_pack,(png_transformp *transform,
   png_transform_controlp tc),PNG_EMPTY);
#endif /* READ_PACK || READ_EXPAND */
#ifdef PNG_WRITE_PACK_SUPPORTED
PNG_INTERNAL_FUNCTION(void,png_init_write_pack,(png_transformp *transform,
   png_transform_controlp tc),PNG_EMPTY);
#endif /* WRITE_PACK */

/* Shared transform functions, defined in pngtran.c */
#if defined(PNG_WRITE_FILLER_SUPPORTED) || \
    defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
PNG_INTERNAL_FUNCTION(void,png_do_strip_channel,(
    png_transform_controlp row_info, png_bytep row, int at_start),PNG_EMPTY);
#endif /* FILLER */

#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)
PNG_INTERNAL_FUNCTION(void,png_do_invert,(png_transform_controlp row_info,
    png_bytep row),PNG_EMPTY);
#endif /* INVERT */

#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) ||\
    defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
PNG_INTERNAL_FUNCTION(void,png_do_invert_alpha,(png_transform_controlp row_info,
    png_bytep row),PNG_EMPTY);
#endif /* INVERT_ALPHA */

#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
PNG_INTERNAL_FUNCTION(void,png_add_rgb_to_gray_byte_ops,(png_structrp png_ptr,
   png_transform_controlp tc, unsigned int index, unsigned int order),
   PNG_EMPTY);
   /* This is an init-time utility to add appropriate byte ops to select a given
    * channel from R/G/B.
    */
#endif /* READ_RGB_TO_GRAY */

#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) &&\
    defined(PNG_READ_BACKGROUND_SUPPORTED)
PNG_INTERNAL_FUNCTION(void,png_push_gray_to_rgb_byte_ops,(png_transformp *tr,
   png_transform_controlp tc), PNG_EMPTY);
   /* This is an init-time utility to push appropriate byte ops to expand a
    * grayscale PNG data set to RGB.  It calls the function callback so 'tc'
    * must be non-NULL.
    */
#endif /* GRAY_TO_RGB && READ_BACKGROUND */

#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED
PNG_INTERNAL_FUNCTION(void,png_add_strip_alpha_byte_ops,(png_structrp png_ptr),
   PNG_EMPTY);
   /* Called from pngrtran.c to add the relevant byte op. */
#endif /* READ_STRIP_ALPHA */

/* The following decodes the appropriate chunks, and does error correction,
 * then calls the appropriate callback for the chunk if it is valid.
 */

#ifdef PNG_READ_SUPPORTED
PNG_INTERNAL_FUNCTION(png_bytep,png_read_buffer,(png_structrp png_ptr,
   png_alloc_size_t new_size, int warn),PNG_EMPTY);
   /* Manage the dynamically allocated read buffer */

/* Shared READ IDAT handling: */
PNG_INTERNAL_FUNCTION(void,png_read_start_IDAT,(png_structrp png_ptr),
   PNG_EMPTY);
   /* Initialize the row buffers, etc. */

typedef enum
{
   png_row_incomplete,
      /* more IDAT data needed for row */
   png_row_process,
      /* png_struct::row_buffer contains a complete row */
   png_row_repeat,
      /* row not in this pass, but the existing row may be used */
   png_row_skip
      /* row not in pass and no appropriate data; skip this row */
}  png_row_op;
PNG_INTERNAL_FUNCTION(png_row_op,png_read_process_IDAT,(png_structrp png_ptr,
      png_bytep transformed_row, png_bytep display_row, int save_row),
      PNG_EMPTY);
   /* Process a block of IDAT data; the routine returns early if it has
    * obtained a row.  It is valid to call this routine with no input data;
    * it will return png_row_incomplete if it needs input.
    *
    * transformed_row: The transformed pixels of the input are written here.
    *                  For interlaced images only the pixels in the pass will
    *                  be written, the other pixels will not be touched.
    *
    * display_row:     The transformed pixels but replicated to that the entire
    *                  buffer will have been initialized.  For passes after the
    *                  first the pixels written are determined by the 'block'
    *                  algorithm; only those *following* pixels which are
    *                  written by *later* passes are written (with a copy of the
    *                  pixel from the pass.)
    *
    * save_row:        A boolean which indicates that the row (unexpanded)
    *                  should be saved in png_struct::transformed_row.  This can
    *                  be used in a later call to png_combine_row.
    *
    * During reading the row is built up until png_row_process is returned.  At
    * this point png_struct::row_buffer contains the original PNG row from the
    * file and, if save_row was set, png_struct::transformed_row contains the
    * row after the selected row transforms have been performed.  For interlaced
    * images both are the width of the interlace pass.
    *
    * When png_row_repeat is returned the same is true, except that the buffers
    * still contain the contents of the preceding row (the one where this
    * funciton returned png_row_pricess).
    *
    * The row buffers should not be accessed if png_row_skip is returned; this
    * row is not modified in the current pass.
    */

PNG_INTERNAL_FUNCTION(void,png_read_free_row_buffers,(png_structrp png_ptr),
    PNG_EMPTY);
   /* Free allocated row buffers; done as soon as possible to avoid carrying
    * around all the memory for longer than necessary.
    */

PNG_INTERNAL_FUNCTION(int,png_read_finish_IDAT,(png_structrp png_ptr),
    PNG_EMPTY);
   /* Complete reading of the IDAT chunks.  This returns 0 if more data is to
    * be read, 1 if the zlib stream has terminated.  Call this routine with
    * zstream.avail_in greater than zero unless there is no more input data.
    * When zstream_avail_in is 0 on entry and the stream does not terminate
    * an "IDAT truncated" error will be output.
    *
    *    ENTRY: png_ptr->zstream.{next,avail}_in points to more IDAT data, if
    *           available, otherwise avail_in should be 0.
    *    RET 0: the LZ stream is still active, more IDAT date is required, if
    *           available, the routine *must* be called again.
    *    RET 1: the LZ stream has been closed and an error may have been output;
    *           png_ptr->zstream_error says whether it has.  If not and there
    *           is more IDAT data available the caller should output an
    *           appropriate (too much IDAT) error message.
    */

#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
PNG_INTERNAL_FUNCTION(void,png_cache_known_unknown,(png_structrp png_ptr,
   png_const_bytep add, int keep),PNG_EMPTY);
   /* Update the png_struct::known_unknown bit cache which stores whether each
    * known chunk should be treated as unknown.
    */
#endif

typedef enum
{
   png_chunk_skip = 0,    /* Skip this chunk */
   png_chunk_unknown,     /* Pass the chunk to png_handle_unknown */
   png_chunk_process_all, /* Process the chunk all at once */
   png_chunk_process_part /* Process the chunk in parts (for IDAT) */
}  png_chunk_op;

PNG_INTERNAL_FUNCTION(png_chunk_op,png_find_chunk_op,(png_structrp png_ptr),
      PNG_EMPTY);
   /* Given a chunk in png_struct::{chunk_name,chunk_length} validate the name
    * and work out how it should be handled.  This function checks the chunk
    * location using png_struct::mode and will set the mode appropriately for
    * the known critical chunks but otherwise makes no changes to the stream
    * read state.
    */

#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
PNG_INTERNAL_FUNCTION(void,png_handle_unknown,(png_structrp png_ptr,
   png_inforp info_ptr, png_bytep chunk_data),PNG_EMPTY);
   /* Handle an unknown chunk that needs to be processed.  It is only valid
    * to call this after png_find_chunk_op returns png_chunk_unknown.  The
    * data argument points to the png_struct::chunk_length bytes of the chunk
    * data.
    */
#endif /* READ_UNKNOWN_CHUNKS */

PNG_INTERNAL_FUNCTION(void,png_handle_chunk,(png_structrp png_ptr,
      png_inforp info_ptr),PNG_EMPTY);
   /* The chunk to handle is in png_struct::chunk_name,chunk_length.
    *
    * NOTE: at present it is only valid to call this after png_find_chunk_op
    * has returned png_chunk_process_all and all the data is available for
    * png_handle_chunk (via the libpng read callback.)
    */
#endif /* READ */

PNG_INTERNAL_FUNCTION(void,png_init_row_info,(png_structrp png_ptr),PNG_EMPTY);
   /* Set the png_struct::row_ members from the PNG file information, running
    * transforms if required.
    */

/* Added at libpng version 1.6.0 */
#ifdef PNG_GAMMA_SUPPORTED
PNG_INTERNAL_FUNCTION(void,png_colorspace_set_gamma,(png_const_structrp png_ptr,
    png_colorspacerp colorspace, png_fixed_point gAMA), PNG_EMPTY);
   /* Set the colorspace gamma with a value provided by the application or by
    * the gAMA chunk on read.  The value will override anything set by an ICC
    * profile.
    */

PNG_INTERNAL_FUNCTION(void,png_colorspace_sync_info,(png_const_structrp png_ptr,
    png_inforp info_ptr), PNG_EMPTY);
   /* Synchronize the info 'valid' flags with the colorspace */

PNG_INTERNAL_FUNCTION(void,png_colorspace_sync,(png_const_structrp png_ptr,
    png_inforp info_ptr), PNG_EMPTY);
   /* Copy the png_struct colorspace to the info_struct and call the above to
    * synchronize the flags.  Checks for NULL info_ptr and does nothing.
    */
#endif

/* Added at libpng version 1.4.0 */
#ifdef PNG_COLORSPACE_SUPPORTED
/* These internal functions are for maintaining the colorspace structure within
 * a png_info or png_struct (or, indeed, both).
 */
PNG_INTERNAL_FUNCTION(int,png_colorspace_set_chromaticities,
   (png_const_structrp png_ptr, png_colorspacerp colorspace, const png_xy *xy,
    int preferred), PNG_EMPTY);

PNG_INTERNAL_FUNCTION(int,png_colorspace_set_endpoints,
   (png_const_structrp png_ptr, png_colorspacerp colorspace, const png_XYZ *XYZ,
    int preferred), PNG_EMPTY);

#ifdef PNG_sRGB_SUPPORTED
PNG_INTERNAL_FUNCTION(int,png_colorspace_set_sRGB,(png_const_structrp png_ptr,
   png_colorspacerp colorspace, int intent), PNG_EMPTY);
   /* This does set the colorspace gAMA and cHRM values too, but doesn't set the
    * flags to write them, if it returns false there was a problem and an error
    * message has already been output (but the colorspace may still need to be
    * synced to record the invalid flag).
    */
#endif /* sRGB */

#ifdef PNG_iCCP_SUPPORTED
PNG_INTERNAL_FUNCTION(int,png_colorspace_set_ICC,(png_const_structrp png_ptr,
   png_colorspacerp colorspace, png_const_charp name,
   png_uint_32 profile_length, png_const_bytep profile, int is_color),
   PNG_EMPTY);
   /* The 'name' is used for information only */

/* Routines for checking parts of an ICC profile. */
PNG_INTERNAL_FUNCTION(int,png_icc_check_length,(png_const_structrp png_ptr,
   png_colorspacerp colorspace, png_const_charp name,
   png_uint_32 profile_length), PNG_EMPTY);
PNG_INTERNAL_FUNCTION(int,png_icc_check_header,(png_const_structrp png_ptr,
   png_colorspacerp colorspace, png_const_charp name,
   png_uint_32 profile_length,
   png_const_bytep profile /* first 132 bytes only */, int is_color),
   PNG_EMPTY);
PNG_INTERNAL_FUNCTION(int,png_icc_check_tag_table,(png_const_structrp png_ptr,
   png_colorspacerp colorspace, png_const_charp name,
   png_uint_32 profile_length,
   png_const_bytep profile /* header plus whole tag table */), PNG_EMPTY);
#ifdef PNG_sRGB_SUPPORTED
PNG_INTERNAL_FUNCTION(void,png_icc_set_sRGB,(
   png_const_structrp png_ptr, png_colorspacerp colorspace,
   png_const_bytep profile, uLong adler), PNG_EMPTY);
   /* 'adler' is the Adler32 checksum of the uncompressed profile data. It may
    * be zero to indicate that it is not available.  It is used, if provided,
    * as a fast check on the profile when checking to see if it is sRGB.
    */
#endif /* sRGB */
#endif /* iCCP */
#endif /* COLORSPACE */

/* Added at libpng version 1.4.0 */
PNG_INTERNAL_FUNCTION(void,png_check_IHDR,(png_const_structrp png_ptr,
    png_uint_32 width, png_uint_32 height, int bit_depth,
    int color_type, int interlace_type, int compression_type,
    int filter_type),PNG_EMPTY);

#if defined(PNG_FLOATING_POINT_SUPPORTED) && defined(PNG_ERROR_TEXT_SUPPORTED)
PNG_INTERNAL_FUNCTION(void,png_fixed_error,(png_const_structrp png_ptr,
   png_const_charp name),PNG_NORETURN);
#endif

/* Puts 'string' into 'buffer' at buffer[pos], taking care never to overwrite
 * the end.  Always leaves the buffer nul terminated.  Never errors out (and
 * there is no error code.)
 */
PNG_INTERNAL_FUNCTION(size_t,png_safecat,(png_charp buffer, size_t bufsize,
   size_t pos, png_const_charp string),PNG_EMPTY);

/* Various internal functions to handle formatted warning messages, currently
 * only implemented for warnings.
 */
#if defined(PNG_WARNINGS_SUPPORTED) || defined(PNG_TIME_RFC1123_SUPPORTED)
/* Utility to dump an unsigned value into a buffer, given a start pointer and
 * and end pointer (which should point just *beyond* the end of the buffer!)
 * Returns the pointer to the start of the formatted string.  This utility only
 * does unsigned values.
 */
PNG_INTERNAL_FUNCTION(png_charp,png_format_number,(png_const_charp start,
   png_charp end, int format, png_alloc_size_t number),PNG_EMPTY);

/* Convenience macro that takes an array: */
#define PNG_FORMAT_NUMBER(buffer,format,number) \
   png_format_number(buffer, buffer + (sizeof buffer), format, number)

/* Suggested size for a number buffer (enough for 64 bits and a sign!) */
#define PNG_NUMBER_BUFFER_SIZE 24

/* These are the integer formats currently supported, the name is formed from
 * the standard printf(3) format string.
 */
#define PNG_NUMBER_FORMAT_u     1 /* chose unsigned API! */
#define PNG_NUMBER_FORMAT_02u   2
#define PNG_NUMBER_FORMAT_d     1 /* chose signed API! */
#define PNG_NUMBER_FORMAT_02d   2
#define PNG_NUMBER_FORMAT_x     3
#define PNG_NUMBER_FORMAT_02x   4
#define PNG_NUMBER_FORMAT_fixed 5 /* choose the signed API */
#endif

#ifdef PNG_WARNINGS_SUPPORTED
/* New defines and members adding in libpng-1.5.4 */
#  define PNG_WARNING_PARAMETER_SIZE 32
#  define PNG_WARNING_PARAMETER_COUNT 8 /* Maximum 9; see pngerror.c */

/* An l-value of this type has to be passed to the APIs below to cache the
 * values of the parameters to a formatted warning message.
 */
typedef char png_warning_parameters[PNG_WARNING_PARAMETER_COUNT][
   PNG_WARNING_PARAMETER_SIZE];

PNG_INTERNAL_FUNCTION(void,png_warning_parameter,(png_warning_parameters p,
   int number, png_const_charp string),PNG_EMPTY);
   /* Parameters are limited in size to PNG_WARNING_PARAMETER_SIZE characters,
    * including the trailing '\0'.
    */
PNG_INTERNAL_FUNCTION(void,png_warning_parameter_unsigned,
   (png_warning_parameters p, int number, int format, png_alloc_size_t value),
   PNG_EMPTY);
   /* Use png_alloc_size_t because it is an unsigned type as big as any we
    * need to output.  Use the following for a signed value.
    */
PNG_INTERNAL_FUNCTION(void,png_warning_parameter_signed,
   (png_warning_parameters p, int number, int format, png_int_32 value),
   PNG_EMPTY);

PNG_INTERNAL_FUNCTION(void,png_formatted_warning,(png_const_structrp png_ptr,
   png_warning_parameters p, png_const_charp message),PNG_EMPTY);
   /* 'message' follows the X/Open approach of using @1, @2 to insert
    * parameters previously supplied using the above functions.  Errors in
    * specifying the parameters will simply result in garbage substitutions.
    */
#endif

#ifdef PNG_BENIGN_ERRORS_SUPPORTED
/* Application errors (new in 1.6); use these functions (declared below) for
 * errors in the parameters or order of API function calls on read.  The
 * 'warning' should be used for an error that can be handled completely; the
 * 'error' for one which can be handled safely but which may lose application
 * information or settings.
 *
 * By default these both result in a png_error call prior to release, while in a
 * released version the 'warning' is just a warning.  However if the application
 * explicitly disables benign errors (explicitly permitting the code to lose
 * information) they both turn into warnings.
 *
 * If benign errors aren't supported they end up as the corresponding base call
 * (png_warning or png_error.)
 */
PNG_INTERNAL_FUNCTION(void,png_app_warning,(png_const_structrp png_ptr,
   png_const_charp message),PNG_EMPTY);
   /* The application provided invalid parameters to an API function or called
    * an API function at the wrong time, libpng can completely recover.
    */

PNG_INTERNAL_FUNCTION(void,png_app_error,(png_const_structrp png_ptr,
   png_const_charp message),PNG_EMPTY);
   /* As above but libpng will ignore the call, or attempt some other partial
    * recovery from the error.
    */
#else
#  define png_app_warning(pp,s) png_warning(pp,s)
#  define png_app_error(pp,s) png_error(pp,s)
#endif

PNG_INTERNAL_FUNCTION(void,png_chunk_report,(png_const_structrp png_ptr,
   png_const_charp message, int error),PNG_EMPTY);
   /* Report a recoverable issue in chunk data.  On read this is used to report
    * a problem found while reading a particular chunk and the
    * png_chunk_benign_error or png_chunk_warning function is used as
    * appropriate.  On write this is used to report an error that comes from
    * data set via an application call to a png_set_ API and png_app_error or
    * png_app_warning is used as appropriate.
    *
    * With PNG_CHUNK_FATAL an error can be marked as unrecoverable, and the
    * function will not return.
    *
    * The 'error' parameter must have one of the following values:
    */
#define PNG_CHUNK_WARNING     0 /* never an error */
#define PNG_CHUNK_WRITE_ERROR 1 /* an error only on write */
#define PNG_CHUNK_ERROR       2 /* always an error */
#define PNG_CHUNK_FATAL       3 /* an unrecoverable error */

#ifndef PNG_ERROR_TEXT_SUPPORTED
#  define png_chunk_report(pp,e,v) png_chunk_report(pp,NULL,v)
#endif

/* ASCII to FP interfaces, currently only implemented if sCAL
 * support is required.
 */
#if defined(PNG_sCAL_SUPPORTED)
/* MAX_DIGITS is actually the maximum number of characters in an sCAL
 * width or height, derived from the precision (number of significant
 * digits - a build time settable option) and assumptions about the
 * maximum ridiculous exponent.
 */
#define PNG_sCAL_MAX_DIGITS (PNG_sCAL_PRECISION+1/*.*/+1/*E*/+10/*exponent*/)

#ifdef PNG_FLOATING_POINT_SUPPORTED
PNG_INTERNAL_FUNCTION(void,png_ascii_from_fp,(png_const_structrp png_ptr,
   png_charp ascii, png_size_t size, double fp, unsigned int precision),
   PNG_EMPTY);
#endif /* FLOATING_POINT */

#ifdef PNG_FIXED_POINT_SUPPORTED
PNG_INTERNAL_FUNCTION(void,png_ascii_from_fixed,(png_const_structrp png_ptr,
   png_charp ascii, png_size_t size, png_fixed_point fp),PNG_EMPTY);
#endif /* FIXED_POINT */
#endif /* sCAL */

#if defined(PNG_sCAL_SUPPORTED) || defined(PNG_pCAL_SUPPORTED)
/* An internal API to validate the format of a floating point number.
 * The result is the index of the next character.  If the number is
 * not valid it will be the index of a character in the supposed number.
 *
 * The format of a number is defined in the PNG extensions specification
 * and this API is strictly conformant to that spec, not anyone elses!
 *
 * The format as a regular expression is:
 *
 * [+-]?[0-9]+.?([Ee][+-]?[0-9]+)?
 *
 * or:
 *
 * [+-]?.[0-9]+(.[0-9]+)?([Ee][+-]?[0-9]+)?
 *
 * The complexity is that either integer or fraction must be present and the
 * fraction is permitted to have no digits only if the integer is present.
 *
 * NOTE: The dangling E problem.
 *   There is a PNG valid floating point number in the following:
 *
 *       PNG floating point numbers are not greedy.
 *
 *   Working this out requires *TWO* character lookahead (because of the
 *   sign), the parser does not do this - it will fail at the 'r' - this
 *   doesn't matter for PNG sCAL chunk values, but it requires more care
 *   if the value were ever to be embedded in something more complex.  Use
 *   ANSI-C strtod if you need the lookahead.
 */
/* State table for the parser. */
#define PNG_FP_INTEGER    0  /* before or in integer */
#define PNG_FP_FRACTION   1  /* before or in fraction */
#define PNG_FP_EXPONENT   2  /* before or in exponent */
#define PNG_FP_STATE      3  /* mask for the above */
#define PNG_FP_SAW_SIGN   4  /* Saw +/- in current state */
#define PNG_FP_SAW_DIGIT  8  /* Saw a digit in current state */
#define PNG_FP_SAW_DOT   16  /* Saw a dot in current state */
#define PNG_FP_SAW_E     32  /* Saw an E (or e) in current state */
#define PNG_FP_SAW_ANY   60  /* Saw any of the above 4 */

/* These three values don't affect the parser.  They are set but not used.
 */
#define PNG_FP_WAS_VALID 64  /* Preceding substring is a valid fp number */
#define PNG_FP_NEGATIVE 128  /* A negative number, including "-0" */
#define PNG_FP_NONZERO  256  /* A non-zero value */
#define PNG_FP_STICKY   448  /* The above three flags */

/* This is available for the caller to store in 'state' if required.  Do not
 * call the parser after setting it (the parser sometimes clears it.)
 */
#define PNG_FP_INVALID  512  /* Available for callers as a distinct value */

/* Result codes for the parser (boolean - true meants ok, false means
 * not ok yet.)
 */
#define PNG_FP_MAYBE      0  /* The number may be valid in the future */
#define PNG_FP_OK         1  /* The number is valid */

/* Tests on the sticky non-zero and negative flags.  To pass these checks
 * the state must also indicate that the whole number is valid - this is
 * achieved by testing PNG_FP_SAW_DIGIT (see the implementation for why this
 * is equivalent to PNG_FP_OK above.)
 */
#define PNG_FP_NZ_MASK (PNG_FP_SAW_DIGIT | PNG_FP_NEGATIVE | PNG_FP_NONZERO)
   /* NZ_MASK: the string is valid and a non-zero negative value */
#define PNG_FP_Z_MASK (PNG_FP_SAW_DIGIT | PNG_FP_NONZERO)
   /* Z MASK: the string is valid and a non-zero value. */
   /* PNG_FP_SAW_DIGIT: the string is valid. */
#define PNG_FP_IS_ZERO(state) (((state) & PNG_FP_Z_MASK) == PNG_FP_SAW_DIGIT)
#define PNG_FP_IS_POSITIVE(state) (((state) & PNG_FP_NZ_MASK) == PNG_FP_Z_MASK)
#define PNG_FP_IS_NEGATIVE(state) (((state) & PNG_FP_NZ_MASK) == PNG_FP_NZ_MASK)

/* The actual parser.  This can be called repeatedly. It updates
 * the index into the string and the state variable (which must
 * be initialized to 0).  It returns a result code, as above.  There
 * is no point calling the parser any more if it fails to advance to
 * the end of the string - it is stuck on an invalid character (or
 * terminated by '\0').
 *
 * Note that the pointer will consume an E or even an E+ and then leave
 * a 'maybe' state even though a preceding integer.fraction is valid.
 * The PNG_FP_WAS_VALID flag indicates that a preceding substring was
 * a valid number.  It's possible to recover from this by calling
 * the parser again (from the start, with state 0) but with a string
 * that omits the last character (i.e. set the size to the index of
 * the problem character.)  This has not been tested within libpng.
 */
PNG_INTERNAL_FUNCTION(int,png_check_fp_number,(png_const_charp string,
   png_size_t size, int *statep, png_size_tp whereami),PNG_EMPTY);

/* This is the same but it checks a complete string and returns true
 * only if it just contains a floating point number.  As of 1.5.4 this
 * function also returns the state at the end of parsing the number if
 * it was valid (otherwise it returns 0.)  This can be used for testing
 * for negative or zero values using the sticky flag.
 */
PNG_INTERNAL_FUNCTION(int,png_check_fp_string,(png_const_charp string,
   png_size_t size),PNG_EMPTY);
#endif /* pCAL || sCAL */

#if defined(PNG_GAMMA_SUPPORTED) ||\
    defined(PNG_INCH_CONVERSIONS_SUPPORTED) || defined(PNG_READ_pHYs_SUPPORTED)
/* Added at libpng version 1.5.0 */
/* This is a utility to provide a*times/div (rounded) and indicate
 * if there is an overflow.  The result is a boolean - false (0)
 * for overflow, true (1) if no overflow, in which case *res
 * holds the result.
 */
PNG_INTERNAL_FUNCTION(int,png_muldiv,(png_fixed_point_p res, png_fixed_point a,
   png_int_32 multiplied_by, png_int_32 divided_by),PNG_EMPTY);
#endif /* GAMMA || INCH_CONVERSIONS || READ_pHYs */

#ifdef PNG_READ_GAMMA_SUPPORTED
/* Internal fixed point gamma correction.  These APIs are called as
 * required to convert single values - they don't need to be fast,
 * they are not used when processing image pixel values.
 */
PNG_INTERNAL_FUNCTION(unsigned int,png_gamma_nxmbit_correct,
   (unsigned int value, png_fixed_point gamma_val, unsigned int n/*input bits*/,
    unsigned int m/*output bits */),PNG_EMPTY);
   /* In this case the value must have 'n' bits and the output will have 'm'
    * bits.
    */

#if !PNG_RELEASE_BUILD
PNG_INTERNAL_FUNCTION(int,png_gamma_check,(png_const_structrp png_ptr,
   png_const_transform_controlp tc),PNG_EMPTY);
   /* Debugging only routine to repeat the test used above to determine if the
    * gamma was insignificant.
    */
#endif /* !RELEASE_BUILD */
#endif /* READ_GAMMA */

#ifdef PNG_SIMPLIFIED_READ_SUPPORTED
/* Internal check function to saw if the gamma of the PNG data is far enough
 * from the given screen gamma to require gamma correction (only needed for a
 * bug work-round in the simplified API).
 * TODO: it should be possible to remove the bug work-round in 1.7
 */
PNG_INTERNAL_FUNCTION(int,png_need_gamma_correction,(png_const_structrp png_ptr,
   png_fixed_point gamma, int sRGB_output),PNG_EMPTY);
#endif /* SIMPLIFIED_READ */

/* This is a utility macro to say whether a gamma value is close enough to sRGB.
 * The test is now hardwired:
 *
 * API CHANGE: prior to 1.7 this would depend on the build-time
 * PNG_GAMMA_THRESHOLD_FIXED setting, which would cause inconsistent results
 * when the setting was changed.  Since this setting can now be changed at
 * run-time it seems more sensible to have a single fixed definition of 'sRGB'.
 *
 * The test is approximately +/- 1%, it allows any decimal value from 0.45 (the
 * two digit rounded version of 1/2.2) to just under 0.46).
 */
#define PNG_GAMMA_IS_sRGB(g) ((g) >= 45000 && (g) < 46000)

/* SIMPLIFIED READ/WRITE SUPPORT */
#if defined(PNG_SIMPLIFIED_READ_SUPPORTED) ||\
   defined(PNG_SIMPLIFIED_WRITE_SUPPORTED)
/* The internal structure that png_image::opaque points to. */
typedef struct png_control
{
   png_structp png_ptr;
   png_infop   info_ptr;
   png_voidp   error_buf;           /* Always a jmp_buf at present. */

   png_const_bytep memory;          /* Memory buffer. */
   png_size_t      size;            /* Size of the memory buffer. */

   unsigned int for_write       :1; /* Otherwise it is a read structure */
   unsigned int owned_file      :1; /* We own the file in io_ptr */
} png_control;

/* Return the pointer to the jmp_buf from a png_control: necessary because C
 * does not reveal the type of the elements of jmp_buf.
 */
#ifdef __cplusplus
#  define png_control_jmp_buf(pc) (((jmp_buf*)((pc)->error_buf))[0])
#else
#  define png_control_jmp_buf(pc) ((pc)->error_buf)
#endif

/* Utility to safely execute a piece of libpng code catching and logging any
 * errors that might occur.  Returns true on success, false on failure (either
 * of the function or as a result of a png_error.)
 */
PNG_INTERNAL_CALLBACK(void,png_safe_error,(png_structp png_ptr,
   png_const_charp error_message),PNG_NORETURN);

#ifdef PNG_WARNINGS_SUPPORTED
PNG_INTERNAL_CALLBACK(void,png_safe_warning,(png_structp png_ptr,
   png_const_charp warning_message),PNG_EMPTY);
#else
#  define png_safe_warning 0/*dummy argument*/
#endif

PNG_INTERNAL_FUNCTION(int,png_safe_execute,(png_imagep image,
   int (*function)(png_voidp), png_voidp arg),PNG_EMPTY);

/* Utility to log an error; this also cleans up the png_image; the function
 * always returns 0 (false).
 */
PNG_INTERNAL_FUNCTION(int,png_image_error,(png_imagep image,
   png_const_charp error_message),PNG_EMPTY);

/* Safely initialize a stdio pointer - used by both the read and the write
 * code.
 */
#ifdef PNG_STDIO_SUPPORTED
PNG_INTERNAL_FUNCTION(int,png_image_init_io,(png_imagep image, png_FILE_p file),
   PNG_EMPTY);
#endif /* STDIO */

#ifndef PNG_SIMPLIFIED_READ_SUPPORTED
/* png_image_free is used by the write code but not exported */
PNG_INTERNAL_FUNCTION(void, png_image_free, (png_imagep image), PNG_EMPTY);
#endif /* !SIMPLIFIED_READ */

#endif /* SIMPLIFIED READ/WRITE */

#ifdef PNG_READ_SUPPORTED
PNG_INTERNAL_FUNCTION(png_int_32, png_read_setting, (png_structrp png_ptr,
   png_uint_32 setting, png_uint_32 parameter, png_int_32 value), PNG_EMPTY);
#endif /* READ */
#ifdef PNG_WRITE_SUPPORTED
PNG_INTERNAL_FUNCTION(png_int_32,  png_write_setting, (png_structrp png_ptr,
   png_uint_32 setting, png_uint_32 parameter, png_int_32 value), PNG_EMPTY);
   /* Implementations of read and write settings, in pngrutil.c and pngwutil.c
    * respectively.
    */
#endif /* WRITE */

/* Maintainer: Put new private prototypes here ^ */

/* These are initialization functions for hardware specific PNG filter
 * optimizations; list these here then select the appropriate one at compile
 * time using the macro PNG_FILTER_OPTIMIZATIONS.  If the macro is not defined
 * the generic code is used.
 */
#ifdef PNG_FILTER_OPTIMIZATIONS
PNG_INTERNAL_FUNCTION(void, PNG_FILTER_OPTIMIZATIONS, (png_structrp png_ptr,
   unsigned int bpp), PNG_EMPTY);
   /* Just declare the optimization that will be used */
#else
   /* List *all* the possible optimizations here - this branch is required if
    * the builder of libpng passes the definition of PNG_FILTER_OPTIMIZATIONS in
    * CFLAGS in place of CPPFLAGS *and* uses symbol prefixing.
    */
PNG_INTERNAL_FUNCTION(void, png_init_filter_functions_neon,
   (png_structp png_ptr, unsigned int bpp), PNG_EMPTY);
#endif

#include "pngdebug.h"

/* EXTENSION SPECIFIC FUNCTIONS */
#ifdef PNG_EXTENSION_HEADER
#  include PNG_EXTENSION_HEADER
#endif /* EXTENSION_HEADER */

#ifdef __cplusplus
}
#endif

#endif /* PNG_VERSION_INFO_ONLY */
#endif /* PNGPRIV_H */