mirror of
https://git.code.sf.net/p/libpng/code.git
synced 2025-07-10 18:04:09 +02:00
Compare commits
715 Commits
v1.6.22bet
...
v1.7.0beta
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d23207b866 | ||
|
|
a70f5053de | ||
|
|
4cc89fb733 | ||
|
|
e966fac5ac | ||
|
|
cde9b583a8 | ||
|
|
1fd42d849d | ||
|
|
b6a1f48ab2 | ||
|
|
bbe8ea6eb0 | ||
|
|
6d2e06f25f | ||
|
|
3fb14ea53b | ||
|
|
af9ad9545d | ||
|
|
5e88e9c396 | ||
|
|
8498aa1c97 | ||
|
|
8fb81acd98 | ||
|
|
1a087bf921 | ||
|
|
5a857b7d83 | ||
|
|
e2414effed | ||
|
|
023b399e40 | ||
|
|
0b073f4a4d | ||
|
|
a8b45d9f7e | ||
|
|
c39c5640b4 | ||
|
|
eb5e71cc8c | ||
|
|
85cb69aa82 | ||
|
|
dcb3f792d9 | ||
|
|
9a6922896d | ||
|
|
55d3b3226e | ||
|
|
443694d7ac | ||
|
|
f26fa77ef8 | ||
|
|
e46cd2e6bc | ||
|
|
f2a160299e | ||
|
|
4697cbded6 | ||
|
|
033a0d7b49 | ||
|
|
eacf6f9637 | ||
|
|
7912bf3037 | ||
|
|
e4fad63915 | ||
|
|
89287f10b8 | ||
|
|
6271b4fc78 | ||
|
|
3d024874a5 | ||
|
|
2fce16e5c4 | ||
|
|
fc322f6d48 | ||
|
|
1afbb57994 | ||
|
|
e393f19527 | ||
|
|
79378d49b3 | ||
|
|
d9d6b6e361 | ||
|
|
b9014ed336 | ||
|
|
faf68f8d57 | ||
|
|
09a1afbb3d | ||
|
|
27e11dc8cf | ||
|
|
df4568f84b | ||
|
|
6d5f00571d | ||
|
|
4705951df1 | ||
|
|
f33fe44b9f | ||
|
|
43d0aa7218 | ||
|
|
89ebb4dd52 | ||
|
|
8d18e76f2b | ||
|
|
fafbc6a458 | ||
|
|
4253c4d759 | ||
|
|
c90572ee77 | ||
|
|
ef26a3f0fb | ||
|
|
63ea57a796 | ||
|
|
07c60a383a | ||
|
|
8d124a250a | ||
|
|
0340dcdcbd | ||
|
|
ff57ec2126 | ||
|
|
745a926a38 | ||
|
|
4b1d9e8c2a | ||
|
|
bb4bcecaa0 | ||
|
|
28fa0d23c1 | ||
|
|
1bfeb46881 | ||
|
|
ace10ed9a2 | ||
|
|
156006bb1a | ||
|
|
8d48a512bd | ||
|
|
c75a0a40b4 | ||
|
|
fad9c9af47 | ||
|
|
5695e897fd | ||
|
|
0e249e9d93 | ||
|
|
a78c4e286a | ||
|
|
16424d20b5 | ||
|
|
9c76207dbb | ||
|
|
2023c4a0a5 | ||
|
|
69ff249bc4 | ||
|
|
844e264234 | ||
|
|
61acc4c9ed | ||
|
|
bd0bb3ca7f | ||
|
|
386b2b0a7b | ||
|
|
d103609ac5 | ||
|
|
639f8a4668 | ||
|
|
aed7f7aaf9 | ||
|
|
15b6717221 | ||
|
|
c9fda22f76 | ||
|
|
4891f1a5a8 | ||
|
|
abe4a4f049 | ||
|
|
f3fa5dce47 | ||
|
|
17bfbce61c | ||
|
|
2933c2e361 | ||
|
|
69f21bc6eb | ||
|
|
454408799b | ||
|
|
4c1ee27962 | ||
|
|
26090a5f43 | ||
|
|
bfd8446816 | ||
|
|
605f8d046f | ||
|
|
b8ab93dc6f | ||
|
|
66b53bdd37 | ||
|
|
dcbc357c46 | ||
|
|
8ac1821831 | ||
|
|
3407d0f7c4 | ||
|
|
c8d2efcb50 | ||
|
|
99436a407e | ||
|
|
59136cc3b3 | ||
|
|
afbaf7150b | ||
|
|
86499967c3 | ||
|
|
028d2c3fd6 | ||
|
|
47ed19dfce | ||
|
|
94a5189b1c | ||
|
|
9fce04fcd6 | ||
|
|
71c5123a4d | ||
|
|
e9d567d9ec | ||
|
|
37a50281cf | ||
|
|
aacda27449 | ||
|
|
b427d7216d | ||
|
|
c46bd30b51 | ||
|
|
0f2f0f7bbd | ||
|
|
84a8bb8244 | ||
|
|
8fe2eac47f | ||
|
|
cb3402221b | ||
|
|
8978eba436 | ||
|
|
4792c8a751 | ||
|
|
6bbc74d880 | ||
|
|
b3a18efebf | ||
|
|
14d11b9f35 | ||
|
|
e41820cd0b | ||
|
|
18211df70b | ||
|
|
1775bdeb24 | ||
|
|
8bffb48bc1 | ||
|
|
edec44bfc4 | ||
|
|
1c514557b6 | ||
|
|
85d7eca204 | ||
|
|
5357dd77f0 | ||
|
|
5db709d83c | ||
|
|
616ed1197b | ||
|
|
0cb0a45721 | ||
|
|
f476f13488 | ||
|
|
8d93ec2eca | ||
|
|
b0076faf1f | ||
|
|
fa86bd2a61 | ||
|
|
961d60b067 | ||
|
|
764ae07652 | ||
|
|
6803b09cb7 | ||
|
|
7a7e4367d0 | ||
|
|
b69df74b8e | ||
|
|
a42416de9c | ||
|
|
e51652b4db | ||
|
|
771eb7d01e | ||
|
|
368bb1b241 | ||
|
|
504ebd427d | ||
|
|
caa716d859 | ||
|
|
0f2554a5e6 | ||
|
|
9eb14136d8 | ||
|
|
09c90236f4 | ||
|
|
a3458a6ba0 | ||
|
|
daf4b9dd18 | ||
|
|
3a866cb451 | ||
|
|
5592e0bc96 | ||
|
|
57e92a8432 | ||
|
|
d3c0359b23 | ||
|
|
801608f8f4 | ||
|
|
c09b3ab2c7 | ||
|
|
722645fec5 | ||
|
|
f72d0d01eb | ||
|
|
97c4072cce | ||
|
|
7a92725e17 | ||
|
|
e916d9bb60 | ||
|
|
ea41fd2161 | ||
|
|
dbd98b8c68 | ||
|
|
5cf6ed45c8 | ||
|
|
9f7d5aa973 | ||
|
|
5b05197604 | ||
|
|
90992547c7 | ||
|
|
13ce05daaf | ||
|
|
2cd6d56ff6 | ||
|
|
1af270dc19 | ||
|
|
2ddd06c392 | ||
|
|
33d4b5b66d | ||
|
|
15a143e85e | ||
|
|
bd55022b2d | ||
|
|
c5bc9b668d | ||
|
|
975d8fac6d | ||
|
|
e76a320539 | ||
|
|
eab2c419fa | ||
|
|
23324b8559 | ||
|
|
8dfa93beed | ||
|
|
ed44394ad0 | ||
|
|
c23bdb1445 | ||
|
|
cbf4adee5c | ||
|
|
1bc0781245 | ||
|
|
7441965463 | ||
|
|
8d6c21ce96 | ||
|
|
8c94b1295f | ||
|
|
1932e16c21 | ||
|
|
a6278e7c87 | ||
|
|
a5b993aaed | ||
|
|
53e537439f | ||
|
|
f1eec0ba62 | ||
|
|
1e563f689c | ||
|
|
0301cc2627 | ||
|
|
9ee0b63b09 | ||
|
|
2c13de800f | ||
|
|
d394d889e1 | ||
|
|
40d90d34a8 | ||
|
|
3f6efbd8e2 | ||
|
|
bf51c644f7 | ||
|
|
05399c8c82 | ||
|
|
8fae6609c0 | ||
|
|
a2245a2c54 | ||
|
|
46d3f863ca | ||
|
|
7c9a08b8bc | ||
|
|
c2a8a01b2a | ||
|
|
8c025bcf3f | ||
|
|
d555056b24 | ||
|
|
69f2152c0f | ||
|
|
e6a3e2456c | ||
|
|
493bfd14a2 | ||
|
|
8a9a3fb4dd | ||
|
|
3e46c31961 | ||
|
|
714515bc0c | ||
|
|
38647d4b21 | ||
|
|
f8d3e854cb | ||
|
|
d280c3a6da | ||
|
|
62dff2f97e | ||
|
|
fea86b1c29 | ||
|
|
601ae5387e | ||
|
|
36ada4acae | ||
|
|
bfc7affa0d | ||
|
|
dba870122c | ||
|
|
35abfe72d6 | ||
|
|
497ff3400c | ||
|
|
bb4e79c947 | ||
|
|
b00bb570f8 | ||
|
|
c68de14844 | ||
|
|
cc7fa5e23f | ||
|
|
ec99b373dd | ||
|
|
3184947a25 | ||
|
|
c5ead5d2cd | ||
|
|
76c5c11168 | ||
|
|
ddcca52933 | ||
|
|
3bd90db79f | ||
|
|
1fc5345bff | ||
|
|
81b1cff052 | ||
|
|
bc1d2b7d23 | ||
|
|
a16d1ef27a | ||
|
|
4b9fe200db | ||
|
|
223aed9f90 | ||
|
|
064ededa0f | ||
|
|
92d7dd1ede | ||
|
|
1b3d312513 | ||
|
|
47b6a93924 | ||
|
|
e1ff1cc930 | ||
|
|
9acee8b4b2 | ||
|
|
8ffa92dc25 | ||
|
|
24382d838c | ||
|
|
9307eef199 | ||
|
|
3d1fec50e8 | ||
|
|
0781bc4905 | ||
|
|
188962a93b | ||
|
|
e55c190818 | ||
|
|
1a9eb510eb | ||
|
|
77476d3c37 | ||
|
|
a671f8baea | ||
|
|
f32c657fc7 | ||
|
|
381283fb5f | ||
|
|
3dd43ae670 | ||
|
|
13d83c6948 | ||
|
|
f19f7a6c95 | ||
|
|
e0fea61cd8 | ||
|
|
689b9c58fe | ||
|
|
dc6cddd798 | ||
|
|
5d2841d272 | ||
|
|
9012e3d108 | ||
|
|
81d58f913e | ||
|
|
0ee7a07a85 | ||
|
|
6acc280403 | ||
|
|
01358ecec2 | ||
|
|
7a35bcac1a | ||
|
|
673ae608ab | ||
|
|
73ea393ab2 | ||
|
|
dff4a834ce | ||
|
|
ad817b9b2b | ||
|
|
218b2d7c70 | ||
|
|
67890a19f3 | ||
|
|
53097f5bbb | ||
|
|
36562c1032 | ||
|
|
82fa6aed0e | ||
|
|
382de60042 | ||
|
|
06963c7841 | ||
|
|
9f2fb72c67 | ||
|
|
10ea5caef2 | ||
|
|
2460d9494d | ||
|
|
e8e7b6681e | ||
|
|
033dd3f20a | ||
|
|
341e23c009 | ||
|
|
e4521a073c | ||
|
|
5ff2d472e8 | ||
|
|
f8eeac2b11 | ||
|
|
e57ab4311b | ||
|
|
9015c44736 | ||
|
|
1d7f037627 | ||
|
|
c4c28d7251 | ||
|
|
0fba15c567 | ||
|
|
c062330846 | ||
|
|
0448d90f01 | ||
|
|
127bede89c | ||
|
|
3e4bd8c261 | ||
|
|
cc085343ec | ||
|
|
ea0197a3e3 | ||
|
|
c2f0c9683f | ||
|
|
79a332afd0 | ||
|
|
352e2fe4c7 | ||
|
|
3077b5e049 | ||
|
|
98043c79a2 | ||
|
|
2bf96d75ec | ||
|
|
678020ae18 | ||
|
|
58e69e45ff | ||
|
|
7b51b8c13b | ||
|
|
5f7e71fa78 | ||
|
|
0cd3d25ae8 | ||
|
|
83a2959908 | ||
|
|
ab2ef2ceb1 | ||
|
|
f0341bae80 | ||
|
|
ed3543679a | ||
|
|
9c7aee825c | ||
|
|
d8055d7123 | ||
|
|
92ef42d5e1 | ||
|
|
1d3a1e36a7 | ||
|
|
d368235da4 | ||
|
|
06b0c83920 | ||
|
|
2130a3cd20 | ||
|
|
f1e4acb5b1 | ||
|
|
7e56f5858d | ||
|
|
82fca45d27 | ||
|
|
f55ee011a2 | ||
|
|
9c9009ec7d | ||
|
|
01d91b4370 | ||
|
|
1fd10de101 | ||
|
|
9149259041 | ||
|
|
8bc832389a | ||
|
|
ba22b208ed | ||
|
|
0f6d60e672 | ||
|
|
6ce2d220b4 | ||
|
|
d7312be749 | ||
|
|
125eac0ee4 | ||
|
|
ab95226db8 | ||
|
|
3043819fb2 | ||
|
|
565e1bc1ae | ||
|
|
5bdcb914a4 | ||
|
|
e8213aa68f | ||
|
|
d4ac328617 | ||
|
|
56e6741b25 | ||
|
|
3e04e189d8 | ||
|
|
eb67f8bcb1 | ||
|
|
9c078fb7d2 | ||
|
|
ae31a1ebdb | ||
|
|
b1d49de5bc | ||
|
|
d7e9c1c584 | ||
|
|
28451a8797 | ||
|
|
e6eb1d6fda | ||
|
|
82dd5d3575 | ||
|
|
a5b6764cea | ||
|
|
56850aba35 | ||
|
|
13f025c29a | ||
|
|
d92b0f23e6 | ||
|
|
eeab1cfefc | ||
|
|
38d22ef928 | ||
|
|
ab1ad88ecc | ||
|
|
caa59e0007 | ||
|
|
310ffb25f8 | ||
|
|
c026b07529 | ||
|
|
6988b31244 | ||
|
|
b23a10f565 | ||
|
|
201e9144a6 | ||
|
|
ba8495bba9 | ||
|
|
3393042627 | ||
|
|
a072dfee8e | ||
|
|
e39e182357 | ||
|
|
ab71e135e7 | ||
|
|
1b577e9bc6 | ||
|
|
238fdc197d | ||
|
|
8cfee5fa78 | ||
|
|
44a9af81b0 | ||
|
|
755f92fc41 | ||
|
|
d9d1c997d8 | ||
|
|
aeb4a22975 | ||
|
|
9c0b5ab848 | ||
|
|
05dcaffd38 | ||
|
|
cca25b182f | ||
|
|
f87df31c8c | ||
|
|
41547820e8 | ||
|
|
e5d462d829 | ||
|
|
6f46730cb7 | ||
|
|
67b88b8ee0 | ||
|
|
7a4bfbdec1 | ||
|
|
859254054a | ||
|
|
515659d638 | ||
|
|
fd409c8019 | ||
|
|
9ee6678e1f | ||
|
|
9b36280e31 | ||
|
|
eaad9f9177 | ||
|
|
70cd1a10f2 | ||
|
|
7974d60f54 | ||
|
|
c7e743d385 | ||
|
|
b2e89f1af6 | ||
|
|
ad30a1262b | ||
|
|
35f88c1341 | ||
|
|
4f8050416f | ||
|
|
776d1768aa | ||
|
|
d7078c52e2 | ||
|
|
4a67ac3f1e | ||
|
|
2799bf9a4f | ||
|
|
34e49ae1bc | ||
|
|
cea01951da | ||
|
|
1a9c06b11a | ||
|
|
f3b1eb68a6 | ||
|
|
12845bc947 | ||
|
|
3ac960f128 | ||
|
|
eb2b0248e2 | ||
|
|
e529698d38 | ||
|
|
1a9e897289 | ||
|
|
3a81956ffe | ||
|
|
0acf4f9770 | ||
|
|
b407af6503 | ||
|
|
0fb41f05df | ||
|
|
8ebdaa0700 | ||
|
|
4e61b58980 | ||
|
|
88e7d62fbc | ||
|
|
43cd0a0bb5 | ||
|
|
1345c5bff8 | ||
|
|
39c420834f | ||
|
|
f898f69f46 | ||
|
|
352f43cdc6 | ||
|
|
f99393490d | ||
|
|
deb920b4a7 | ||
|
|
148cdac18f | ||
|
|
51ecc14a8a | ||
|
|
713a20c57d | ||
|
|
4526f546ba | ||
|
|
0c5acfa19e | ||
|
|
848eeacb41 | ||
|
|
2ced844b0e | ||
|
|
e2c5ed8d1d | ||
|
|
76004ce6ed | ||
|
|
258b986917 | ||
|
|
50a09830b8 | ||
|
|
9a3f244085 | ||
|
|
fb1305faeb | ||
|
|
3d7f3bbab7 | ||
|
|
2d032e966d | ||
|
|
8dd3784f7c | ||
|
|
98b9371115 | ||
|
|
d29413a2a9 | ||
|
|
dc63b03da1 | ||
|
|
cf354c2c82 | ||
|
|
484dad1a19 | ||
|
|
1695471118 | ||
|
|
ae14dcd404 | ||
|
|
302c58b8cf | ||
|
|
39fee3cee1 | ||
|
|
b7362c6738 | ||
|
|
f2d8561fdc | ||
|
|
1bd81ffa21 | ||
|
|
6d2b1a7dbc | ||
|
|
5daa97c2eb | ||
|
|
9e441e96b9 | ||
|
|
a0d314ce84 | ||
|
|
b871b25997 | ||
|
|
d38ebc9ded | ||
|
|
995402ca6e | ||
|
|
1982968dad | ||
|
|
32cd66d619 | ||
|
|
03a53fa429 | ||
|
|
441de8f4fd | ||
|
|
4e5c80034e | ||
|
|
879d63156a | ||
|
|
eb021245d0 | ||
|
|
6607a3b905 | ||
|
|
28711dff2a | ||
|
|
4413d5dcd2 | ||
|
|
206d1eed42 | ||
|
|
114fa16ab3 | ||
|
|
eb2af04bd3 | ||
|
|
200fc68f52 | ||
|
|
4cfd01a288 | ||
|
|
e98229ceb0 | ||
|
|
ad1a4c8cc3 | ||
|
|
8df7c46e5b | ||
|
|
99078ec8bd | ||
|
|
a2c5f56e77 | ||
|
|
9e168ea2c9 | ||
|
|
06be739941 | ||
|
|
448092b8eb | ||
|
|
1faa6ff32c | ||
|
|
3adf438f39 | ||
|
|
d45a632529 | ||
|
|
5a1b8d106d | ||
|
|
05f896004f | ||
|
|
a4f1de9109 | ||
|
|
7ebb353944 | ||
|
|
b1f0c7d0e5 | ||
|
|
55df049962 | ||
|
|
219ba1370e | ||
|
|
4dc4471bb5 | ||
|
|
a199a15b28 | ||
|
|
e9446f2f95 | ||
|
|
f70f2fcf48 | ||
|
|
158c947ce2 | ||
|
|
7e2707e2af | ||
|
|
81824079b5 | ||
|
|
e8e1add0a8 | ||
|
|
a549223f91 | ||
|
|
ebe7945b96 | ||
|
|
e3e35aa980 | ||
|
|
9f2fbcf5d8 | ||
|
|
264ba68afe | ||
|
|
3ef99c9316 | ||
|
|
4b29f97f9b | ||
|
|
fe6e6cf130 | ||
|
|
547df4b9ca | ||
|
|
a0d4a0b971 | ||
|
|
72c2577302 | ||
|
|
091fab713c | ||
|
|
32aeb2cd4e | ||
|
|
c1bcdc3a86 | ||
|
|
553b8f85d3 | ||
|
|
30666a6097 | ||
|
|
0bfa63cd0d | ||
|
|
b37a7c6674 | ||
|
|
7657ac14f2 | ||
|
|
d9f60caf72 | ||
|
|
88c20ada06 | ||
|
|
f3bfc4a142 | ||
|
|
3fdef04d55 | ||
|
|
eae431e514 | ||
|
|
003590c361 | ||
|
|
8e23262b2b | ||
|
|
157e0649e0 | ||
|
|
83f1287c02 | ||
|
|
a1124a574a | ||
|
|
6f27254a7e | ||
|
|
79fc8fa0d9 | ||
|
|
394bc6cdee | ||
|
|
bb06552075 | ||
|
|
a14071d814 | ||
|
|
23f3e46518 | ||
|
|
f97b2a6cde | ||
|
|
23f4320775 | ||
|
|
fb411867b0 | ||
|
|
5aa2ca454d | ||
|
|
7905286ffa | ||
|
|
2edcb6ad0f | ||
|
|
0f1599e6e5 | ||
|
|
cbf22f30b4 | ||
|
|
9bf3c70730 | ||
|
|
1bc5747713 | ||
|
|
4a7796faca | ||
|
|
34081a0e2f | ||
|
|
b88c94208a | ||
|
|
30662f5e92 | ||
|
|
46ad4c5bd4 | ||
|
|
5c32606ec0 | ||
|
|
a08ac031fc | ||
|
|
c233ec8743 | ||
|
|
d594be641a | ||
|
|
4c9168875b | ||
|
|
3c051ee282 | ||
|
|
e1ded944f0 | ||
|
|
c09dddc0cd | ||
|
|
bd56d76417 | ||
|
|
0cc23ac171 | ||
|
|
cb10e19725 | ||
|
|
9dba7219a0 | ||
|
|
17c6af8c40 | ||
|
|
6a02eb6d2c | ||
|
|
40d41fe6f8 | ||
|
|
7073d26e51 | ||
|
|
cf76fe8654 | ||
|
|
b780b64fbf | ||
|
|
b1876ab6e2 | ||
|
|
28a95d125f | ||
|
|
993f68c006 | ||
|
|
8d23524359 | ||
|
|
e0f4aaa668 | ||
|
|
3de174cd2f | ||
|
|
eaf2f1dcbe | ||
|
|
ea0b4c602e | ||
|
|
371c3d4dfd | ||
|
|
0bcf5fb451 | ||
|
|
57d6907d89 | ||
|
|
6cf97e37af | ||
|
|
8ef61c4693 | ||
|
|
25a116f97d | ||
|
|
d6d41c847a | ||
|
|
9e0297546f | ||
|
|
d529363d13 | ||
|
|
55e93d7090 | ||
|
|
23674b75be | ||
|
|
0ddf350360 | ||
|
|
066f9862f0 | ||
|
|
ae1a5c811c | ||
|
|
5a1ce92c0c | ||
|
|
7a498039c5 | ||
|
|
40a93652aa | ||
|
|
a1362f38de | ||
|
|
30bc0333fe | ||
|
|
55794013d4 | ||
|
|
2e92b4dfa0 | ||
|
|
f46106fa04 | ||
|
|
0dcd32f39c | ||
|
|
808ea281a4 | ||
|
|
ec89aefb44 | ||
|
|
6152dbd424 | ||
|
|
fe18c0d9ea | ||
|
|
1b0358302d | ||
|
|
d20f9d5030 | ||
|
|
fc447311aa | ||
|
|
8e30e43587 | ||
|
|
0403ccf1de | ||
|
|
1a321cc088 | ||
|
|
c9f99f487b | ||
|
|
8360e60abc | ||
|
|
2799f74489 | ||
|
|
7363babe4f | ||
|
|
e3a526f789 | ||
|
|
8f0935b8dc | ||
|
|
ae6503fe0e | ||
|
|
851a6265a8 | ||
|
|
ffa24d4108 | ||
|
|
206f4d2678 | ||
|
|
bb040784c2 | ||
|
|
70e1af50ed | ||
|
|
eb4a645eda | ||
|
|
9f7f03a3c4 | ||
|
|
395ddbd318 | ||
|
|
9f0d36c85f | ||
|
|
e9760e5e95 | ||
|
|
b96b2b7e90 | ||
|
|
9bb705e0a8 | ||
|
|
e860f77393 | ||
|
|
b5a7565908 | ||
|
|
e88e221d91 | ||
|
|
b10867cdc2 | ||
|
|
bf7084b80d | ||
|
|
6afcee826f | ||
|
|
f15a5006c8 | ||
|
|
cdbd5174bd | ||
|
|
7a9b6203ef | ||
|
|
803493e19c | ||
|
|
4245e6b1b2 | ||
|
|
81892f6b90 | ||
|
|
862993827d | ||
|
|
d304125332 | ||
|
|
9124f3e29a | ||
|
|
2969375aa6 | ||
|
|
5e8ba1cbbf | ||
|
|
8aee43d10a | ||
|
|
e355657bbe | ||
|
|
fb6ba9acf4 | ||
|
|
815173a0b5 | ||
|
|
7f489a77bb | ||
|
|
8ec8e8fcd5 | ||
|
|
a4e606dd5f | ||
|
|
646de7962b | ||
|
|
4accd423c2 | ||
|
|
f62caaf4dc | ||
|
|
b789bb84bb | ||
|
|
ce60ad642b | ||
|
|
ab097b1168 | ||
|
|
3a737d86c7 | ||
|
|
a1337e57a8 | ||
|
|
247b3fcf49 | ||
|
|
f01273b25c | ||
|
|
8cb1a2ac6d | ||
|
|
e6e5ac8cb7 | ||
|
|
a4798fb83e | ||
|
|
46369f35c5 | ||
|
|
e699993d70 | ||
|
|
5a0afcfa63 | ||
|
|
3fc9cbf126 | ||
|
|
36b628b19e | ||
|
|
2c31365fd4 | ||
|
|
e1e3c1a2a2 | ||
|
|
b940e5dc5d | ||
|
|
fbbbc620b8 | ||
|
|
9b99600c4d | ||
|
|
3129d7426e | ||
|
|
325ceea971 | ||
|
|
ac39fc3024 | ||
|
|
99343407e6 | ||
|
|
3e23f45ba9 | ||
|
|
72389dec42 | ||
|
|
1f0853f47e | ||
|
|
32a60a4885 | ||
|
|
5e07dc6970 | ||
|
|
4b90a8d416 | ||
|
|
d59c19b64c | ||
|
|
bbabd977d1 | ||
|
|
0cf9c7d63d | ||
|
|
b4e241559e | ||
|
|
1e15aee6be | ||
|
|
d59e60d0fb | ||
|
|
ec1d13a1d4 | ||
|
|
d9002f94cb | ||
|
|
1fa858db48 | ||
|
|
0f2a5bac64 | ||
|
|
eac85878bf | ||
|
|
240ac287eb | ||
|
|
3e42c81193 | ||
|
|
ac3b4d9b69 |
99
.travis.yml
Normal file
99
.travis.yml
Normal file
@@ -0,0 +1,99 @@
|
||||
language: c
|
||||
sudo: false
|
||||
cache:
|
||||
directories:
|
||||
- $HOME/.cache/pip
|
||||
- $HOME/deps
|
||||
matrix:
|
||||
include:
|
||||
- os: linux
|
||||
compiler: gcc
|
||||
env: BUILD_TYPE=normal
|
||||
- os: linux
|
||||
compiler: clang
|
||||
env: BUILD_TYPE=normal
|
||||
- os: linux
|
||||
compiler: gcc
|
||||
env: BUILD_TYPE=coverage
|
||||
- os: linux
|
||||
compiler: clang
|
||||
env: BUILD_TYPE=ubsan
|
||||
- os: linux
|
||||
compiler: clang
|
||||
env: BUILD_TYPE=asan
|
||||
- os: linux
|
||||
compiler: clang
|
||||
env: BUILD_TYPE=lsan
|
||||
- os: linux
|
||||
compiler: clang
|
||||
env: BUILD_TYPE=msan
|
||||
- os: osx
|
||||
compiler: gcc
|
||||
env: BUILD_TYPE=normal
|
||||
- os: osx
|
||||
compiler: clang
|
||||
env: BUILD_TYPE=normal
|
||||
|
||||
install:
|
||||
- pip install --user 'requests[security]'
|
||||
- pip install --user cpp-coveralls
|
||||
- |
|
||||
mkdir -p deps
|
||||
pushd deps
|
||||
export PREFIXDIR=`pwd`
|
||||
if [ ! -f "libtool-2.4.6.tar.xz" ]; then
|
||||
wget http://ftpmirror.gnu.org/libtool/libtool-2.4.6.tar.xz
|
||||
fi
|
||||
if [ ! -f "automake-1.15.tar.xz" ]; then
|
||||
wget http://ftp.gnu.org/gnu/automake/automake-1.15.tar.xz
|
||||
fi
|
||||
if [ ! -d "libtool-2.4.6" ]; then
|
||||
tar xf libtool-2.4.6.tar.xz
|
||||
pushd libtool-2.4.6/
|
||||
./configure --prefix=$PREFIXDIR
|
||||
make && make install
|
||||
popd
|
||||
cp $PREFIXDIR/bin/libtool $PREFIXDIR/bin/glibtool
|
||||
cp $PREFIXDIR/bin/libtoolize $PREFIXDIR/bin/glibtoolize
|
||||
fi
|
||||
if [ ! -d "automake-1.15" ]; then
|
||||
tar xf automake-1.15.tar.xz
|
||||
pushd automake-1.15/
|
||||
./configure --prefix=$PREFIXDIR
|
||||
make && make install
|
||||
popd
|
||||
fi
|
||||
export PATH="$PREFIXDIR/bin:$PATH"
|
||||
popd
|
||||
before_script:
|
||||
- |
|
||||
if [ "$BUILD_TYPE" = "coverage" ]; then
|
||||
export CFLAGS="-fprofile-arcs -ftest-coverage"
|
||||
export LDFLAGS="-fprofile-arcs -ftest-coverage"
|
||||
fi
|
||||
- |
|
||||
if [ "$BUILD_TYPE" = "asan" ]; then
|
||||
export CFLAGS=-fsanitize=address
|
||||
export LDFLAGS=-fsanitize=address
|
||||
fi
|
||||
- |
|
||||
if [ "$BUILD_TYPE" = "lsan" ]; then
|
||||
export CFLAGS=-fsanitize=leak
|
||||
export LDFLAGS=-fsanitize=leak
|
||||
fi
|
||||
- |
|
||||
if [ "$BUILD_TYPE" = "msan" ]; then
|
||||
export CFLAGS=-fsanitize=memory
|
||||
export LDFLAGS=-fsanitize=memory
|
||||
fi
|
||||
- |
|
||||
if [ "$BUILD_TYPE" = "ubsan" ]; then
|
||||
export CFLAGS="-fsanitize=undefined -fno-sanitize-recover"
|
||||
export LDFLAGS="-fsanitize=undefined"
|
||||
fi
|
||||
script:
|
||||
- ./autogen.sh && ./configure && make && make check
|
||||
- |
|
||||
if [ "$BUILD_TYPE" = "coverage" ]; then
|
||||
cpp-coveralls --gcov-options '\-lp'
|
||||
fi
|
||||
@@ -34,8 +34,8 @@ project(libpng C)
|
||||
enable_testing()
|
||||
|
||||
set(PNGLIB_MAJOR 1)
|
||||
set(PNGLIB_MINOR 6)
|
||||
set(PNGLIB_RELEASE 22)
|
||||
set(PNGLIB_MINOR 7)
|
||||
set(PNGLIB_RELEASE 0)
|
||||
set(PNGLIB_NAME libpng${PNGLIB_MAJOR}${PNGLIB_MINOR})
|
||||
set(PNGLIB_VERSION ${PNGLIB_MAJOR}.${PNGLIB_MINOR}.${PNGLIB_RELEASE})
|
||||
|
||||
@@ -337,6 +337,7 @@ set(libpng_private_hdrs
|
||||
pngdebug.h
|
||||
pnginfo.h
|
||||
pngstruct.h
|
||||
pngchunk.h
|
||||
)
|
||||
if(AWK)
|
||||
list(APPEND libpng_private_hdrs "${CMAKE_CURRENT_BINARY_DIR}/pngprefix.h")
|
||||
@@ -696,9 +697,9 @@ endif(NOT WIN32 OR CYGWIN OR MINGW)
|
||||
# SET UP LINKS
|
||||
if(PNG_SHARED)
|
||||
set_target_properties(png PROPERTIES
|
||||
# VERSION 16.${PNGLIB_RELEASE}.1.6.22beta03
|
||||
VERSION 16.${PNGLIB_RELEASE}.0
|
||||
SOVERSION 16
|
||||
# VERSION 17.${PNGLIB_RELEASE}.1.7.0beta80
|
||||
VERSION 17.${PNGLIB_RELEASE}.0
|
||||
SOVERSION 17
|
||||
CLEAN_DIRECT_OUTPUT 1)
|
||||
endif()
|
||||
|
||||
@@ -721,7 +722,7 @@ if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL )
|
||||
FRAMEWORK DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||
|
||||
if(PNG_SHARED)
|
||||
# Create a symlink for libpng.dll.a => libpng16.dll.a on Cygwin
|
||||
# Create a symlink for libpng.dll.a => libpng17.dll.a on Cygwin
|
||||
if(CYGWIN OR MINGW)
|
||||
get_target_property(BUILD_TARGET_LOCATION png LOCATION_${CMAKE_BUILD_TYPE})
|
||||
CREATE_SYMLINK(${BUILD_TARGET_LOCATION} libpng${CMAKE_IMPORT_LIBRARY_SUFFIX})
|
||||
|
||||
6
INSTALL
6
INSTALL
@@ -47,9 +47,7 @@ If configure does not work on your system, or if you have a need to
|
||||
change configure.ac or Makefile.am, and you have a reasonably
|
||||
up-to-date set of tools, running ./autogen.sh in a git clone before
|
||||
running ./configure may fix the problem. To be really sure that you
|
||||
aren't using any of the included pre-built scripts, especially if you
|
||||
are building from a tar distribution instead of a git distribution,
|
||||
do this:
|
||||
aren't using any of the included pre-built scripts, you can do this:
|
||||
|
||||
./configure --enable-maintainer-mode
|
||||
make maintainer-clean
|
||||
@@ -401,7 +399,7 @@ CFLAGS="-Wall -O -funroll-loops \
|
||||
--with-pkgconfigdir=/usr/lib/pkgconfig --includedir=/usr/include
|
||||
|
||||
You can alternatively specify --includedir=/usr/include, /usr/local/include,
|
||||
/usr/include/libpng16, or whatever.
|
||||
/usr/include/libpng17, or whatever.
|
||||
|
||||
If you find that the configure script is out-of-date or is not supporting
|
||||
your platform properly, try running autogen.sh to regenerate "configure",
|
||||
|
||||
32
LICENSE
32
LICENSE
@@ -10,7 +10,7 @@ this sentence.
|
||||
|
||||
This code is released under the libpng license.
|
||||
|
||||
libpng versions 1.0.7, July 1, 2000 through 1.6.22beta03, March 9, 2016 are
|
||||
libpng versions 1.0.7, July 1, 2000, through 1.7.0beta80, May 6, 2016, are
|
||||
Copyright (c) 2000-2002, 2004, 2006-2016 Glenn Randers-Pehrson, are
|
||||
derived from libpng-1.0.6, and are distributed according to the same
|
||||
disclaimer and license as libpng-1.0.6 with the following individuals
|
||||
@@ -32,10 +32,6 @@ and with the following additions to the disclaimer:
|
||||
risk of satisfactory quality, performance, accuracy, and effort is with
|
||||
the user.
|
||||
|
||||
Some files in the "contrib" directory and some configure-generated
|
||||
files that are distributed with libpng have other copyright owners and
|
||||
are released under other open source licenses.
|
||||
|
||||
libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
|
||||
Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from
|
||||
libpng-0.96, and are distributed according to the same disclaimer and
|
||||
@@ -59,9 +55,6 @@ Contributing Authors:
|
||||
Greg Roelofs
|
||||
Tom Tanner
|
||||
|
||||
Some files in the "scripts" directory have other copyright owners
|
||||
but are released under this license.
|
||||
|
||||
libpng versions 0.5, May 1995, through 0.88, January 1996, are
|
||||
Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
|
||||
|
||||
@@ -102,29 +95,18 @@ appreciated.
|
||||
|
||||
END OF COPYRIGHT NOTICE, DISCLAIMER, and LICENSE.
|
||||
|
||||
TRADEMARK:
|
||||
A "png_get_copyright" function is available, for convenient use in "about"
|
||||
boxes and the like:
|
||||
|
||||
The name "libpng" has not been registered by the Copyright owner
|
||||
as a trademark in any jurisdiction. However, because libpng has
|
||||
been distributed and maintained world-wide, continually since 1995,
|
||||
the Copyright owner claims "common-law trademark protection" in any
|
||||
jurisdiction where common-law trademark is recognized.
|
||||
printf("%s", png_get_copyright(NULL));
|
||||
|
||||
OSI CERTIFICATION:
|
||||
Also, the PNG logo (in PNG format, of course) is supplied in the
|
||||
files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
|
||||
|
||||
Libpng is OSI Certified Open Source Software. OSI Certified Open Source is
|
||||
a certification mark of the Open Source Initiative. OSI has not addressed
|
||||
the additional disclaimers inserted at version 1.0.7.
|
||||
|
||||
EXPORT CONTROL:
|
||||
|
||||
The Copyright owner believes that the Export Control Classification
|
||||
Number (ECCN) for libpng is EAR99, which means not subject to export
|
||||
controls or International Traffic in Arms Regulations (ITAR) because
|
||||
it is open source, publicly available software, that does not contain
|
||||
any encryption software. See the EAR, paragraphs 734.3(b)(3) and
|
||||
734.7(b).
|
||||
|
||||
Glenn Randers-Pehrson
|
||||
glennrp at users.sourceforge.net
|
||||
March 9, 2016
|
||||
May 6, 2016
|
||||
|
||||
49
Makefile.am
49
Makefile.am
@@ -1,11 +1,6 @@
|
||||
# Makefile.am, the source file for Makefile.in (and hence Makefile), is
|
||||
# Makefile.am:
|
||||
# Source file for Makefile.in (and hence Makefile)
|
||||
#
|
||||
# Copyright (c) 2004-2016 Glenn Randers-Pehrson
|
||||
# Last changed in libpng 1.6.22 [(PENDING RELEASE)]
|
||||
#
|
||||
# This code is released under the libpng license.
|
||||
# For conditions of distribution and use, see the disclaimer
|
||||
# and license in png.h
|
||||
|
||||
PNGLIB_BASENAME= libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@
|
||||
|
||||
@@ -56,9 +51,9 @@ TESTS =\
|
||||
tests/pngvalid-gamma-expand16-background\
|
||||
tests/pngvalid-gamma-expand16-transform tests/pngvalid-gamma-sbit\
|
||||
tests/pngvalid-gamma-threshold tests/pngvalid-gamma-transform\
|
||||
tests/pngvalid-progressive-size\
|
||||
tests/pngvalid-progressive-size tests/pngvalid-size\
|
||||
tests/pngvalid-progressive-interlace-standard\
|
||||
tests/pngvalid-transform\
|
||||
tests/pngvalid-transform tests/pngvalid-interlace-transform\
|
||||
tests/pngvalid-progressive-standard tests/pngvalid-standard\
|
||||
tests/pngstest-1.8 tests/pngstest-1.8-alpha tests/pngstest-linear\
|
||||
tests/pngstest-linear-alpha tests/pngstest-none tests/pngstest-none-alpha\
|
||||
@@ -81,11 +76,15 @@ lib_LTLIBRARIES=libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@.la
|
||||
libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_SOURCES = png.c pngerror.c\
|
||||
pngget.c pngmem.c pngpread.c pngread.c pngrio.c pngrtran.c pngrutil.c\
|
||||
pngset.c pngtrans.c pngwio.c pngwrite.c pngwtran.c pngwutil.c\
|
||||
png.h pngconf.h pngdebug.h pnginfo.h pngpriv.h pngstruct.h pngusr.dfa
|
||||
png.h pngconf.h pngdebug.h pnginfo.h pngpriv.h pngstruct.h pngchunk.h \
|
||||
pngusr.dfa
|
||||
|
||||
if PNG_ARM_NEON
|
||||
libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_SOURCES += arm/arm_init.c\
|
||||
arm/filter_neon.S arm/filter_neon_intrinsics.c
|
||||
# Include libpng extensions, if appropriate. This uses a Makefile.am fragment,
|
||||
# pre-set things that might be changed by addition:
|
||||
AM_CPPFLAGS =
|
||||
DFA_EXTENSION =
|
||||
if LIBPNG_EXTENSIONS
|
||||
include $(top_srcdir)/contrib/extensions.am
|
||||
endif
|
||||
|
||||
nodist_libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_SOURCES = pnglibconf.h
|
||||
@@ -128,12 +127,12 @@ EXTRA_DIST= \
|
||||
$(TESTS) $(XFAIL_TESTS) tests/pngstest \
|
||||
CMakeLists.txt example.c libpng-manual.txt
|
||||
|
||||
SCRIPT_CLEANFILES=scripts/*.out scripts/*.chk
|
||||
SCRIPT_CLEANFILES=scripts/*.out scripts/*.chk scripts/pnglibconf.c
|
||||
|
||||
CLEANFILES= *.tf? pngout.png libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@.pc \
|
||||
libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@-config libpng.vers libpng.sym \
|
||||
check.new pnglibconf.h pngprefix.h symbols.new pngtest-log.txt \
|
||||
pnglibconf.out pnglibconf.c pnglibconf.pre pnglibconf.dfn \
|
||||
pnglibconf.out pnglibconf.c pnglibconf.dfn pnglibconf.pre \
|
||||
$(SCRIPT_CLEANFILES)
|
||||
|
||||
MAINTAINERCLEANFILES = Makefile.in aclocal.m4 config.guess config.h.in \
|
||||
@@ -145,8 +144,8 @@ config.sub configure depcomp install-sh ltmain.sh missing
|
||||
PNG_COPTS = @PNG_COPTS@
|
||||
AM_CFLAGS = ${PNG_COPTS}
|
||||
|
||||
# DFNCPP is normally just CPP - the C preprocessor - but on Solaris and maybe
|
||||
# other operating systems (NeXT?) the C preprocessor selected by configure
|
||||
# DFNCPP is normally just "CPP -E" - the C preprocessor - but on Solaris and
|
||||
# maybe other operating systems (NeXT?) the C preprocessor selected by configure
|
||||
# checks input tokens for validity - effectively it performs part of the ANSI-C
|
||||
# parsing - and therefore fails with the .df files. configure.ac has special
|
||||
# checks for this and sets DFNCPP appropriately.
|
||||
@@ -165,6 +164,8 @@ scripts/prefix.out: png.h pngconf.h pnglibconf.out
|
||||
scripts/symbols.out: png.h pngconf.h $(srcdir)/scripts/pnglibconf.h.prebuilt
|
||||
scripts/intprefix.out: pnglibconf.h
|
||||
|
||||
pnglibconf.out: config.h
|
||||
|
||||
libpng.sym: scripts/sym.out
|
||||
rm -f $@
|
||||
cp $? $@
|
||||
@@ -176,7 +177,7 @@ if DO_PNG_PREFIX
|
||||
# Rename functions in scripts/prefix.out with a PNG_PREFIX prefix.
|
||||
# Rename macros in scripts/macro.lst from PNG_PREFIXpng_ to PNG_ (the actual
|
||||
# implementation of the macro).
|
||||
pnglibconf.h: pnglibconf.out scripts/prefix.out scripts/macro.lst
|
||||
pnglibconf.h: pnglibconf.out scripts/prefix.out scripts/macro.lst config.h
|
||||
rm -f $@
|
||||
$(AWK) 's==0 && NR>1{print prev}\
|
||||
s==0{prev=$$0}\
|
||||
@@ -241,17 +242,17 @@ endif
|
||||
rm -f $@ $*.tf[12]
|
||||
test -d scripts || mkdir scripts || test -d scripts
|
||||
$(DFNCPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES)\
|
||||
$(CPPFLAGS) $(SYMBOL_CFLAGS) $< > $*.tf1
|
||||
$(AM_CPPFLAGS) $(CPPFLAGS) $(SYMBOL_CFLAGS) $< > $*.tf1
|
||||
$(AWK) -f "${srcdir}/scripts/dfn.awk" out="$*.tf2" $*.tf1 1>&2
|
||||
rm -f $*.tf1
|
||||
mv $*.tf2 $@
|
||||
|
||||
# The .c file for pnglibconf.h is machine generated
|
||||
pnglibconf.c: scripts/pnglibconf.dfa scripts/options.awk pngconf.h pngusr.dfa $(DFA_XTRA)
|
||||
pnglibconf.c: scripts/pnglibconf.dfa scripts/options.awk pngconf.h pngusr.dfa $(DFA_EXTENSION) $(DFA_XTRA)
|
||||
rm -f $@ $*.tf[45]
|
||||
$(AWK) -f ${srcdir}/scripts/options.awk out=$*.tf4 version=search\
|
||||
${srcdir}/pngconf.h ${srcdir}/scripts/pnglibconf.dfa\
|
||||
${srcdir}/pngusr.dfa $(DFA_XTRA) 1>&2
|
||||
$(DFA_EXTENSION) ${srcdir}/pngusr.dfa $(DFA_XTRA) 1>&2
|
||||
$(AWK) -f ${srcdir}/scripts/options.awk out=$*.tf5 $*.tf4 1>&2
|
||||
rm $*.tf4
|
||||
mv $*.tf5 $@
|
||||
@@ -269,8 +270,8 @@ scripts/symbols.chk: scripts/checksym.awk scripts/symbols.def scripts/symbols.ou
|
||||
# be empty - no non-standard defines
|
||||
scripts/pnglibconf.c: scripts/pnglibconf.dfa scripts/options.awk pngconf.h
|
||||
rm -f $@ pnglibconf.tf[67]
|
||||
test -z "$(CPPFLAGS)"
|
||||
echo "com @PNGLIB_VERSION@ STANDARD API DEFINITION" |\
|
||||
test -z "$(CPPFLAGS)" -a -z "$(AM_CPPFLAGS)"
|
||||
echo "com libpng @PNGLIB_VERSION@ STANDARD API DEFINITION" |\
|
||||
$(AWK) -f ${srcdir}/scripts/options.awk out=pnglibconf.tf6\
|
||||
logunsupported=1 version=search ${srcdir}/pngconf.h -\
|
||||
${srcdir}/scripts/pnglibconf.dfa 1>&2
|
||||
@@ -279,7 +280,7 @@ scripts/pnglibconf.c: scripts/pnglibconf.dfa scripts/options.awk pngconf.h
|
||||
rm pnglibconf.tf6
|
||||
mv pnglibconf.tf7 $@
|
||||
|
||||
$(libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_OBJECTS): png.h pngconf.h \
|
||||
$(libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_OBJECTS): png.h pngconf.h pngchunk.h \
|
||||
pnglibconf.h pngpriv.h pngdebug.h pnginfo.h pngstruct.h pngprefix.h
|
||||
|
||||
test: check-am
|
||||
|
||||
3
README
3
README
@@ -1,4 +1,4 @@
|
||||
README for libpng version 1.6.22beta03 - March 9, 2016 (shared library 16.0)
|
||||
README for libpng version 1.7.0beta80 - May 6, 2016 (shared library 17.0)
|
||||
See the note about version numbers near the top of png.h
|
||||
|
||||
See INSTALL for instructions on how to install libpng.
|
||||
@@ -160,6 +160,7 @@ Files in this distribution:
|
||||
pngstruct.h => png_struct declaration (private)
|
||||
pnginfo.h => png_info struct declaration (private)
|
||||
pngdebug.h => debugging macros (private)
|
||||
pngchunk.h => PNG chunk descriptions (private, new in libpng17)
|
||||
pngerror.c => Error/warning message I/O functions
|
||||
pngget.c => Functions for retrieving info from struct
|
||||
pngmem.c => Memory handling functions
|
||||
|
||||
1
TODO
1
TODO
@@ -25,5 +25,6 @@ Investigate pre-incremented loop counters and other loop constructions.
|
||||
Add interpolated method of handling interlacing.
|
||||
Switch to the simpler zlib (zlib/libpng) license if legally possible.
|
||||
Extend pngvalid.c to validate more of the libpng transformations.
|
||||
Refactor preprocessor conditionals to compile entire statements
|
||||
|
||||
*/
|
||||
|
||||
232
configure.ac
232
configure.ac
@@ -1,12 +1,5 @@
|
||||
# configure.ac
|
||||
|
||||
# Copyright (c) 2004-2015 Glenn Randers-Pehrson
|
||||
# Last changed in libpng 1.6.22 [(PENDING RELEASE)]
|
||||
|
||||
# This code is released under the libpng license.
|
||||
# For conditions of distribution and use, see the disclaimer
|
||||
# and license in png.h
|
||||
|
||||
dnl Process this file with autoconf to produce a configure script.
|
||||
dnl
|
||||
dnl Minor upgrades (compatible ABI): increment the package version
|
||||
@@ -25,7 +18,7 @@ AC_PREREQ([2.68])
|
||||
|
||||
dnl Version number stuff here:
|
||||
|
||||
AC_INIT([libpng],[1.6.22beta03],[png-mng-implement@lists.sourceforge.net])
|
||||
AC_INIT([libpng],[1.7.0beta80],[png-mng-implement@lists.sourceforge.net])
|
||||
AC_CONFIG_MACRO_DIR([scripts])
|
||||
|
||||
# libpng does not follow GNU file name conventions (hence 'foreign')
|
||||
@@ -34,7 +27,8 @@ AC_CONFIG_MACRO_DIR([scripts])
|
||||
# dist-xz requires automake 1.11 or later
|
||||
# 1.12.2 fixes a security issue in 1.11.2 and 1.12.1
|
||||
# 1.13 is required for parallel tests
|
||||
AM_INIT_AUTOMAKE([1.13 foreign dist-xz color-tests silent-rules subdir-objects])
|
||||
# 1.14.1 is required for %reldir% support
|
||||
AM_INIT_AUTOMAKE([1.15 foreign dist-xz color-tests silent-rules subdir-objects])
|
||||
# The following line causes --disable-maintainer-mode to be the default to
|
||||
# configure, this is necessary because libpng distributions cannot rely on the
|
||||
# time stamps of the autotools generated files being correct
|
||||
@@ -46,10 +40,10 @@ dnl automake, so the following is not necessary (and is not defined anyway):
|
||||
dnl AM_PREREQ([1.11.2])
|
||||
dnl stop configure from automagically running automake
|
||||
|
||||
PNGLIB_VERSION=1.6.22beta03
|
||||
PNGLIB_VERSION=1.7.0beta80
|
||||
PNGLIB_MAJOR=1
|
||||
PNGLIB_MINOR=6
|
||||
PNGLIB_RELEASE=22
|
||||
PNGLIB_MINOR=7
|
||||
PNGLIB_RELEASE=0
|
||||
|
||||
dnl End of version number stuff
|
||||
|
||||
@@ -67,10 +61,10 @@ AC_PROG_INSTALL
|
||||
AC_PROG_LN_S
|
||||
AC_PROG_MAKE_SET
|
||||
|
||||
dnl libtool/libtoolize; version 2.4.2 is the tested version, this or any
|
||||
dnl libtool/libtoolize; version 2.4.4 is the tested version, this or any
|
||||
dnl compatible later version may be used
|
||||
LT_INIT([win32-dll])
|
||||
LT_PREREQ([2.4.2])
|
||||
LT_PREREQ([2.4.4])
|
||||
|
||||
# Some awks crash when confronted with pnglibconf.dfa, do a test run now
|
||||
# to make sure this doesn't happen
|
||||
@@ -86,7 +80,7 @@ fi
|
||||
|
||||
# This is a remnant of the old cc -E validation, where it may have been
|
||||
# necessary to use a different preprocessor for .dfn files
|
||||
DFNCPP="$CPP"
|
||||
DFNCPP="$CPP -E"
|
||||
AC_SUBST(DFNCPP)
|
||||
|
||||
# -Werror cannot be passed to GCC in CFLAGS because configure will fail (it
|
||||
@@ -116,30 +110,146 @@ AC_ARG_ENABLE(werror,
|
||||
|
||||
# Checks for header files.
|
||||
AC_HEADER_STDC
|
||||
# Headers used in pngpriv.h:
|
||||
AC_CHECK_HEADERS([assert.h stdlib.h string.h float.h fp.h math.h m68881.h])
|
||||
# Additional headers used in pngconf.h:
|
||||
AC_CHECK_HEADERS([limits.h stddef.h stdio.h setjmp.h time.h])
|
||||
# Used by pngread.c (for the simplified API):
|
||||
AC_CHECK_HEADERS([errno.h])
|
||||
# The following are not required for the standard 'make' build of libpng:
|
||||
# Additional requirements of contrib/libtests/makepng.c:
|
||||
AC_CHECK_HEADERS([ctype.h])
|
||||
# Additional requirements of contrib/libtests/pngvalid.c:
|
||||
AC_CHECK_HEADERS([fenv.h])
|
||||
|
||||
# Checks for typedefs, structures, and compiler characteristics.
|
||||
AC_C_CONST
|
||||
AC_TYPE_SIZE_T
|
||||
AC_STRUCT_TM
|
||||
# Most of these have been removed from 1.7.0 because they checked for non-ANSI-C
|
||||
# behaviors and the result were, anyway, not used by earlier versions of libpng.
|
||||
AC_C_RESTRICT
|
||||
|
||||
# Checks for library functions.
|
||||
AC_FUNC_STRTOD
|
||||
AC_CHECK_FUNCS([memset], , AC_MSG_ERROR(memset not found in libc))
|
||||
AC_CHECK_FUNCS([pow], , AC_CHECK_LIB(m, pow, , AC_MSG_ERROR(cannot find pow)) )
|
||||
AC_ARG_WITH(zlib-prefix,
|
||||
AS_HELP_STRING([[[--with-zlib-prefix]]],
|
||||
[prefix that may have been used in installed zlib]),
|
||||
[ZPREFIX=${withval}],
|
||||
[ZPREFIX='z_'])
|
||||
AC_CHECK_LIB(z, zlibVersion, ,
|
||||
AC_CHECK_LIB(z, ${ZPREFIX}zlibVersion, , AC_MSG_ERROR(zlib not installed)))
|
||||
# Checks for library functions; these need to be in order, least demanding to
|
||||
# most because the -l directives are added to the head of the list at each
|
||||
# check.
|
||||
# ANSI-C functions: all are required but they don't have to be implemented in
|
||||
# libc, it is perfectly ok to configure with an extra, wrapper, library preset
|
||||
# in LIBS. NOTE: this list may not be complete
|
||||
AC_CHECK_FUNCS([memset memcpy strncpy],,
|
||||
AC_MSG_FAILURE([missing ANSI-C functions]))
|
||||
|
||||
# floor and ceil are required for FLOATING_POINT, but they can be turned off on
|
||||
# the configure command line (and they are independent.) Default is to 'on'
|
||||
AC_ARG_ENABLE([floating-point],
|
||||
AS_HELP_STRING([[[--enabled-floating-point]]],
|
||||
[Enable floating point APIs (default: yes)]),,
|
||||
[enable_floating_point=yes])
|
||||
|
||||
AC_ARG_ENABLE([fixed-point],
|
||||
AS_HELP_STRING([[[--enable-fixed-point]]],
|
||||
[Enable fixed point APIs (default: yes)]),,
|
||||
[enable_fixed_point=yes])
|
||||
|
||||
AC_ARG_ENABLE([floating-arithmetic],
|
||||
AS_HELP_STRING([[[--enable-floating-arithmetic]]],
|
||||
[Use floating point arithmetic internally (default: yes)]),,
|
||||
[enable_floating_arithmetic=yes])
|
||||
|
||||
# Check for a requirement for math library support
|
||||
if test "$enable_floating_arithmetic" = yes
|
||||
then
|
||||
AC_SEARCH_LIBS([floor],[m],,
|
||||
[AC_MSG_WARN([not found])
|
||||
enable_floating_arithmetic=no])
|
||||
AC_SEARCH_LIBS([frexp],[m],,
|
||||
[AC_MSG_WARN([not found])
|
||||
enable_floating_arithmetic=no])
|
||||
AC_SEARCH_LIBS([modf],[m],,
|
||||
[AC_MSG_WARN([not found])
|
||||
enable_floating_arithmetic=no])
|
||||
AC_SEARCH_LIBS([atof],[m],,
|
||||
[AC_MSG_WARN([not found])
|
||||
enable_floating_arithmetic=no])
|
||||
AC_SEARCH_LIBS([pow],[m],,
|
||||
[AC_MSG_WARN([not found])
|
||||
enable_floating_arithmetic=no])
|
||||
fi
|
||||
|
||||
# Set the relevant defines if required (only if required), this will override
|
||||
# anything on the command line.
|
||||
if test "$enable_floating_point" != yes
|
||||
then
|
||||
AC_MSG_NOTICE([Floating point APIs disabled])
|
||||
AC_DEFINE([PNG_NO_FLOATING_POINT],[1],
|
||||
[No support for floating point APIs])
|
||||
fi
|
||||
if test "$enable_fixed_point" != yes
|
||||
then
|
||||
AC_MSG_NOTICE([Fixed point APIs disabled])
|
||||
AC_DEFINE([PNG_NO_FIXED_POINT],[1],
|
||||
[No support for fixed point APIs])
|
||||
fi
|
||||
if test "$enable_floating_arithmetic" != yes
|
||||
then
|
||||
AC_MSG_NOTICE([Fixed point arithmetic will be used])
|
||||
AC_DEFINE([PNG_NO_FLOATING_ARITHMETIC],[1],
|
||||
[No support for floating point arithmetic])
|
||||
fi
|
||||
|
||||
# The following is for pngvalid, to ensure it catches FP errors even on
|
||||
# platforms that don't enable FP exceptions, the function appears in the math
|
||||
# library (typically), it's not an error if it is not found.
|
||||
AC_CHECK_LIB([m], [feenableexcept])
|
||||
AC_CHECK_FUNCS([feenableexcept])
|
||||
AC_SEARCH_LIBS([feenableexcept],[m],AC_DEFINE([HAVE_FEENABLEEXCEPT],[1],
|
||||
[Define to 1 if the feenableexcept function is available]))
|
||||
# Required by pngvalid:
|
||||
AC_SEARCH_LIBS([ceil],[m])
|
||||
|
||||
# zlib checks and arguments;
|
||||
# package zlib: argument is the name of the library
|
||||
# zlib-header: the name of the header file
|
||||
# zlib-prefix: the prefix for library functions, if any
|
||||
AC_ARG_WITH([zlib],
|
||||
AS_HELP_STRING([[[--with-zlib=<name>]]],
|
||||
[base name of the zlib implementation (e.g. 'z')]),,
|
||||
[with_zlib='z'])
|
||||
|
||||
z_prefix=
|
||||
AC_ARG_WITH([zlib-prefix],
|
||||
AS_HELP_STRING([[[--with-zlib-prefix=<prefix>]]],
|
||||
[prefix for zlib API functions]),
|
||||
[if test "$withval" = "" -o "$withval" = yes; then
|
||||
with_zlib_prefix='z_'
|
||||
AC_DEFINE([PNG_ZLIB_PREFIX],[z_],[Standard zlib prefix])
|
||||
elif test "${withval}" != "no"; then
|
||||
AC_DEFINE_UNQUOTED([PNG_ZLIB_PREFIX],[${withval}],
|
||||
[User defined zlib prefix])
|
||||
else
|
||||
with_zlib_prefix=
|
||||
fi
|
||||
if test "$with_zlib_prefix" != ""; then
|
||||
AC_DEFINE([Z_PREFIX],[1],[Tell zlib.h to prefix function names])
|
||||
z_prefix="#define Z_PREFIX 1"
|
||||
fi])
|
||||
|
||||
AC_ARG_WITH([zlib-header],
|
||||
AS_HELP_STRING([[[--with-zlib-header='<file>' or '"file"']]],
|
||||
[C include argument to locate zlib header file, e.g. <zlib.h>, take
|
||||
care to put single quotes round this on the command line]),
|
||||
[AC_DEFINE_UNQUOTED([PNG_ZLIB_HEADER],[${withval}],[Zlib header file])],
|
||||
with_zlib_header='<zlib.h>')
|
||||
|
||||
# AC_CHECK_LIB isn't quite enough for this because we need the special header
|
||||
# file too.
|
||||
LIBS="-l${with_zlib} $LIBS"
|
||||
AC_MSG_CHECKING(
|
||||
[[Library '${with_zlib}' and #include ${with_zlib_header} for symbol '${with_zlib_prefix}zlibVersion']])
|
||||
AC_LINK_IFELSE(
|
||||
[AC_LANG_PROGRAM(
|
||||
[[
|
||||
${z_prefix}
|
||||
#include ${with_zlib_header}
|
||||
]],
|
||||
[[(void)${with_zlib_prefix}zlibVersion();]])],
|
||||
AC_MSG_RESULT([ok]),
|
||||
AC_MSG_FAILURE([not found]))
|
||||
|
||||
AC_MSG_CHECKING([if using Solaris linker])
|
||||
SLD=`$LD --version 2>&1 | grep Solaris`
|
||||
@@ -185,7 +295,7 @@ AM_CONDITIONAL(HAVE_LD_VERSION_SCRIPT, test "$have_ld_version_script" = "yes")
|
||||
if test "$have_ld_version_script" = "yes"; then
|
||||
AC_MSG_CHECKING([for symbol prefix])
|
||||
SYMBOL_PREFIX=`echo "PREFIX=__USER_LABEL_PREFIX__" \
|
||||
| ${CPP-${CC-gcc} -E} - 2>&1 \
|
||||
| ${DFNCPP-${CC-gcc -E}} - 2>&1 \
|
||||
| ${EGREP-grep} "^PREFIX=" \
|
||||
| ${SED-sed} -e "s:^PREFIX=::" -e "s:__USER_LABEL_PREFIX__::"`
|
||||
AC_SUBST(SYMBOL_PREFIX)
|
||||
@@ -272,60 +382,16 @@ AC_ARG_ENABLE([unversioned-libpng-config],
|
||||
AM_CONDITIONAL([DO_INSTALL_LIBPNG_CONFIG],
|
||||
[test "$enable_unversioned_libpng_config" != "no"])
|
||||
|
||||
# HOST SPECIFIC OPTIONS
|
||||
# =====================
|
||||
#
|
||||
# ARM
|
||||
# ===
|
||||
#
|
||||
# ARM NEON (SIMD) support.
|
||||
|
||||
AC_ARG_ENABLE([arm-neon],
|
||||
AS_HELP_STRING([[[--enable-arm-neon]]],
|
||||
[Enable ARM NEON optimizations: =no/off, check, api, yes/on:]
|
||||
[no/off: disable the optimizations; check: use internal checking code]
|
||||
[(deprecated and poorly supported); api: disable by default, enable by]
|
||||
[a call to png_set_option; yes/on: turn on unconditionally.]
|
||||
[If not specified: determined by the compiler.]),
|
||||
[case "$enableval" in
|
||||
no|off)
|
||||
# disable the default enabling on __ARM_NEON__ systems:
|
||||
AC_DEFINE([PNG_ARM_NEON_OPT], [0],
|
||||
[Disable ARM Neon optimizations])
|
||||
# Prevent inclusion of the assembler files below:
|
||||
enable_arm_neon=no;;
|
||||
check)
|
||||
AC_DEFINE([PNG_ARM_NEON_CHECK_SUPPORTED], [],
|
||||
[Check for ARM Neon support at run-time]);;
|
||||
api)
|
||||
AC_DEFINE([PNG_ARM_NEON_API_SUPPORTED], [],
|
||||
[Turn on ARM Neon optimizations at run-time]);;
|
||||
yes|on)
|
||||
AC_DEFINE([PNG_ARM_NEON_OPT], [2],
|
||||
[Enable ARM Neon optimizations])
|
||||
AC_MSG_WARN([--enable-arm-neon: please specify 'check' or 'api', if]
|
||||
[you want the optimizations unconditionally pass -mfpu=neon]
|
||||
[to the compiler.]);;
|
||||
*)
|
||||
AC_MSG_ERROR([--enable-arm-neon=${enable_arm_neon}: invalid value])
|
||||
esac])
|
||||
|
||||
# Add ARM specific files to all builds where the host_cpu is arm ('arm*') or
|
||||
# where ARM optimizations were explicitly requested (this allows a fallback if a
|
||||
# future host CPU does not match 'arm*')
|
||||
|
||||
AM_CONDITIONAL([PNG_ARM_NEON],
|
||||
[test "$enable_arm_neon" != 'no' &&
|
||||
case "$host_cpu" in
|
||||
arm*|aarch64*) :;;
|
||||
*) test "$enable_arm_neon" != '';;
|
||||
esac])
|
||||
# EXTENSIONS
|
||||
# Configure (and all other) support for extensions is included when autoconf is
|
||||
# run by virtue of the existence (or not) of the following file:
|
||||
sinclude([contrib/extensions.ac])
|
||||
AM_CONDITIONAL([LIBPNG_EXTENSIONS],[test -n "$libpng_automake_extensions"])
|
||||
|
||||
AC_MSG_NOTICE([[Extra options for compiler: $PNG_COPTS]])
|
||||
|
||||
# Config files, substituting as above
|
||||
AC_CONFIG_FILES([Makefile libpng.pc:libpng.pc.in])
|
||||
AC_CONFIG_FILES([libpng-config:libpng-config.in],
|
||||
[chmod +x libpng-config])
|
||||
AC_CONFIG_FILES([Makefile libpng.pc])
|
||||
AC_CONFIG_FILES([libpng-config], [chmod +x libpng-config])
|
||||
|
||||
AC_OUTPUT
|
||||
|
||||
2175
contrib/examples/pngcp.c
Normal file
2175
contrib/examples/pngcp.c
Normal file
File diff suppressed because it is too large
Load Diff
16
contrib/extensions.ac
Normal file
16
contrib/extensions.ac
Normal file
@@ -0,0 +1,16 @@
|
||||
# CONTRIBUTED EXTENSIONS
|
||||
#
|
||||
# The following extensions are part of a standard libpng distribution. They are
|
||||
# not supported parts of libpng and they are not necessarily released under the
|
||||
# same license as libpng. Please consult the relevant directory for copyright
|
||||
# and support information before uncommenting any of the lines below.
|
||||
#
|
||||
# After you change this file you MUST re-run "autoreconf" to regenerate the
|
||||
# configure script, otherwise the change may have no effect.
|
||||
#
|
||||
# Include the ARM NEON extension:
|
||||
#sinclude([contrib/neon/neon.ac])
|
||||
#
|
||||
# If any of the extensions require automake support (this is likely) automake
|
||||
# must include the file contrib/extensions.am
|
||||
#libpng_automake_extensions="yes"
|
||||
7
contrib/extensions.am
Normal file
7
contrib/extensions.am
Normal file
@@ -0,0 +1,7 @@
|
||||
# CONTRIBUTED EXTENSIONS
|
||||
#
|
||||
# Please read the file "contrib/extensions.ac" before making changes to this
|
||||
# file.
|
||||
#
|
||||
# Include the ARM NEON extension:
|
||||
#include %reldir%/neon/neon.am
|
||||
@@ -23,9 +23,9 @@
|
||||
|
||||
# macros --------------------------------------------------------------------
|
||||
|
||||
PNGINC = -I/usr/local/include/libpng16
|
||||
PNGLIB = -L/usr/local/lib -lpng16 # dynamically linked against libpng
|
||||
#PNGLIB = /usr/local/lib/libpng16.a # statically linked against libpng
|
||||
PNGINC = -I/usr/local/include/libpng17
|
||||
PNGLIB = -L/usr/local/lib -lpng17 # dynamically linked against libpng
|
||||
#PNGLIB = /usr/local/lib/libpng17.a # statically linked against libpng
|
||||
# or:
|
||||
#PNGINC = -I../..
|
||||
#PNGLIB = -L../.. -lpng
|
||||
|
||||
@@ -26,14 +26,14 @@
|
||||
# macros --------------------------------------------------------------------
|
||||
|
||||
#PNGDIR = /usr/local/lib
|
||||
#PNGINC = -I/usr/local/include/libpng16
|
||||
#PNGLIBd = -L$(PNGDIR) -lpng16 # dynamically linked, installed libpng
|
||||
#PNGLIBs = $(PNGDIR)/libpng16.a # statically linked, installed libpng
|
||||
#PNGINC = -I/usr/local/include/libpng17
|
||||
#PNGLIBd = -L$(PNGDIR) -lpng17 # dynamically linked, installed libpng
|
||||
#PNGLIBs = $(PNGDIR)/libpng17.a # statically linked, installed libpng
|
||||
# or:
|
||||
PNGDIR = ../..# this one is for libpng-x.y.z/contrib/gregbook builds
|
||||
#PNGDIR = ../libpng
|
||||
PNGINC = -I$(PNGDIR)
|
||||
PNGLIBd = -Wl,-rpath,$(PNGDIR) -L$(PNGDIR) -lpng16 # dynamically linked
|
||||
PNGLIBd = -Wl,-rpath,$(PNGDIR) -L$(PNGDIR) -lpng17 # dynamically linked
|
||||
PNGLIBs = $(PNGDIR)/libpng.a # statically linked, local libpng
|
||||
|
||||
ZDIR = /usr/local/lib
|
||||
@@ -59,16 +59,15 @@ INCS = $(PNGINC) $(ZINC) $(XINC)
|
||||
RLIBSd = $(PNGLIBd) $(ZLIBd) $(XLIB) -lm
|
||||
RLIBSs = $(PNGLIBs) $(ZLIBs) $(XLIB) -lm
|
||||
WLIBSd = $(PNGLIBd) $(ZLIBd) -lm
|
||||
WLIBSs = $(PNGLIBs) $(ZLIBs) -lm
|
||||
WLIBSs = $(PNGLIBs) $(ZLIBs)
|
||||
|
||||
CC = gcc
|
||||
LD = gcc
|
||||
RM = rm -f
|
||||
CPPFLAGS = $(INCS) -DFEATURE_LOOP
|
||||
CFLAGS = -O -Wall
|
||||
#CFLAGS = -O -W -Wall -Wextra -pedantic -ansi
|
||||
# [note that -Wall is a gcc-specific compilation flag ("most warnings on")]
|
||||
# [-ansi, -pedantic, -Wextra, and -W can also be used]
|
||||
# [-ansi, -pedantic and -W can also be used]
|
||||
LDFLAGS =
|
||||
O = .o
|
||||
E =
|
||||
|
||||
@@ -100,8 +100,7 @@ int readpng_init(FILE *infile, ulg *pWidth, ulg *pHeight)
|
||||
|
||||
/* could pass pointers to user-defined error handlers instead of NULLs: */
|
||||
|
||||
png_ptr = png_create_read_struct(png_get_libpng_ver(NULL), NULL, NULL,
|
||||
NULL);
|
||||
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
|
||||
if (!png_ptr)
|
||||
return 4; /* out of memory */
|
||||
|
||||
|
||||
@@ -26,8 +26,6 @@
|
||||
- 1.14: added support for X resources (thanks to Gerhard Niklasch)
|
||||
- 2.00: dual-licensed (added GNU GPL)
|
||||
- 2.01: fixed improper display of usage screen on PNG error(s)
|
||||
- 2.02: Added "void(argc);" statement to quiet pedantic compiler warnings
|
||||
about unused variable (GR-P)
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
@@ -82,7 +80,7 @@
|
||||
|
||||
#define PROGNAME "rpng-x"
|
||||
#define LONGNAME "Simple PNG Viewer for X"
|
||||
#define VERSION "2.02 of 15 June 2014"
|
||||
#define VERSION "2.01 of 16 March 2008"
|
||||
#define RESNAME "rpng" /* our X resource application name */
|
||||
#define RESCLASS "Rpng" /* our X resource class name */
|
||||
|
||||
@@ -281,17 +279,15 @@ int main(int argc, char **argv)
|
||||
"Usage: %s [-display xdpy] [-gamma exp] [-bgcolor bg] file.png\n"
|
||||
" xdpy\tname of the target X display (e.g., ``hostname:0'')\n"
|
||||
" exp \ttransfer-function exponent (``gamma'') of the display\n"
|
||||
"\t\t system in floating-point format (e.g., ``%.1f''); equal\n",
|
||||
PROGNAME, default_display_exponent);
|
||||
|
||||
fprintf(stderr, "\n"
|
||||
"\t\t system in floating-point format (e.g., ``%.1f''); equal\n"
|
||||
"\t\t to the product of the lookup-table exponent (varies)\n"
|
||||
"\t\t and the CRT exponent (usually 2.2); must be positive\n"
|
||||
" bg \tdesired background color in 7-character hex RGB format\n"
|
||||
"\t\t (e.g., ``#ff7700'' for orange: same as HTML colors);\n"
|
||||
"\t\t used with transparent images\n"
|
||||
"\nPress Q, Esc or mouse button 1 (within image window, after image\n"
|
||||
"is displayed) to quit.\n");
|
||||
"is displayed) to quit.\n"
|
||||
"\n", PROGNAME, default_display_exponent);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
@@ -423,8 +419,6 @@ int main(int argc, char **argv)
|
||||
|
||||
rpng_x_cleanup();
|
||||
|
||||
(void)argc; /* Unused */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -33,8 +33,6 @@
|
||||
- 2.02: fixed improper display of usage screen on PNG error(s); fixed
|
||||
unexpected-EOF and file-read-error cases
|
||||
- 2.03: removed runtime MMX-enabling/disabling and obsolete -mmx* options
|
||||
- 2.04:
|
||||
(GR-P)
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -90,7 +90,7 @@ int writepng_init(mainprog_info *mainprog_ptr)
|
||||
|
||||
/* could also replace libpng warning-handler (final NULL), but no need: */
|
||||
|
||||
png_ptr = png_create_write_struct(png_get_libpng_ver(NULL), mainprog_ptr,
|
||||
png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, mainprog_ptr,
|
||||
writepng_error_handler, NULL);
|
||||
if (!png_ptr)
|
||||
return 4; /* out of memory */
|
||||
|
||||
@@ -1,114 +0,0 @@
|
||||
Enabling SSE support
|
||||
|
||||
Copyright (c) 2016 Google, Inc.
|
||||
Written by Mike Klein and Matt Sarett
|
||||
|
||||
If you have moved intel_init.c and filter_sse2_intrinsics.c to a different
|
||||
directory, be sure to update the '#include "../../pngpriv.h"' line in both
|
||||
files if necessary to point to the correct relative location of pngpriv.h
|
||||
with respect to the new location of those files.
|
||||
|
||||
To enable SSE support in libpng, follow the instructions in I, II, or III,
|
||||
below:
|
||||
|
||||
I. Using patched "configure" scripts:
|
||||
|
||||
First, apply intel_sse.patch in your build directory.
|
||||
|
||||
patch -i contrib/intel/intel_sse.patch -p1
|
||||
|
||||
Then, if you are not building in a new GIT clone, e.g., in a tar
|
||||
distribution, remove any existing pre-built configure scripts:
|
||||
|
||||
./configure --enable-maintainer-mode
|
||||
make maintainer-clean
|
||||
./autogen.sh --maintainer --clean
|
||||
|
||||
Finally, configure libpng with -DPNG_INTEL_SSE in CPPFLAGS. If you only
|
||||
want to optimize reading 4bpp images, also use -DPNG_NO_INTEL_SSE_3BPP:
|
||||
|
||||
./autogen.sh --maintainer
|
||||
CPPFLAGS="-DPNG_INTEL_SSE -DPNG_NO_INTEL_SSE_3BPP" ./configure [options]
|
||||
make
|
||||
|
||||
II. Using a custom makefile:
|
||||
|
||||
If you are using a custom makefile makefile, you will have to update it
|
||||
manually to include contrib/intel/*.o in the dependencies, and to define
|
||||
PNG_INTEL_SSE and possibly PNG_NO_INTEL_SSE_3BPP.
|
||||
|
||||
III. Using manually updated "configure" scripts:
|
||||
|
||||
If you prefer, manually edit configure.ac and Makefile.am, following the
|
||||
instructions below, then follow the instructions in section II of INSTALL
|
||||
in the main libpng directory, then configure libpng with -DPNG_INTEL_SSE
|
||||
in CPPFLAGS. If you only want to optimize reading 4bpp images, also use
|
||||
-DPNG_NO_INTEL_SSE_3BPP.
|
||||
|
||||
1. Insert the following lines above the copyright line near the top of
|
||||
configure.ac:
|
||||
|
||||
-----------------cut----------------
|
||||
# Copyright (c) 2016 Google, Inc.
|
||||
# Written by Mike Klein and Matt Sarett
|
||||
# Derived from the ARM supporting code in libpng/configure.ac, which was
|
||||
-----------------cut----------------
|
||||
|
||||
2. Add the following code to configure.ac under HOST SPECIFIC OPTIONS
|
||||
directly beneath the section for ARM:
|
||||
|
||||
-----------------cut----------------
|
||||
# INTEL
|
||||
# =====
|
||||
#
|
||||
# INTEL SSE (SIMD) support.
|
||||
|
||||
AC_ARG_ENABLE([intel-sse],
|
||||
AS_HELP_STRING([[[--enable-intel-sse]]],
|
||||
[Enable Intel SSE optimizations: =no/off, yes/on:]
|
||||
[no/off: disable the optimizations;]
|
||||
[yes/on: enable the optimizations.]
|
||||
[If not specified: determined by the compiler.]),
|
||||
[case "$enableval" in
|
||||
no|off)
|
||||
# disable the default enabling:
|
||||
AC_DEFINE([PNG_INTEL_SSE_OPT], [0],
|
||||
[Disable Intel SSE optimizations])
|
||||
# Prevent inclusion of the assembler files below:
|
||||
enable_intel_sse=no;;
|
||||
yes|on)
|
||||
AC_DEFINE([PNG_INTEL_SSE_OPT], [1],
|
||||
[Enable Intel SSE optimizations]);;
|
||||
*)
|
||||
AC_MSG_ERROR([--enable-intel-sse=${enable_intel_sse}: invalid value])
|
||||
esac])
|
||||
|
||||
# Add Intel specific files to all builds where the host_cpu is Intel ('x86*')
|
||||
# or where Intel optimizations were explicitly requested (this allows a
|
||||
# fallback if a future host CPU does not match 'x86*')
|
||||
AM_CONDITIONAL([PNG_INTEL_SSE],
|
||||
[test "$enable_intel_sse" != 'no' &&
|
||||
case "$host_cpu" in
|
||||
i?86|x86_64) :;;
|
||||
*) test "$enable_intel_sse" != '';;
|
||||
esac])
|
||||
-----------------cut----------------
|
||||
|
||||
3. Insert the following lines above the copyright line near the top of
|
||||
Makefile.am:
|
||||
|
||||
-----------------cut----------------
|
||||
# Copyright (c) 2016 Google, Inc.
|
||||
# Written by Mike Klein and Matt Sarett
|
||||
# Derived from the ARM supporting code in libpng/configure.ac, which was
|
||||
-----------------cut----------------
|
||||
|
||||
4. Add the following code to Makefile.am under HOST SPECIFIC OPTIONS
|
||||
directly beneath the "if PNG_ARM_NEON ... endif" statement:
|
||||
|
||||
-----------------cut----------------
|
||||
if PNG_INTEL_SSE
|
||||
libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_SOURCES += contrib/intel/intel_init.c\
|
||||
contrib/intel/filter_sse2_intrinsics.c
|
||||
endif
|
||||
-----------------cut----------------
|
||||
@@ -1,316 +0,0 @@
|
||||
|
||||
/* filter_sse2_intrinsics.c - SSE2 optimized filter functions
|
||||
*
|
||||
* Copyright (c) 2016 Google, Inc.
|
||||
* Written by Mike Klein and Matt Sarett
|
||||
* Derived from arm/filter_neon_intrinsics.c, which was
|
||||
* Copyright (c) 2014,2016 Glenn Randers-Pehrson
|
||||
*
|
||||
* Last changed in libpng 1.6.22 [(PENDING RELEASE)]
|
||||
*
|
||||
* This code is released under the libpng license.
|
||||
* For conditions of distribution and use, see the disclaimer
|
||||
* and license in png.h
|
||||
*/
|
||||
|
||||
#include "../../pngpriv.h"
|
||||
|
||||
#ifdef PNG_READ_SUPPORTED
|
||||
|
||||
#if PNG_INTEL_SSE_IMPLEMENTATION > 0
|
||||
|
||||
#include <immintrin.h>
|
||||
|
||||
/* Functions in this file look at most 3 pixels (a,b,c) to predict the 4th (d).
|
||||
* They're positioned like this:
|
||||
* prev: c b
|
||||
* row: a d
|
||||
* The Sub filter predicts d=a, Avg d=(a+b)/2, and Paeth predicts d to be
|
||||
* whichever of a, b, or c is closest to p=a+b-c.
|
||||
*/
|
||||
|
||||
#ifndef PNG_NO_INTEL_SSE_3BPP
|
||||
static __m128i load3(const void* p) {
|
||||
png_uint_32 packed;
|
||||
memcpy(&packed, p, 3);
|
||||
return _mm_cvtsi32_si128(packed);
|
||||
}
|
||||
#endif
|
||||
|
||||
static __m128i load4(const void* p) {
|
||||
return _mm_cvtsi32_si128(*(const int*)p);
|
||||
}
|
||||
|
||||
#ifndef PNG_NO_INTEL_SSE_3BPP
|
||||
static void store3(void* p, __m128i v) {
|
||||
png_uint_32 packed = _mm_cvtsi128_si32(v);
|
||||
memcpy(p, &packed, 3);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void store4(void* p, __m128i v) {
|
||||
*(int*)p = _mm_cvtsi128_si32(v);
|
||||
}
|
||||
|
||||
#ifndef PNG_NO_INTEL_SSE_3BPP
|
||||
void png_read_filter_row_sub3_sse2(png_row_infop row_info, png_bytep row,
|
||||
png_const_bytep prev)
|
||||
{
|
||||
/* The Sub filter predicts each pixel as the previous pixel, a.
|
||||
* There is no pixel to the left of the first pixel. It's encoded directly.
|
||||
* That works with our main loop if we just say that left pixel was zero.
|
||||
*/
|
||||
png_debug(1, "in png_read_filter_row_sub3_sse2");
|
||||
__m128i a, d = _mm_setzero_si128();
|
||||
|
||||
int rb = row_info->rowbytes;
|
||||
while (rb > 0) {
|
||||
a = d; d = load3(row);
|
||||
d = _mm_add_epi8(d, a);
|
||||
store3(row, d);
|
||||
|
||||
row += 3;
|
||||
rb -= 3;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void png_read_filter_row_sub4_sse2(png_row_infop row_info, png_bytep row,
|
||||
png_const_bytep prev)
|
||||
{
|
||||
/* The Sub filter predicts each pixel as the previous pixel, a.
|
||||
* There is no pixel to the left of the first pixel. It's encoded directly.
|
||||
* That works with our main loop if we just say that left pixel was zero.
|
||||
*/
|
||||
png_debug(1, "in png_read_filter_row_sub4_sse2");
|
||||
__m128i a, d = _mm_setzero_si128();
|
||||
|
||||
int rb = row_info->rowbytes;
|
||||
while (rb > 0) {
|
||||
a = d; d = load4(row);
|
||||
d = _mm_add_epi8(d, a);
|
||||
store4(row, d);
|
||||
|
||||
row += 4;
|
||||
rb -= 4;
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef PNG_NO_INTEL_SSE_3BPP
|
||||
void png_read_filter_row_avg3_sse2(png_row_infop row_info, png_bytep row,
|
||||
png_const_bytep prev)
|
||||
{
|
||||
/* The Avg filter predicts each pixel as the (truncated) average of a and b.
|
||||
* There's no pixel to the left of the first pixel. Luckily, it's
|
||||
* predicted to be half of the pixel above it. So again, this works
|
||||
* perfectly with our loop if we make sure a starts at zero.
|
||||
*/
|
||||
png_debug(1, "in png_read_filter_row_avg3_sse2");
|
||||
const __m128i zero = _mm_setzero_si128();
|
||||
__m128i b;
|
||||
__m128i a, d = zero;
|
||||
|
||||
int rb = row_info->rowbytes;
|
||||
while (rb > 0) {
|
||||
b = load3(prev);
|
||||
a = d; d = load3(row );
|
||||
|
||||
/* PNG requires a truncating average, so we can't just use _mm_avg_epu8 */
|
||||
__m128i avg = _mm_avg_epu8(a,b);
|
||||
/* ...but we can fix it up by subtracting off 1 if it rounded up. */
|
||||
avg = _mm_sub_epi8(avg, _mm_and_si128(_mm_xor_si128(a,b),
|
||||
_mm_set1_epi8(1)));
|
||||
|
||||
d = _mm_add_epi8(d, avg);
|
||||
store3(row, d);
|
||||
|
||||
prev += 3;
|
||||
row += 3;
|
||||
rb -= 3;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void png_read_filter_row_avg4_sse2(png_row_infop row_info, png_bytep row,
|
||||
png_const_bytep prev)
|
||||
{
|
||||
/* The Avg filter predicts each pixel as the (truncated) average of a and b.
|
||||
* There's no pixel to the left of the first pixel. Luckily, it's
|
||||
* predicted to be half of the pixel above it. So again, this works
|
||||
* perfectly with our loop if we make sure a starts at zero.
|
||||
*/
|
||||
png_debug(1, "in png_read_filter_row_avg4_sse2");
|
||||
const __m128i zero = _mm_setzero_si128();
|
||||
__m128i b;
|
||||
__m128i a, d = zero;
|
||||
|
||||
int rb = row_info->rowbytes;
|
||||
while (rb > 0) {
|
||||
b = load4(prev);
|
||||
a = d; d = load4(row );
|
||||
|
||||
/* PNG requires a truncating average, so we can't just use _mm_avg_epu8 */
|
||||
__m128i avg = _mm_avg_epu8(a,b);
|
||||
/* ...but we can fix it up by subtracting off 1 if it rounded up. */
|
||||
avg = _mm_sub_epi8(avg, _mm_and_si128(_mm_xor_si128(a,b),
|
||||
_mm_set1_epi8(1)));
|
||||
|
||||
d = _mm_add_epi8(d, avg);
|
||||
store4(row, d);
|
||||
|
||||
prev += 4;
|
||||
row += 4;
|
||||
rb -= 4;
|
||||
}
|
||||
}
|
||||
|
||||
/* Returns |x| for 16-bit lanes. */
|
||||
static __m128i abs_i16(__m128i x) {
|
||||
#if PNG_INTEL_SSE_IMPLEMENTATION >= 2
|
||||
return _mm_abs_epi16(x);
|
||||
#else
|
||||
/* Read this all as, return x<0 ? -x : x.
|
||||
* To negate two's complement, you flip all the bits then add 1.
|
||||
*/
|
||||
__m128i is_negative = _mm_cmplt_epi16(x, _mm_setzero_si128());
|
||||
|
||||
/* Flip negative lanes. */
|
||||
x = _mm_xor_si128(x, is_negative);
|
||||
|
||||
/* +1 to negative lanes, else +0. */
|
||||
x = _mm_add_epi16(x, _mm_srli_epi16(is_negative, 15));
|
||||
return x;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Bytewise c ? t : e. */
|
||||
static __m128i if_then_else(__m128i c, __m128i t, __m128i e) {
|
||||
#if PNG_INTEL_SSE_IMPLEMENTATION >= 3
|
||||
return _mm_blendv_epi8(e,t,c);
|
||||
#else
|
||||
return _mm_or_si128(_mm_and_si128(c, t), _mm_andnot_si128(c, e));
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifndef PNG_NO_INTEL_SSE_3BPP
|
||||
void png_read_filter_row_paeth3_sse2(png_row_infop row_info, png_bytep row,
|
||||
png_const_bytep prev)
|
||||
{
|
||||
/* Paeth tries to predict pixel d using the pixel to the left of it, a,
|
||||
* and two pixels from the previous row, b and c:
|
||||
* prev: c b
|
||||
* row: a d
|
||||
* The Paeth function predicts d to be whichever of a, b, or c is nearest to
|
||||
* p=a+b-c.
|
||||
*
|
||||
* The first pixel has no left context, and so uses an Up filter, p = b.
|
||||
* This works naturally with our main loop's p = a+b-c if we force a and c
|
||||
* to zero.
|
||||
* Here we zero b and d, which become c and a respectively at the start of
|
||||
* the loop.
|
||||
*/
|
||||
png_debug(1, "in png_read_filter_row_paeth3_sse2");
|
||||
const __m128i zero = _mm_setzero_si128();
|
||||
__m128i c, b = zero,
|
||||
a, d = zero;
|
||||
|
||||
int rb = row_info->rowbytes;
|
||||
while (rb > 0) {
|
||||
/* It's easiest to do this math (particularly, deal with pc) with 16-bit
|
||||
* intermediates.
|
||||
*/
|
||||
c = b; b = _mm_unpacklo_epi8(load3(prev), zero);
|
||||
a = d; d = _mm_unpacklo_epi8(load3(row ), zero);
|
||||
|
||||
/* (p-a) == (a+b-c - a) == (b-c) */
|
||||
__m128i pa = _mm_sub_epi16(b,c);
|
||||
|
||||
/* (p-b) == (a+b-c - b) == (a-c) */
|
||||
__m128i pb = _mm_sub_epi16(a,c);
|
||||
|
||||
/* (p-c) == (a+b-c - c) == (a+b-c-c) == (b-c)+(a-c) */
|
||||
__m128i pc = _mm_add_epi16(pa,pb);
|
||||
|
||||
pa = abs_i16(pa); /* |p-a| */
|
||||
pb = abs_i16(pb); /* |p-b| */
|
||||
pc = abs_i16(pc); /* |p-c| */
|
||||
|
||||
__m128i smallest = _mm_min_epi16(pc, _mm_min_epi16(pa, pb));
|
||||
|
||||
/* Paeth breaks ties favoring a over b over c. */
|
||||
__m128i nearest = if_then_else(_mm_cmpeq_epi16(smallest, pa), a,
|
||||
if_then_else(_mm_cmpeq_epi16(smallest, pb), b,
|
||||
c));
|
||||
|
||||
/* Note `_epi8`: we need addition to wrap modulo 255. */
|
||||
d = _mm_add_epi8(d, nearest);
|
||||
store3(row, _mm_packus_epi16(d,d));
|
||||
|
||||
prev += 3;
|
||||
row += 3;
|
||||
rb -= 3;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void png_read_filter_row_paeth4_sse2(png_row_infop row_info, png_bytep row,
|
||||
png_const_bytep prev)
|
||||
{
|
||||
/* Paeth tries to predict pixel d using the pixel to the left of it, a,
|
||||
* and two pixels from the previous row, b and c:
|
||||
* prev: c b
|
||||
* row: a d
|
||||
* The Paeth function predicts d to be whichever of a, b, or c is nearest to
|
||||
* p=a+b-c.
|
||||
*
|
||||
* The first pixel has no left context, and so uses an Up filter, p = b.
|
||||
* This works naturally with our main loop's p = a+b-c if we force a and c
|
||||
* to zero.
|
||||
* Here we zero b and d, which become c and a respectively at the start of
|
||||
* the loop.
|
||||
*/
|
||||
png_debug(1, "in png_read_filter_row_paeth4_sse2");
|
||||
const __m128i zero = _mm_setzero_si128();
|
||||
__m128i c, b = zero,
|
||||
a, d = zero;
|
||||
|
||||
int rb = row_info->rowbytes;
|
||||
while (rb > 0) {
|
||||
/* It's easiest to do this math (particularly, deal with pc) with 16-bit
|
||||
* intermediates.
|
||||
*/
|
||||
c = b; b = _mm_unpacklo_epi8(load4(prev), zero);
|
||||
a = d; d = _mm_unpacklo_epi8(load4(row ), zero);
|
||||
|
||||
/* (p-a) == (a+b-c - a) == (b-c) */
|
||||
__m128i pa = _mm_sub_epi16(b,c);
|
||||
|
||||
/* (p-b) == (a+b-c - b) == (a-c) */
|
||||
__m128i pb = _mm_sub_epi16(a,c);
|
||||
|
||||
/* (p-c) == (a+b-c - c) == (a+b-c-c) == (b-c)+(a-c) */
|
||||
__m128i pc = _mm_add_epi16(pa,pb);
|
||||
|
||||
pa = abs_i16(pa); /* |p-a| */
|
||||
pb = abs_i16(pb); /* |p-b| */
|
||||
pc = abs_i16(pc); /* |p-c| */
|
||||
|
||||
__m128i smallest = _mm_min_epi16(pc, _mm_min_epi16(pa, pb));
|
||||
|
||||
/* Paeth breaks ties favoring a over b over c. */
|
||||
__m128i nearest = if_then_else(_mm_cmpeq_epi16(smallest, pa), a,
|
||||
if_then_else(_mm_cmpeq_epi16(smallest, pb), b,
|
||||
c));
|
||||
|
||||
/* Note `_epi8`: we need addition to wrap modulo 255. */
|
||||
d = _mm_add_epi8(d, nearest);
|
||||
store4(row, _mm_packus_epi16(d,d));
|
||||
|
||||
prev += 4;
|
||||
row += 4;
|
||||
rb -= 4;
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* PNG_INTEL_SSE_IMPLEMENTATION > 0 */
|
||||
#endif /* READ */
|
||||
@@ -1,56 +0,0 @@
|
||||
|
||||
/* intel_init.c - SSE2 optimized filter functions
|
||||
*
|
||||
* Copyright (c) 2016 Google, Inc.
|
||||
* Written by Mike Klein and Matt Sarett
|
||||
* Derived from arm/arm_init.c, which was
|
||||
* Copyright (c) 2014,2016 Glenn Randers-Pehrson
|
||||
*
|
||||
* Last changed in libpng 1.6.22 [(PENDING RELEASE)]
|
||||
*
|
||||
* This code is released under the libpng license.
|
||||
* For conditions of distribution and use, see the disclaimer
|
||||
* and license in png.h
|
||||
*/
|
||||
|
||||
#include "../../pngpriv.h"
|
||||
|
||||
#ifdef PNG_READ_SUPPORTED
|
||||
#if PNG_INTEL_SSE_IMPLEMENTATION > 0
|
||||
|
||||
void
|
||||
png_init_filter_functions_sse2(png_structp pp, unsigned int bpp)
|
||||
{
|
||||
/* The techniques used to implement each of these filters in SSE operate on
|
||||
* one pixel at a time.
|
||||
* So they generally speed up 3bpp images about 3x, 4bpp images about 4x.
|
||||
* They can scale up to 6 and 8 bpp images and down to 2 bpp images,
|
||||
* but they'd not likely have any benefit for 1bpp images.
|
||||
* Most of these can be implemented using only MMX and 64-bit registers,
|
||||
* but they end up a bit slower than using the equally-ubiquitous SSE2.
|
||||
*/
|
||||
png_debug(1, "in png_init_filter_functions_sse2");
|
||||
if (bpp == 3)
|
||||
{
|
||||
#ifndef PNG_NO_INTEL_SSE_3BPP
|
||||
pp->read_filter[PNG_FILTER_VALUE_SUB-1] = png_read_filter_row_sub3_sse2;
|
||||
pp->read_filter[PNG_FILTER_VALUE_AVG-1] = png_read_filter_row_avg3_sse2;
|
||||
pp->read_filter[PNG_FILTER_VALUE_PAETH-1] =
|
||||
png_read_filter_row_paeth3_sse2;
|
||||
#endif
|
||||
}
|
||||
else if (bpp == 4)
|
||||
{
|
||||
pp->read_filter[PNG_FILTER_VALUE_SUB-1] = png_read_filter_row_sub4_sse2;
|
||||
pp->read_filter[PNG_FILTER_VALUE_AVG-1] = png_read_filter_row_avg4_sse2;
|
||||
pp->read_filter[PNG_FILTER_VALUE_PAETH-1] =
|
||||
png_read_filter_row_paeth4_sse2;
|
||||
}
|
||||
|
||||
/* No need optimize PNG_FILTER_VALUE_UP. The compiler should
|
||||
* autovectorize.
|
||||
*/
|
||||
}
|
||||
|
||||
#endif /* PNG_INTEL_SSE_IMPLEMENTATION > 0 */
|
||||
#endif /* PNG_READ_SUPPORTED */
|
||||
@@ -1,106 +0,0 @@
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
--- a/configure.ac 2016-02-22 17:24:25.000000000 -0600
|
||||
+++ b/configure.ac 2016-02-22 17:30:36.949159871 -0600
|
||||
@@ -1,10 +1,13 @@
|
||||
# configure.ac
|
||||
|
||||
+# Copyright (c) 2016 Google, Inc.
|
||||
+# Written by Mike Klein and Matt Sarett
|
||||
+# Derived from the ARM supporting code in libpng/configure.ac, which was
|
||||
# Copyright (c) 2004-2015 Glenn Randers-Pehrson
|
||||
# Last changed in libpng 1.6.22 [(PENDING RELEASE)]
|
||||
|
||||
# This code is released under the libpng license.
|
||||
# For conditions of distribution and use, see the disclaimer
|
||||
# and license in png.h
|
||||
|
||||
dnl Process this file with autoconf to produce a configure script.
|
||||
@@ -316,16 +319,50 @@ AC_ARG_ENABLE([arm-neon],
|
||||
|
||||
AM_CONDITIONAL([PNG_ARM_NEON],
|
||||
[test "$enable_arm_neon" != 'no' &&
|
||||
case "$host_cpu" in
|
||||
arm*|aarch64*) :;;
|
||||
*) test "$enable_arm_neon" != '';;
|
||||
esac])
|
||||
|
||||
+# INTEL
|
||||
+# =====
|
||||
+#
|
||||
+# INTEL SSE (SIMD) support.
|
||||
+
|
||||
+AC_ARG_ENABLE([intel-sse],
|
||||
+ AS_HELP_STRING([[[--enable-intel-sse]]],
|
||||
+ [Enable Intel SSE optimizations: =no/off, yes/on:]
|
||||
+ [no/off: disable the optimizations;]
|
||||
+ [yes/on: enable the optimizations.]
|
||||
+ [If not specified: determined by the compiler.]),
|
||||
+ [case "$enableval" in
|
||||
+ no|off)
|
||||
+ # disable the default enabling:
|
||||
+ AC_DEFINE([PNG_INTEL_SSE_OPT], [0],
|
||||
+ [Disable Intel SSE optimizations])
|
||||
+ # Prevent inclusion of the assembler files below:
|
||||
+ enable_intel_sse=no;;
|
||||
+ yes|on)
|
||||
+ AC_DEFINE([PNG_INTEL_SSE_OPT], [1],
|
||||
+ [Enable Intel SSE optimizations]);;
|
||||
+ *)
|
||||
+ AC_MSG_ERROR([--enable-intel-sse=${enable_intel_sse}: invalid value])
|
||||
+ esac])
|
||||
+
|
||||
+# Add Intel specific files to all builds where the host_cpu is Intel ('x86*')
|
||||
+# or where Intel optimizations were explicitly requested (this allows a
|
||||
+# fallback if a future host CPU does not match 'x86*')
|
||||
+AM_CONDITIONAL([PNG_INTEL_SSE],
|
||||
+ [test "$enable_intel_sse" != 'no' &&
|
||||
+ case "$host_cpu" in
|
||||
+ i?86|x86_64) :;;
|
||||
+ *) test "$enable_intel_sse" != '';;
|
||||
+ esac])
|
||||
AC_MSG_NOTICE([[Extra options for compiler: $PNG_COPTS]])
|
||||
|
||||
# Config files, substituting as above
|
||||
AC_CONFIG_FILES([Makefile libpng.pc:libpng.pc.in])
|
||||
AC_CONFIG_FILES([libpng-config:libpng-config.in],
|
||||
[chmod +x libpng-config])
|
||||
|
||||
AC_OUTPUT
|
||||
diff --git a/Makefile.am b/Makefile.am
|
||||
--- a/Makefile.am 2016-02-22 17:24:24.000000000 -0600
|
||||
+++ b/Makefile.am 2016-02-22 17:32:18.387223996 -0600
|
||||
@@ -1,10 +1,13 @@
|
||||
# Makefile.am, the source file for Makefile.in (and hence Makefile), is
|
||||
#
|
||||
+# Copyright (c) 2016 Google, Inc.
|
||||
+# Written by Mike Klein and Matt Sarett
|
||||
+# Derived from the ARM supporting code in libpng/configure.ac, which was
|
||||
# Copyright (c) 2004-2016 Glenn Randers-Pehrson
|
||||
# Last changed in libpng 1.6.22 [(PENDING RELEASE)]
|
||||
#
|
||||
# This code is released under the libpng license.
|
||||
# For conditions of distribution and use, see the disclaimer
|
||||
# and license in png.h
|
||||
|
||||
PNGLIB_BASENAME= libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@
|
||||
@@ -83,16 +86,20 @@ libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_SO
|
||||
pngset.c pngtrans.c pngwio.c pngwrite.c pngwtran.c pngwutil.c\
|
||||
png.h pngconf.h pngdebug.h pnginfo.h pngpriv.h pngstruct.h pngusr.dfa
|
||||
|
||||
if PNG_ARM_NEON
|
||||
libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_SOURCES += arm/arm_init.c\
|
||||
arm/filter_neon.S arm/filter_neon_intrinsics.c
|
||||
endif
|
||||
|
||||
+if PNG_INTEL_SSE
|
||||
+libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_SOURCES += contrib/intel/intel_init.c\
|
||||
+ contrib/intel/filter_sse2_intrinsics.c
|
||||
+endif
|
||||
nodist_libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_SOURCES = pnglibconf.h
|
||||
|
||||
libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_LDFLAGS = -no-undefined -export-dynamic \
|
||||
-version-number @PNGLIB_MAJOR@@PNGLIB_MINOR@:@PNGLIB_RELEASE@:0
|
||||
|
||||
if HAVE_LD_VERSION_SCRIPT
|
||||
# Versioned symbols and restricted exports
|
||||
if HAVE_SOLARIS_LD
|
||||
@@ -1,6 +1,6 @@
|
||||
/* contrib/libtests/pngstest-errors.h
|
||||
*
|
||||
* BUILT USING: libpng version 1.6.19beta03 - September 25, 2015
|
||||
* BUILT USING: libpng version 1.7.0beta66 - September 18, 2015
|
||||
*
|
||||
* This code is released under the libpng license.
|
||||
* For conditions of distribution and use, see the disclaimer
|
||||
@@ -22,7 +22,7 @@ static png_uint_16 gpc_error[16/*in*/][16/*out*/][4/*a*/] =
|
||||
{ 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }
|
||||
}, { /* input: sRGB-gray+alpha */
|
||||
{ 0, 19, 0, 0 }, { 0, 0, 0, 0 }, { 0, 20, 0, 0 }, { 0, 0, 0, 0 },
|
||||
{ 0, 19, 1, 0 }, { 0, 0, 0, 0 }, { 0, 20, 1, 0 }, { 0, 0, 0, 0 },
|
||||
{ 0, 897, 788, 0 }, { 0, 897, 788, 0 }, { 0, 897, 788, 0 }, { 0, 897, 788, 0 },
|
||||
{ 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }
|
||||
@@ -32,8 +32,8 @@ static png_uint_16 gpc_error[16/*in*/][16/*out*/][4/*a*/] =
|
||||
{ 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }
|
||||
}, { /* input: sRGB-rgb+alpha */
|
||||
{ 0, 16, 17, 0 }, { 0, 17, 17, 0 }, { 0, 19, 0, 0 }, { 0, 0, 0, 0 },
|
||||
{ 0, 850, 875, 0 }, { 0, 850, 875, 0 }, { 0, 897, 788, 0 }, { 0, 897, 788, 0 },
|
||||
{ 0, 14, 13, 0 }, { 0, 15, 13, 0 }, { 0, 19, 1, 0 }, { 0, 0, 0, 0 },
|
||||
{ 0, 832, 764, 0 }, { 0, 832, 764, 0 }, { 0, 897, 788, 0 }, { 0, 897, 788, 0 },
|
||||
{ 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }
|
||||
}, { /* input: linear-gray */
|
||||
@@ -67,13 +67,13 @@ static png_uint_16 gpc_error[16/*in*/][16/*out*/][4/*a*/] =
|
||||
{ 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }
|
||||
}, { /* input: color-mapped-sRGB-rgb */
|
||||
{ 0, 0, 13, 0 }, { 0, 0, 13, 0 }, { 0, 0, 9, 0 }, { 0, 0, 9, 0 },
|
||||
{ 0, 0, 13, 0 }, { 0, 0, 13, 0 }, { 0, 0, 8, 0 }, { 0, 0, 8, 0 },
|
||||
{ 0, 0, 673, 0 }, { 0, 0, 673, 0 }, { 0, 0, 674, 0 }, { 0, 0, 674, 0 },
|
||||
{ 0, 0, 1, 0 }, { 0, 0, 1, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 },
|
||||
{ 0, 0, 460, 0 }, { 0, 0, 460, 0 }, { 0, 0, 263, 0 }, { 0, 0, 263, 0 }
|
||||
}, { /* input: color-mapped-sRGB-rgb+alpha */
|
||||
{ 0, 6, 8, 0 }, { 0, 7, 8, 0 }, { 0, 75, 9, 0 }, { 0, 9, 9, 0 },
|
||||
{ 0, 585, 427, 0 }, { 0, 585, 427, 0 }, { 0, 717, 514, 0 }, { 0, 717, 514, 0 },
|
||||
{ 0, 6, 8, 0 }, { 0, 7, 8, 0 }, { 0, 75, 8, 0 }, { 0, 9, 8, 0 },
|
||||
{ 0, 585, 427, 0 }, { 0, 585, 427, 0 }, { 0, 717, 584, 0 }, { 0, 717, 584, 0 },
|
||||
{ 0, 1, 1, 0 }, { 0, 1, 1, 0 }, { 0, 1, 0, 0 }, { 0, 0, 0, 0 },
|
||||
{ 0, 13323, 460, 0 }, { 0, 427, 460, 0 }, { 0, 16480, 263, 0 }, { 0, 243, 263, 0 }
|
||||
}, { /* input: color-mapped-linear-gray */
|
||||
@@ -107,7 +107,7 @@ static png_uint_16 gpc_error_via_linear[16][4/*out*/][4] =
|
||||
}, { /* input: sRGB-rgb */
|
||||
{ 0, 0, 20, 0 }, { 0, 0, 20, 0 }, { 0, 0, 15, 0 }, { 0, 0, 15, 0 }
|
||||
}, { /* input: sRGB-rgb+alpha */
|
||||
{ 0, 16, 17, 0 }, { 0, 187, 17, 0 }, { 0, 15, 15, 0 }, { 0, 186, 15, 0 }
|
||||
{ 0, 12, 14, 0 }, { 0, 180, 14, 0 }, { 0, 15, 15, 0 }, { 0, 186, 15, 0 }
|
||||
}, { /* input: linear-gray */
|
||||
{ 0, 0, 1, 0 }, { 0, 0, 1, 0 }, { 0, 0, 1, 0 }, { 0, 0, 1, 0 }
|
||||
}, { /* input: linear-gray+alpha */
|
||||
@@ -123,7 +123,7 @@ static png_uint_16 gpc_error_via_linear[16][4/*out*/][4] =
|
||||
}, { /* input: color-mapped-sRGB-rgb */
|
||||
{ 0, 0, 13, 0 }, { 0, 0, 13, 0 }, { 0, 0, 14, 0 }, { 0, 0, 14, 0 }
|
||||
}, { /* input: color-mapped-sRGB-rgb+alpha */
|
||||
{ 0, 4, 8, 0 }, { 0, 9, 8, 0 }, { 0, 9, 5, 0 }, { 0, 32, 5, 0 }
|
||||
{ 0, 4, 8, 0 }, { 0, 9, 8, 0 }, { 0, 9, 9, 0 }, { 0, 32, 9, 0 }
|
||||
}, { /* input: color-mapped-linear-gray */
|
||||
{ 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }
|
||||
}, { /* input: color-mapped-linear-gray+alpha */
|
||||
@@ -138,27 +138,27 @@ static png_uint_16 gpc_error_to_colormap[8/*i*/][8/*o*/][4] =
|
||||
{
|
||||
{ /* input: sRGB-gray */
|
||||
{ 0, 0, 9, 0 }, { 0, 0, 9, 0 }, { 0, 0, 9, 0 }, { 0, 0, 9, 0 },
|
||||
{ 0, 0, 560, 0 }, { 0, 0, 560, 0 }, { 0, 0, 560, 0 }, { 0, 0, 560, 0 }
|
||||
{ 0, 0, 742, 0 }, { 0, 0, 742, 0 }, { 0, 0, 742, 0 }, { 0, 0, 742, 0 }
|
||||
}, { /* input: sRGB-gray+alpha */
|
||||
{ 0, 19, 9, 0 }, { 0, 255, 9, 25 }, { 0, 88, 9, 0 }, { 0, 255, 9, 25 },
|
||||
{ 0, 1012, 928, 0 }, { 0, 16026, 928, 6425 }, { 0, 1012, 928, 0 }, { 0, 16026, 928, 6425 }
|
||||
{ 0, 19, 6, 0 }, { 0, 255, 6, 25 }, { 0, 88, 6, 0 }, { 0, 255, 6, 25 },
|
||||
{ 0, 1012, 911, 0 }, { 0, 16026, 911, 6425 }, { 0, 1012, 911, 0 }, { 0, 16026, 911, 6425 }
|
||||
}, { /* input: sRGB-rgb */
|
||||
{ 0, 0, 19, 0 }, { 0, 0, 19, 0 }, { 0, 0, 25, 0 }, { 0, 0, 25, 0 },
|
||||
{ 0, 0, 962, 0 }, { 0, 0, 962, 0 }, { 0, 0, 13677, 0 }, { 0, 0, 13677, 0 }
|
||||
}, { /* input: sRGB-rgb+alpha */
|
||||
{ 0, 63, 77, 0 }, { 0, 255, 19, 25 }, { 0, 225, 25, 0 }, { 0, 255, 25, 67 },
|
||||
{ 0, 17534, 18491, 0 }, { 0, 15736, 2824, 6425 }, { 0, 14019, 13677, 0 }, { 0, 50115, 13677, 17219 }
|
||||
{ 0, 17534, 18491, 0 }, { 0, 15998, 2824, 6425 }, { 0, 14103, 13677, 0 }, { 0, 50115, 13677, 17219 }
|
||||
}, { /* input: linear-gray */
|
||||
{ 0, 0, 73, 0 }, { 0, 0, 73, 0 }, { 0, 0, 73, 0 }, { 0, 0, 73, 0 },
|
||||
{ 0, 0, 18817, 0 }, { 0, 0, 18817, 0 }, { 0, 0, 18817, 0 }, { 0, 0, 18817, 0 }
|
||||
}, { /* input: linear-gray+alpha */
|
||||
{ 0, 74, 74, 0 }, { 0, 255, 74, 25 }, { 0, 99, 74, 0 }, { 0, 255, 74, 25 },
|
||||
{ 0, 74, 74, 0 }, { 0, 255, 74, 25 }, { 0, 100, 74, 0 }, { 0, 255, 74, 25 },
|
||||
{ 0, 18919, 18907, 0 }, { 0, 24549, 18907, 6553 }, { 0, 18919, 18907, 0 }, { 0, 24549, 18907, 6553 }
|
||||
}, { /* input: linear-rgb */
|
||||
{ 0, 0, 73, 0 }, { 0, 0, 73, 0 }, { 0, 0, 98, 0 }, { 0, 0, 98, 0 },
|
||||
{ 0, 0, 18664, 0 }, { 0, 0, 18664, 0 }, { 0, 0, 24998, 0 }, { 0, 0, 24998, 0 }
|
||||
}, { /* input: linear-rgb+alpha */
|
||||
{ 0, 181, 196, 0 }, { 0, 255, 61, 25 }, { 206, 187, 98, 0 }, { 0, 255, 98, 67 },
|
||||
{ 0, 181, 196, 0 }, { 0, 255, 61, 25 }, { 206, 192, 98, 0 }, { 0, 255, 98, 67 },
|
||||
{ 0, 18141, 18137, 0 }, { 0, 17494, 17504, 6553 }, { 0, 24979, 24992, 0 }, { 0, 49172, 24992, 17347 }
|
||||
}
|
||||
};
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include <time.h>
|
||||
|
||||
@@ -36,6 +37,15 @@
|
||||
# include "../../png.h"
|
||||
#endif
|
||||
|
||||
/* The following is to support direct compilation of this file as C++ */
|
||||
#ifdef __cplusplus
|
||||
# define voidcast(type, value) static_cast<type>(value)
|
||||
#else
|
||||
# define voidcast(type, value) (value)
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#if ((defined(PNG_SEQUENTIAL_READ_SUPPORTED)) && defined(PNG_STDIO_SUPPORTED)\
|
||||
&& defined(PNG_EASY_ACCESS_SUPPORTED) && defined(PNG_INFO_IMAGE_SUPPORTED))
|
||||
typedef struct
|
||||
{
|
||||
FILE *input;
|
||||
@@ -80,8 +90,8 @@ static void read_by_row(png_structp png_ptr, png_infop info_ptr,
|
||||
{
|
||||
png_size_t rowbytes = png_get_rowbytes(png_ptr, info_ptr);
|
||||
|
||||
row = malloc(rowbytes);
|
||||
display = malloc(rowbytes);
|
||||
row = voidcast(png_bytep,malloc(rowbytes));
|
||||
display = voidcast(png_bytep,malloc(rowbytes));
|
||||
|
||||
if (row == NULL || display == NULL)
|
||||
png_error(png_ptr, "OOM allocating row buffers");
|
||||
@@ -137,7 +147,9 @@ static int read_png(FILE *fp, png_int_32 transforms, FILE *write_file)
|
||||
return 0;
|
||||
}
|
||||
|
||||
png_set_benign_errors(png_ptr, 1/*allowed*/);
|
||||
# ifdef PNG_BENIGN_ERRORS_SUPPORTED
|
||||
png_set_benign_errors(png_ptr, 1/*allowed*/);
|
||||
# endif
|
||||
png_init_io(png_ptr, fp);
|
||||
|
||||
info_ptr = png_create_info_struct(png_ptr);
|
||||
@@ -268,6 +280,9 @@ static int add_one_file(FILE *fp, char *name)
|
||||
ok = 1; /* read ok */
|
||||
}
|
||||
|
||||
else
|
||||
fprintf(stderr, "%s: file not added\n", name);
|
||||
|
||||
(void)fclose(ip);
|
||||
|
||||
/* An error in the output is fatal; exit immediately: */
|
||||
@@ -298,10 +313,9 @@ static int add_one_file(FILE *fp, char *name)
|
||||
/* file open error: */
|
||||
perror(name);
|
||||
fprintf(stderr, "%s: open failed\n", name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
return 0; /* file not added */
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -321,6 +335,7 @@ usage(FILE *fp)
|
||||
" --by-image: read by image with png_read_png\n"
|
||||
" --<transform>: implies by-image, use PNG_TRANSFORM_<transform>\n"
|
||||
" Otherwise: read by row using png_read_row (to a single row buffer)\n"
|
||||
/* ISO C90 string length max 509 */);fprintf(stderr,
|
||||
"{files}:\n"
|
||||
" PNG files to copy into the assembly and time. Invalid files are skipped\n"
|
||||
" with appropriate error messages. If no files are given the list of files\n"
|
||||
@@ -379,6 +394,12 @@ int main(int argc, char **argv)
|
||||
argv[3]);
|
||||
exit(99);
|
||||
}
|
||||
#ifdef __COVERITY__
|
||||
else
|
||||
{
|
||||
nfiles &= PNG_UINT_31_MAX;
|
||||
}
|
||||
#endif
|
||||
|
||||
argv += 3;
|
||||
argc -= 3;
|
||||
@@ -386,7 +407,39 @@ int main(int argc, char **argv)
|
||||
|
||||
else /* Else use a temporary file */
|
||||
{
|
||||
#ifndef __COVERITY__
|
||||
fp = tmpfile();
|
||||
#else
|
||||
/* Experimental. Coverity says tmpfile() is insecure because it
|
||||
* generates predictable names.
|
||||
*
|
||||
* It is possible to satisfy Coverity by using mkstemp(); however,
|
||||
* any platform supporting mkstemp() undoubtedly has a secure tmpfile()
|
||||
* implementation as well, and doesn't need the fix. Note that
|
||||
* the fix won't work on platforms that don't support mkstemp().
|
||||
*
|
||||
* https://www.securecoding.cert.org/confluence/display/c/
|
||||
* FIO21-C.+Do+not+create+temporary+files+in+shared+directories
|
||||
* says that most historic implementations of tmpfile() provide
|
||||
* only a limited number of possible temporary file names
|
||||
* (usually 26) before file names are recycled. That article also
|
||||
* provides a secure solution that unfortunately depends upon mkstemp().
|
||||
*/
|
||||
char tmpfile[] = "timepng-XXXXXX";
|
||||
int filedes;
|
||||
umask(0177);
|
||||
filedes = mkstemp(tmpfile);
|
||||
if (filedes < 0)
|
||||
fp = NULL;
|
||||
else
|
||||
{
|
||||
fp = fdopen(filedes,"w+");
|
||||
/* Hide the filename immediately and ensure that the file does
|
||||
* not exist after the program ends
|
||||
*/
|
||||
(void) unlink(tmpfile);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (fp == NULL)
|
||||
{
|
||||
@@ -452,7 +505,13 @@ int main(int argc, char **argv)
|
||||
|
||||
for (i=1; i<argc; ++i)
|
||||
{
|
||||
if (add_one_file(fp, argv[i]))
|
||||
if (nfiles == INT_MAX)
|
||||
{
|
||||
fprintf(stderr, "%s: skipped, too many files\n", argv[i]);
|
||||
break;
|
||||
}
|
||||
|
||||
else if (add_one_file(fp, argv[i]))
|
||||
++nfiles;
|
||||
}
|
||||
}
|
||||
@@ -468,7 +527,13 @@ int main(int argc, char **argv)
|
||||
if (filename[len-1] == '\n')
|
||||
{
|
||||
filename[len-1] = 0;
|
||||
if (add_one_file(fp, filename))
|
||||
if (nfiles == INT_MAX)
|
||||
{
|
||||
fprintf(stderr, "%s: skipped, too many files\n", filename);
|
||||
break;
|
||||
}
|
||||
|
||||
else if (add_one_file(fp, filename))
|
||||
++nfiles;
|
||||
}
|
||||
|
||||
@@ -526,3 +591,6 @@ int main(int argc, char **argv)
|
||||
/* Exit code 0 on success. */
|
||||
return ok == 0;
|
||||
}
|
||||
#else /* !sufficient support */
|
||||
int main(void) { return 77; }
|
||||
#endif /* !sufficient support */
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
|
||||
/* arm_init.c - NEON optimised filter functions
|
||||
*
|
||||
* Copyright (c) 2014,2016 Glenn Randers-Pehrson
|
||||
* Copyright (c) 2014 Glenn Randers-Pehrson
|
||||
* Written by Mans Rullgard, 2011.
|
||||
* Last changed in libpng 1.6.22 [(PENDING RELEASE)]
|
||||
* Last changed in libpng 1.6.16 [December 22, 2014]
|
||||
*
|
||||
* This code is released under the libpng license.
|
||||
* For conditions of distribution and use, see the disclaimer
|
||||
@@ -14,7 +14,8 @@
|
||||
*/
|
||||
#define _POSIX_SOURCE 1
|
||||
|
||||
#include "../pngpriv.h"
|
||||
#include "../../pngpriv.h"
|
||||
#define PNG_SRC_FILE PNG_SRC_FILE_arm_arm_init
|
||||
|
||||
#ifdef PNG_READ_SUPPORTED
|
||||
|
||||
@@ -66,7 +67,6 @@ png_init_filter_functions_neon(png_structp pp, unsigned int bpp)
|
||||
* wrong order of the 'ON' and 'default' cases. UNSET now defaults to OFF,
|
||||
* as documented in png.h
|
||||
*/
|
||||
png_debug(1, "in png_init_filter_functions_neon");
|
||||
#ifdef PNG_ARM_NEON_API_SUPPORTED
|
||||
switch ((pp->options >> PNG_ARM_NEON) & 3)
|
||||
{
|
||||
10
contrib/neon/extensions.ac
Normal file
10
contrib/neon/extensions.ac
Normal file
@@ -0,0 +1,10 @@
|
||||
# To just this extension either copy the 'sinclude' line and the setting of
|
||||
# libpng_automake_extensions into contrib/extensions.am or link/copy the whole
|
||||
# file there. Do the same with the associated file extensions.am
|
||||
#
|
||||
# Include the ARM NEON extension:
|
||||
sinclude([contrib/neon/neon.ac])
|
||||
#
|
||||
# If any of the extensions require automake support (this is likely) automake
|
||||
# must include the file contrib/extensions.am
|
||||
libpng_automake_extensions="yes"
|
||||
5
contrib/neon/extensions.am
Normal file
5
contrib/neon/extensions.am
Normal file
@@ -0,0 +1,5 @@
|
||||
# To just this extension either copy the 'include' line into
|
||||
# contrib/extensions.am or link/copy the whole file there. Do the same with the
|
||||
# associated file extensions.ac
|
||||
# Include the ARM NEON extension:
|
||||
include %reldir%/neon/neon.am
|
||||
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Copyright (c) 2014 Glenn Randers-Pehrson
|
||||
* Written by Mans Rullgard, 2011.
|
||||
* Last changed in libpng 1.6.16 [December 22, 2014]
|
||||
* Last changed in libpng 1.6.16 [(PENDING RELEASE)]
|
||||
*
|
||||
* This code is released under the libpng license.
|
||||
* For conditions of distribution and use, see the disclaimer
|
||||
@@ -14,7 +14,7 @@
|
||||
* definitions (or not) of PNG_ARM_NEON_OPT and PNG_ARM_NEON_IMPLEMENTATION.
|
||||
*/
|
||||
#define PNG_VERSION_INFO_ONLY
|
||||
#include "../pngpriv.h"
|
||||
#include "../../pngpriv.h"
|
||||
|
||||
#if defined(__linux__) && defined(__ELF__)
|
||||
.section .note.GNU-stack,"",%progbits /* mark stack as non-executable */
|
||||
@@ -1,18 +1,19 @@
|
||||
|
||||
/* filter_neon_intrinsics.c - NEON optimised filter functions
|
||||
*
|
||||
* Copyright (c) 2014,2016 Glenn Randers-Pehrson
|
||||
* Copyright (c) 2014 Glenn Randers-Pehrson
|
||||
* Written by James Yu <james.yu at linaro.org>, October 2013.
|
||||
* Based on filter_neon.S, written by Mans Rullgard, 2011.
|
||||
*
|
||||
* Last changed in libpng 1.6.22 [(PENDING RELEASE)]
|
||||
* Last changed in libpng 1.6.16 [December 22, 2014]
|
||||
*
|
||||
* This code is released under the libpng license.
|
||||
* For conditions of distribution and use, see the disclaimer
|
||||
* and license in png.h
|
||||
*/
|
||||
|
||||
#include "../pngpriv.h"
|
||||
#include "../../pngpriv.h"
|
||||
#define PNG_SRC_FILE PNG_SRC_FILE_arm_filter_neon_intrinsics
|
||||
|
||||
#ifdef PNG_READ_SUPPORTED
|
||||
|
||||
@@ -40,15 +41,13 @@
|
||||
#if PNG_ARM_NEON_OPT > 0
|
||||
|
||||
void
|
||||
png_read_filter_row_up_neon(png_row_infop row_info, png_bytep row,
|
||||
png_const_bytep prev_row)
|
||||
png_read_filter_row_up_neon(png_alloc_size_t rowbytes, unsigned int bpp,
|
||||
png_bytep row, png_const_bytep prev_row)
|
||||
{
|
||||
png_bytep rp = row;
|
||||
png_bytep rp_stop = row + row_info->rowbytes;
|
||||
png_bytep rp_stop = row + rowbytes;
|
||||
png_const_bytep pp = prev_row;
|
||||
|
||||
png_debug(1, "in png_read_filter_row_up_neon");
|
||||
|
||||
for (; rp < rp_stop; rp += 16, pp += 16)
|
||||
{
|
||||
uint8x16_t qrp, qpp;
|
||||
@@ -58,14 +57,15 @@ png_read_filter_row_up_neon(png_row_infop row_info, png_bytep row,
|
||||
qrp = vaddq_u8(qrp, qpp);
|
||||
vst1q_u8(rp, qrp);
|
||||
}
|
||||
|
||||
PNG_UNUSED(bpp)
|
||||
}
|
||||
|
||||
void
|
||||
png_read_filter_row_sub3_neon(png_row_infop row_info, png_bytep row,
|
||||
png_const_bytep prev_row)
|
||||
png_read_filter_row_sub3_neon(png_alloc_size_t rowbytes, unsigned int bpp, png_bytep row, png_const_bytep prev_row)
|
||||
{
|
||||
png_bytep rp = row;
|
||||
png_bytep rp_stop = row + row_info->rowbytes;
|
||||
png_bytep rp_stop = row + rowbytes;
|
||||
|
||||
uint8x16_t vtmp = vld1q_u8(rp);
|
||||
uint8x8x2_t *vrpt = png_ptr(uint8x8x2_t, &vtmp);
|
||||
@@ -74,8 +74,6 @@ png_read_filter_row_sub3_neon(png_row_infop row_info, png_bytep row,
|
||||
uint8x8x4_t vdest;
|
||||
vdest.val[3] = vdup_n_u8(0);
|
||||
|
||||
png_debug(1, "in png_read_filter_row_sub3_neon");
|
||||
|
||||
for (; rp < rp_stop;)
|
||||
{
|
||||
uint8x8_t vtmp1, vtmp2;
|
||||
@@ -104,21 +102,20 @@ png_read_filter_row_sub3_neon(png_row_infop row_info, png_bytep row,
|
||||
rp += 3;
|
||||
}
|
||||
|
||||
PNG_UNUSED(bpp)
|
||||
PNG_UNUSED(prev_row)
|
||||
}
|
||||
|
||||
void
|
||||
png_read_filter_row_sub4_neon(png_row_infop row_info, png_bytep row,
|
||||
png_const_bytep prev_row)
|
||||
png_read_filter_row_sub4_neon(png_alloc_size_t rowbytes, unsigned int bpp,
|
||||
png_bytep row, png_const_bytep prev_row)
|
||||
{
|
||||
png_bytep rp = row;
|
||||
png_bytep rp_stop = row + row_info->rowbytes;
|
||||
png_bytep rp_stop = row + rowbytes;
|
||||
|
||||
uint8x8x4_t vdest;
|
||||
vdest.val[3] = vdup_n_u8(0);
|
||||
|
||||
png_debug(1, "in png_read_filter_row_sub4_neon");
|
||||
|
||||
for (; rp < rp_stop; rp += 16)
|
||||
{
|
||||
uint32x2x4_t vtmp = vld4_u32(png_ptr(uint32_t,rp));
|
||||
@@ -133,16 +130,17 @@ png_read_filter_row_sub4_neon(png_row_infop row_info, png_bytep row,
|
||||
vst4_lane_u32(png_ptr(uint32_t,rp), png_ldr(uint32x2x4_t,&vdest), 0);
|
||||
}
|
||||
|
||||
PNG_UNUSED(bpp)
|
||||
PNG_UNUSED(prev_row)
|
||||
}
|
||||
|
||||
void
|
||||
png_read_filter_row_avg3_neon(png_row_infop row_info, png_bytep row,
|
||||
png_const_bytep prev_row)
|
||||
png_read_filter_row_avg3_neon(png_alloc_size_t rowbytes, unsigned int bpp,
|
||||
png_bytep row, png_const_bytep prev_row)
|
||||
{
|
||||
png_bytep rp = row;
|
||||
png_const_bytep pp = prev_row;
|
||||
png_bytep rp_stop = row + row_info->rowbytes;
|
||||
png_bytep rp_stop = row + rowbytes;
|
||||
|
||||
uint8x16_t vtmp;
|
||||
uint8x8x2_t *vrpt;
|
||||
@@ -154,8 +152,6 @@ png_read_filter_row_avg3_neon(png_row_infop row_info, png_bytep row,
|
||||
vrpt = png_ptr(uint8x8x2_t,&vtmp);
|
||||
vrp = *vrpt;
|
||||
|
||||
png_debug(1, "in png_read_filter_row_avg3_neon");
|
||||
|
||||
for (; rp < rp_stop; pp += 12)
|
||||
{
|
||||
uint8x8_t vtmp1, vtmp2, vtmp3;
|
||||
@@ -202,21 +198,21 @@ png_read_filter_row_avg3_neon(png_row_infop row_info, png_bytep row,
|
||||
vst1_lane_u32(png_ptr(uint32_t,rp), png_ldr(uint32x2_t,&vdest.val[3]), 0);
|
||||
rp += 3;
|
||||
}
|
||||
|
||||
PNG_UNUSED(bpp)
|
||||
}
|
||||
|
||||
void
|
||||
png_read_filter_row_avg4_neon(png_row_infop row_info, png_bytep row,
|
||||
png_const_bytep prev_row)
|
||||
png_read_filter_row_avg4_neon(png_alloc_size_t rowbytes, unsigned int bpp,
|
||||
png_bytep row, png_const_bytep prev_row)
|
||||
{
|
||||
png_bytep rp = row;
|
||||
png_bytep rp_stop = row + row_info->rowbytes;
|
||||
png_bytep rp_stop = row + rowbytes;
|
||||
png_const_bytep pp = prev_row;
|
||||
|
||||
uint8x8x4_t vdest;
|
||||
vdest.val[3] = vdup_n_u8(0);
|
||||
|
||||
png_debug(1, "in png_read_filter_row_avg4_neon");
|
||||
|
||||
for (; rp < rp_stop; rp += 16, pp += 16)
|
||||
{
|
||||
uint32x2x4_t vtmp;
|
||||
@@ -242,6 +238,8 @@ png_read_filter_row_avg4_neon(png_row_infop row_info, png_bytep row,
|
||||
|
||||
vst4_lane_u32(png_ptr(uint32_t,rp), png_ldr(uint32x2x4_t,&vdest), 0);
|
||||
}
|
||||
|
||||
PNG_UNUSED(bpp)
|
||||
}
|
||||
|
||||
static uint8x8_t
|
||||
@@ -272,12 +270,12 @@ paeth(uint8x8_t a, uint8x8_t b, uint8x8_t c)
|
||||
}
|
||||
|
||||
void
|
||||
png_read_filter_row_paeth3_neon(png_row_infop row_info, png_bytep row,
|
||||
png_const_bytep prev_row)
|
||||
png_read_filter_row_paeth3_neon(png_alloc_size_t rowbytes, unsigned int bpp,
|
||||
png_bytep row, png_const_bytep prev_row)
|
||||
{
|
||||
png_bytep rp = row;
|
||||
png_const_bytep pp = prev_row;
|
||||
png_bytep rp_stop = row + row_info->rowbytes;
|
||||
png_bytep rp_stop = row + rowbytes;
|
||||
|
||||
uint8x16_t vtmp;
|
||||
uint8x8x2_t *vrpt;
|
||||
@@ -290,8 +288,6 @@ png_read_filter_row_paeth3_neon(png_row_infop row_info, png_bytep row,
|
||||
vrpt = png_ptr(uint8x8x2_t,&vtmp);
|
||||
vrp = *vrpt;
|
||||
|
||||
png_debug(1, "in png_read_filter_row_paeth3_neon");
|
||||
|
||||
for (; rp < rp_stop; pp += 12)
|
||||
{
|
||||
uint8x8x2_t *vppt;
|
||||
@@ -337,22 +333,22 @@ png_read_filter_row_paeth3_neon(png_row_infop row_info, png_bytep row,
|
||||
vst1_lane_u32(png_ptr(uint32_t,rp), png_ldr(uint32x2_t,&vdest.val[3]), 0);
|
||||
rp += 3;
|
||||
}
|
||||
|
||||
PNG_UNUSED(bpp)
|
||||
}
|
||||
|
||||
void
|
||||
png_read_filter_row_paeth4_neon(png_row_infop row_info, png_bytep row,
|
||||
png_const_bytep prev_row)
|
||||
png_read_filter_row_paeth4_neon(png_alloc_size_t rowbytes, unsigned int bpp,
|
||||
png_bytep row, png_const_bytep prev_row)
|
||||
{
|
||||
png_bytep rp = row;
|
||||
png_bytep rp_stop = row + row_info->rowbytes;
|
||||
png_bytep rp_stop = row + rowbytes;
|
||||
png_const_bytep pp = prev_row;
|
||||
|
||||
uint8x8_t vlast = vdup_n_u8(0);
|
||||
uint8x8x4_t vdest;
|
||||
vdest.val[3] = vdup_n_u8(0);
|
||||
|
||||
png_debug(1, "in png_read_filter_row_paeth4_neon");
|
||||
|
||||
for (; rp < rp_stop; rp += 16, pp += 16)
|
||||
{
|
||||
uint32x2x4_t vtmp;
|
||||
@@ -380,8 +376,9 @@ png_read_filter_row_paeth4_neon(png_row_infop row_info, png_bytep row,
|
||||
|
||||
vst4_lane_u32(png_ptr(uint32_t,rp), png_ldr(uint32x2x4_t,&vdest), 0);
|
||||
}
|
||||
}
|
||||
|
||||
PNG_UNUSED(bpp)
|
||||
}
|
||||
#endif /* PNG_ARM_NEON_OPT > 0 */
|
||||
#endif /* PNG_ARM_NEON_IMPLEMENTATION == 1 (intrinsics) */
|
||||
#endif /* READ */
|
||||
47
contrib/neon/neon.ac
Normal file
47
contrib/neon/neon.ac
Normal file
@@ -0,0 +1,47 @@
|
||||
# LIBPNG EXTENSION: NEON
|
||||
#
|
||||
# ARM NEON (SIMD) support.
|
||||
#
|
||||
# This file contains configure.ac additions to libpng configure to enable
|
||||
# building of the ARM NEON filter optimizations.
|
||||
#
|
||||
AC_ARG_ENABLE([arm-neon],
|
||||
AS_HELP_STRING([[[--enable-arm-neon]]],
|
||||
[Enable ARM NEON optimizations: =no/off, check, api, yes/on:]
|
||||
[no/off: disable the optimizations; check: use internal checking code]
|
||||
[(deprecated and poorly supported); api: disable by default, enable by]
|
||||
[a call to png_set_option; yes/on: turn on unconditionally.]
|
||||
[If not specified: determined by the compiler.]),
|
||||
[case "$enableval" in
|
||||
no|off)
|
||||
# disable the default enabling on __ARM_NEON__ systems:
|
||||
AC_DEFINE([PNG_ARM_NEON_OPT], [0],
|
||||
[Disable ARM Neon optimizations])
|
||||
# Prevent inclusion of the assembler files below:
|
||||
enable_arm_neon=no;;
|
||||
check)
|
||||
AC_DEFINE([PNG_ARM_NEON_CHECK_SUPPORTED], [],
|
||||
[Check for ARM Neon support at run-time]);;
|
||||
api)
|
||||
AC_DEFINE([PNG_ARM_NEON_API_SUPPORTED], [],
|
||||
[Turn on ARM Neon optimizations at run-time]);;
|
||||
yes|on)
|
||||
AC_DEFINE([PNG_ARM_NEON_OPT], [2],
|
||||
[Enable ARM Neon optimizations])
|
||||
AC_MSG_WARN([--enable-arm-neon: please specify 'check' or 'api', if]
|
||||
[you want the optimizations unconditionally pass -mfpu=neon]
|
||||
[to the compiler.]);;
|
||||
*)
|
||||
AC_MSG_ERROR([--enable-arm-neon=${enable_arm_neon}: invalid value])
|
||||
esac])
|
||||
|
||||
# Add ARM specific files to all builds where the host_cpu is arm ('arm*') or
|
||||
# where ARM optimizations were explicitly requested (this allows a fallback if a
|
||||
# future host CPU does not match 'arm*')
|
||||
|
||||
AM_CONDITIONAL([PNG_ARM_NEON],
|
||||
[test "$enable_arm_neon" != 'no' &&
|
||||
case "$host_cpu" in
|
||||
arm*|aarch64*) :;;
|
||||
*) test "$enable_arm_neon" != '';;
|
||||
esac])
|
||||
27
contrib/neon/neon.am
Normal file
27
contrib/neon/neon.am
Normal file
@@ -0,0 +1,27 @@
|
||||
# contrib/neon/neon.am
|
||||
#
|
||||
# This is an automake fragment included by the top-level Makefile.am if
|
||||
# contrib/neon/neon.ac is included in configure
|
||||
#
|
||||
# It builds the source files in this directory into ARM hardware support for
|
||||
# libpng.
|
||||
#
|
||||
if PNG_ARM_NEON
|
||||
libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_SOURCES += %D%/arm_init.c\
|
||||
%D%/filter_neon.S %D%/filter_neon_intrinsics.c
|
||||
|
||||
DFA_EXTENSION += ${srcdir}/%D%/neon.dfa
|
||||
|
||||
# This causes pngpriv.h to include the named header. It is VERY important to
|
||||
# understand that this MUST be defined and the header MUST define internal
|
||||
# 'extern' functions with PNG_INTERNAL_FUNCTION. This allows vendors to use
|
||||
# static library builds of libpng without clashing with the installed system
|
||||
# libpng; see the libpng-prefix option in configure.ac The value of this
|
||||
# #define is included in pnglibconf.h
|
||||
#
|
||||
# NOTE: you must include the double quotes in the value and you must therefore
|
||||
# support the whole thing with single quotes. If you need to use <> for a
|
||||
# header be aware that if you miss out the single quotes you will create a
|
||||
# random file.
|
||||
AM_CPPFLAGS += -DPNG_EXTENSION_HEADER='"%D%/neon.h"'
|
||||
endif
|
||||
41
contrib/neon/neon.dfa
Normal file
41
contrib/neon/neon.dfa
Normal file
@@ -0,0 +1,41 @@
|
||||
# contrib/arm/neon.dfa
|
||||
#
|
||||
# This is a dfa fragment that is added to DFA_HARDWARE in Makefile.am and
|
||||
# consequently is inserted after scripts/pnglibconf.dfa to define extra,
|
||||
# hardware, options.
|
||||
#
|
||||
# The following are required in any fragment to record the copyright holder of
|
||||
# the *changes* and the appropriate email for bug reports. Note that the
|
||||
# copyright here is just for the specific configuration; additional files may
|
||||
# have additional and/or different copyrights.
|
||||
#
|
||||
# Later settings (e.g. in user.dfa) will override these settings.
|
||||
#
|
||||
setting USER_PRIVATEBUILD default "John Bowler"
|
||||
setting USER_BUG_REPORTS default "jbowler@acm.org"
|
||||
#
|
||||
# These options are specific to the ARM NEON hardware optimizations. At present
|
||||
# these optimizations depend on GCC specific pre-processing of an assembler (.S)
|
||||
# file so they probably won't work with other compilers.
|
||||
#
|
||||
# ARM_NEON_OPT: unset: check at compile time (__ARM_NEON__ must be defined by
|
||||
# the compiler, typically as a result of specifying
|
||||
# CC="gcc -mfpu=neon".)
|
||||
# 0: disable (even if the CPU has a NEON FPU.)
|
||||
# 1: check at run time (via ARM_NEON_{API,CHECK})
|
||||
# 2: switch on unconditionally (inadvisable - instead pass
|
||||
# -mfpu=neon to GCC in CC)
|
||||
# When building libpng avoid using any setting other than '0'; '1' is
|
||||
# set automatically when either 'API' or 'CHECK' are configured in,
|
||||
# '2' should not be necessary as -mfpu=neon will achieve the same
|
||||
# effect as well as applying NEON optimizations to the rest of the
|
||||
# libpng code.
|
||||
# NOTE: any setting other than '0' requires ALIGNED_MEMORY
|
||||
# ARM_NEON_API: (PNG_ARM_NEON == 1) allow the optimization to be switched on
|
||||
# with png_set_option
|
||||
# ARM_NEON_CHECK: (PNG_ARM_NEON == 1) compile a run-time check to see if Neon
|
||||
# extensions are supported. This is poorly supported and
|
||||
# deprecated - use the png_set_option API.
|
||||
setting ARM_NEON_OPT
|
||||
option ARM_NEON_API disabled enables SET_OPTION sets ARM_NEON_OPT 1
|
||||
option ARM_NEON_CHECK disabled sets ARM_NEON_OPT 1
|
||||
124
contrib/neon/neon.h
Normal file
124
contrib/neon/neon.h
Normal file
@@ -0,0 +1,124 @@
|
||||
/* Compile time options.
|
||||
* =====================
|
||||
* In a multi-arch build the compiler may compile the code several times for the
|
||||
* same object module, producing different binaries for different architectures.
|
||||
* When this happens configure-time setting of the target host options cannot be
|
||||
* done. An example is iOS vs Android compilation of ARM NEON support.
|
||||
*
|
||||
* NOTE: symbol prefixing does not pass $(CFLAGS) to the preprocessor, because
|
||||
* this is not possible with certain compilers (Oracle SUN OS CC), as a result
|
||||
* it is necessary to ensure that all extern functions that *might* be used
|
||||
* regardless of $(CFLAGS) get declared in this file. The test on __ARM_NEON
|
||||
* below is one example of this behavior because it is controlled by the
|
||||
* presence or not of -mfpu=neon on the GCC command line, it is possible to do
|
||||
* this in $(CC), e.g. "CC=gcc -mfpu=neon", but people who build libpng rarely
|
||||
* do this.
|
||||
*/
|
||||
#ifndef PNG_ARM_NEON_OPT
|
||||
/* ARM NEON optimizations are being controlled by the compiler settings,
|
||||
* typically the target FPU. If the FPU supports NEON instructions then the
|
||||
* compiler will define __ARM_NEON and we can rely unconditionally on NEON
|
||||
* instructions not crashing, otherwise we must disable use of NEON
|
||||
* instructions.
|
||||
*
|
||||
* NOTE: at present these optimizations depend on 'ALIGNED_MEMORY', so they
|
||||
* can only be turned on automatically if that is supported too. If
|
||||
* PNG_ARM_NEON_OPT is set in CPPFLAGS (to >0) then arm/arm_init.c will fail
|
||||
* to compile with an appropriate #error if ALIGNED_MEMORY has been turned
|
||||
* off.
|
||||
*
|
||||
* Note that older versions of GCC defined __ARM_NEON__; this is no longer
|
||||
* supported. Also 32-bit ARM versions of GCC required the NEON FPU mode to
|
||||
* be turned on explicitly on the command line. If this is not done (on
|
||||
* 32-bit ARM) NEON code will not be included.
|
||||
*
|
||||
* To disable ARM_NEON optimizations entirely, and skip compiling the
|
||||
* associated assembler code, pass --enable-arm-neon=no to configure
|
||||
* or put -DPNG_ARM_NEON_OPT=0 in CPPFLAGS.
|
||||
*/
|
||||
# if defined(__ARM_NEON) && defined(PNG_ALIGNED_MEMORY_SUPPORTED)
|
||||
# define PNG_ARM_NEON_OPT 2
|
||||
# else
|
||||
# define PNG_ARM_NEON_OPT 0
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if PNG_ARM_NEON_OPT > 0
|
||||
/* NEON optimizations are to be at least considered by libpng, so enable the
|
||||
* callbacks to do this.
|
||||
*/
|
||||
# define PNG_FILTER_OPTIMIZATIONS png_init_filter_functions_neon
|
||||
|
||||
/* By default the 'intrinsics' code in arm/filter_neon_intrinsics.c is used
|
||||
* if possible - if __ARM_NEON is set and the compiler version is not known
|
||||
* to be broken. This is controlled by PNG_ARM_NEON_IMPLEMENTATION which can
|
||||
* be:
|
||||
*
|
||||
* 1 The intrinsics code (the default with __ARM_NEON)
|
||||
* 2 The hand coded assembler (the default without __ARM_NEON)
|
||||
*
|
||||
* It is possible to set PNG_ARM_NEON_IMPLEMENTATION in CPPFLAGS, however
|
||||
* this is *NOT* supported and may cease to work even after a minor revision
|
||||
* to libpng. It *is* valid to do this for testing purposes, e.g. speed
|
||||
* testing or a new compiler, but the results should be communicated to the
|
||||
* libpng implementation list for incorporation in the next minor release.
|
||||
*/
|
||||
# ifndef PNG_ARM_NEON_IMPLEMENTATION
|
||||
# ifdef __ARM_NEON
|
||||
# if defined(__clang__)
|
||||
/* At present it is unknown by the libpng developers which versions
|
||||
* of clang support the intrinsics, however some or perhaps all
|
||||
* versions do not work with the assembler so this may be
|
||||
* irrelevant, so just use the default (do nothing here.)
|
||||
*/
|
||||
# elif defined(__GNUC__)
|
||||
/* GCC 4.5.4 NEON support is known to be broken. 4.6.3 is known to
|
||||
* work, so if this *is* GCC, or G++, look for a version >4.5
|
||||
*/
|
||||
# if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 6)
|
||||
# define PNG_ARM_NEON_IMPLEMENTATION 2
|
||||
# endif /* no GNUC support */
|
||||
# endif /* __GNUC__ */
|
||||
# else /* !defined __ARM_NEON */
|
||||
/* The 'intrinsics' code simply won't compile without compiler support
|
||||
* and that support switches on __ARM_NEON, so use the assembler:
|
||||
*/
|
||||
# define PNG_ARM_NEON_IMPLEMENTATION 2
|
||||
# endif /* __ARM_NEON */
|
||||
# endif /* !defined PNG_ARM_NEON_IMPLEMENTATION */
|
||||
|
||||
# ifndef PNG_ARM_NEON_IMPLEMENTATION
|
||||
/* Use the intrinsics code by default. */
|
||||
# define PNG_ARM_NEON_IMPLEMENTATION 1
|
||||
# endif
|
||||
#endif /* PNG_ARM_NEON_OPT > 0 */
|
||||
|
||||
#ifdef PNG_SET_OPTION_SUPPORTED
|
||||
#ifdef PNG_ARM_NEON_API_SUPPORTED
|
||||
# define PNG_ARM_NEON 0 /* HARDWARE: ARM Neon SIMD instructions supported */
|
||||
#endif
|
||||
#endif /* SET_OPTION */
|
||||
|
||||
#if PNG_ARM_NEON_OPT > 0
|
||||
PNG_INTERNAL_FUNCTION(void,png_read_filter_row_up_neon,
|
||||
(png_alloc_size_t row_bytes, unsigned int bpp, png_bytep row,
|
||||
png_const_bytep prev_row),PNG_EMPTY);
|
||||
PNG_INTERNAL_FUNCTION(void,png_read_filter_row_sub3_neon,
|
||||
(png_alloc_size_t row_bytes, unsigned int bpp, png_bytep row,
|
||||
png_const_bytep prev_row),PNG_EMPTY);
|
||||
PNG_INTERNAL_FUNCTION(void,png_read_filter_row_sub4_neon,
|
||||
(png_alloc_size_t row_bytes, unsigned int bpp, png_bytep row,
|
||||
png_const_bytep prev_row),PNG_EMPTY);
|
||||
PNG_INTERNAL_FUNCTION(void,png_read_filter_row_avg3_neon,
|
||||
(png_alloc_size_t row_bytes, unsigned int bpp, png_bytep row,
|
||||
png_const_bytep prev_row),PNG_EMPTY);
|
||||
PNG_INTERNAL_FUNCTION(void,png_read_filter_row_avg4_neon,
|
||||
(png_alloc_size_t row_bytes, unsigned int bpp, png_bytep row,
|
||||
png_const_bytep prev_row),PNG_EMPTY);
|
||||
PNG_INTERNAL_FUNCTION(void,png_read_filter_row_paeth3_neon,
|
||||
(png_alloc_size_t row_bytes, unsigned int bpp, png_bytep row,
|
||||
png_const_bytep prev_row),PNG_EMPTY);
|
||||
PNG_INTERNAL_FUNCTION(void,png_read_filter_row_paeth4_neon,
|
||||
(png_alloc_size_t row_bytes, unsigned int bpp, png_bytep row,
|
||||
png_const_bytep prev_row),PNG_EMPTY);
|
||||
#endif
|
||||
@@ -56,7 +56,7 @@ PNGSRCS=png$(C) pngerror$(C) pngget$(C) pngmem$(C) \
|
||||
pngset$(C) pngtrans$(C)
|
||||
|
||||
# Standard headers
|
||||
PNGH =png.h pngconf.h pngdebug.h pnginfo.h pngpriv.h pngstruct.h
|
||||
PNGH =png.h pngconf.h pngdebug.h pnginfo.h pngpriv.h pngstruct.h pngchunk.h
|
||||
|
||||
# Machine generated headers
|
||||
PNGCONF=pnglibconf.h
|
||||
|
||||
@@ -36,5 +36,7 @@ option FLOATING_ARITHMETIC off
|
||||
option SETJMP on
|
||||
option STDIO on
|
||||
option READ_EXPAND on
|
||||
option READ_IMAGE on
|
||||
option READ_INTERLACING on
|
||||
option READ_STRIP_16_TO_8 on
|
||||
option USER_LIMITS on
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
* affect the API (so are not recorded in pnglibconf.h)
|
||||
*/
|
||||
|
||||
#define PNG_RELEASE_BUILD 1
|
||||
#define PNG_ALIGN_TYPE PNG_ALIGN_NONE
|
||||
|
||||
#endif /* MINRDPNGCONF_H */
|
||||
|
||||
@@ -56,7 +56,7 @@ PNGSRCS=png$(C) pngerror$(C) pngget$(C) pngmem$(C) \
|
||||
pngwtran$(C) pngwutil$(C)
|
||||
|
||||
# Standard headers
|
||||
PNGH =png.h pngconf.h pngdebug.h pnginfo.h pngpriv.h pngstruct.h
|
||||
PNGH =png.h pngconf.h pngdebug.h pnginfo.h pngpriv.h pngstruct.h pngchunk.h
|
||||
|
||||
# Machine generated headers
|
||||
PNGCONF=pnglibconf.h
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
* affect the API (so are not recorded in pnglibconf.h)
|
||||
*/
|
||||
|
||||
#define PNG_RELEASE_BUILD 1
|
||||
#define PNG_ALIGN_TYPE PNG_ALIGN_NONE
|
||||
|
||||
#endif /* MINWRPNGCONF_H */
|
||||
|
||||
@@ -72,7 +72,7 @@ PNGSRCS=png$(C) pngerror$(C) pngget$(C) pngmem$(C) \
|
||||
pngset$(C) pngtrans$(C)
|
||||
|
||||
# Standard headers
|
||||
PNGH =png.h pngconf.h pngdebug.h pnginfo.h pngpriv.h pngstruct.h
|
||||
PNGH =png.h pngconf.h pngdebug.h pnginfo.h pngpriv.h pngstruct.h pngchunk.h
|
||||
|
||||
# Machine generated headers
|
||||
PNGCONF=pnglibconf.h
|
||||
|
||||
@@ -36,5 +36,6 @@ option STDIO on
|
||||
option READ_bKGD on
|
||||
option READ_GAMMA on
|
||||
option READ_EXPAND on
|
||||
option READ_INTERLACING on
|
||||
option READ_STRIP_16_TO_8 on
|
||||
option READ_GRAY_TO_RGB on
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
* affect the API (so are not recorded in pnglibconf.h)
|
||||
*/
|
||||
|
||||
#define PNG_RELEASE_BUILD 1
|
||||
#define PNG_ALIGN_TYPE PNG_ALIGN_NONE
|
||||
|
||||
#endif /* MINPRDPNGCONF_H */
|
||||
|
||||
@@ -8,9 +8,9 @@ LD=$(CC)
|
||||
RM=rm -f
|
||||
|
||||
#PNGPATH = /usr/local
|
||||
#PNGINC = -I$(PNGPATH)/include/libpng16
|
||||
#PNGLIB = -L$(PNGPATH)/lib -lpng16
|
||||
#PNGLIBS = $(PNGPATH)/lib/libpng16.a
|
||||
#PNGINC = -I$(PNGPATH)/include/libpng17
|
||||
#PNGLIB = -L$(PNGPATH)/lib -lpng17
|
||||
#PNGLIBS = $(PNGPATH)/lib/libpng17.a
|
||||
PNGINC = -I../..
|
||||
PNGLIB = -L../.. -lpng
|
||||
PNGLIBS = ../../libpng.a
|
||||
@@ -23,8 +23,7 @@ ZINC = -I../../../zlib
|
||||
ZLIB = -L../../../zlib -lz
|
||||
ZLIBS = ../../../zlib/libz.a
|
||||
|
||||
CPPFLAGS=$(PNGINC) $(ZINC)
|
||||
CFLAGS=
|
||||
CFLAGS=$(PNGINC) $(ZINC)
|
||||
LDLIBS=$(PNGLIB) $(ZLIB)
|
||||
LDLIBSS=$(PNGLIBS) $(ZLIBS)
|
||||
C=.c
|
||||
@@ -38,7 +37,7 @@ E=
|
||||
all: png2pnm$(E) pnm2png$(E) png2pnm-static$(E) pnm2png-static$(E)
|
||||
|
||||
png2pnm$(O): png2pnm$(C)
|
||||
$(CC) -c $(CPPFLAGS) $(CFLAGS) png2pnm$(C)
|
||||
$(CC) -c $(CFLAGS) png2pnm$(C)
|
||||
|
||||
png2pnm$(E): png2pnm$(O)
|
||||
$(LD) $(LDFLAGS) -o png2pnm$(E) png2pnm$(O) $(LDLIBS) -lm
|
||||
@@ -47,7 +46,7 @@ png2pnm-static$(E): png2pnm$(O)
|
||||
$(LD) $(LDFLAGS) -o png2pnm-static$(E) png2pnm$(O) $(LDLIBSS) -lm
|
||||
|
||||
pnm2png$(O): pnm2png$(C)
|
||||
$(CC) -c $(CPPFLAGS) $(CFLAGS) pnm2png$(C)
|
||||
$(CC) -c $(CFLAGS) pnm2png$(C)
|
||||
|
||||
pnm2png$(E): pnm2png$(O)
|
||||
$(LD) $(LDFLAGS) -o pnm2png$(E) pnm2png$(O) $(LDLIBS) -lm
|
||||
|
||||
@@ -7,8 +7,7 @@ LB=tlib
|
||||
RM=del
|
||||
CP=copy
|
||||
MODEL=l
|
||||
CPPFLAGS=-I..\libpng -I..\zlib
|
||||
CFLAGS=-O -m$(MODEL)
|
||||
CCFLAGS=-O -m$(MODEL) -I..\libpng -I..\zlib
|
||||
LDFLAGS=-m$(MODEL) -L..\libpng -L..\zlib
|
||||
C=.c
|
||||
O=.obj
|
||||
@@ -20,13 +19,13 @@ E=.exe
|
||||
all: png2pnm$(E) pnm2png$(E)
|
||||
|
||||
png2pnm$(O): png2pnm$(C)
|
||||
$(CC) -c $(CPPFLAGS) $(CFLAGS) png2pnm$(C)
|
||||
$(CC) -c $(CCFLAGS) png2pnm$(C)
|
||||
|
||||
png2pnm$(E): png2pnm$(O)
|
||||
$(LD) $(LDFLAGS) png2pnm$(O) libpng$(L) zlib$(L)
|
||||
|
||||
pnm2png$(O): pnm2png$(C)
|
||||
$(CC) -c $(CPPFLAGS) $(CFLAGS) pnm2png$(C)
|
||||
$(CC) -c $(CCFLAGS) pnm2png$(C)
|
||||
|
||||
pnm2png$(E): pnm2png$(O)
|
||||
$(LD) $(LDFLAGS) pnm2png$(O) libpng$(L) zlib$(L)
|
||||
@@ -36,3 +35,4 @@ clean:
|
||||
$(RM) *$(E)
|
||||
|
||||
# End of makefile for png2pnm / pnm2png
|
||||
|
||||
|
||||
@@ -52,8 +52,7 @@
|
||||
|
||||
int main (int argc, char *argv[]);
|
||||
void usage ();
|
||||
BOOL png2pnm (FILE *png_file, FILE *pnm_file, FILE *alpha_file, BOOL raw,
|
||||
BOOL alpha);
|
||||
BOOL png2pnm (FILE *png_file, FILE *pnm_file, FILE *alpha_file, BOOL raw, BOOL alpha);
|
||||
|
||||
/*
|
||||
* main
|
||||
@@ -86,8 +85,7 @@ int main(int argc, char *argv[])
|
||||
if ((fp_al = fopen (argv[argi], "wb")) == NULL)
|
||||
{
|
||||
fprintf (stderr, "PNM2PNG\n");
|
||||
fprintf (stderr, "Error: can not create alpha-channel file %s\n",
|
||||
argv[argi]);
|
||||
fprintf (stderr, "Error: can not create alpha-channel file %s\n", argv[argi]);
|
||||
exit (1);
|
||||
}
|
||||
break;
|
||||
@@ -178,11 +176,9 @@ void usage()
|
||||
fprintf (stderr, "Usage: png2pnm [options] <file>.png [<file>.pnm]\n");
|
||||
fprintf (stderr, " or: ... | png2pnm [options]\n");
|
||||
fprintf (stderr, "Options:\n");
|
||||
fprintf (stderr,
|
||||
" -r[aw] write pnm-file in binary format (P4/P5/P6) (default)\n");
|
||||
fprintf (stderr, " -r[aw] write pnm-file in binary format (P4/P5/P6) (default)\n");
|
||||
fprintf (stderr, " -n[oraw] write pnm-file in ascii format (P1/P2/P3)\n");
|
||||
fprintf (stderr,
|
||||
" -a[lpha] <file>.pgm write PNG alpha channel as pgm-file\n");
|
||||
fprintf (stderr, " -a[lpha] <file>.pgm write PNG alpha channel as pgm-file\n");
|
||||
fprintf (stderr, " -h | -? print this help-information\n");
|
||||
}
|
||||
|
||||
@@ -190,8 +186,7 @@ void usage()
|
||||
* png2pnm
|
||||
*/
|
||||
|
||||
BOOL png2pnm (FILE *png_file, FILE *pnm_file, FILE *alpha_file,
|
||||
volatile BOOL raw, BOOL alpha)
|
||||
BOOL png2pnm (FILE *png_file, FILE *pnm_file, FILE *alpha_file, BOOL raw, BOOL alpha)
|
||||
{
|
||||
png_struct *png_ptr = NULL;
|
||||
png_info *info_ptr = NULL;
|
||||
@@ -223,7 +218,7 @@ BOOL png2pnm (FILE *png_file, FILE *pnm_file, FILE *alpha_file,
|
||||
|
||||
/* create png and info structures */
|
||||
|
||||
png_ptr = png_create_read_struct (png_get_libpng_ver(NULL),
|
||||
png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING,
|
||||
NULL, NULL, NULL);
|
||||
if (!png_ptr)
|
||||
return FALSE; /* out of memory */
|
||||
@@ -266,7 +261,7 @@ BOOL png2pnm (FILE *png_file, FILE *pnm_file, FILE *alpha_file,
|
||||
png_set_expand (png_ptr);
|
||||
|
||||
#ifdef NJET
|
||||
/* downgrade 16-bit images to 8-bit */
|
||||
/* downgrade 16-bit images to 8 bit */
|
||||
if (bit_depth == 16)
|
||||
png_set_strip_16 (png_ptr);
|
||||
/* transform grayscale images into full-color */
|
||||
@@ -320,14 +315,12 @@ BOOL png2pnm (FILE *png_file, FILE *pnm_file, FILE *alpha_file,
|
||||
/* row_bytes is the width x number of channels x (bit-depth / 8) */
|
||||
row_bytes = png_get_rowbytes (png_ptr, info_ptr);
|
||||
|
||||
if ((png_pixels = (png_byte *)
|
||||
malloc (row_bytes * height * sizeof (png_byte))) == NULL) {
|
||||
if ((png_pixels = (png_byte *) malloc (row_bytes * height * sizeof (png_byte))) == NULL) {
|
||||
png_destroy_read_struct (&png_ptr, &info_ptr, NULL);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if ((row_pointers = (png_byte **)
|
||||
malloc (height * sizeof (png_bytep))) == NULL)
|
||||
if ((row_pointers = (png_byte **) malloc (height * sizeof (png_bytep))) == NULL)
|
||||
{
|
||||
png_destroy_read_struct (&png_ptr, &info_ptr, NULL);
|
||||
free (png_pixels);
|
||||
@@ -336,7 +329,7 @@ BOOL png2pnm (FILE *png_file, FILE *pnm_file, FILE *alpha_file,
|
||||
}
|
||||
|
||||
/* set the individual row_pointers to point at the correct offsets */
|
||||
for (i = 0; i < ((int) height); i++)
|
||||
for (i = 0; i < (height); i++)
|
||||
row_pointers[i] = png_pixels + i * row_bytes;
|
||||
|
||||
/* now we can go ahead and just read the whole image */
|
||||
@@ -379,9 +372,9 @@ BOOL png2pnm (FILE *png_file, FILE *pnm_file, FILE *alpha_file,
|
||||
/* write data to PNM file */
|
||||
pix_ptr = png_pixels;
|
||||
|
||||
for (row = 0; row < (int) height; row++)
|
||||
for (row = 0; row < height; row++)
|
||||
{
|
||||
for (col = 0; col < (int) width; col++)
|
||||
for (col = 0; col < width; col++)
|
||||
{
|
||||
for (i = 0; i < (channels - alpha_present); i++)
|
||||
{
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* pnm2png.c --- conversion from PBM/PGM/PPM-file to PNG-file
|
||||
* copyright (C) 1999 by Willem van Schaik <willem@schaik.com>
|
||||
* copyright (C) 1999,2015 by Willem van Schaik <willem@schaik.com>
|
||||
*
|
||||
* version 1.0 - 1999.10.15 - First version.
|
||||
* version 1.1 - 2015.07.29 - Fixed leaks (Glenn Randers-Pehrson)
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
|
||||
pngsuite
|
||||
--------
|
||||
Copyright (c) Willem van Schaik, 1999, 2011, 2012
|
||||
Two images (ftbbn0g01.png and ftbbn0g02.png) are by Glenn Randers-Pehrson, 2012
|
||||
(c) Willem van Schaik, 1999, 2011, 2012
|
||||
Two images are by Glenn Randers-Pehrson, 2012
|
||||
|
||||
Permission to use, copy, modify, and distribute these images for any
|
||||
purpose and without fee is hereby granted.
|
||||
|
||||
BIN
contrib/testpngs/gray-2-sBIT-tRNS.png
Normal file
BIN
contrib/testpngs/gray-2-sBIT-tRNS.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 500 B |
@@ -15,10 +15,22 @@
|
||||
# ones that extend the code-coverage of libpng from the existing test files in
|
||||
# contrib/pngsuite.
|
||||
test -n "$MAKEPNG" || MAKEPNG=./makepng
|
||||
if test "$1" = "-v"
|
||||
then
|
||||
verbose=1
|
||||
shift
|
||||
else
|
||||
verbose=
|
||||
fi
|
||||
what="$1"
|
||||
shift
|
||||
cmdline="$@"
|
||||
opts=
|
||||
|
||||
mp(){
|
||||
${MAKEPNG} $opts $1 "$3" "$4" "$3-$4$2.png"
|
||||
test -n "$verbose" &&
|
||||
echo ${MAKEPNG} $opts $cmdline $1 "$3" "$4" "$3-$4$2.png"
|
||||
${MAKEPNG} $opts $cmdline $1 "$3" "$4" "$3-$4$2.png"
|
||||
}
|
||||
|
||||
mpg(){
|
||||
@@ -39,7 +51,7 @@ mptrans(){
|
||||
fi
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
case "$what" in
|
||||
--small)
|
||||
opts="--small";;&
|
||||
|
||||
@@ -72,19 +84,8 @@ case "$1" in
|
||||
done;;
|
||||
|
||||
--coverage)
|
||||
# Comments below indicate cases known to be required and not duplicated
|
||||
# in other (required) cases; the aim is to get a minimal set that gives
|
||||
# the maxium code coverage.
|
||||
mpg none gray-alpha 8 # required: code coverage, sRGB opaque component
|
||||
mpg none palette 8 # required: basic palette read
|
||||
mpg 1.8 gray 2 # required: tests gamma threshold code
|
||||
mpg 1.8 palette 2 # required: code coverage
|
||||
mpg 1.8 palette 4 # required: code coverage
|
||||
mpg 1.8 palette 8 # error limits only
|
||||
mpg linear palette 8 # error limits only
|
||||
mpg linear rgb-alpha 16 # error limits only
|
||||
mpg sRGB palette 1 # required: code coverage
|
||||
mpg sRGB rgb-alpha 16 # required: code coverage: pngread.c:2422 untested
|
||||
# Extra images made to improve code coverage:
|
||||
${MAKEPNG} --insert sBIT 1 --tRNS gray 2 gray-2-sBIT-tRNS.png
|
||||
:;;
|
||||
|
||||
*)
|
||||
|
||||
437
contrib/tools/chunkhash.c
Normal file
437
contrib/tools/chunkhash.c
Normal file
@@ -0,0 +1,437 @@
|
||||
/* chunkhash.c -- build a perfect hash code for the chunk names on stdin.
|
||||
*
|
||||
* Last changed in libpng 1.7.0 [(PENDING RELEASE)]
|
||||
*
|
||||
* COPYRIGHT: Written by John Cunningham Bowler, 2014.
|
||||
* To the extent possible under law, the author has waived all copyright and
|
||||
* related or neighboring rights to this work. This work is published from:
|
||||
* United States.
|
||||
*
|
||||
* Feed this program all the known chunks that libpng must recognize. It will
|
||||
* generate an appropriate hash key for the macro in pngpriv.h To generate the
|
||||
* list of chunks currently defined in png.h do this:
|
||||
*
|
||||
* sed -n -e 's/^#define png_\(....\) PNG_U32.*$/\1/p' png.h
|
||||
*
|
||||
* An alternative to using this program is to pipe the output of the above
|
||||
* through gperf, however the code generated by perf is somewhat more verbose
|
||||
* and it doesn't generate as good a result (however it's a heck of a lot faster
|
||||
* than this program!)
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <png.h> /* for the libpng types for this platform */
|
||||
|
||||
/* The machine generated file is checked in, so this works and it obtains the
|
||||
* definition of the PNG_CHUNK_HASH macro. To change this definition only ever
|
||||
* alter the strings below!
|
||||
*/
|
||||
#include "chunkhash.h"
|
||||
|
||||
/* The best_ variables are local variables defined in the functions below. When
|
||||
* used in libpng code, however, they are just constants.
|
||||
*/
|
||||
#define PNG_CHUNK_HASH_MASK best_mask
|
||||
#define PNG_CHUNK_HASH_C0 best_c[0]
|
||||
#define PNG_CHUNK_HASH_C1 best_c[1]
|
||||
#define PNG_CHUNK_HASH_C2 best_c[2]
|
||||
#define PNG_CHUNK_HASH_C3 best_c[3]
|
||||
|
||||
/* These strings contain the C text to copy into the new version of
|
||||
* contrib/tools/chunkhash.c
|
||||
*/
|
||||
static const char *strings[] = {
|
||||
"/* chunkhash.h -- a perfect hash code for the chunk names in png.h",
|
||||
" *",
|
||||
" * Last changed in libpng 1.7.0 [(PENDING RELEASE)]",
|
||||
" *",
|
||||
" * THIS IS A MACHINE GENERATED FILE. See contrib/tools/chunkhash.c for",
|
||||
" * copyright and other information.",
|
||||
" *",
|
||||
" * USAGE: To include the PNG_CHUNK_HASH macro and associated definitions:",
|
||||
" *",
|
||||
" * #define PNG_CHUNKHASH_DEFS",
|
||||
" * #include \"contrib/tools/chunkhash.h\"",
|
||||
" *",
|
||||
" * To define the png_chunk_hash array used by the macro:",
|
||||
" *",
|
||||
" * #define PNG_CHUNKHASH_CODE",
|
||||
" * #include \"contrib/tools/chunkhash.h\"",
|
||||
" *",
|
||||
" * One or both of the defines must be given except when building chunkhash",
|
||||
" * itself.",
|
||||
" */",
|
||||
"#ifdef PNG_CHUNKHASH_DEFS",
|
||||
"#ifndef PNG_CHUNKHASH_H",
|
||||
"#define PNG_CHUNKHASH_H",
|
||||
"/* A perfect hash code - returns a value 0..(PNG_KNOWN_CHUNK_COUNT-1) and is",
|
||||
" * generated by the ridiculously simple program in contrib/tools/chunkhash.c",
|
||||
" *",
|
||||
" * The hash code used here multiplies each byte by a different constant to",
|
||||
" * return a single number:",
|
||||
" *",
|
||||
" * b0 * c[0] + b1 * [c1] + b2 * c[2] + b3 * c[3]",
|
||||
" *",
|
||||
" * The values of the constants are found by search using the a table of",
|
||||
" * primes, including 0, and may be (in fact are at present) 0 for some of the",
|
||||
" * bytes, the compiler is expected to optimize multiply by zero, or one!",
|
||||
" *",
|
||||
" * The lookup table reduces the sparse result of the hash calculation to the",
|
||||
" * correct index values. The chunks are indexed in the string order of the",
|
||||
" * png_uint_32 chunk names.",
|
||||
" */",
|
||||
0, /* HEADER definitions go here */
|
||||
"",
|
||||
"extern const png_byte png_chunk_hash[PNG_CHUNK_HASH_MASK+1];",
|
||||
"#endif /* !PNG_CHUNKHASH_H */",
|
||||
"#endif /* PNG_CHUNKHASH_DEFS */",
|
||||
"",
|
||||
"#ifndef PNG_CHUNK_HASH",
|
||||
"#define PNG_CHUNK_HASH(chunk) (png_chunk_hash[PNG_CHUNK_HASH_MASK & (\\",
|
||||
" ((chunk) >> 24) * PNG_CHUNK_HASH_C0 +\\",
|
||||
" ((chunk) >> 16) * PNG_CHUNK_HASH_C1 +\\",
|
||||
" ((chunk) >> 8) * PNG_CHUNK_HASH_C2 +\\",
|
||||
" ((chunk) ) * PNG_CHUNK_HASH_C3)])",
|
||||
"#endif",
|
||||
"",
|
||||
"#ifdef PNG_CHUNKHASH_CODE",
|
||||
"#ifndef PNG_CHUNKHASH_C",
|
||||
"#define PNG_CHUNKHASH_C",
|
||||
"const png_byte png_chunk_hash[PNG_CHUNK_HASH_MASK+1] = {",
|
||||
0, /* png.c definitions go here */
|
||||
"};",
|
||||
"#endif /* !PNG_CHUNKHASH_C */",
|
||||
"#endif /* PNG_CHUNKHASH_CODE */",
|
||||
0 /* end of file */
|
||||
};
|
||||
|
||||
#define CHUNK_COUNT_MAX 32
|
||||
/* If necessary this is easy to increase; just don't use a png_uint_32
|
||||
* bitmask below, however it doesn't seem likely that the limit will be hit
|
||||
* any time soon.
|
||||
*/
|
||||
|
||||
static const png_byte
|
||||
chunk_hash[256] =
|
||||
{
|
||||
0, 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
|
||||
};
|
||||
|
||||
static void
|
||||
error(const char *string)
|
||||
{
|
||||
fprintf(stderr, "chunkhash: %s\n", string);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* Return a hash code for the given chunk; this is the same as the pngpriv.h
|
||||
* macro, but parameterized. The names of the parameters have to be chosen to
|
||||
* match the above #defines.
|
||||
*/
|
||||
static png_uint_32
|
||||
test_hash(png_uint_32 chunk, const unsigned int *best_c, png_uint_32 best_mask)
|
||||
{
|
||||
# define png_chunk_hash chunk_hash /* prevents lookup */
|
||||
return PNG_CHUNK_HASH(chunk);
|
||||
# undef png_chunk_hash
|
||||
}
|
||||
|
||||
static void
|
||||
print_chunks(const png_uint_32 *chunks, unsigned int nchunks, png_uint_32 first,
|
||||
png_uint_32 last, const unsigned int *best_c, png_uint_32 best_mask,
|
||||
const png_byte *lut)
|
||||
{
|
||||
/* 'last' is the last code to print plus 1, this is used to detect duplicates
|
||||
* (which should not happen - if there are any it's an internal error!)
|
||||
*/
|
||||
if (nchunks > 0)
|
||||
{
|
||||
/* Recursive algorithm; find the hash code of the next chunk, then print
|
||||
* all remaining chunks with codes in the range first..code (including
|
||||
* duplicates) and after print all remaining chunks with codes in the
|
||||
* range (code+1)..last
|
||||
*/
|
||||
const png_uint_32 chunk = *chunks++;
|
||||
# define png_chunk_hash lut
|
||||
const png_uint_32 code = PNG_CHUNK_HASH(chunk);
|
||||
# undef png_chunk_hash
|
||||
|
||||
--nchunks;
|
||||
|
||||
/* The code might be out of the print range */
|
||||
if (code >= first && code <= last)
|
||||
{
|
||||
if (code >= first) /* not time yet */
|
||||
print_chunks(chunks, nchunks, first, code, best_c, best_mask, lut);
|
||||
|
||||
printf("#define PNG_CHUNK_%c%c%c%c_TAG %lu%s\n", (char)(chunk>>24),
|
||||
(char)(chunk>>16), (char)(chunk>>8), (char)chunk,
|
||||
(unsigned long)code, code == last ? " /* DUPLICATE */" : "");
|
||||
|
||||
if (code < last) /* still some to go */
|
||||
print_chunks(chunks, nchunks, code+1, last, best_c, best_mask, lut);
|
||||
}
|
||||
|
||||
else
|
||||
print_chunks(chunks, nchunks, first, last, best_c, best_mask, lut);
|
||||
}
|
||||
}
|
||||
|
||||
static unsigned int primes[] =
|
||||
{
|
||||
0, 1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67,
|
||||
71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149,
|
||||
151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229,
|
||||
233, 239, 241, 251
|
||||
};
|
||||
|
||||
#define NPRIMES ((sizeof primes)/(sizeof primes[0]))
|
||||
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
/* Stdin should just contain chunk names, one per line */
|
||||
png_uint_32 best_mask;
|
||||
unsigned int best_c[4];
|
||||
png_uint_32 chunks[CHUNK_COUNT_MAX];
|
||||
png_byte known_chunk_count;
|
||||
|
||||
/* Not required; stop GCC whining: */
|
||||
memset(best_c, 0xab, sizeof best_c);
|
||||
best_mask = 0x12345678;
|
||||
|
||||
{
|
||||
png_uint_32 this_chunk = 0;
|
||||
png_byte n_chunks = 0;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
int ch = getchar();
|
||||
|
||||
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
|
||||
{
|
||||
if (this_chunk > 0xffffffU)
|
||||
error("chunk name too long");
|
||||
|
||||
this_chunk = (this_chunk << 8) + (unsigned)ch;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
if (this_chunk > 0)
|
||||
{
|
||||
if (this_chunk <= 0xffffffU)
|
||||
error("chunk name too short");
|
||||
|
||||
if (n_chunks >= CHUNK_COUNT_MAX)
|
||||
error("too many chunks (check CHUNK_COUNT_MAX)");
|
||||
|
||||
chunks[n_chunks++] = this_chunk;
|
||||
this_chunk = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (ch < 0)
|
||||
break;
|
||||
}
|
||||
|
||||
/* 22 is the number of chunks currently defined (excluding fRAc), at any
|
||||
* time it should also be in PNG_KNOWN_CHUNK_COUNT, but this run of
|
||||
* chunkhash may be trying to add a chunk so allow bigger numbers.
|
||||
*/
|
||||
# ifdef PNG_KNOWN_CHUNK_COUNT
|
||||
# define CHUNK_COUNT_MIN PNG_KNOWN_CHUNK_COUNT
|
||||
# else
|
||||
# define CHUNK_COUNT_MIN 26
|
||||
# endif
|
||||
if (n_chunks < CHUNK_COUNT_MIN)
|
||||
error("too few chunks (expecting at least 26)");
|
||||
|
||||
known_chunk_count = n_chunks;
|
||||
}
|
||||
|
||||
/* Exhaustive search of the hash parameters - in fact this isn't very slow at
|
||||
* all.
|
||||
*/
|
||||
{
|
||||
unsigned int i1, c_zero = 0, c_one = 0;
|
||||
|
||||
for (i1=0; i1<NPRIMES; ++i1)
|
||||
{
|
||||
unsigned int i2;
|
||||
unsigned int c[4];
|
||||
|
||||
fprintf(stderr, "TEST: %u\n", primes[i1]);
|
||||
c[0] = primes[i1];
|
||||
|
||||
for (i2=0; i2<NPRIMES; ++i2)
|
||||
{
|
||||
unsigned int i3;
|
||||
|
||||
c[1] = primes[i2];
|
||||
|
||||
for (i3=0; i3<NPRIMES; ++i3)
|
||||
{
|
||||
unsigned int i4;
|
||||
|
||||
c[2] = primes[i3];
|
||||
|
||||
for (i4=0; i4<NPRIMES; ++i4)
|
||||
{
|
||||
unsigned int i;
|
||||
png_uint_32 hash_mask = 0xffU;
|
||||
png_uint_32 hashes[CHUNK_COUNT_MAX];
|
||||
|
||||
c[3] = primes[i4];
|
||||
|
||||
while (hash_mask > 0xfU)
|
||||
{
|
||||
for (i=0; i<known_chunk_count; ++i)
|
||||
{
|
||||
unsigned int j;
|
||||
png_uint_32 hash = test_hash(chunks[i], c, hash_mask);
|
||||
|
||||
for (j=0; j<i; ++j) if (hashes[j] == hash) goto next_i4;
|
||||
|
||||
hashes[i] = hash;
|
||||
}
|
||||
|
||||
hash_mask >>= 1;
|
||||
}
|
||||
|
||||
next_i4:
|
||||
if (hash_mask < 0xffU)
|
||||
{
|
||||
/* This worked */
|
||||
unsigned int best, c0 = 0, c1 = 0;
|
||||
|
||||
hash_mask <<= 1;
|
||||
hash_mask += 1;
|
||||
|
||||
for (i=0; i<4; ++i)
|
||||
{
|
||||
if (c[i] == 0)
|
||||
++c0;
|
||||
|
||||
else if (c[i] == 1)
|
||||
++c1;
|
||||
}
|
||||
|
||||
if (hash_mask == best_mask)
|
||||
best = (c0 > c_zero) || (c0 == c_zero && c1 > c_one);
|
||||
|
||||
else
|
||||
best = (hash_mask < best_mask);
|
||||
|
||||
if (best)
|
||||
{
|
||||
fprintf(stderr, "{%u,%u,%u,%u} & 0x%lx\n",
|
||||
c[0], c[1], c[2], c[3],
|
||||
(unsigned long)hash_mask);
|
||||
|
||||
c_zero = c0;
|
||||
c_one = c1;
|
||||
best_mask = hash_mask;
|
||||
memcpy(best_c, c, sizeof best_c);
|
||||
}
|
||||
}
|
||||
} /* i4 */
|
||||
} /* i3 */
|
||||
} /* i2 */
|
||||
} /* i1 */
|
||||
}
|
||||
|
||||
/* Calculate the LUT (png_chunk_hash) */
|
||||
{
|
||||
png_byte b;
|
||||
png_byte lut[256];
|
||||
|
||||
/* A failure returns PNG_KNOWN_CHUNK_COUNT: */
|
||||
memset(lut, known_chunk_count, sizeof lut);
|
||||
|
||||
for (b=0; b<known_chunk_count; ++b)
|
||||
lut[test_hash(chunks[b], best_c, best_mask)] = b;
|
||||
|
||||
/* Validate the pngpriv.h hash function. */
|
||||
# define png_chunk_hash lut
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i=0; i<known_chunk_count; ++i)
|
||||
{
|
||||
png_uint_32 chunk = chunks[i];
|
||||
|
||||
if (PNG_CHUNK_HASH(chunk) != i)
|
||||
error("internal error: hash didn't work!");
|
||||
}
|
||||
}
|
||||
# undef lut
|
||||
|
||||
/* Print all the results, first the stuff for pngpriv.h */
|
||||
{
|
||||
unsigned int i = 0;
|
||||
|
||||
while (strings[i] != 0)
|
||||
puts(strings[i++]);
|
||||
|
||||
printf("#define PNG_CHUNK_HASH_MASK 0x%lxU\n",
|
||||
(unsigned long)best_mask);
|
||||
printf("#define PNG_CHUNK_HASH_C0 %u\n", best_c[0]);
|
||||
printf("#define PNG_CHUNK_HASH_C1 %u\n", best_c[1]);
|
||||
printf("#define PNG_CHUNK_HASH_C2 %u\n", best_c[2]);
|
||||
printf("#define PNG_CHUNK_HASH_C3 %u\n", best_c[3]);
|
||||
|
||||
/* Print the hash codes of all the chunks */
|
||||
putchar('\n');
|
||||
print_chunks(chunks, known_chunk_count, 0, 0xffffffff, best_c,
|
||||
best_mask, lut);
|
||||
putchar('\n');
|
||||
printf("#define PNG_KNOWN_CHUNK_COUNT %u\n", known_chunk_count);
|
||||
|
||||
while (strings[++i] != 0)
|
||||
puts(strings[i]);
|
||||
|
||||
/* Now print the LUT */
|
||||
fputs(" ", stdout);
|
||||
{
|
||||
unsigned int j;
|
||||
|
||||
for (j=0; j<=best_mask; ++j)
|
||||
{
|
||||
printf("%d", lut[j]);
|
||||
|
||||
if ((j % 16) == 15 && j < best_mask)
|
||||
printf(",\n ");
|
||||
|
||||
else if (j < best_mask)
|
||||
printf(", ");
|
||||
|
||||
else
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
|
||||
/* And the trailing text */
|
||||
while (strings[++i] != 0)
|
||||
puts(strings[i]);
|
||||
}
|
||||
}
|
||||
|
||||
exit(0);
|
||||
}
|
||||
97
contrib/tools/chunkhash.h
Normal file
97
contrib/tools/chunkhash.h
Normal file
@@ -0,0 +1,97 @@
|
||||
/* chunkhash.h -- a perfect hash code for the chunk names in png.h
|
||||
*
|
||||
* Last changed in libpng 1.7.0 [(PENDING RELEASE)]
|
||||
*
|
||||
* THIS IS A MACHINE GENERATED FILE. See contrib/tools/chunkhash.c for
|
||||
* copyright and other information.
|
||||
*
|
||||
* USAGE: To include the PNG_CHUNK_HASH macro and associated definitions:
|
||||
*
|
||||
* #define PNG_CHUNKHASH_DEFS
|
||||
* #include "contrib/tools/chunkhash.h"
|
||||
*
|
||||
* To define the png_chunk_hash array used by the macro:
|
||||
*
|
||||
* #define PNG_CHUNKHASH_CODE
|
||||
* #include "contrib/tools/chunkhash.h"
|
||||
*
|
||||
* One or both of the defines must be given except when building chunkhash
|
||||
* itself.
|
||||
*/
|
||||
#ifdef PNG_CHUNKHASH_DEFS
|
||||
#ifndef PNG_CHUNKHASH_H
|
||||
#define PNG_CHUNKHASH_H
|
||||
/* A perfect hash code - returns a value 0..(PNG_KNOWN_CHUNK_COUNT-1) and is
|
||||
* generated by the ridiculously simple program in contrib/tools/chunkhash.c
|
||||
*
|
||||
* The hash code used here multiplies each byte by a different constant to
|
||||
* return a single number:
|
||||
*
|
||||
* b0 * c[0] + b1 * [c1] + b2 * c[2] + b3 * c[3]
|
||||
*
|
||||
* The values of the constants are found by search using the a table of
|
||||
* primes, including 0, and may be (in fact are at present) 0 for some of the
|
||||
* bytes, the compiler is expected to optimize multiply by zero, or one!
|
||||
*
|
||||
* The lookup table reduces the sparse result of the hash calculation to the
|
||||
* correct index values. The chunks are indexed in the string order of the
|
||||
* png_uint_32 chunk names.
|
||||
*/
|
||||
#define PNG_CHUNK_HASH_MASK 0x3fU
|
||||
#define PNG_CHUNK_HASH_C0 103
|
||||
#define PNG_CHUNK_HASH_C1 1
|
||||
#define PNG_CHUNK_HASH_C2 0
|
||||
#define PNG_CHUNK_HASH_C3 1
|
||||
|
||||
#define PNG_CHUNK_IDAT_TAG 0
|
||||
#define PNG_CHUNK_IEND_TAG 1
|
||||
#define PNG_CHUNK_IHDR_TAG 2
|
||||
#define PNG_CHUNK_PLTE_TAG 3
|
||||
#define PNG_CHUNK_bKGD_TAG 4
|
||||
#define PNG_CHUNK_cHRM_TAG 5
|
||||
#define PNG_CHUNK_fRAc_TAG 6
|
||||
#define PNG_CHUNK_gAMA_TAG 7
|
||||
#define PNG_CHUNK_gIFg_TAG 8
|
||||
#define PNG_CHUNK_gIFt_TAG 9
|
||||
#define PNG_CHUNK_gIFx_TAG 10
|
||||
#define PNG_CHUNK_hIST_TAG 11
|
||||
#define PNG_CHUNK_iCCP_TAG 12
|
||||
#define PNG_CHUNK_iTXt_TAG 13
|
||||
#define PNG_CHUNK_oFFs_TAG 14
|
||||
#define PNG_CHUNK_pCAL_TAG 15
|
||||
#define PNG_CHUNK_pHYs_TAG 16
|
||||
#define PNG_CHUNK_sBIT_TAG 17
|
||||
#define PNG_CHUNK_sCAL_TAG 18
|
||||
#define PNG_CHUNK_sPLT_TAG 19
|
||||
#define PNG_CHUNK_sRGB_TAG 20
|
||||
#define PNG_CHUNK_sTER_TAG 21
|
||||
#define PNG_CHUNK_tEXt_TAG 22
|
||||
#define PNG_CHUNK_tIME_TAG 23
|
||||
#define PNG_CHUNK_tRNS_TAG 24
|
||||
#define PNG_CHUNK_zTXt_TAG 25
|
||||
|
||||
#define PNG_KNOWN_CHUNK_COUNT 26
|
||||
|
||||
extern const png_byte png_chunk_hash[PNG_CHUNK_HASH_MASK+1];
|
||||
#endif /* !PNG_CHUNKHASH_H */
|
||||
#endif /* PNG_CHUNKHASH_DEFS */
|
||||
|
||||
#ifndef PNG_CHUNK_HASH
|
||||
#define PNG_CHUNK_HASH(chunk) (png_chunk_hash[PNG_CHUNK_HASH_MASK & (\
|
||||
((chunk) >> 24) * PNG_CHUNK_HASH_C0 +\
|
||||
((chunk) >> 16) * PNG_CHUNK_HASH_C1 +\
|
||||
((chunk) >> 8) * PNG_CHUNK_HASH_C2 +\
|
||||
((chunk) ) * PNG_CHUNK_HASH_C3)])
|
||||
#endif
|
||||
|
||||
#ifdef PNG_CHUNKHASH_CODE
|
||||
#ifndef PNG_CHUNKHASH_C
|
||||
#define PNG_CHUNKHASH_C
|
||||
const png_byte png_chunk_hash[PNG_CHUNK_HASH_MASK+1] = {
|
||||
26, 3, 26, 26, 26, 26, 26, 13, 26, 26, 26, 16, 26, 26, 26, 26,
|
||||
26, 24, 12, 26, 18, 26, 26, 26, 26, 20, 26, 17, 26, 26, 25, 15,
|
||||
26, 8, 14, 26, 26, 22, 26, 26, 1, 19, 5, 21, 26, 26, 9, 26,
|
||||
26, 26, 10, 7, 26, 11, 26, 0, 26, 2, 23, 26, 26, 4, 26, 6
|
||||
};
|
||||
#endif /* !PNG_CHUNKHASH_C */
|
||||
#endif /* PNG_CHUNKHASH_CODE */
|
||||
208
contrib/tools/dynamic-range.c
Normal file
208
contrib/tools/dynamic-range.c
Normal file
@@ -0,0 +1,208 @@
|
||||
/* dynamic-range.c
|
||||
*
|
||||
* Last changed in libpng 1.7.0
|
||||
*
|
||||
* COPYRIGHT: Written by John Cunningham Bowler, 2015
|
||||
* To the extent possible under law, the author has waived all copyright and
|
||||
* related or neighboring rights to this work. This work is published from:
|
||||
* United States.
|
||||
*
|
||||
* Find the dynamic range of a given gamma encoding given a (linear) precision
|
||||
* and a maximum number of encoded values.
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <float.h>
|
||||
#include <math.h>
|
||||
#include <assert.h>
|
||||
|
||||
double range(unsigned int steps, double factor, double gamma)
|
||||
{
|
||||
return pow((steps * (pow(factor, 1/gamma) - 1)), gamma);
|
||||
}
|
||||
|
||||
double max_range_gamma(unsigned int steps, double factor, double *max_range,
|
||||
double glo, double rlo, double gmid, double rmid, double ghi, double rhi)
|
||||
{
|
||||
/* Given three values which contain a peak value (so rmid > rlo and rmid >
|
||||
* rhi) find the peak by repeated division of the range. The algorithm is to
|
||||
* find the range for two gamma values mid-way between the two pairs
|
||||
* (glo,gmid), (ghi,gmid) then find the max; this gives us a new glo/ghi
|
||||
* which must be half the distance apart of the previous pair.
|
||||
*/
|
||||
double gammas[5];
|
||||
double ranges[5];
|
||||
|
||||
gammas[0] = glo; ranges[0] = rlo;
|
||||
gammas[2] = gmid; ranges[2] = rmid;
|
||||
gammas[4] = ghi; ranges[4] = rhi;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
int i, m;
|
||||
|
||||
ranges[1] = range(steps, factor, gammas[1] = (gammas[0]+gammas[2])/2);
|
||||
ranges[3] = range(steps, factor, gammas[3] = (gammas[2]+gammas[4])/2);
|
||||
|
||||
for (m=1, i=2; i<4; ++i)
|
||||
if (ranges[i] >= ranges[m])
|
||||
m = i;
|
||||
|
||||
assert(gammas[0] < gammas[m] && gammas[m] < gammas[4]);
|
||||
assert(ranges[0] < ranges[m] && ranges[m] > ranges[4]);
|
||||
|
||||
gammas[0] = gammas[m-1]; ranges[0] = ranges[m-1];
|
||||
gammas[4] = gammas[m+1]; ranges[4] = ranges[m+1];
|
||||
gammas[2] = gammas[m]; ranges[2] = ranges[m];
|
||||
|
||||
if (((gammas[4] - gammas[0])/gammas[2]-1) < 3*DBL_EPSILON ||
|
||||
((ranges[2] - ranges[0])/ranges[2]-1) < 6*DBL_EPSILON)
|
||||
{
|
||||
*max_range = ranges[2];
|
||||
return gammas[2];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
double best_gamma(unsigned int values, double precision, double *best_range)
|
||||
{
|
||||
/* The 'guess' gamma value is determined by the following formula, which is
|
||||
* itself derived from linear regression using values returned by this
|
||||
* program:
|
||||
*/
|
||||
double gtry = values * precision / 2.736;
|
||||
double rtry;
|
||||
|
||||
/* 'values' needs to be the number of steps after the first, we have to
|
||||
* reserve the first value, 0, for 0, so subtract 2 from values. precision
|
||||
* must be adjusted to the step factor.
|
||||
*/
|
||||
values -= 2U;
|
||||
precision += 1;
|
||||
rtry = range(values, precision, gtry);
|
||||
|
||||
/* Now find two values either side of gtry with a lower range. */
|
||||
{
|
||||
double glo, ghi, rlo, rhi, gbest, rbest;
|
||||
|
||||
glo = gtry;
|
||||
do
|
||||
{
|
||||
glo *= 0.9;
|
||||
rlo = range(values, precision, glo);
|
||||
}
|
||||
while (rlo >= rtry);
|
||||
|
||||
ghi = gtry;
|
||||
do
|
||||
{
|
||||
ghi *= 1.1;
|
||||
rhi = range(values, precision, ghi);
|
||||
}
|
||||
while (rhi >= rtry);
|
||||
|
||||
gbest = max_range_gamma(values, precision, &rbest,
|
||||
glo, rlo, gtry, rtry, ghi, rhi);
|
||||
|
||||
*best_range = rbest / precision;
|
||||
return gbest;
|
||||
}
|
||||
}
|
||||
|
||||
double linear_regression(double precision, double *bp)
|
||||
{
|
||||
unsigned int values, count = 0;
|
||||
double g_sum = 0, g2_sum = 0, v_sum = 0, v2_sum = 0, gv_sum = 0;
|
||||
|
||||
/* Perform simple linear regression to get:
|
||||
*
|
||||
* gamma = a + b.values
|
||||
*/
|
||||
for (values = 128; values < 65536; ++values, ++count)
|
||||
{
|
||||
double range;
|
||||
double gamma = best_gamma(values, precision, &range);
|
||||
|
||||
g_sum += gamma;
|
||||
g2_sum += gamma * gamma;
|
||||
v_sum += values;
|
||||
v2_sum += values * (double)values;
|
||||
gv_sum += gamma * values;
|
||||
/* printf("%u %g %g\n", values, gamma, range); */
|
||||
}
|
||||
|
||||
g_sum /= count;
|
||||
g2_sum /= count;
|
||||
v_sum /= count;
|
||||
v2_sum /= count;
|
||||
gv_sum /= count;
|
||||
|
||||
{
|
||||
double b = (gv_sum - g_sum * v_sum) / (v2_sum - v_sum * v_sum);
|
||||
*bp = b;
|
||||
return g_sum - b * v_sum;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, const char **argv)
|
||||
{
|
||||
double precision = argc == 2 ? atof(argv[1]) : 0;
|
||||
|
||||
/* Perform a second linear regression here on b:
|
||||
*
|
||||
* b = bA + bB * precision
|
||||
*/
|
||||
if (precision == 0)
|
||||
{
|
||||
double b_sum = 0, b2_sum = 0, p_sum = 0, p2_sum = 0, bp_sum = 0,
|
||||
a_sum = 0, count = 0;
|
||||
|
||||
for (precision = .001; precision <= 0.01; precision += .001, count += 1)
|
||||
{
|
||||
double b;
|
||||
double a = linear_regression(precision, &b);
|
||||
|
||||
b_sum += b;
|
||||
b2_sum += b * b;
|
||||
p_sum += precision;
|
||||
p2_sum += precision * precision;
|
||||
bp_sum += b * precision;
|
||||
a_sum += a;
|
||||
}
|
||||
|
||||
b_sum /= count;
|
||||
b2_sum /= count;
|
||||
p_sum /= count;
|
||||
p2_sum /= count;
|
||||
bp_sum /= count;
|
||||
a_sum /= count;
|
||||
|
||||
{
|
||||
double bB = (bp_sum - b_sum * p_sum) / (p2_sum - p_sum * p_sum);
|
||||
double bA = b_sum - bB * p_sum;
|
||||
|
||||
printf("a = %g, b = %g + precision/%g\n", a_sum, bA, 1/bB);
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
unsigned int bits;
|
||||
double b;
|
||||
double a = linear_regression(precision, &b);
|
||||
printf("precision %g: gamma = %g + values*%g\n", precision, a, b);
|
||||
|
||||
/* For information, given a precision: */
|
||||
for (bits=7U; bits <= 16U; ++bits)
|
||||
{
|
||||
unsigned int values = 1U<<bits;
|
||||
double gamma = values*precision/2.736;
|
||||
double r = range(values-2U, 1+precision, gamma);
|
||||
|
||||
printf("bits: %u, gamma: %g, range: 1:%g\n", bits, gamma, r);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
238
contrib/tools/scale.c
Normal file
238
contrib/tools/scale.c
Normal file
@@ -0,0 +1,238 @@
|
||||
/* Given a target range and a source range work out an expression to scale from
|
||||
* the source to the target of the form:
|
||||
*
|
||||
* (number * mult + add)>>16
|
||||
*
|
||||
* The command arguments are:
|
||||
*
|
||||
* scale target source
|
||||
*
|
||||
* and the program works out a pair of numbers, mult and add, that evaluate:
|
||||
*
|
||||
* number * target
|
||||
* round( --------------- )
|
||||
* source
|
||||
*
|
||||
* exactly for number in the range 0..source
|
||||
*/
|
||||
#define _ISOC99_SOURCE 1
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
|
||||
static double minerr;
|
||||
static unsigned long minmult, minadd, minshift;
|
||||
static long mindelta;
|
||||
|
||||
static int
|
||||
test(unsigned long target, unsigned long source, unsigned long mult,
|
||||
long add, unsigned long shift, long delta)
|
||||
{
|
||||
unsigned long i;
|
||||
double maxerr = 0;
|
||||
double rs = (double)target/source;
|
||||
|
||||
for (i=0; i<=source; ++i)
|
||||
{
|
||||
unsigned long t = i*mult+add;
|
||||
double err = fabs((t >> shift) - i*rs);
|
||||
|
||||
if (err > minerr)
|
||||
return 0;
|
||||
|
||||
if (err > maxerr)
|
||||
maxerr = err;
|
||||
}
|
||||
|
||||
if (maxerr < minerr)
|
||||
{
|
||||
minerr = maxerr;
|
||||
minmult = mult;
|
||||
minadd = add;
|
||||
minshift = shift;
|
||||
mindelta = delta;
|
||||
}
|
||||
|
||||
return maxerr < .5;
|
||||
}
|
||||
|
||||
static int
|
||||
dotest(unsigned long target, unsigned long source, unsigned long mult,
|
||||
long add, unsigned long shift, long delta, int print)
|
||||
{
|
||||
if (test(target, source, mult, add, shift, delta))
|
||||
{
|
||||
if (print & 4)
|
||||
printf(" {%11lu,%6ld /* >>%lu */ }, /* %lu/%lu */\n",
|
||||
mult, add, shift, target, source);
|
||||
|
||||
else if (print & 2)
|
||||
printf(" {%11lu,%6ld,%3lu }, /* %lu/%lu */\n",
|
||||
mult, add, shift, target, source);
|
||||
|
||||
else if (print)
|
||||
printf("number * %lu/%lu = (number * %lu + %ld) >> %lu [delta %ld]\n",
|
||||
target, source, mult, add, shift, delta);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
find(unsigned long target, unsigned long source, int print, int fixshift)
|
||||
{
|
||||
unsigned long shift = 0;
|
||||
unsigned long shiftlim = 0;
|
||||
|
||||
/* In the final math the sum is at most (source*mult+add) >> shift, so:
|
||||
*
|
||||
* source*mult+add < 1<<32
|
||||
* mult < (1<<32)/source
|
||||
*
|
||||
* but:
|
||||
*
|
||||
* mult = (target<<shift)/source
|
||||
*
|
||||
* so:
|
||||
*
|
||||
* (target<<shift) < (1<<32)
|
||||
*/
|
||||
if (fixshift < 0)
|
||||
while ((target<<shiftlim) < 0x80000000U) ++shiftlim;
|
||||
|
||||
else
|
||||
shift = shiftlim = (unsigned long)fixshift;
|
||||
|
||||
minerr = 1E8;
|
||||
|
||||
for (; shift<=shiftlim; ++shift)
|
||||
{
|
||||
unsigned long mult = ((target<<shift) + (source>>1)) / source;
|
||||
long delta;
|
||||
long limit = 1; /* seems to be sufficient */
|
||||
long add, start, end;
|
||||
|
||||
end = 1<<shift;
|
||||
start = -end;
|
||||
|
||||
for (add=start; add<=end; ++add)
|
||||
if (dotest(target,source,mult,add,shift,0,print))
|
||||
return 1;
|
||||
|
||||
for (delta=1; delta<=limit; ++delta)
|
||||
{
|
||||
# if 0
|
||||
fprintf(stderr, "%lu/%lu: shift %lu, delta %lu\n", target, source,
|
||||
shift, delta);
|
||||
# endif
|
||||
|
||||
for (add=start; add<=end; ++add)
|
||||
{
|
||||
if (dotest(target, source, mult-delta, add, shift, -delta, print))
|
||||
return 1;
|
||||
|
||||
if (dotest(target, source, mult+delta, add, shift, delta, print))
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (print & 4)
|
||||
printf(" {%11lu,%6ld /* >>%lu */ }, /* %lu/%lu ERROR: .5+%g*/\n",
|
||||
minmult, minadd, minshift, target, source, minerr-.5);
|
||||
|
||||
else if (print & 2)
|
||||
printf(" {%11lu,%6ld,%3lu }, /* %lu/%lu ERROR: .5+%g*/\n",
|
||||
minmult, minadd, minshift, target, source, minerr-.5);
|
||||
|
||||
else if (print)
|
||||
printf(
|
||||
"number * %lu/%lu ~= (number * %lu + %ld) >> %lu +/-.5+%g [delta %ld]\n",
|
||||
target, source, minmult, minadd, minshift, minerr-.5, mindelta);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
usage(const char *prog)
|
||||
{
|
||||
fprintf(stderr,
|
||||
"usage: %s {--denominator|--maxshift|--code} target {source}\n"
|
||||
" For each 'source' prints 'mult' and 'add' such that:\n\n"
|
||||
" (number * mult + add) >> 16 = round(number*target/source)\n\n"
|
||||
" for all integer values of number in the range 0..source.\n\n"
|
||||
" --denominator: swap target and source (specify a single source first\n"
|
||||
" and follow with multiple targets.)\n"
|
||||
" --maxshift: find the lowest shift value that works for all the\n"
|
||||
" repeated 'source' values\n"
|
||||
" --code: output C code for array/structure initialization\n",
|
||||
prog);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, const char **argv)
|
||||
{
|
||||
int i, err = 0, maxshift = 0, firstsrc = 1, code = 0, denominator = 0;
|
||||
unsigned long target, shift = 0;
|
||||
|
||||
while (argc > 1)
|
||||
{
|
||||
if (strcmp(argv[firstsrc], "--maxshift") == 0)
|
||||
{
|
||||
maxshift = 1;
|
||||
++firstsrc;
|
||||
}
|
||||
|
||||
else if (strcmp(argv[firstsrc], "--code") == 0)
|
||||
{
|
||||
code = 1;
|
||||
++firstsrc;
|
||||
}
|
||||
|
||||
else if (strcmp(argv[firstsrc], "--denominator") == 0)
|
||||
{
|
||||
denominator = 1;
|
||||
++firstsrc;
|
||||
}
|
||||
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
if (argc < 2+firstsrc)
|
||||
usage(argv[0]);
|
||||
|
||||
target = strtoul(argv[firstsrc++], 0, 0);
|
||||
if (target == 0) usage(argv[0]);
|
||||
|
||||
for (i=firstsrc; i<argc; ++i)
|
||||
{
|
||||
unsigned long source = strtoul(argv[i], 0, 0);
|
||||
|
||||
if (source == 0) usage(argv[0]);
|
||||
|
||||
if (!find(denominator ? source : target, denominator ? target : source,
|
||||
maxshift ? 0 : 1+code, -1))
|
||||
err = 1;
|
||||
|
||||
if (minshift > shift) shift = minshift;
|
||||
}
|
||||
|
||||
if (maxshift) for (i=firstsrc; i<argc; ++i)
|
||||
{
|
||||
unsigned long source = strtoul(argv[i], 0, 0);
|
||||
|
||||
if (!find(denominator ? source : target, denominator ? target : source,
|
||||
code ? 4 : 1, shift))
|
||||
err = 1;
|
||||
}
|
||||
|
||||
/* Just an exit code - the printout above lists the problem */
|
||||
return err;
|
||||
}
|
||||
12
example.c
12
example.c
@@ -2,8 +2,8 @@
|
||||
#if 0 /* in case someone actually tries to compile this */
|
||||
|
||||
/* example.c - an example of using libpng
|
||||
* Last changed in libpng 1.6.15 [November 20, 2014]
|
||||
* Maintained 1998-2014 Glenn Randers-Pehrson
|
||||
* Last changed in libpng 1.7.0 [(PENDING RELEASE)]
|
||||
* Maintained 1998-2016 Glenn Randers-Pehrson
|
||||
* Maintained 1996, 1997 Andreas Dilger)
|
||||
* Written 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
* To the extent possible under law, the authors have waived
|
||||
@@ -39,7 +39,7 @@
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <png.h>
|
||||
#include <zlib.h>
|
||||
#include PNG_ZLIB_HEADER /* this is the header libpng was built with */
|
||||
|
||||
int main(int argc, const char **argv)
|
||||
{
|
||||
@@ -522,7 +522,7 @@ void read_png(FILE *fp, int sig_read) /* File is already open */
|
||||
png_set_swap(png_ptr);
|
||||
|
||||
/* Add filler (or alpha) byte (before/after each RGB triplet) */
|
||||
png_set_filler(png_ptr, 0xffff, PNG_FILLER_AFTER);
|
||||
png_set_filler(png_ptr, 0xff, PNG_FILLER_AFTER);
|
||||
|
||||
#ifdef PNG_READ_INTERLACING_SUPPORTED
|
||||
/* Turn on interlace handling. REQUIRED if you are not using
|
||||
@@ -530,9 +530,9 @@ void read_png(FILE *fp, int sig_read) /* File is already open */
|
||||
* see the png_read_row() method below:
|
||||
*/
|
||||
number_passes = png_set_interlace_handling(png_ptr);
|
||||
#else
|
||||
#else /* !READ_INTERLACING */
|
||||
number_passes = 1;
|
||||
#endif /* READ_INTERLACING */
|
||||
#endif /* !READ_INTERLACING */
|
||||
|
||||
|
||||
/* Optional call to gamma correct and add the background to the palette
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
libpng-manual.txt - A description on how to use and modify libpng
|
||||
|
||||
libpng version 1.6.22beta03 - March 9, 2016
|
||||
libpng version 1.7.0beta80 - May 6, 2016
|
||||
Updated and distributed by Glenn Randers-Pehrson
|
||||
<glennrp at users.sourceforge.net>
|
||||
Copyright (c) 1998-2016 Glenn Randers-Pehrson
|
||||
Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||
|
||||
This document is released under the libpng license.
|
||||
For conditions of distribution and use, see the disclaimer
|
||||
@@ -11,15 +11,15 @@ libpng-manual.txt - A description on how to use and modify libpng
|
||||
|
||||
Based on:
|
||||
|
||||
libpng versions 0.97, January 1998, through 1.6.22beta03 - March 9, 2016
|
||||
libpng versions 0.97, January 1998, through 1.7.0beta80 - May 6, 2016
|
||||
Updated and distributed by Glenn Randers-Pehrson
|
||||
Copyright (c) 1998-2016 Glenn Randers-Pehrson
|
||||
Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||
|
||||
libpng 1.0 beta 6 - version 0.96 - May 28, 1997
|
||||
libpng 1.0 beta 6 version 0.96 May 28, 1997
|
||||
Updated and distributed by Andreas Dilger
|
||||
Copyright (c) 1996, 1997 Andreas Dilger
|
||||
|
||||
libpng 1.0 beta 2 - version 0.88 - January 26, 1996
|
||||
libpng 1.0 beta 2 - version 0.88 January 26, 1996
|
||||
For conditions of distribution and use, see copyright
|
||||
notice in png.h. Copyright (c) 1995, 1996 Guy Eric
|
||||
Schalnat, Group 42, Inc.
|
||||
@@ -42,10 +42,11 @@ libpng-manual.txt - A description on how to use and modify libpng
|
||||
X. Changes to Libpng from version 1.0.x/1.2.x to 1.4.x
|
||||
XI. Changes to Libpng from version 1.4.x to 1.5.x
|
||||
XII. Changes to Libpng from version 1.5.x to 1.6.x
|
||||
XIII. Detecting libpng
|
||||
XIV. Source code repository
|
||||
XV. Coding style
|
||||
XVI. Y2K Compliance in libpng
|
||||
XIII. Changes to Libpng from version 1.6.x to 1.7.x
|
||||
XIV. Detecting libpng
|
||||
XV. Source code repository
|
||||
XVI. Coding style
|
||||
XVII. Y2K Compliance in libpng
|
||||
|
||||
I. Introduction
|
||||
|
||||
@@ -345,23 +346,22 @@ then only check the bytes (if any) that your program didn't read.
|
||||
to replace them with custom functions. See the discussion under
|
||||
Customizing libpng.
|
||||
|
||||
|
||||
FILE *fp = fopen(file_name, "rb");
|
||||
if (!fp)
|
||||
{
|
||||
return (ERROR);
|
||||
}
|
||||
|
||||
if (fread(header, 1, number, fp) != number)
|
||||
{
|
||||
return (ERROR);
|
||||
}
|
||||
|
||||
fread(header, 1, number, fp);
|
||||
is_png = !png_sig_cmp(header, 0, number);
|
||||
|
||||
if (!is_png)
|
||||
{
|
||||
return (NOT_PNG);
|
||||
}
|
||||
|
||||
|
||||
Next, png_struct and png_info need to be allocated and initialized. In
|
||||
order to ensure that the size of these structures is correct even with a
|
||||
dynamically linked libpng, there are functions to initialize and
|
||||
@@ -429,12 +429,16 @@ an end_info structure.
|
||||
|
||||
If you would rather avoid the complexity of setjmp/longjmp issues,
|
||||
you can compile libpng with PNG_NO_SETJMP, in which case
|
||||
errors will result in a call to PNG_ABORT() which defaults to abort().
|
||||
errors will result in a call to PNG_ABORT which defaults to abort().
|
||||
|
||||
You can #define PNG_ABORT() to a function that does something
|
||||
You can #define PNG_ABORT to a function or other C code that does something
|
||||
more useful than abort(), as long as your function does not
|
||||
return.
|
||||
|
||||
If you do this, you cannot #define PNG_SIMPLIFIED_READ_SUPPORTED or
|
||||
PNG_SIMPLIFIED_WRITE_SUPPORTED, because the simplified API requires
|
||||
setjmp() support.
|
||||
|
||||
Now you need to set up the input code. The default for libpng is to
|
||||
use the C function fread(). If you use this, you will need to pass a
|
||||
valid FILE * in the function png_init_io(). Be sure that the file is
|
||||
@@ -526,15 +530,15 @@ you can retrieve with
|
||||
|
||||
png_get_user_chunk_ptr(png_ptr);
|
||||
|
||||
If you call the png_set_read_user_chunk_fn() function, then all unknown
|
||||
chunks which the callback does not handle will be saved when read. You can
|
||||
cause them to be discarded by returning '1' ("handled") instead of '0'. This
|
||||
behavior will change in libpng 1.7 and the default handling set by the
|
||||
png_set_keep_unknown_chunks() function, described below, will be used when the
|
||||
callback returns 0. If you want the existing behavior you should set the global
|
||||
default to PNG_HANDLE_CHUNK_IF_SAFE now; this is compatible with all current
|
||||
versions of libpng and with 1.7. Libpng 1.6 issues a warning if you keep the
|
||||
default, or PNG_HANDLE_CHUNK_NEVER, and the callback returns 0.
|
||||
If you call the png_set_read_user_chunk_fn() function, then all unknown chunks
|
||||
will be passed to your callback when read. You can cause known chunks to be
|
||||
passed in as well by using png_set_keep_unknown_chunks (see below) - this will
|
||||
prevent the normal libpng handling of those known chunks.
|
||||
|
||||
If your callback returns 0 the default unknown handling will be used (see
|
||||
below). This is new behavior in libpng 1.7, prior to 1.7 it was not possible to
|
||||
discard a chunk; PNG_HANDLE_CHUNK_IF_SAFE was forced. Libpng 1.6.0 issues a
|
||||
warning when this was done.
|
||||
|
||||
At this point, you can set up a callback function that will be
|
||||
called after each row has been read, which you can use to control
|
||||
@@ -633,10 +637,8 @@ callback function:
|
||||
...
|
||||
|
||||
#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
|
||||
/* ignore all unknown chunks
|
||||
* (use global setting "2" for libpng16 and earlier):
|
||||
*/
|
||||
png_set_keep_unknown_chunks(read_ptr, 2, NULL, 0);
|
||||
/* ignore all unknown chunks: */
|
||||
png_set_keep_unknown_chunks(read_ptr, 1, NULL, 0);
|
||||
|
||||
/* except for vpAg: */
|
||||
png_set_keep_unknown_chunks(read_ptr, 2, vpAg, 1);
|
||||
@@ -650,13 +652,15 @@ User limits
|
||||
|
||||
The PNG specification allows the width and height of an image to be as
|
||||
large as 2^31-1 (0x7fffffff), or about 2.147 billion rows and columns.
|
||||
For safety, libpng imposes a default limit of 1 million rows and columns.
|
||||
Since very few applications really need to process such large images,
|
||||
we have imposed an arbitrary 1,000,000 limit on rows and columns.
|
||||
Larger images will be rejected immediately with a png_error() call. If
|
||||
you wish to change these limits, you can use
|
||||
you wish to change this limit, you can use
|
||||
|
||||
png_set_user_limits(png_ptr, width_max, height_max);
|
||||
|
||||
to set your own limits (libpng may reject some very wide images
|
||||
to set your own limits, or use width_max = height_max = 0x7fffffffL
|
||||
to allow all valid dimensions (libpng may reject some very large images
|
||||
anyway because of potential buffer overflow conditions).
|
||||
|
||||
You should put this statement after you create the PNG structure and
|
||||
@@ -671,11 +675,8 @@ If you need to retrieve the limits that are being applied, use
|
||||
height_max = png_get_user_height_max(png_ptr);
|
||||
|
||||
The PNG specification sets no limit on the number of ancillary chunks
|
||||
allowed in a PNG datastream. By default, libpng imposes a limit of
|
||||
a total of 1000 sPLT, tEXt, iTXt, zTXt, and unknown chunks to be stored.
|
||||
If you have set up both info_ptr and end_info_ptr, the limit applies
|
||||
separately to each. You can change the limit on the total number of such
|
||||
chunks that will be stored, with
|
||||
allowed in a PNG datastream. You can impose a limit on the total number
|
||||
of sPLT, tEXt, iTXt, zTXt, and unknown chunks that will be stored, with
|
||||
|
||||
png_set_chunk_cache_max(png_ptr, user_chunk_cache_max);
|
||||
|
||||
@@ -683,9 +684,8 @@ where 0x7fffffffL means unlimited. You can retrieve this limit with
|
||||
|
||||
chunk_cache_max = png_get_chunk_cache_max(png_ptr);
|
||||
|
||||
Libpng imposes a limit of 8 Megabytes (8,000,000 bytes) on the amount of
|
||||
memory that a compressed chunk other than IDAT can occupy, when decompressed.
|
||||
You can change this limit with
|
||||
You can also set a limit on the amount of memory that a compressed chunk
|
||||
other than IDAT can occupy, with
|
||||
|
||||
png_set_chunk_malloc_max(png_ptr, user_chunk_malloc_max);
|
||||
|
||||
@@ -1186,7 +1186,10 @@ row_pointers prior to calling png_read_png() with
|
||||
png_set_rows(png_ptr, info_ptr, &row_pointers);
|
||||
|
||||
Alternatively you could allocate your image in one big block and define
|
||||
row_pointers[i] to point into the proper places in your block.
|
||||
row_pointers[i] to point into the proper places in your block. If
|
||||
you do this, be sure to call png_read_update_info() described below,
|
||||
to update the "rowbytes" value to account for any transformations that
|
||||
change the number of bytes per row before you use it to allocate your block.
|
||||
|
||||
If you use png_set_rows(), the application is responsible for freeing
|
||||
row_pointers (and row_pointers[i], if they were separately allocated).
|
||||
@@ -1275,12 +1278,13 @@ in until png_read_end() has read the chunk data following the image.
|
||||
interlace_type, compression_type, or filter_method can
|
||||
be NULL if you are not interested in their values.
|
||||
|
||||
Note that png_get_IHDR() returns 32-bit data into
|
||||
Note that png_get_IHDR() returns png_uint_32 data into
|
||||
the application's width and height variables.
|
||||
This is an unsafe situation if these are not png_uint_32
|
||||
variables. In such situations, the
|
||||
png_get_image_width() and png_get_image_height()
|
||||
functions described below are safer.
|
||||
variables, or if they are 32-bit variables on a 64-bit
|
||||
platform. In such situations, the png_get_image_width()
|
||||
and png_get_image_height() functions described below are
|
||||
safer.
|
||||
|
||||
width = png_get_image_width(png_ptr,
|
||||
info_ptr);
|
||||
@@ -1463,6 +1467,11 @@ png_set_rgb_to_gray()).
|
||||
PNG_ITXT_COMPRESSION_NONE
|
||||
PNG_ITXT_COMPRESSION_zTXt
|
||||
|
||||
text_ptr[i].location - location of chunk
|
||||
PNG_HAVE_IHDR
|
||||
PNG_HAVE_PLTE
|
||||
PNG_AFTER_IDAT
|
||||
|
||||
text_ptr[i].key - keyword for comment. Must contain
|
||||
1-79 characters.
|
||||
|
||||
@@ -1685,16 +1694,15 @@ described below.
|
||||
Data will be decoded into the supplied row buffers packed into bytes
|
||||
unless the library has been told to transform it into another format.
|
||||
For example, 4 bit/pixel paletted or grayscale data will be returned
|
||||
2 pixels/byte with the leftmost pixel in the high-order bits of the byte,
|
||||
unless png_set_packing() is called. 8-bit RGB data will be stored
|
||||
2 pixels/byte with the leftmost pixel in the high-order bits of the
|
||||
byte, unless png_set_packing() is called. 8-bit RGB data will be stored
|
||||
in RGB RGB RGB format unless png_set_filler() or png_set_add_alpha()
|
||||
is called to insert filler bytes, either before or after each RGB triplet.
|
||||
|
||||
16-bit RGB data will be returned RRGGBB RRGGBB, with the most significant
|
||||
byte of the color value first, unless png_set_scale_16() is called to
|
||||
transform it to regular RGB RGB triplets, or png_set_filler() or
|
||||
png_set_add alpha() is called to insert two filler bytes, either before
|
||||
or after each RRGGBB triplet. Similarly, 8-bit or 16-bit grayscale data can
|
||||
png_set_add alpha() is called to insert filler bytes, either before or
|
||||
after each RRGGBB triplet. Similarly, 8-bit or 16-bit grayscale data can
|
||||
be modified with png_set_filler(), png_set_add_alpha(), png_set_strip_16(),
|
||||
or png_set_scale_16().
|
||||
|
||||
@@ -1851,13 +1859,12 @@ into 4 or 8 bytes for windowing systems that need them in this format:
|
||||
if (color_type == PNG_COLOR_TYPE_RGB)
|
||||
png_set_filler(png_ptr, filler, PNG_FILLER_BEFORE);
|
||||
|
||||
where "filler" is the 8-bit or 16-bit number to fill with, and the location
|
||||
is either PNG_FILLER_BEFORE or PNG_FILLER_AFTER, depending upon whether
|
||||
you want the filler before the RGB or after. When filling an 8-bit pixel,
|
||||
the least significant 8 bits of the number are used, if a 16-bit number is
|
||||
supplied. This transformation does not affect images that already have full
|
||||
alpha channels. To add an opaque alpha channel, use filler=0xffff and
|
||||
PNG_FILLER_AFTER which will generate RGBA pixels.
|
||||
where "filler" is the 8 or 16-bit number to fill with, and the location is
|
||||
either PNG_FILLER_BEFORE or PNG_FILLER_AFTER, depending upon whether
|
||||
you want the filler before the RGB or after. This transformation
|
||||
does not affect images that already have full alpha channels. To add an
|
||||
opaque alpha channel, use filler=0xff or 0xffff and PNG_FILLER_AFTER which
|
||||
will generate RGBA pixels.
|
||||
|
||||
Note that png_set_filler() does not change the color type. If you want
|
||||
to do that, you can add a true alpha channel with
|
||||
@@ -1867,7 +1874,7 @@ to do that, you can add a true alpha channel with
|
||||
png_set_add_alpha(png_ptr, filler, PNG_FILLER_AFTER);
|
||||
|
||||
where "filler" contains the alpha value to assign to each pixel.
|
||||
The png_set_add_alpha() function was added in libpng-1.2.7.
|
||||
This function was added in libpng-1.2.7.
|
||||
|
||||
If you are reading an image with an alpha channel, and you need the
|
||||
data as ARGB instead of the normal PNG format RGBA:
|
||||
@@ -2745,11 +2752,10 @@ section below for more information on the libpng error handling.
|
||||
|
||||
If you would rather avoid the complexity of setjmp/longjmp issues,
|
||||
you can compile libpng with PNG_NO_SETJMP, in which case
|
||||
errors will result in a call to PNG_ABORT() which defaults to abort().
|
||||
errors will result in a call to PNG_ABORT which defaults to abort().
|
||||
|
||||
You can #define PNG_ABORT() to a function that does something
|
||||
more useful than abort(), as long as your function does not
|
||||
return.
|
||||
You can #define PNG_ABORT to a function or other C code that does something
|
||||
more useful than abort(), as long as your function does not return.
|
||||
|
||||
Checking for invalid palette index on write was added at libpng
|
||||
1.5.10. If a pixel contains an invalid (out-of-range) index libpng issues
|
||||
@@ -2960,7 +2966,6 @@ width, height, bit_depth, and color_type must be the same in each call.
|
||||
(array of png_color)
|
||||
num_palette - number of entries in the palette
|
||||
|
||||
|
||||
png_set_gAMA(png_ptr, info_ptr, file_gamma);
|
||||
png_set_gAMA_fixed(png_ptr, info_ptr, int_file_gamma);
|
||||
|
||||
@@ -3085,6 +3090,10 @@ width, height, bit_depth, and color_type must be the same in each call.
|
||||
PNG_TEXT_COMPRESSION_zTXt
|
||||
PNG_ITXT_COMPRESSION_NONE
|
||||
PNG_ITXT_COMPRESSION_zTXt
|
||||
text_ptr[i].location - location of chunk
|
||||
PNG_HAVE_IHDR
|
||||
PNG_HAVE_PLTE
|
||||
PNG_AFTER_IDAT
|
||||
text_ptr[i].key - keyword for comment. Must contain
|
||||
1-79 characters.
|
||||
text_ptr[i].text - text comments for current
|
||||
@@ -3268,7 +3277,7 @@ tEXt chunk use RFC 1123 format dates (e.g. "22 May 1997 18:07:10 GMT"),
|
||||
although this isn't a requirement. Unlike the tIME chunk, the
|
||||
"Creation Time" tEXt chunk is not expected to be automatically changed
|
||||
by the software. To facilitate the use of RFC 1123 dates, a function
|
||||
png_convert_to_rfc1123_buffer(buffer, png_timep) is provided to
|
||||
png_convert_to_rfc1123_buffer(png_ptr, buffer, png_timep) is provided to
|
||||
convert from PNG time to an RFC 1123 format string. The caller must provide
|
||||
a writeable buffer of at least 29 bytes.
|
||||
|
||||
@@ -3725,26 +3734,21 @@ as a wide variety of APIs to manipulate ancilliary information.
|
||||
|
||||
To read a PNG file using the simplified API:
|
||||
|
||||
1) Declare a 'png_image' structure (see below) on the stack, set the
|
||||
version field to PNG_IMAGE_VERSION and the 'opaque' pointer to NULL
|
||||
(this is REQUIRED, your program may crash if you don't do it.)
|
||||
1) Declare a 'png_image' structure (see below) on the
|
||||
stack and memset() it to all zero.
|
||||
|
||||
2) Call the appropriate png_image_begin_read... function.
|
||||
|
||||
3) Set the png_image 'format' member to the required sample format.
|
||||
3) Set the png_image 'format' member to the required
|
||||
format and allocate a buffer for the image.
|
||||
|
||||
4) Allocate a buffer for the image and, if required, the color-map.
|
||||
|
||||
5) Call png_image_finish_read to read the image and, if required, the
|
||||
color-map into your buffers.
|
||||
4) Call png_image_finish_read to read the image into
|
||||
your buffer.
|
||||
|
||||
There are no restrictions on the format of the PNG input itself; all valid
|
||||
color types, bit depths, and interlace methods are acceptable, and the
|
||||
input image is transformed as necessary to the requested in-memory format
|
||||
during the png_image_finish_read() step. The only caveat is that if you
|
||||
request a color-mapped image from a PNG that is full-color or makes
|
||||
complex use of an alpha channel the transformation is extremely lossy and the
|
||||
result may look terrible.
|
||||
during the png_image_finish_read() step.
|
||||
|
||||
To write a PNG file using the simplified API:
|
||||
|
||||
@@ -3753,14 +3757,13 @@ To write a PNG file using the simplified API:
|
||||
|
||||
2) Initialize the members of the structure that describe the
|
||||
image, setting the 'format' member to the format of the
|
||||
image samples.
|
||||
image in memory.
|
||||
|
||||
3) Call the appropriate png_image_write... function with a
|
||||
pointer to the image and, if necessary, the color-map to write
|
||||
the PNG data.
|
||||
pointer to the image to write the PNG data.
|
||||
|
||||
png_image is a structure that describes the in-memory format of an image
|
||||
when it is being read or defines the in-memory format of an image that you
|
||||
when it is being read or define the in-memory format of an image that you
|
||||
need to write. The "png_image" structure contains the following members:
|
||||
|
||||
png_controlp opaque Initialize to NULL, free with png_image_free
|
||||
@@ -3773,15 +3776,15 @@ need to write. The "png_image" structure contains the following members:
|
||||
png_uint_32 warning_or_error;
|
||||
char message[64];
|
||||
|
||||
In the event of an error or warning the "warning_or_error"
|
||||
In the event of an error or warning the following field warning_or_error
|
||||
field will be set to a non-zero value and the 'message' field will contain
|
||||
a '\0' terminated string with the libpng error or warning message. If both
|
||||
warnings and an error were encountered, only the error is recorded. If there
|
||||
are multiple warnings, only the first one is recorded.
|
||||
|
||||
The upper 30 bits of the "warning_or_error" value are reserved; the low two
|
||||
bits contain a two bit code such that a value more than 1 indicates a failure
|
||||
in the API just called:
|
||||
The upper 30 bits of this value are reserved; the low two bits contain
|
||||
a two bit code such that a value more than 1 indicates a failure in the API
|
||||
just called:
|
||||
|
||||
0 - no warning or error
|
||||
1 - warning
|
||||
@@ -3813,72 +3816,64 @@ channels are linear. Color channels use the RGB encoding (RGB end-points) of
|
||||
the sRGB specification. This encoding is identified by the
|
||||
PNG_FORMAT_FLAG_LINEAR flag below.
|
||||
|
||||
When the simplified API needs to convert between sRGB and linear colorspaces,
|
||||
the actual sRGB transfer curve defined in the sRGB specification (see the
|
||||
article at http://en.wikipedia.org/wiki/SRGB) is used, not the gamma=1/2.2
|
||||
approximation used elsewhere in libpng.
|
||||
|
||||
When an alpha channel is present it is expected to denote pixel coverage
|
||||
of the color or luminance channels and is returned as an associated alpha
|
||||
channel: the color/gray channels are scaled (pre-multiplied) by the alpha
|
||||
value.
|
||||
|
||||
The samples are either contained directly in the image data, between 1 and 8
|
||||
bytes per pixel according to the encoding, or are held in a color-map indexed
|
||||
by bytes in the image data. In the case of a color-map the color-map entries
|
||||
are individual samples, encoded as above, and the image data has one byte per
|
||||
pixel to select the relevant sample from the color-map.
|
||||
When a color-mapped image is used as a result of calling
|
||||
png_image_read_colormap or png_image_write_colormap the channels are encoded
|
||||
in the color-map and the descriptions above apply to the color-map entries.
|
||||
The image data is encoded as small integers, value 0..255, that index the
|
||||
entries in the color-map. One integer (one byte) is stored for each pixel.
|
||||
|
||||
PNG_FORMAT_*
|
||||
|
||||
The #defines to be used in png_image::format. Each #define identifies a
|
||||
particular layout of channel data and, if present, alpha values. There are
|
||||
separate defines for each of the two component encodings.
|
||||
separate defines for each of the two channel encodings.
|
||||
|
||||
A format is built up using single bit flag values. All combinations are
|
||||
valid. Formats can be built up from the flag values or you can use one of
|
||||
the predefined values below. When testing formats always use the FORMAT_FLAG
|
||||
macros to test for individual features - future versions of the library may
|
||||
add new flags.
|
||||
A format is built up using single bit flag values. Not all combinations are
|
||||
valid: use the bit flag values below for testing a format returned by the
|
||||
read APIs, but set formats from the derived values.
|
||||
|
||||
When reading or writing color-mapped images the format should be set to the
|
||||
format of the entries in the color-map then png_image_{read,write}_colormap
|
||||
called to read or write the color-map and set the format correctly for the
|
||||
image data. Do not set the PNG_FORMAT_FLAG_COLORMAP bit directly!
|
||||
|
||||
NOTE: libpng can be built with particular features disabled. If you see
|
||||
NOTE: libpng can be built with particular features disabled, if you see
|
||||
compiler errors because the definition of one of the following flags has been
|
||||
compiled out it is because libpng does not have the required support. It is
|
||||
possible, however, for the libpng configuration to enable the format on just
|
||||
read or just write; in that case you may see an error at run time.
|
||||
You can guard against this by checking for the definition of the
|
||||
appropriate "_SUPPORTED" macro, one of:
|
||||
read or just write; in that case you may see an error at run time. You can
|
||||
guard against this by checking for the definition of:
|
||||
|
||||
PNG_SIMPLIFIED_{READ,WRITE}_{BGR,AFIRST}_SUPPORTED
|
||||
|
||||
PNG_FORMAT_FLAG_ALPHA format with an alpha channel
|
||||
PNG_FORMAT_FLAG_COLOR color format: otherwise grayscale
|
||||
PNG_FORMAT_FLAG_LINEAR 2-byte channels else 1-byte
|
||||
PNG_FORMAT_FLAG_COLORMAP image data is color-mapped
|
||||
PNG_FORMAT_FLAG_BGR BGR colors, else order is RGB
|
||||
PNG_FORMAT_FLAG_AFIRST alpha channel comes first
|
||||
PNG_FORMAT_FLAG_ALPHA 0x01 format with an alpha channel
|
||||
PNG_FORMAT_FLAG_COLOR 0x02 color format: otherwise grayscale
|
||||
PNG_FORMAT_FLAG_LINEAR 0x04 png_uint_16 channels else png_byte
|
||||
PNG_FORMAT_FLAG_COLORMAP 0x08 libpng use only
|
||||
PNG_FORMAT_FLAG_BGR 0x10 BGR colors, else order is RGB
|
||||
PNG_FORMAT_FLAG_AFIRST 0x20 alpha channel comes first
|
||||
|
||||
Supported formats are as follows. Future versions of libpng may support more
|
||||
formats; for compatibility with older versions simply check if the format
|
||||
macro is defined using #ifdef. These defines describe the in-memory layout
|
||||
of the components of the pixels of the image.
|
||||
|
||||
First the single byte (sRGB) formats:
|
||||
First the single byte formats:
|
||||
|
||||
PNG_FORMAT_GRAY
|
||||
PNG_FORMAT_GA
|
||||
PNG_FORMAT_AG
|
||||
PNG_FORMAT_RGB
|
||||
PNG_FORMAT_BGR
|
||||
PNG_FORMAT_RGBA
|
||||
PNG_FORMAT_ARGB
|
||||
PNG_FORMAT_BGRA
|
||||
PNG_FORMAT_ABGR
|
||||
PNG_FORMAT_GRAY 0
|
||||
PNG_FORMAT_GA PNG_FORMAT_FLAG_ALPHA
|
||||
PNG_FORMAT_AG (PNG_FORMAT_GA|PNG_FORMAT_FLAG_AFIRST)
|
||||
PNG_FORMAT_RGB PNG_FORMAT_FLAG_COLOR
|
||||
PNG_FORMAT_BGR (PNG_FORMAT_FLAG_COLOR|PNG_FORMAT_FLAG_BGR)
|
||||
PNG_FORMAT_RGBA (PNG_FORMAT_RGB|PNG_FORMAT_FLAG_ALPHA)
|
||||
PNG_FORMAT_ARGB (PNG_FORMAT_RGBA|PNG_FORMAT_FLAG_AFIRST)
|
||||
PNG_FORMAT_BGRA (PNG_FORMAT_BGR|PNG_FORMAT_FLAG_ALPHA)
|
||||
PNG_FORMAT_ABGR (PNG_FORMAT_BGRA|PNG_FORMAT_FLAG_AFIRST)
|
||||
|
||||
Then the linear 2-byte formats. When naming these "Y" is used to
|
||||
indicate a luminance (gray) channel. The component order within the pixel
|
||||
@@ -3887,22 +3882,22 @@ components in the linear format. The components are 16-bit integers in
|
||||
the native byte order for your platform, and there is no provision for
|
||||
swapping the bytes to a different endian condition.
|
||||
|
||||
PNG_FORMAT_LINEAR_Y
|
||||
PNG_FORMAT_LINEAR_Y PNG_FORMAT_FLAG_LINEAR
|
||||
PNG_FORMAT_LINEAR_Y_ALPHA
|
||||
(PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_ALPHA)
|
||||
PNG_FORMAT_LINEAR_RGB
|
||||
(PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_COLOR)
|
||||
PNG_FORMAT_LINEAR_RGB_ALPHA
|
||||
(PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_COLOR|
|
||||
PNG_FORMAT_FLAG_ALPHA)
|
||||
|
||||
With color-mapped formats the image data is one byte for each pixel. The byte
|
||||
is an index into the color-map which is formatted as above. To obtain a
|
||||
color-mapped format it is sufficient just to add the PNG_FOMAT_FLAG_COLORMAP
|
||||
to one of the above definitions, or you can use one of the definitions below.
|
||||
Color-mapped formats are obtained by calling png_image_{read,write}_colormap,
|
||||
as appropriate after setting png_image::format to the format of the color-map
|
||||
to be read or written. Applications may check the value of
|
||||
PNG_FORMAT_FLAG_COLORMAP to see if they have called the colormap API. The
|
||||
format of the color-map may be extracted using the following macro.
|
||||
|
||||
PNG_FORMAT_RGB_COLORMAP
|
||||
PNG_FORMAT_BGR_COLORMAP
|
||||
PNG_FORMAT_RGBA_COLORMAP
|
||||
PNG_FORMAT_ARGB_COLORMAP
|
||||
PNG_FORMAT_BGRA_COLORMAP
|
||||
PNG_FORMAT_ABGR_COLORMAP
|
||||
PNG_FORMAT_OF_COLORMAP(fmt) ((fmt) & ~PNG_FORMAT_FLAG_COLORMAP)
|
||||
|
||||
PNG_IMAGE macros
|
||||
|
||||
@@ -3910,9 +3905,9 @@ These are convenience macros to derive information from a png_image
|
||||
structure. The PNG_IMAGE_SAMPLE_ macros return values appropriate to the
|
||||
actual image sample values - either the entries in the color-map or the
|
||||
pixels in the image. The PNG_IMAGE_PIXEL_ macros return corresponding values
|
||||
for the pixels and will always return 1 for color-mapped formats. The
|
||||
remaining macros return information about the rows in the image and the
|
||||
complete image.
|
||||
for the pixels and will always return 1 after a call to
|
||||
png_image_{read,write}_colormap. The remaining macros return information
|
||||
about the rows in the image and the complete image.
|
||||
|
||||
NOTE: All the macros that take a png_image::format parameter are compile time
|
||||
constants if the format parameter is, itself, a constant. Therefore these
|
||||
@@ -3920,39 +3915,46 @@ macros can be used in array declarations and case labels where required.
|
||||
Similarly the macros are also pre-processor constants (sizeof is not used) so
|
||||
they can be used in #if tests.
|
||||
|
||||
First the information about the samples.
|
||||
|
||||
PNG_IMAGE_SAMPLE_CHANNELS(fmt)
|
||||
Returns the total number of channels in a given format: 1..4
|
||||
|
||||
PNG_IMAGE_SAMPLE_COMPONENT_SIZE(fmt)
|
||||
Returns the size in bytes of a single component of a pixel or color-map
|
||||
entry (as appropriate) in the image: 1 or 2.
|
||||
entry (as appropriate) in the image.
|
||||
|
||||
PNG_IMAGE_SAMPLE_SIZE(fmt)
|
||||
This is the size of the sample data for one sample. If the image is
|
||||
color-mapped it is the size of one color-map entry (and image pixels are
|
||||
one byte in size), otherwise it is the size of one image pixel.
|
||||
|
||||
PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(fmt)
|
||||
The maximum size of the color-map required by the format expressed in a
|
||||
count of components. This can be used to compile-time allocate a
|
||||
color-map:
|
||||
|
||||
png_uint_16 colormap[PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(linear_fmt)];
|
||||
|
||||
png_byte colormap[PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(sRGB_fmt)];
|
||||
|
||||
Alternatively use the PNG_IMAGE_COLORMAP_SIZE macro below to use the
|
||||
information from one of the png_image_begin_read_ APIs and dynamically
|
||||
allocate the required memory.
|
||||
|
||||
PNG_IMAGE_COLORMAP_SIZE(fmt)
|
||||
The size of the color-map required by the format; this is the size of the
|
||||
color-map buffer passed to the png_image_{read,write}_colormap APIs. It is
|
||||
color-map buffer passed to the png_image_{read,write}_colormap APIs, it is
|
||||
a fixed number determined by the format so can easily be allocated on the
|
||||
stack if necessary.
|
||||
|
||||
#define PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(fmt)\
|
||||
(PNG_IMAGE_SAMPLE_CHANNELS(fmt) * 256)
|
||||
/* The maximum size of the color-map required by the format expressed in a
|
||||
* count of components. This can be used to compile-time allocate a
|
||||
* color-map:
|
||||
*
|
||||
* png_uint_16 colormap[PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(linear_fmt)];
|
||||
*
|
||||
* png_byte colormap[PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(sRGB_fmt)];
|
||||
*
|
||||
* Alternatively, use the PNG_IMAGE_COLORMAP_SIZE macro below to use the
|
||||
* information from one of the png_image_begin_read_ APIs and dynamically
|
||||
* allocate the required memory.
|
||||
*/
|
||||
|
||||
|
||||
Corresponding information about the pixels
|
||||
|
||||
PNG_IMAGE_PIXEL_(test,fmt)
|
||||
|
||||
PNG_IMAGE_PIXEL_CHANNELS(fmt)
|
||||
The number of separate channels (components) in a pixel; 1 for a
|
||||
color-mapped image.
|
||||
@@ -3978,54 +3980,19 @@ Information about the whole row, or whole image
|
||||
to start the next row on a 4-byte boundary.
|
||||
|
||||
PNG_IMAGE_BUFFER_SIZE(image, row_stride)
|
||||
Return the size, in bytes, of an image buffer given a png_image and a row
|
||||
stride - the number of components to leave space for in each row.
|
||||
|
||||
PNG_IMAGE_SIZE(image)
|
||||
Return the size, in bytes, of the image in memory given just a png_image;
|
||||
the row stride is the minimum stride required for the image.
|
||||
|
||||
PNG_IMAGE_COLORMAP_SIZE(image)
|
||||
Return the size, in bytes, of the color-map of this image. If the image
|
||||
format is not a color-map format this will return a size sufficient for
|
||||
256 entries in the given format; check PNG_FORMAT_FLAG_COLORMAP if
|
||||
you don't want to allocate a color-map in this case.
|
||||
|
||||
PNG_IMAGE_FLAG_*
|
||||
|
||||
Flags containing additional information about the image are held in
|
||||
the 'flags' field of png_image.
|
||||
Returns the size, in bytes, of an image buffer given a png_image and a row
|
||||
stride - the number of components to leave space for in each row. This
|
||||
macro takes care of multiplying row_stride by PNG_IMAGE_PIXEL_COMONENT_SIZE
|
||||
when the image has 2-byte components.
|
||||
|
||||
PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB == 0x01
|
||||
This indicates the the RGB values of the in-memory bitmap do not
|
||||
correspond to the red, green and blue end-points defined by sRGB.
|
||||
|
||||
PNG_IMAGE_FLAG_FAST == 0x02
|
||||
On write emphasise speed over compression; the resultant PNG file will be
|
||||
larger but will be produced significantly faster, particular for large
|
||||
images. Do not use this option for images which will be distributed, only
|
||||
used it when producing intermediate files that will be read back in
|
||||
repeatedly. For a typical 24-bit image the option will double the read
|
||||
speed at the cost of increasing the image size by 25%, however for many
|
||||
more compressible images the PNG file can be 10 times larger with only a
|
||||
slight speed gain.
|
||||
|
||||
PNG_IMAGE_FLAG_16BIT_sRGB == 0x04
|
||||
On read if the image is a 16-bit per component image and there is no gAMA
|
||||
or sRGB chunk assume that the components are sRGB encoded. Notice that
|
||||
images output by the simplified API always have gamma information; setting
|
||||
this flag only affects the interpretation of 16-bit images from an
|
||||
external source. It is recommended that the application expose this flag
|
||||
to the user; the user can normally easily recognize the difference between
|
||||
linear and sRGB encoding. This flag has no effect on write - the data
|
||||
passed to the write APIs must have the correct encoding (as defined
|
||||
above.)
|
||||
|
||||
If the flag is not set (the default) input 16-bit per component data is
|
||||
assumed to be linear.
|
||||
|
||||
NOTE: the flag can only be set after the png_image_begin_read_ call,
|
||||
because that call initializes the 'flags' field.
|
||||
PNG_IMAGE_FLAG_COLORMAP == 0x02
|
||||
The PNG is color-mapped. If this flag is set png_image_read_colormap
|
||||
can be used without further loss of image information. If it is not set
|
||||
png_image_read_colormap will cause significant loss if the image has any
|
||||
|
||||
READ APIs
|
||||
|
||||
@@ -4123,11 +4090,10 @@ a 16-bit linear encoded PNG file is written.
|
||||
|
||||
With all APIs row_stride is handled as in the read APIs - it is the spacing
|
||||
from one row to the next in component sized units (float) and if negative
|
||||
indicates a bottom-up row layout in the buffer. If you pass zero, libpng will
|
||||
calculate the row_stride for you from the width and number of channels.
|
||||
indicates a bottom-up row layout in the buffer.
|
||||
|
||||
Note that the write API does not support interlacing, sub-8-bit pixels,
|
||||
indexed (paletted) images, or most ancillary chunks.
|
||||
and indexed (paletted) images.
|
||||
|
||||
VI. Modifying/Customizing libpng
|
||||
|
||||
@@ -4218,7 +4184,7 @@ Error handling in libpng is done through png_error() and png_warning().
|
||||
Errors handled through png_error() are fatal, meaning that png_error()
|
||||
should never return to its caller. Currently, this is handled via
|
||||
setjmp() and longjmp() (unless you have compiled libpng with
|
||||
PNG_NO_SETJMP, in which case it is handled via PNG_ABORT()),
|
||||
PNG_NO_SETJMP, in which case it is handled via PNG_ABORT),
|
||||
but you could change this to do things like exit() if you should wish,
|
||||
as long as your function does not return.
|
||||
|
||||
@@ -4915,7 +4881,7 @@ limits are now
|
||||
png_user_chunk_malloc_max 0 (unlimited) 8,000,000
|
||||
|
||||
The png_set_option() function (and the "options" member of the png struct) was
|
||||
added to libpng-1.5.15, with option PNG_ARM_NEON.
|
||||
added to libpng-1.5.15.
|
||||
|
||||
The library now supports a complete fixed point implementation and can
|
||||
thus be used on systems that have no floating point support or very
|
||||
@@ -5087,10 +5053,6 @@ enforced. The sRGB chunk is allowed to appear in images with any color type
|
||||
and is interpreted by libpng to convey a one-tracer-curve gray profile or a
|
||||
three-tracer-curve RGB profile as appropriate.
|
||||
|
||||
Libpng 1.5.x erroneously used /MD for Debug DLL builds; if you used the debug
|
||||
builds in your app and you changed your app to use /MD you will need to
|
||||
change it back to /MDd for libpng 1.6.x.
|
||||
|
||||
Prior to libpng-1.6.0 a warning would be issued if the iTXt chunk contained
|
||||
an empty language field or an empty translated keyword. Both of these
|
||||
are allowed by the PNG specification, so these warnings are no longer issued.
|
||||
@@ -5156,12 +5118,58 @@ It can be set for testing debug or beta builds to ensure that they will compile
|
||||
when the build type is switched to RC or STABLE. In essence this overrides the
|
||||
PNG_LIBPNG_BUILD_BASE_TYPE definition which is not directly user controllable.
|
||||
|
||||
Starting with libpng-1.6.19, attempting to set an over-length PLTE chunk
|
||||
is an error. Previously this requirement of the PNG specification was not
|
||||
enforced, and the palette was always limited to 256 entries. An over-length
|
||||
PLTE chunk found in an input PNG is silently truncated.
|
||||
XIII. Changes to Libpng from version 1.6.x to 1.7.x
|
||||
|
||||
XIII. Detecting libpng
|
||||
Some functions that were deprecated in libpng-1.6.0 were removed:
|
||||
png_reset_zstream(),
|
||||
png_info_init_3(),
|
||||
png_data_freer() and its associated flags,
|
||||
png_malloc_default(),
|
||||
and png_free_default().
|
||||
|
||||
These apparently unused experimental functions have been deprecated
|
||||
and the code within them, except for the APIs, has been removed.
|
||||
png_set_filter_heuristics()
|
||||
and png_set_filter_heuristics_fixed()
|
||||
|
||||
A location byte was added to the png_text structure.
|
||||
|
||||
A new private header file, "pngchunk.h", was added.
|
||||
|
||||
The PNG_ABORT() macro was changed to PNG_ABORT, and the default is now
|
||||
"abort()" for all platforms (previously it was "ExitProcess(0)" on
|
||||
Windows platforms). Starting with libpng-1.7.0 you have to define
|
||||
PNG_ABORT instead of PNG_ABORT(), and you must include a terminating
|
||||
semicolon in your definition, e.g.,
|
||||
|
||||
#if PNGCRUSH_LIBPNG_VER >= 10700
|
||||
# ifdef _WINDOWS_
|
||||
# define PNG_ABORT ExitProcess(0);
|
||||
# else
|
||||
# define PNG_ABORT abort();
|
||||
# endif
|
||||
#else
|
||||
# ifdef _WINDOWS_
|
||||
# define PNG_ABORT() ExitProcess(0)
|
||||
# else
|
||||
# define PNG_ABORT() abort()
|
||||
# endif
|
||||
#endif
|
||||
|
||||
The png_get_IHDR() function now allows users to supply NULL for any
|
||||
argument in which they aren't interested. Previously, the width, height,
|
||||
bit_depth, and color_type arguments were not allowed to be NULL.
|
||||
|
||||
The 8-bit compose and rgb_to_grayscale operations were made more accurate.
|
||||
While these did not introduce API incompatibility, there may be differences
|
||||
in unit test results.
|
||||
|
||||
Internal "affirm()" and "impossible()" macros were added, along with
|
||||
some internal supporting macros and functions. These are similar to the
|
||||
ANSI-C "assert()" macro but they are not affected by NDEBUG, and they are
|
||||
private (not visible to nor usable by libpng applications).
|
||||
|
||||
XIV. Detecting libpng
|
||||
|
||||
The png_get_io_ptr() function has been present since libpng-0.88, has never
|
||||
changed, and is unaffected by conditional compilation macros. It is the
|
||||
@@ -5194,7 +5202,7 @@ simple verbal discriptions of bug fixes, reported either to the
|
||||
SourceForge bug tracker, to the png-mng-implement at lists.sf.net
|
||||
mailing list, or directly to glennrp.
|
||||
|
||||
XV. Coding style
|
||||
XVI. Coding style
|
||||
|
||||
Our coding style is similar to the "Allman" style
|
||||
(See http://en.wikipedia.org/wiki/Indent_style#Allman_style), with curly
|
||||
@@ -5314,12 +5322,10 @@ We prefer #ifdef and #ifndef to #if defined() and #if !defined()
|
||||
when there is only one macro being tested. We always use parentheses
|
||||
with "defined".
|
||||
|
||||
We express integer constants that are used as bit masks in hex format,
|
||||
with an even number of lower-case hex digits, and to make them unsigned
|
||||
(e.g., 0x00U, 0xffU, 0x0100U) and long if they are greater than 0x7fff
|
||||
(e.g., 0xffffUL).
|
||||
We prefer to express integers that are used as bit masks in hex format,
|
||||
with an even number of lower-case hex digits (e.g., 0x00, 0xff, 0x0100).
|
||||
|
||||
We prefer to use underscores rather than camelCase in names, except
|
||||
We prefer to use underscores in variable names rather than camelCase, except
|
||||
for a few type names that we inherit from zlib.h.
|
||||
|
||||
We prefer "if (something != 0)" and "if (something == 0)"
|
||||
@@ -5331,13 +5337,13 @@ Lines do not exceed 80 characters.
|
||||
|
||||
Other rules can be inferred by inspecting the libpng source.
|
||||
|
||||
XVI. Y2K Compliance in libpng
|
||||
XVII. Y2K Compliance in libpng
|
||||
|
||||
Since the PNG Development group is an ad-hoc body, we can't make
|
||||
an official declaration.
|
||||
|
||||
This is your unofficial assurance that libpng from version 0.71 and
|
||||
upward through 1.6.22beta03 are Y2K compliant. It is my belief that earlier
|
||||
upward through 1.7.0beta80 are Y2K compliant. It is my belief that earlier
|
||||
versions were also Y2K compliant.
|
||||
|
||||
Libpng only has two year fields. One is a 2-byte unsigned integer
|
||||
@@ -5353,9 +5359,8 @@ in libpng-1.6.x and will be removed from libpng-1.7.0.
|
||||
|
||||
There are seven time-related functions:
|
||||
|
||||
png_convert_to_rfc_1123_buffer() in png.c
|
||||
(formerly png_convert_to_rfc_1152() in error, and
|
||||
also formerly png_convert_to_rfc_1123())
|
||||
png_convert_to_rfc_1123() in png.c
|
||||
(formerly png_convert_to_rfc_1152() in error)
|
||||
png_convert_from_struct_tm() in pngwrite.c, called
|
||||
in pngwrite.c
|
||||
png_convert_from_time_t() in pngwrite.c
|
||||
|
||||
503
libpng.3
503
libpng.3
@@ -1,6 +1,6 @@
|
||||
.TH LIBPNG 3 "March 9, 2016"
|
||||
.TH LIBPNG 3 "May 6, 2016"
|
||||
.SH NAME
|
||||
libpng \- Portable Network Graphics (PNG) Reference Library 1.6.22beta03
|
||||
libpng \- Portable Network Graphics (PNG) Reference Library 1.7.0beta80
|
||||
.SH SYNOPSIS
|
||||
\fB
|
||||
#include <png.h>\fP
|
||||
@@ -23,7 +23,7 @@ libpng \- Portable Network Graphics (PNG) Reference Library 1.6.22beta03
|
||||
|
||||
\fBvoid png_convert_from_time_t (png_timep \fP\fIptime\fP\fB, time_t \fIttime\fP\fB);\fP
|
||||
|
||||
\fBpng_charp png_convert_to_rfc1123 (png_structp \fP\fIpng_ptr\fP\fB, png_timep \fIptime\fP\fB);\fP
|
||||
\fBpng_charp png_convert_to_rfc1123_buffer (png_structp \fP\fIpng_ptr\fP\fB, char \fP\fIout[29]\fP\fB, png_timep \fIptime\fP\fB);\fP
|
||||
|
||||
\fBpng_infop png_create_info_struct (png_structp \fIpng_ptr\fP\fB);\fP
|
||||
|
||||
@@ -35,8 +35,6 @@ libpng \- Portable Network Graphics (PNG) Reference Library 1.6.22beta03
|
||||
|
||||
\fBpng_structp png_create_write_struct_2 (png_const_charp \fP\fIuser_png_ver\fP\fB, png_voidp \fP\fIerror_ptr\fP\fB, png_error_ptr \fP\fIerror_fn\fP\fB, png_error_ptr \fP\fIwarn_fn\fP\fB, png_voidp \fP\fImem_ptr\fP\fB, png_malloc_ptr \fP\fImalloc_fn\fP\fB, png_free_ptr \fIfree_fn\fP\fB);\fP
|
||||
|
||||
\fBvoid png_data_freer (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fP\fIfreer\fP\fB, png_uint_32 \fImask)\fP\fB);\fP
|
||||
|
||||
\fBvoid png_destroy_info_struct (png_structp \fP\fIpng_ptr\fP\fB, png_infopp \fIinfo_ptr_ptr\fP\fB);\fP
|
||||
|
||||
\fBvoid png_destroy_read_struct (png_structpp \fP\fIpng_ptr_ptr\fP\fB, png_infopp \fP\fIinfo_ptr_ptr\fP\fB, png_infopp \fIend_info_ptr_ptr\fP\fB);\fP
|
||||
@@ -51,8 +49,6 @@ libpng \- Portable Network Graphics (PNG) Reference Library 1.6.22beta03
|
||||
|
||||
\fBvoid png_free_chunk_list (png_structp \fIpng_ptr\fP\fB);\fP
|
||||
|
||||
\fBvoid png_free_default (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fIptr\fP\fB);\fP
|
||||
|
||||
\fBvoid png_free_data (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fInum\fP\fB);\fP
|
||||
|
||||
\fBpng_byte png_get_bit_depth (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
|
||||
@@ -233,16 +229,12 @@ libpng \- Portable Network Graphics (PNG) Reference Library 1.6.22beta03
|
||||
|
||||
\fBint png_image_write_to_stdio (png_imagep \fP\fIimage\fP\fB, FILE \fP\fI*file\fP\fB, int \fP\fIconvert_to_8_bit\fP\fB, const void \fP\fI*buffer\fP\fB, png_int_32 \fP\fIrow_stride\fP\fB, void \fI*colormap)\fP\fB);\fP
|
||||
|
||||
\fBvoid png_info_init_3 (png_infopp \fP\fIinfo_ptr\fP\fB, png_size_t \fIpng_info_struct_size\fP\fB);\fP
|
||||
|
||||
\fBvoid png_init_io (png_structp \fP\fIpng_ptr\fP\fB, FILE \fI*fp\fP\fB);\fP
|
||||
|
||||
\fBvoid png_longjmp (png_structp \fP\fIpng_ptr\fP\fB, int \fIval\fP\fB);\fP
|
||||
|
||||
\fBpng_voidp png_malloc (png_structp \fP\fIpng_ptr\fP\fB, png_alloc_size_t \fIsize\fP\fB);\fP
|
||||
|
||||
\fBpng_voidp png_malloc_default (png_structp \fP\fIpng_ptr\fP\fB, png_alloc_size_t \fIsize\fP\fB);\fP
|
||||
|
||||
\fBpng_voidp png_malloc_warn (png_structp \fP\fIpng_ptr\fP\fB, png_alloc_size_t \fIsize\fP\fB);\fP
|
||||
|
||||
\fBpng_uint_32 png_permit_mng_features (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fImng_features_permitted\fP\fB);\fP
|
||||
@@ -269,8 +261,6 @@ libpng \- Portable Network Graphics (PNG) Reference Library 1.6.22beta03
|
||||
|
||||
\fBvoid png_read_update_info (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
|
||||
|
||||
\fBint png_reset_zstream (png_structp \fIpng_ptr\fP\fB);\fP
|
||||
|
||||
\fBvoid png_save_int_32 (png_bytep \fP\fIbuf\fP\fB, png_int_32 \fIi\fP\fB);\fP
|
||||
|
||||
\fBvoid png_save_uint_16 (png_bytep \fP\fIbuf\fP\fB, unsigned int \fIi\fP\fB);\fP
|
||||
@@ -510,10 +500,10 @@ Following is a copy of the libpng-manual.txt file that accompanies libpng.
|
||||
.SH LIBPNG.TXT
|
||||
libpng-manual.txt - A description on how to use and modify libpng
|
||||
|
||||
libpng version 1.6.22beta03 - March 9, 2016
|
||||
libpng version 1.7.0beta80 - May 6, 2016
|
||||
Updated and distributed by Glenn Randers-Pehrson
|
||||
<glennrp at users.sourceforge.net>
|
||||
Copyright (c) 1998-2016 Glenn Randers-Pehrson
|
||||
Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||
|
||||
This document is released under the libpng license.
|
||||
For conditions of distribution and use, see the disclaimer
|
||||
@@ -521,15 +511,15 @@ libpng-manual.txt - A description on how to use and modify libpng
|
||||
|
||||
Based on:
|
||||
|
||||
libpng versions 0.97, January 1998, through 1.6.22beta03 - March 9, 2016
|
||||
libpng versions 0.97, January 1998, through 1.7.0beta80 - May 6, 2016
|
||||
Updated and distributed by Glenn Randers-Pehrson
|
||||
Copyright (c) 1998-2016 Glenn Randers-Pehrson
|
||||
Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||
|
||||
libpng 1.0 beta 6 - version 0.96 - May 28, 1997
|
||||
libpng 1.0 beta 6 version 0.96 May 28, 1997
|
||||
Updated and distributed by Andreas Dilger
|
||||
Copyright (c) 1996, 1997 Andreas Dilger
|
||||
|
||||
libpng 1.0 beta 2 - version 0.88 - January 26, 1996
|
||||
libpng 1.0 beta 2 - version 0.88 January 26, 1996
|
||||
For conditions of distribution and use, see copyright
|
||||
notice in png.h. Copyright (c) 1995, 1996 Guy Eric
|
||||
Schalnat, Group 42, Inc.
|
||||
@@ -552,10 +542,11 @@ libpng-manual.txt - A description on how to use and modify libpng
|
||||
X. Changes to Libpng from version 1.0.x/1.2.x to 1.4.x
|
||||
XI. Changes to Libpng from version 1.4.x to 1.5.x
|
||||
XII. Changes to Libpng from version 1.5.x to 1.6.x
|
||||
XIII. Detecting libpng
|
||||
XIV. Source code repository
|
||||
XV. Coding style
|
||||
XVI. Y2K Compliance in libpng
|
||||
XIII. Changes to Libpng from version 1.6.x to 1.7.x
|
||||
XIV. Detecting libpng
|
||||
XV. Source code repository
|
||||
XVI. Coding style
|
||||
XVII. Y2K Compliance in libpng
|
||||
|
||||
.SH I. Introduction
|
||||
|
||||
@@ -855,23 +846,22 @@ then only check the bytes (if any) that your program didn't read.
|
||||
to replace them with custom functions. See the discussion under
|
||||
Customizing libpng.
|
||||
|
||||
|
||||
FILE *fp = fopen(file_name, "rb");
|
||||
if (!fp)
|
||||
{
|
||||
return (ERROR);
|
||||
}
|
||||
|
||||
if (fread(header, 1, number, fp) != number)
|
||||
{
|
||||
return (ERROR);
|
||||
}
|
||||
|
||||
fread(header, 1, number, fp);
|
||||
is_png = !png_sig_cmp(header, 0, number);
|
||||
|
||||
if (!is_png)
|
||||
{
|
||||
return (NOT_PNG);
|
||||
}
|
||||
|
||||
|
||||
Next, png_struct and png_info need to be allocated and initialized. In
|
||||
order to ensure that the size of these structures is correct even with a
|
||||
dynamically linked libpng, there are functions to initialize and
|
||||
@@ -939,12 +929,16 @@ an end_info structure.
|
||||
|
||||
If you would rather avoid the complexity of setjmp/longjmp issues,
|
||||
you can compile libpng with PNG_NO_SETJMP, in which case
|
||||
errors will result in a call to PNG_ABORT() which defaults to abort().
|
||||
errors will result in a call to PNG_ABORT which defaults to abort().
|
||||
|
||||
You can #define PNG_ABORT() to a function that does something
|
||||
You can #define PNG_ABORT to a function or other C code that does something
|
||||
more useful than abort(), as long as your function does not
|
||||
return.
|
||||
|
||||
If you do this, you cannot #define PNG_SIMPLIFIED_READ_SUPPORTED or
|
||||
PNG_SIMPLIFIED_WRITE_SUPPORTED, because the simplified API requires
|
||||
setjmp() support.
|
||||
|
||||
Now you need to set up the input code. The default for libpng is to
|
||||
use the C function fread(). If you use this, you will need to pass a
|
||||
valid FILE * in the function png_init_io(). Be sure that the file is
|
||||
@@ -1036,15 +1030,15 @@ you can retrieve with
|
||||
|
||||
png_get_user_chunk_ptr(png_ptr);
|
||||
|
||||
If you call the png_set_read_user_chunk_fn() function, then all unknown
|
||||
chunks which the callback does not handle will be saved when read. You can
|
||||
cause them to be discarded by returning '1' ("handled") instead of '0'. This
|
||||
behavior will change in libpng 1.7 and the default handling set by the
|
||||
png_set_keep_unknown_chunks() function, described below, will be used when the
|
||||
callback returns 0. If you want the existing behavior you should set the global
|
||||
default to PNG_HANDLE_CHUNK_IF_SAFE now; this is compatible with all current
|
||||
versions of libpng and with 1.7. Libpng 1.6 issues a warning if you keep the
|
||||
default, or PNG_HANDLE_CHUNK_NEVER, and the callback returns 0.
|
||||
If you call the png_set_read_user_chunk_fn() function, then all unknown chunks
|
||||
will be passed to your callback when read. You can cause known chunks to be
|
||||
passed in as well by using png_set_keep_unknown_chunks (see below) - this will
|
||||
prevent the normal libpng handling of those known chunks.
|
||||
|
||||
If your callback returns 0 the default unknown handling will be used (see
|
||||
below). This is new behavior in libpng 1.7, prior to 1.7 it was not possible to
|
||||
discard a chunk; PNG_HANDLE_CHUNK_IF_SAFE was forced. Libpng 1.6.0 issues a
|
||||
warning when this was done.
|
||||
|
||||
At this point, you can set up a callback function that will be
|
||||
called after each row has been read, which you can use to control
|
||||
@@ -1143,10 +1137,8 @@ callback function:
|
||||
...
|
||||
|
||||
#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
|
||||
/* ignore all unknown chunks
|
||||
* (use global setting "2" for libpng16 and earlier):
|
||||
*/
|
||||
png_set_keep_unknown_chunks(read_ptr, 2, NULL, 0);
|
||||
/* ignore all unknown chunks: */
|
||||
png_set_keep_unknown_chunks(read_ptr, 1, NULL, 0);
|
||||
|
||||
/* except for vpAg: */
|
||||
png_set_keep_unknown_chunks(read_ptr, 2, vpAg, 1);
|
||||
@@ -1160,13 +1152,15 @@ callback function:
|
||||
|
||||
The PNG specification allows the width and height of an image to be as
|
||||
large as 2^(31\-1 (0x7fffffff), or about 2.147 billion rows and columns.
|
||||
For safety, libpng imposes a default limit of 1 million rows and columns.
|
||||
Since very few applications really need to process such large images,
|
||||
we have imposed an arbitrary 1,000,000 limit on rows and columns.
|
||||
Larger images will be rejected immediately with a png_error() call. If
|
||||
you wish to change these limits, you can use
|
||||
you wish to change this limit, you can use
|
||||
|
||||
png_set_user_limits(png_ptr, width_max, height_max);
|
||||
|
||||
to set your own limits (libpng may reject some very wide images
|
||||
to set your own limits, or use width_max = height_max = 0x7fffffffL
|
||||
to allow all valid dimensions (libpng may reject some very large images
|
||||
anyway because of potential buffer overflow conditions).
|
||||
|
||||
You should put this statement after you create the PNG structure and
|
||||
@@ -1181,11 +1175,8 @@ If you need to retrieve the limits that are being applied, use
|
||||
height_max = png_get_user_height_max(png_ptr);
|
||||
|
||||
The PNG specification sets no limit on the number of ancillary chunks
|
||||
allowed in a PNG datastream. By default, libpng imposes a limit of
|
||||
a total of 1000 sPLT, tEXt, iTXt, zTXt, and unknown chunks to be stored.
|
||||
If you have set up both info_ptr and end_info_ptr, the limit applies
|
||||
separately to each. You can change the limit on the total number of such
|
||||
chunks that will be stored, with
|
||||
allowed in a PNG datastream. You can impose a limit on the total number
|
||||
of sPLT, tEXt, iTXt, zTXt, and unknown chunks that will be stored, with
|
||||
|
||||
png_set_chunk_cache_max(png_ptr, user_chunk_cache_max);
|
||||
|
||||
@@ -1193,9 +1184,8 @@ where 0x7fffffffL means unlimited. You can retrieve this limit with
|
||||
|
||||
chunk_cache_max = png_get_chunk_cache_max(png_ptr);
|
||||
|
||||
Libpng imposes a limit of 8 Megabytes (8,000,000 bytes) on the amount of
|
||||
memory that a compressed chunk other than IDAT can occupy, when decompressed.
|
||||
You can change this limit with
|
||||
You can also set a limit on the amount of memory that a compressed chunk
|
||||
other than IDAT can occupy, with
|
||||
|
||||
png_set_chunk_malloc_max(png_ptr, user_chunk_malloc_max);
|
||||
|
||||
@@ -1696,7 +1686,10 @@ row_pointers prior to calling png_read_png() with
|
||||
png_set_rows(png_ptr, info_ptr, &row_pointers);
|
||||
|
||||
Alternatively you could allocate your image in one big block and define
|
||||
row_pointers[i] to point into the proper places in your block.
|
||||
row_pointers[i] to point into the proper places in your block. If
|
||||
you do this, be sure to call png_read_update_info() described below,
|
||||
to update the "rowbytes" value to account for any transformations that
|
||||
change the number of bytes per row before you use it to allocate your block.
|
||||
|
||||
If you use png_set_rows(), the application is responsible for freeing
|
||||
row_pointers (and row_pointers[i], if they were separately allocated).
|
||||
@@ -1785,12 +1778,13 @@ in until png_read_end() has read the chunk data following the image.
|
||||
interlace_type, compression_type, or filter_method can
|
||||
be NULL if you are not interested in their values.
|
||||
|
||||
Note that png_get_IHDR() returns 32-bit data into
|
||||
Note that png_get_IHDR() returns png_uint_32 data into
|
||||
the application's width and height variables.
|
||||
This is an unsafe situation if these are not png_uint_32
|
||||
variables. In such situations, the
|
||||
png_get_image_width() and png_get_image_height()
|
||||
functions described below are safer.
|
||||
variables, or if they are 32-bit variables on a 64-bit
|
||||
platform. In such situations, the png_get_image_width()
|
||||
and png_get_image_height() functions described below are
|
||||
safer.
|
||||
|
||||
width = png_get_image_width(png_ptr,
|
||||
info_ptr);
|
||||
@@ -1973,6 +1967,11 @@ png_set_rgb_to_gray()).
|
||||
PNG_ITXT_COMPRESSION_NONE
|
||||
PNG_ITXT_COMPRESSION_zTXt
|
||||
|
||||
text_ptr[i].location - location of chunk
|
||||
PNG_HAVE_IHDR
|
||||
PNG_HAVE_PLTE
|
||||
PNG_AFTER_IDAT
|
||||
|
||||
text_ptr[i].key - keyword for comment. Must contain
|
||||
1-79 characters.
|
||||
|
||||
@@ -2195,16 +2194,15 @@ described below.
|
||||
Data will be decoded into the supplied row buffers packed into bytes
|
||||
unless the library has been told to transform it into another format.
|
||||
For example, 4 bit/pixel paletted or grayscale data will be returned
|
||||
2 pixels/byte with the leftmost pixel in the high-order bits of the byte,
|
||||
unless png_set_packing() is called. 8-bit RGB data will be stored
|
||||
2 pixels/byte with the leftmost pixel in the high-order bits of the
|
||||
byte, unless png_set_packing() is called. 8-bit RGB data will be stored
|
||||
in RGB RGB RGB format unless png_set_filler() or png_set_add_alpha()
|
||||
is called to insert filler bytes, either before or after each RGB triplet.
|
||||
|
||||
16-bit RGB data will be returned RRGGBB RRGGBB, with the most significant
|
||||
byte of the color value first, unless png_set_scale_16() is called to
|
||||
transform it to regular RGB RGB triplets, or png_set_filler() or
|
||||
png_set_add alpha() is called to insert two filler bytes, either before
|
||||
or after each RRGGBB triplet. Similarly, 8-bit or 16-bit grayscale data can
|
||||
png_set_add alpha() is called to insert filler bytes, either before or
|
||||
after each RRGGBB triplet. Similarly, 8-bit or 16-bit grayscale data can
|
||||
be modified with png_set_filler(), png_set_add_alpha(), png_set_strip_16(),
|
||||
or png_set_scale_16().
|
||||
|
||||
@@ -2361,13 +2359,12 @@ into 4 or 8 bytes for windowing systems that need them in this format:
|
||||
if (color_type == PNG_COLOR_TYPE_RGB)
|
||||
png_set_filler(png_ptr, filler, PNG_FILLER_BEFORE);
|
||||
|
||||
where "filler" is the 8-bit or 16-bit number to fill with, and the location
|
||||
is either PNG_FILLER_BEFORE or PNG_FILLER_AFTER, depending upon whether
|
||||
you want the filler before the RGB or after. When filling an 8-bit pixel,
|
||||
the least significant 8 bits of the number are used, if a 16-bit number is
|
||||
supplied. This transformation does not affect images that already have full
|
||||
alpha channels. To add an opaque alpha channel, use filler=0xffff and
|
||||
PNG_FILLER_AFTER which will generate RGBA pixels.
|
||||
where "filler" is the 8 or 16-bit number to fill with, and the location is
|
||||
either PNG_FILLER_BEFORE or PNG_FILLER_AFTER, depending upon whether
|
||||
you want the filler before the RGB or after. This transformation
|
||||
does not affect images that already have full alpha channels. To add an
|
||||
opaque alpha channel, use filler=0xff or 0xffff and PNG_FILLER_AFTER which
|
||||
will generate RGBA pixels.
|
||||
|
||||
Note that png_set_filler() does not change the color type. If you want
|
||||
to do that, you can add a true alpha channel with
|
||||
@@ -2377,7 +2374,7 @@ to do that, you can add a true alpha channel with
|
||||
png_set_add_alpha(png_ptr, filler, PNG_FILLER_AFTER);
|
||||
|
||||
where "filler" contains the alpha value to assign to each pixel.
|
||||
The png_set_add_alpha() function was added in libpng-1.2.7.
|
||||
This function was added in libpng-1.2.7.
|
||||
|
||||
If you are reading an image with an alpha channel, and you need the
|
||||
data as ARGB instead of the normal PNG format RGBA:
|
||||
@@ -3255,11 +3252,10 @@ section below for more information on the libpng error handling.
|
||||
|
||||
If you would rather avoid the complexity of setjmp/longjmp issues,
|
||||
you can compile libpng with PNG_NO_SETJMP, in which case
|
||||
errors will result in a call to PNG_ABORT() which defaults to abort().
|
||||
errors will result in a call to PNG_ABORT which defaults to abort().
|
||||
|
||||
You can #define PNG_ABORT() to a function that does something
|
||||
more useful than abort(), as long as your function does not
|
||||
return.
|
||||
You can #define PNG_ABORT to a function or other C code that does something
|
||||
more useful than abort(), as long as your function does not return.
|
||||
|
||||
Checking for invalid palette index on write was added at libpng
|
||||
1.5.10. If a pixel contains an invalid (out-of-range) index libpng issues
|
||||
@@ -3470,7 +3466,6 @@ width, height, bit_depth, and color_type must be the same in each call.
|
||||
(array of png_color)
|
||||
num_palette - number of entries in the palette
|
||||
|
||||
|
||||
png_set_gAMA(png_ptr, info_ptr, file_gamma);
|
||||
png_set_gAMA_fixed(png_ptr, info_ptr, int_file_gamma);
|
||||
|
||||
@@ -3595,6 +3590,10 @@ width, height, bit_depth, and color_type must be the same in each call.
|
||||
PNG_TEXT_COMPRESSION_zTXt
|
||||
PNG_ITXT_COMPRESSION_NONE
|
||||
PNG_ITXT_COMPRESSION_zTXt
|
||||
text_ptr[i].location - location of chunk
|
||||
PNG_HAVE_IHDR
|
||||
PNG_HAVE_PLTE
|
||||
PNG_AFTER_IDAT
|
||||
text_ptr[i].key - keyword for comment. Must contain
|
||||
1-79 characters.
|
||||
text_ptr[i].text - text comments for current
|
||||
@@ -3778,7 +3777,7 @@ tEXt chunk use RFC 1123 format dates (e.g. "22 May 1997 18:07:10 GMT"),
|
||||
although this isn't a requirement. Unlike the tIME chunk, the
|
||||
"Creation Time" tEXt chunk is not expected to be automatically changed
|
||||
by the software. To facilitate the use of RFC 1123 dates, a function
|
||||
png_convert_to_rfc1123_buffer(buffer, png_timep) is provided to
|
||||
png_convert_to_rfc1123_buffer(png_ptr, buffer, png_timep) is provided to
|
||||
convert from PNG time to an RFC 1123 format string. The caller must provide
|
||||
a writeable buffer of at least 29 bytes.
|
||||
|
||||
@@ -4235,26 +4234,21 @@ as a wide variety of APIs to manipulate ancilliary information.
|
||||
|
||||
To read a PNG file using the simplified API:
|
||||
|
||||
1) Declare a 'png_image' structure (see below) on the stack, set the
|
||||
version field to PNG_IMAGE_VERSION and the 'opaque' pointer to NULL
|
||||
(this is REQUIRED, your program may crash if you don't do it.)
|
||||
1) Declare a 'png_image' structure (see below) on the
|
||||
stack and memset() it to all zero.
|
||||
|
||||
2) Call the appropriate png_image_begin_read... function.
|
||||
|
||||
3) Set the png_image 'format' member to the required sample format.
|
||||
3) Set the png_image 'format' member to the required
|
||||
format and allocate a buffer for the image.
|
||||
|
||||
4) Allocate a buffer for the image and, if required, the color-map.
|
||||
|
||||
5) Call png_image_finish_read to read the image and, if required, the
|
||||
color-map into your buffers.
|
||||
4) Call png_image_finish_read to read the image into
|
||||
your buffer.
|
||||
|
||||
There are no restrictions on the format of the PNG input itself; all valid
|
||||
color types, bit depths, and interlace methods are acceptable, and the
|
||||
input image is transformed as necessary to the requested in-memory format
|
||||
during the png_image_finish_read() step. The only caveat is that if you
|
||||
request a color-mapped image from a PNG that is full-color or makes
|
||||
complex use of an alpha channel the transformation is extremely lossy and the
|
||||
result may look terrible.
|
||||
during the png_image_finish_read() step.
|
||||
|
||||
To write a PNG file using the simplified API:
|
||||
|
||||
@@ -4263,14 +4257,13 @@ To write a PNG file using the simplified API:
|
||||
|
||||
2) Initialize the members of the structure that describe the
|
||||
image, setting the 'format' member to the format of the
|
||||
image samples.
|
||||
image in memory.
|
||||
|
||||
3) Call the appropriate png_image_write... function with a
|
||||
pointer to the image and, if necessary, the color-map to write
|
||||
the PNG data.
|
||||
pointer to the image to write the PNG data.
|
||||
|
||||
png_image is a structure that describes the in-memory format of an image
|
||||
when it is being read or defines the in-memory format of an image that you
|
||||
when it is being read or define the in-memory format of an image that you
|
||||
need to write. The "png_image" structure contains the following members:
|
||||
|
||||
png_controlp opaque Initialize to NULL, free with png_image_free
|
||||
@@ -4283,15 +4276,15 @@ need to write. The "png_image" structure contains the following members:
|
||||
png_uint_32 warning_or_error;
|
||||
char message[64];
|
||||
|
||||
In the event of an error or warning the "warning_or_error"
|
||||
In the event of an error or warning the following field warning_or_error
|
||||
field will be set to a non-zero value and the 'message' field will contain
|
||||
a '\0' terminated string with the libpng error or warning message. If both
|
||||
warnings and an error were encountered, only the error is recorded. If there
|
||||
are multiple warnings, only the first one is recorded.
|
||||
|
||||
The upper 30 bits of the "warning_or_error" value are reserved; the low two
|
||||
bits contain a two bit code such that a value more than 1 indicates a failure
|
||||
in the API just called:
|
||||
The upper 30 bits of this value are reserved; the low two bits contain
|
||||
a two bit code such that a value more than 1 indicates a failure in the API
|
||||
just called:
|
||||
|
||||
0 - no warning or error
|
||||
1 - warning
|
||||
@@ -4323,72 +4316,64 @@ channels are linear. Color channels use the RGB encoding (RGB end-points) of
|
||||
the sRGB specification. This encoding is identified by the
|
||||
PNG_FORMAT_FLAG_LINEAR flag below.
|
||||
|
||||
When the simplified API needs to convert between sRGB and linear colorspaces,
|
||||
the actual sRGB transfer curve defined in the sRGB specification (see the
|
||||
article at http://en.wikipedia.org/wiki/SRGB) is used, not the gamma=1/2.2
|
||||
approximation used elsewhere in libpng.
|
||||
|
||||
When an alpha channel is present it is expected to denote pixel coverage
|
||||
of the color or luminance channels and is returned as an associated alpha
|
||||
channel: the color/gray channels are scaled (pre-multiplied) by the alpha
|
||||
value.
|
||||
|
||||
The samples are either contained directly in the image data, between 1 and 8
|
||||
bytes per pixel according to the encoding, or are held in a color-map indexed
|
||||
by bytes in the image data. In the case of a color-map the color-map entries
|
||||
are individual samples, encoded as above, and the image data has one byte per
|
||||
pixel to select the relevant sample from the color-map.
|
||||
When a color-mapped image is used as a result of calling
|
||||
png_image_read_colormap or png_image_write_colormap the channels are encoded
|
||||
in the color-map and the descriptions above apply to the color-map entries.
|
||||
The image data is encoded as small integers, value 0..255, that index the
|
||||
entries in the color-map. One integer (one byte) is stored for each pixel.
|
||||
|
||||
PNG_FORMAT_*
|
||||
|
||||
The #defines to be used in png_image::format. Each #define identifies a
|
||||
particular layout of channel data and, if present, alpha values. There are
|
||||
separate defines for each of the two component encodings.
|
||||
separate defines for each of the two channel encodings.
|
||||
|
||||
A format is built up using single bit flag values. All combinations are
|
||||
valid. Formats can be built up from the flag values or you can use one of
|
||||
the predefined values below. When testing formats always use the FORMAT_FLAG
|
||||
macros to test for individual features - future versions of the library may
|
||||
add new flags.
|
||||
A format is built up using single bit flag values. Not all combinations are
|
||||
valid: use the bit flag values below for testing a format returned by the
|
||||
read APIs, but set formats from the derived values.
|
||||
|
||||
When reading or writing color-mapped images the format should be set to the
|
||||
format of the entries in the color-map then png_image_{read,write}_colormap
|
||||
called to read or write the color-map and set the format correctly for the
|
||||
image data. Do not set the PNG_FORMAT_FLAG_COLORMAP bit directly!
|
||||
|
||||
NOTE: libpng can be built with particular features disabled. If you see
|
||||
NOTE: libpng can be built with particular features disabled, if you see
|
||||
compiler errors because the definition of one of the following flags has been
|
||||
compiled out it is because libpng does not have the required support. It is
|
||||
possible, however, for the libpng configuration to enable the format on just
|
||||
read or just write; in that case you may see an error at run time.
|
||||
You can guard against this by checking for the definition of the
|
||||
appropriate "_SUPPORTED" macro, one of:
|
||||
read or just write; in that case you may see an error at run time. You can
|
||||
guard against this by checking for the definition of:
|
||||
|
||||
PNG_SIMPLIFIED_{READ,WRITE}_{BGR,AFIRST}_SUPPORTED
|
||||
|
||||
PNG_FORMAT_FLAG_ALPHA format with an alpha channel
|
||||
PNG_FORMAT_FLAG_COLOR color format: otherwise grayscale
|
||||
PNG_FORMAT_FLAG_LINEAR 2-byte channels else 1-byte
|
||||
PNG_FORMAT_FLAG_COLORMAP image data is color-mapped
|
||||
PNG_FORMAT_FLAG_BGR BGR colors, else order is RGB
|
||||
PNG_FORMAT_FLAG_AFIRST alpha channel comes first
|
||||
PNG_FORMAT_FLAG_ALPHA 0x01 format with an alpha channel
|
||||
PNG_FORMAT_FLAG_COLOR 0x02 color format: otherwise grayscale
|
||||
PNG_FORMAT_FLAG_LINEAR 0x04 png_uint_16 channels else png_byte
|
||||
PNG_FORMAT_FLAG_COLORMAP 0x08 libpng use only
|
||||
PNG_FORMAT_FLAG_BGR 0x10 BGR colors, else order is RGB
|
||||
PNG_FORMAT_FLAG_AFIRST 0x20 alpha channel comes first
|
||||
|
||||
Supported formats are as follows. Future versions of libpng may support more
|
||||
formats; for compatibility with older versions simply check if the format
|
||||
macro is defined using #ifdef. These defines describe the in-memory layout
|
||||
of the components of the pixels of the image.
|
||||
|
||||
First the single byte (sRGB) formats:
|
||||
First the single byte formats:
|
||||
|
||||
PNG_FORMAT_GRAY
|
||||
PNG_FORMAT_GA
|
||||
PNG_FORMAT_AG
|
||||
PNG_FORMAT_RGB
|
||||
PNG_FORMAT_BGR
|
||||
PNG_FORMAT_RGBA
|
||||
PNG_FORMAT_ARGB
|
||||
PNG_FORMAT_BGRA
|
||||
PNG_FORMAT_ABGR
|
||||
PNG_FORMAT_GRAY 0
|
||||
PNG_FORMAT_GA PNG_FORMAT_FLAG_ALPHA
|
||||
PNG_FORMAT_AG (PNG_FORMAT_GA|PNG_FORMAT_FLAG_AFIRST)
|
||||
PNG_FORMAT_RGB PNG_FORMAT_FLAG_COLOR
|
||||
PNG_FORMAT_BGR (PNG_FORMAT_FLAG_COLOR|PNG_FORMAT_FLAG_BGR)
|
||||
PNG_FORMAT_RGBA (PNG_FORMAT_RGB|PNG_FORMAT_FLAG_ALPHA)
|
||||
PNG_FORMAT_ARGB (PNG_FORMAT_RGBA|PNG_FORMAT_FLAG_AFIRST)
|
||||
PNG_FORMAT_BGRA (PNG_FORMAT_BGR|PNG_FORMAT_FLAG_ALPHA)
|
||||
PNG_FORMAT_ABGR (PNG_FORMAT_BGRA|PNG_FORMAT_FLAG_AFIRST)
|
||||
|
||||
Then the linear 2-byte formats. When naming these "Y" is used to
|
||||
indicate a luminance (gray) channel. The component order within the pixel
|
||||
@@ -4397,22 +4382,22 @@ components in the linear format. The components are 16-bit integers in
|
||||
the native byte order for your platform, and there is no provision for
|
||||
swapping the bytes to a different endian condition.
|
||||
|
||||
PNG_FORMAT_LINEAR_Y
|
||||
PNG_FORMAT_LINEAR_Y PNG_FORMAT_FLAG_LINEAR
|
||||
PNG_FORMAT_LINEAR_Y_ALPHA
|
||||
(PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_ALPHA)
|
||||
PNG_FORMAT_LINEAR_RGB
|
||||
(PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_COLOR)
|
||||
PNG_FORMAT_LINEAR_RGB_ALPHA
|
||||
(PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_COLOR|
|
||||
PNG_FORMAT_FLAG_ALPHA)
|
||||
|
||||
With color-mapped formats the image data is one byte for each pixel. The byte
|
||||
is an index into the color-map which is formatted as above. To obtain a
|
||||
color-mapped format it is sufficient just to add the PNG_FOMAT_FLAG_COLORMAP
|
||||
to one of the above definitions, or you can use one of the definitions below.
|
||||
Color-mapped formats are obtained by calling png_image_{read,write}_colormap,
|
||||
as appropriate after setting png_image::format to the format of the color-map
|
||||
to be read or written. Applications may check the value of
|
||||
PNG_FORMAT_FLAG_COLORMAP to see if they have called the colormap API. The
|
||||
format of the color-map may be extracted using the following macro.
|
||||
|
||||
PNG_FORMAT_RGB_COLORMAP
|
||||
PNG_FORMAT_BGR_COLORMAP
|
||||
PNG_FORMAT_RGBA_COLORMAP
|
||||
PNG_FORMAT_ARGB_COLORMAP
|
||||
PNG_FORMAT_BGRA_COLORMAP
|
||||
PNG_FORMAT_ABGR_COLORMAP
|
||||
PNG_FORMAT_OF_COLORMAP(fmt) ((fmt) & ~PNG_FORMAT_FLAG_COLORMAP)
|
||||
|
||||
PNG_IMAGE macros
|
||||
|
||||
@@ -4420,9 +4405,9 @@ These are convenience macros to derive information from a png_image
|
||||
structure. The PNG_IMAGE_SAMPLE_ macros return values appropriate to the
|
||||
actual image sample values - either the entries in the color-map or the
|
||||
pixels in the image. The PNG_IMAGE_PIXEL_ macros return corresponding values
|
||||
for the pixels and will always return 1 for color-mapped formats. The
|
||||
remaining macros return information about the rows in the image and the
|
||||
complete image.
|
||||
for the pixels and will always return 1 after a call to
|
||||
png_image_{read,write}_colormap. The remaining macros return information
|
||||
about the rows in the image and the complete image.
|
||||
|
||||
NOTE: All the macros that take a png_image::format parameter are compile time
|
||||
constants if the format parameter is, itself, a constant. Therefore these
|
||||
@@ -4430,39 +4415,46 @@ macros can be used in array declarations and case labels where required.
|
||||
Similarly the macros are also pre-processor constants (sizeof is not used) so
|
||||
they can be used in #if tests.
|
||||
|
||||
First the information about the samples.
|
||||
|
||||
PNG_IMAGE_SAMPLE_CHANNELS(fmt)
|
||||
Returns the total number of channels in a given format: 1..4
|
||||
|
||||
PNG_IMAGE_SAMPLE_COMPONENT_SIZE(fmt)
|
||||
Returns the size in bytes of a single component of a pixel or color-map
|
||||
entry (as appropriate) in the image: 1 or 2.
|
||||
entry (as appropriate) in the image.
|
||||
|
||||
PNG_IMAGE_SAMPLE_SIZE(fmt)
|
||||
This is the size of the sample data for one sample. If the image is
|
||||
color-mapped it is the size of one color-map entry (and image pixels are
|
||||
one byte in size), otherwise it is the size of one image pixel.
|
||||
|
||||
PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(fmt)
|
||||
The maximum size of the color-map required by the format expressed in a
|
||||
count of components. This can be used to compile-time allocate a
|
||||
color-map:
|
||||
|
||||
png_uint_16 colormap[PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(linear_fmt)];
|
||||
|
||||
png_byte colormap[PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(sRGB_fmt)];
|
||||
|
||||
Alternatively use the PNG_IMAGE_COLORMAP_SIZE macro below to use the
|
||||
information from one of the png_image_begin_read_ APIs and dynamically
|
||||
allocate the required memory.
|
||||
|
||||
PNG_IMAGE_COLORMAP_SIZE(fmt)
|
||||
The size of the color-map required by the format; this is the size of the
|
||||
color-map buffer passed to the png_image_{read,write}_colormap APIs. It is
|
||||
color-map buffer passed to the png_image_{read,write}_colormap APIs, it is
|
||||
a fixed number determined by the format so can easily be allocated on the
|
||||
stack if necessary.
|
||||
|
||||
#define PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(fmt)\
|
||||
(PNG_IMAGE_SAMPLE_CHANNELS(fmt) * 256)
|
||||
/* The maximum size of the color-map required by the format expressed in a
|
||||
* count of components. This can be used to compile-time allocate a
|
||||
* color-map:
|
||||
*
|
||||
* png_uint_16 colormap[PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(linear_fmt)];
|
||||
*
|
||||
* png_byte colormap[PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(sRGB_fmt)];
|
||||
*
|
||||
* Alternatively, use the PNG_IMAGE_COLORMAP_SIZE macro below to use the
|
||||
* information from one of the png_image_begin_read_ APIs and dynamically
|
||||
* allocate the required memory.
|
||||
*/
|
||||
|
||||
|
||||
Corresponding information about the pixels
|
||||
|
||||
PNG_IMAGE_PIXEL_(test,fmt)
|
||||
|
||||
PNG_IMAGE_PIXEL_CHANNELS(fmt)
|
||||
The number of separate channels (components) in a pixel; 1 for a
|
||||
color-mapped image.
|
||||
@@ -4488,54 +4480,19 @@ Information about the whole row, or whole image
|
||||
to start the next row on a 4-byte boundary.
|
||||
|
||||
PNG_IMAGE_BUFFER_SIZE(image, row_stride)
|
||||
Return the size, in bytes, of an image buffer given a png_image and a row
|
||||
stride - the number of components to leave space for in each row.
|
||||
|
||||
PNG_IMAGE_SIZE(image)
|
||||
Return the size, in bytes, of the image in memory given just a png_image;
|
||||
the row stride is the minimum stride required for the image.
|
||||
|
||||
PNG_IMAGE_COLORMAP_SIZE(image)
|
||||
Return the size, in bytes, of the color-map of this image. If the image
|
||||
format is not a color-map format this will return a size sufficient for
|
||||
256 entries in the given format; check PNG_FORMAT_FLAG_COLORMAP if
|
||||
you don't want to allocate a color-map in this case.
|
||||
|
||||
PNG_IMAGE_FLAG_*
|
||||
|
||||
Flags containing additional information about the image are held in
|
||||
the 'flags' field of png_image.
|
||||
Returns the size, in bytes, of an image buffer given a png_image and a row
|
||||
stride - the number of components to leave space for in each row. This
|
||||
macro takes care of multiplying row_stride by PNG_IMAGE_PIXEL_COMONENT_SIZE
|
||||
when the image has 2-byte components.
|
||||
|
||||
PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB == 0x01
|
||||
This indicates the the RGB values of the in-memory bitmap do not
|
||||
correspond to the red, green and blue end-points defined by sRGB.
|
||||
|
||||
PNG_IMAGE_FLAG_FAST == 0x02
|
||||
On write emphasise speed over compression; the resultant PNG file will be
|
||||
larger but will be produced significantly faster, particular for large
|
||||
images. Do not use this option for images which will be distributed, only
|
||||
used it when producing intermediate files that will be read back in
|
||||
repeatedly. For a typical 24-bit image the option will double the read
|
||||
speed at the cost of increasing the image size by 25%, however for many
|
||||
more compressible images the PNG file can be 10 times larger with only a
|
||||
slight speed gain.
|
||||
|
||||
PNG_IMAGE_FLAG_16BIT_sRGB == 0x04
|
||||
On read if the image is a 16-bit per component image and there is no gAMA
|
||||
or sRGB chunk assume that the components are sRGB encoded. Notice that
|
||||
images output by the simplified API always have gamma information; setting
|
||||
this flag only affects the interpretation of 16-bit images from an
|
||||
external source. It is recommended that the application expose this flag
|
||||
to the user; the user can normally easily recognize the difference between
|
||||
linear and sRGB encoding. This flag has no effect on write - the data
|
||||
passed to the write APIs must have the correct encoding (as defined
|
||||
above.)
|
||||
|
||||
If the flag is not set (the default) input 16-bit per component data is
|
||||
assumed to be linear.
|
||||
|
||||
NOTE: the flag can only be set after the png_image_begin_read_ call,
|
||||
because that call initializes the 'flags' field.
|
||||
PNG_IMAGE_FLAG_COLORMAP == 0x02
|
||||
The PNG is color-mapped. If this flag is set png_image_read_colormap
|
||||
can be used without further loss of image information. If it is not set
|
||||
png_image_read_colormap will cause significant loss if the image has any
|
||||
|
||||
READ APIs
|
||||
|
||||
@@ -4633,11 +4590,10 @@ a 16-bit linear encoded PNG file is written.
|
||||
|
||||
With all APIs row_stride is handled as in the read APIs - it is the spacing
|
||||
from one row to the next in component sized units (float) and if negative
|
||||
indicates a bottom-up row layout in the buffer. If you pass zero, libpng will
|
||||
calculate the row_stride for you from the width and number of channels.
|
||||
indicates a bottom-up row layout in the buffer.
|
||||
|
||||
Note that the write API does not support interlacing, sub-8-bit pixels,
|
||||
indexed (paletted) images, or most ancillary chunks.
|
||||
and indexed (paletted) images.
|
||||
|
||||
.SH VI. Modifying/Customizing libpng
|
||||
|
||||
@@ -4728,7 +4684,7 @@ Error handling in libpng is done through png_error() and png_warning().
|
||||
Errors handled through png_error() are fatal, meaning that png_error()
|
||||
should never return to its caller. Currently, this is handled via
|
||||
setjmp() and longjmp() (unless you have compiled libpng with
|
||||
PNG_NO_SETJMP, in which case it is handled via PNG_ABORT()),
|
||||
PNG_NO_SETJMP, in which case it is handled via PNG_ABORT),
|
||||
but you could change this to do things like exit() if you should wish,
|
||||
as long as your function does not return.
|
||||
|
||||
@@ -5425,7 +5381,7 @@ limits are now
|
||||
png_user_chunk_malloc_max 0 (unlimited) 8,000,000
|
||||
|
||||
The png_set_option() function (and the "options" member of the png struct) was
|
||||
added to libpng-1.5.15, with option PNG_ARM_NEON.
|
||||
added to libpng-1.5.15.
|
||||
|
||||
The library now supports a complete fixed point implementation and can
|
||||
thus be used on systems that have no floating point support or very
|
||||
@@ -5597,10 +5553,6 @@ enforced. The sRGB chunk is allowed to appear in images with any color type
|
||||
and is interpreted by libpng to convey a one-tracer-curve gray profile or a
|
||||
three-tracer-curve RGB profile as appropriate.
|
||||
|
||||
Libpng 1.5.x erroneously used /MD for Debug DLL builds; if you used the debug
|
||||
builds in your app and you changed your app to use /MD you will need to
|
||||
change it back to /MDd for libpng 1.6.x.
|
||||
|
||||
Prior to libpng-1.6.0 a warning would be issued if the iTXt chunk contained
|
||||
an empty language field or an empty translated keyword. Both of these
|
||||
are allowed by the PNG specification, so these warnings are no longer issued.
|
||||
@@ -5666,12 +5618,58 @@ It can be set for testing debug or beta builds to ensure that they will compile
|
||||
when the build type is switched to RC or STABLE. In essence this overrides the
|
||||
PNG_LIBPNG_BUILD_BASE_TYPE definition which is not directly user controllable.
|
||||
|
||||
Starting with libpng-1.6.19, attempting to set an over-length PLTE chunk
|
||||
is an error. Previously this requirement of the PNG specification was not
|
||||
enforced, and the palette was always limited to 256 entries. An over-length
|
||||
PLTE chunk found in an input PNG is silently truncated.
|
||||
.SH XIII. Changes to Libpng from version 1.6.x to 1.7.x
|
||||
|
||||
.SH XIII. Detecting libpng
|
||||
Some functions that were deprecated in libpng-1.6.0 were removed:
|
||||
png_reset_zstream(),
|
||||
png_info_init_3(),
|
||||
png_data_freer() and its associated flags,
|
||||
png_malloc_default(),
|
||||
and png_free_default().
|
||||
|
||||
These apparently unused experimental functions have been deprecated
|
||||
and the code within them, except for the APIs, has been removed.
|
||||
png_set_filter_heuristics()
|
||||
and png_set_filter_heuristics_fixed()
|
||||
|
||||
A location byte was added to the png_text structure.
|
||||
|
||||
A new private header file, "pngchunk.h", was added.
|
||||
|
||||
The PNG_ABORT() macro was changed to PNG_ABORT, and the default is now
|
||||
"abort()" for all platforms (previously it was "ExitProcess(0)" on
|
||||
Windows platforms). Starting with libpng-1.7.0 you have to define
|
||||
PNG_ABORT instead of PNG_ABORT(), and you must include a terminating
|
||||
semicolon in your definition, e.g.,
|
||||
|
||||
#if PNGCRUSH_LIBPNG_VER >= 10700
|
||||
# ifdef _WINDOWS_
|
||||
# define PNG_ABORT ExitProcess(0);
|
||||
# else
|
||||
# define PNG_ABORT abort();
|
||||
# endif
|
||||
#else
|
||||
# ifdef _WINDOWS_
|
||||
# define PNG_ABORT() ExitProcess(0)
|
||||
# else
|
||||
# define PNG_ABORT() abort()
|
||||
# endif
|
||||
#endif
|
||||
|
||||
The png_get_IHDR() function now allows users to supply NULL for any
|
||||
argument in which they aren't interested. Previously, the width, height,
|
||||
bit_depth, and color_type arguments were not allowed to be NULL.
|
||||
|
||||
The 8-bit compose and rgb_to_grayscale operations were made more accurate.
|
||||
While these did not introduce API incompatibility, there may be differences
|
||||
in unit test results.
|
||||
|
||||
Internal "affirm()" and "impossible()" macros were added, along with
|
||||
some internal supporting macros and functions. These are similar to the
|
||||
ANSI-C "assert()" macro but they are not affected by NDEBUG, and they are
|
||||
private (not visible to nor usable by libpng applications).
|
||||
|
||||
.SH XIV. Detecting libpng
|
||||
|
||||
The png_get_io_ptr() function has been present since libpng-0.88, has never
|
||||
changed, and is unaffected by conditional compilation macros. It is the
|
||||
@@ -5704,7 +5702,7 @@ simple verbal discriptions of bug fixes, reported either to the
|
||||
SourceForge bug tracker, to the png-mng-implement at lists.sf.net
|
||||
mailing list, or directly to glennrp.
|
||||
|
||||
.SH XV. Coding style
|
||||
.SH XVI. Coding style
|
||||
|
||||
Our coding style is similar to the "Allman" style
|
||||
(See http://en.wikipedia.org/wiki/Indent_style#Allman_style), with curly
|
||||
@@ -5824,12 +5822,10 @@ We prefer #ifdef and #ifndef to #if defined() and #if !defined()
|
||||
when there is only one macro being tested. We always use parentheses
|
||||
with "defined".
|
||||
|
||||
We express integer constants that are used as bit masks in hex format,
|
||||
with an even number of lower-case hex digits, and to make them unsigned
|
||||
(e.g., 0x00U, 0xffU, 0x0100U) and long if they are greater than 0x7fff
|
||||
(e.g., 0xffffUL).
|
||||
We prefer to express integers that are used as bit masks in hex format,
|
||||
with an even number of lower-case hex digits (e.g., 0x00, 0xff, 0x0100).
|
||||
|
||||
We prefer to use underscores rather than camelCase in names, except
|
||||
We prefer to use underscores in variable names rather than camelCase, except
|
||||
for a few type names that we inherit from zlib.h.
|
||||
|
||||
We prefer "if (something != 0)" and "if (something == 0)"
|
||||
@@ -5841,13 +5837,13 @@ Lines do not exceed 80 characters.
|
||||
|
||||
Other rules can be inferred by inspecting the libpng source.
|
||||
|
||||
.SH XVI. Y2K Compliance in libpng
|
||||
.SH XVII. Y2K Compliance in libpng
|
||||
|
||||
Since the PNG Development group is an ad-hoc body, we can't make
|
||||
an official declaration.
|
||||
|
||||
This is your unofficial assurance that libpng from version 0.71 and
|
||||
upward through 1.6.22beta03 are Y2K compliant. It is my belief that earlier
|
||||
upward through 1.7.0beta80 are Y2K compliant. It is my belief that earlier
|
||||
versions were also Y2K compliant.
|
||||
|
||||
Libpng only has two year fields. One is a 2-byte unsigned integer
|
||||
@@ -5863,9 +5859,8 @@ in libpng-1.6.x and will be removed from libpng-1.7.0.
|
||||
|
||||
There are seven time-related functions:
|
||||
|
||||
png_convert_to_rfc_1123_buffer() in png.c
|
||||
(formerly png_convert_to_rfc_1152() in error, and
|
||||
also formerly png_convert_to_rfc_1123())
|
||||
png_convert_to_rfc_1123() in png.c
|
||||
(formerly png_convert_to_rfc_1152() in error)
|
||||
png_convert_from_struct_tm() in pngwrite.c, called
|
||||
in pngwrite.c
|
||||
png_convert_from_time_t() in pngwrite.c
|
||||
@@ -5949,7 +5944,11 @@ the first widely used release:
|
||||
...
|
||||
1.5.23 15 10523 15.so.15.23[.0]
|
||||
...
|
||||
1.6.22 16 10622 16.so.16.22[.0]
|
||||
1.6.19beta01-04 16 10619 16.so.16.19[.0]
|
||||
1.6.19rc01-03 16 10619 16.so.16.19[.0]
|
||||
...
|
||||
1.7.0alpha01-10 17 10700 17.so.17.0[.0]
|
||||
1.7.0beta01-80 17 10700 17.so.17.0[.0]
|
||||
|
||||
Henceforth the source version will match the shared-library minor
|
||||
and patch numbers; the shared-library major version number will be
|
||||
@@ -6005,7 +6004,7 @@ possible without all of you.
|
||||
|
||||
Thanks to Frank J. T. Wojcik for helping with the documentation.
|
||||
|
||||
Libpng version 1.6.22beta03 - March 9, 2016:
|
||||
Libpng version 1.7.0beta80 - May 6, 2016:
|
||||
Initially created in 1995 by Guy Eric Schalnat, then of Group 42, Inc.
|
||||
Currently maintained by Glenn Randers-Pehrson (glennrp at users.sourceforge.net).
|
||||
|
||||
@@ -6030,7 +6029,7 @@ this sentence.
|
||||
|
||||
This code is released under the libpng license.
|
||||
|
||||
libpng versions 1.0.7, July 1, 2000 through 1.6.22beta03, March 9, 2016 are
|
||||
libpng versions 1.0.7, July 1, 2000, through 1.7.0beta80, May 6, 2016, are
|
||||
Copyright (c) 2000-2002, 2004, 2006-2016 Glenn Randers-Pehrson, are
|
||||
derived from libpng-1.0.6, and are distributed according to the same
|
||||
disclaimer and license as libpng-1.0.6 with the following individuals
|
||||
@@ -6052,10 +6051,6 @@ and with the following additions to the disclaimer:
|
||||
risk of satisfactory quality, performance, accuracy, and effort is with
|
||||
the user.
|
||||
|
||||
Some files in the "contrib" directory and some configure-generated
|
||||
files that are distributed with libpng have other copyright owners and
|
||||
are released under other open source licenses.
|
||||
|
||||
libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
|
||||
Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from
|
||||
libpng-0.96, and are distributed according to the same disclaimer and
|
||||
@@ -6079,9 +6074,6 @@ Contributing Authors:
|
||||
Greg Roelofs
|
||||
Tom Tanner
|
||||
|
||||
Some files in the "scripts" directory have other copyright owners
|
||||
but are released under this license.
|
||||
|
||||
libpng versions 0.5, May 1995, through 0.88, January 1996, are
|
||||
Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
|
||||
|
||||
@@ -6122,29 +6114,6 @@ appreciated.
|
||||
|
||||
END OF COPYRIGHT NOTICE, DISCLAIMER, and LICENSE.
|
||||
|
||||
TRADEMARK:
|
||||
|
||||
The name "libpng" has not been registered by the Copyright owner
|
||||
as a trademark in any jurisdiction. However, because libpng has
|
||||
been distributed and maintained world-wide, continually since 1995,
|
||||
the Copyright owner claims "common-law trademark protection" in any
|
||||
jurisdiction where common-law trademark is recognized.
|
||||
|
||||
OSI CERTIFICATION:
|
||||
|
||||
Libpng is OSI Certified Open Source Software. OSI Certified Open Source is
|
||||
a certification mark of the Open Source Initiative. OSI has not addressed
|
||||
the additional disclaimers inserted at version 1.0.7.
|
||||
|
||||
EXPORT CONTROL:
|
||||
|
||||
The Copyright owner believes that the Export Control Classification
|
||||
Number (ECCN) for libpng is EAR99, which means not subject to export
|
||||
controls or International Traffic in Arms Regulations (ITAR) because
|
||||
it is open source, publicly available software, that does not contain
|
||||
any encryption software. See the EAR, paragraphs 734.3(b)(3) and
|
||||
734.7(b).
|
||||
|
||||
A "png_get_copyright" function is available, for convenient use in "about"
|
||||
boxes and the like:
|
||||
|
||||
@@ -6153,9 +6122,13 @@ boxes and the like:
|
||||
Also, the PNG logo (in PNG format, of course) is supplied in the
|
||||
files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
|
||||
|
||||
Libpng is OSI Certified Open Source Software. OSI Certified Open Source is
|
||||
a certification mark of the Open Source Initiative. OSI has not addressed
|
||||
the additional disclaimers inserted at version 1.0.7.
|
||||
|
||||
Glenn Randers-Pehrson
|
||||
glennrp at users.sourceforge.net
|
||||
March 9, 2016
|
||||
May 6, 2016
|
||||
|
||||
.\" end of man page
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
.TH LIBPNGPF 3 "March 9, 2016"
|
||||
.TH LIBPNGPF 3 "May 6, 2016"
|
||||
.SH NAME
|
||||
libpng \- Portable Network Graphics (PNG) Reference Library 1.6.22beta03
|
||||
libpng \- Portable Network Graphics (PNG) Reference Library 1.7.0beta80
|
||||
(private functions)
|
||||
.SH SYNOPSIS
|
||||
\fB#include \fI"pngpriv.h"
|
||||
|
||||
5
png.5
5
png.5
@@ -1,4 +1,4 @@
|
||||
.TH PNG 5 "March 9, 2016"
|
||||
.TH PNG 5 "May 6, 2016"
|
||||
.SH NAME
|
||||
png \- Portable Network Graphics (PNG) format
|
||||
.SH DESCRIPTION
|
||||
@@ -24,6 +24,7 @@ PNG specification (second edition), November 2003:
|
||||
.IP
|
||||
.br
|
||||
<http://www.w3.org/TR/2003/REC-PNG-20031110/
|
||||
.LP
|
||||
PNG 1.2 specification, July 1999:
|
||||
.IP
|
||||
.br
|
||||
@@ -58,7 +59,7 @@ Thomas Boutell and others (png-list).
|
||||
|
||||
.SH COPYRIGHT NOTICE
|
||||
.LP
|
||||
This man page is Copyright (c) 1998-2006 Glenn Randers-Pehrson. See png.h
|
||||
This man page is Copyright (c) 1998-2012 Glenn Randers-Pehrson. See png.h
|
||||
for conditions of use and distribution.
|
||||
.LP
|
||||
The PNG Specification (Second Edition) is
|
||||
|
||||
47
pngchunk.h
Normal file
47
pngchunk.h
Normal file
@@ -0,0 +1,47 @@
|
||||
|
||||
/* pngchunk.h - PNG chunk descriptions
|
||||
*
|
||||
* Last changed in libpng 1.7.0 [(PENDING RELEASE)]
|
||||
* Copyright (c) 2016 Glenn Randers-Pehrson
|
||||
*
|
||||
* This code is released under the libpng license.
|
||||
* For conditions of distribution and use, see the disclaimer
|
||||
* and license in png.h
|
||||
*
|
||||
* If this list is changed in any way scripts/chunkhash.c must be rebuilt and
|
||||
* run to regenerate the lookup functions for the tables described from this
|
||||
* list.
|
||||
*
|
||||
* IDAT MUST be first in the list; it must have index '0'. The order of the
|
||||
* remaining chunks comes from section 5.6 "Chunk ordering" in the ISO spec
|
||||
* plus the ordering rules in the PNG extensions documnet.
|
||||
*
|
||||
* Keep PNG_CHUNK_BEGIN and PNG_CHUNK_END at the beginning and end.
|
||||
*/
|
||||
PNG_CHUNK_BEGIN(IDAT, 73, 68, 65, 84, within_IDAT, after_start)
|
||||
PNG_CHUNK( IHDR, 73, 72, 68, 82, before_start, at_start)
|
||||
PNG_CHUNK( cHRM, 99, 72, 82, 77, before_PLTE, after_start)
|
||||
PNG_CHUNK( gAMA, 103, 65, 77, 65, before_PLTE, after_start)
|
||||
PNG_CHUNK( iCCP, 105, 67, 67, 80, before_PLTE, after_start)
|
||||
PNG_CHUNK( sBIT, 115, 66, 73, 84, before_PLTE, after_start)
|
||||
PNG_CHUNK( sRGB, 115, 82, 71, 66, before_PLTE, after_start)
|
||||
PNG_CHUNK( PLTE, 80, 76, 84, 69, before_PLTE, after_start)
|
||||
PNG_CHUNK( bKGD, 98, 75, 71, 68, before_IDAT, after_PLTE)
|
||||
PNG_CHUNK( hIST, 104, 73, 83, 84, before_IDAT, after_PLTE)
|
||||
PNG_CHUNK( tRNS, 116, 82, 78, 83, before_IDAT, after_PLTE)
|
||||
PNG_CHUNK( oFFs, 111, 70, 70, 115, before_IDAT, after_start)
|
||||
PNG_CHUNK( pCAL, 112, 67, 65, 76, before_IDAT, after_start)
|
||||
PNG_CHUNK( sCAL, 115, 67, 65, 76, before_IDAT, after_start)
|
||||
PNG_CHUNK( sTER, 115, 84, 69, 82, before_IDAT, after_start)
|
||||
PNG_CHUNK( pHYs, 112, 72, 89, 115, before_IDAT, after_start)
|
||||
PNG_CHUNK( sPLT, 115, 80, 76, 84, before_IDAT, after_start)
|
||||
PNG_CHUNK( tIME, 116, 73, 77, 69, before_end, after_start)
|
||||
PNG_CHUNK( iTXt, 105, 84, 88, 116, before_end, after_start)
|
||||
PNG_CHUNK( tEXt, 116, 69, 88, 116, before_end, after_start)
|
||||
PNG_CHUNK( zTXt, 122, 84, 88, 116, before_end, after_start)
|
||||
PNG_CHUNK( fRAc, 102, 82, 65, 99, before_end, after_start)
|
||||
PNG_CHUNK( gIFg, 103, 73, 70, 103, before_end, after_start)
|
||||
PNG_CHUNK( gIFt, 103, 73, 70, 116, before_end, after_start)
|
||||
PNG_CHUNK( gIFx, 103, 73, 70, 120, before_end, after_start)
|
||||
PNG_CHUNK( dSIG, 100, 83, 73, 71, before_end, after_start)
|
||||
PNG_CHUNK_END( IEND, 73, 69, 78, 68, before_end, after_IDAT)
|
||||
48
pngconf.h
48
pngconf.h
@@ -1,9 +1,9 @@
|
||||
|
||||
/* pngconf.h - machine configurable file for libpng
|
||||
*
|
||||
* libpng version 1.6.22beta03, March 9, 2016
|
||||
* libpng version 1.7.0beta80, May 6, 2016
|
||||
*
|
||||
* Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
|
||||
* 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.)
|
||||
*
|
||||
@@ -63,7 +63,7 @@
|
||||
*/
|
||||
#define PNG_CONST const /* backward compatibility only */
|
||||
|
||||
/* This controls optimization of the reading of 16-bit and 32-bit values
|
||||
/* This controls optimization of the reading of 16 and 32 bit values
|
||||
* from PNG files. It can be set on a per-app-file basis - it
|
||||
* just changes whether a macro is used when the function is called.
|
||||
* The library builder sets the default; if read functions are not
|
||||
@@ -295,11 +295,11 @@
|
||||
* table entries, so we discard it here. See the .dfn files in the
|
||||
* scripts directory.
|
||||
*/
|
||||
|
||||
#ifndef PNG_EXPORTA
|
||||
# define PNG_EXPORTA(ordinal, type, name, args, attributes) \
|
||||
PNG_FUNCTION(PNG_EXPORT_TYPE(type), (PNGAPI name), PNGARG(args), \
|
||||
PNG_LINKAGE_API attributes)
|
||||
|
||||
# define PNG_EXPORTA(ordinal, type, name, args, attributes)\
|
||||
PNG_FUNCTION(PNG_EXPORT_TYPE(type),(PNGAPI name),PNGARG(args), \
|
||||
extern attributes)
|
||||
#endif
|
||||
|
||||
/* ANSI-C (C90) does not permit a macro to be invoked with an empty argument,
|
||||
@@ -307,7 +307,7 @@
|
||||
*/
|
||||
#define PNG_EMPTY /*empty list*/
|
||||
|
||||
#define PNG_EXPORT(ordinal, type, name, args) \
|
||||
#define PNG_EXPORT(ordinal, type, name, args)\
|
||||
PNG_EXPORTA(ordinal, type, name, args, PNG_EMPTY)
|
||||
|
||||
/* Use PNG_REMOVED to comment out a removed interface. */
|
||||
@@ -445,6 +445,14 @@
|
||||
# define PNG_RESTRICT /* The C99 "restrict" feature */
|
||||
#endif
|
||||
|
||||
#ifndef PNG_FP_EXPORT /* A floating point API. */
|
||||
# ifdef PNG_FLOATING_POINT_SUPPORTED
|
||||
# define PNG_FP_EXPORT(ordinal, type, name, args)\
|
||||
PNG_EXPORT(ordinal, type, name, args);
|
||||
# else /* No floating point APIs */
|
||||
# define PNG_FP_EXPORT(ordinal, type, name, args)
|
||||
# endif
|
||||
#endif
|
||||
#ifndef PNG_FP_EXPORT /* A floating point API. */
|
||||
# ifdef PNG_FLOATING_POINT_SUPPORTED
|
||||
# define PNG_FP_EXPORT(ordinal, type, name, args)\
|
||||
@@ -480,7 +488,7 @@
|
||||
#if CHAR_BIT == 8 && UCHAR_MAX == 255
|
||||
typedef unsigned char png_byte;
|
||||
#else
|
||||
# error "libpng requires 8-bit bytes"
|
||||
# error "libpng requires 8 bit bytes"
|
||||
#endif
|
||||
|
||||
#if INT_MIN == -32768 && INT_MAX == 32767
|
||||
@@ -488,7 +496,7 @@
|
||||
#elif SHRT_MIN == -32768 && SHRT_MAX == 32767
|
||||
typedef short png_int_16;
|
||||
#else
|
||||
# error "libpng requires a signed 16-bit type"
|
||||
# error "libpng requires a signed 16 bit type"
|
||||
#endif
|
||||
|
||||
#if UINT_MAX == 65535
|
||||
@@ -496,7 +504,7 @@
|
||||
#elif USHRT_MAX == 65535
|
||||
typedef unsigned short png_uint_16;
|
||||
#else
|
||||
# error "libpng requires an unsigned 16-bit type"
|
||||
# error "libpng requires an unsigned 16 bit type"
|
||||
#endif
|
||||
|
||||
#if INT_MIN < -2147483646 && INT_MAX > 2147483646
|
||||
@@ -504,7 +512,7 @@
|
||||
#elif LONG_MIN < -2147483646 && LONG_MAX > 2147483646
|
||||
typedef long int png_int_32;
|
||||
#else
|
||||
# error "libpng requires a signed 32-bit (or more) type"
|
||||
# error "libpng requires a signed 32 bit (or more) type"
|
||||
#endif
|
||||
|
||||
#if UINT_MAX > 4294967294
|
||||
@@ -512,11 +520,13 @@
|
||||
#elif ULONG_MAX > 4294967294
|
||||
typedef unsigned long int png_uint_32;
|
||||
#else
|
||||
# error "libpng requires an unsigned 32-bit (or more) type"
|
||||
# error "libpng requires an unsigned 32 bit (or more) type"
|
||||
#endif
|
||||
|
||||
/* Prior to 1.6.0 it was possible to disable the use of size_t, 1.6.0, however,
|
||||
* requires an ISOC90 compiler and relies on consistent behavior of sizeof.
|
||||
*
|
||||
* DEPRECATED: don't use these types, instead use size_t and ptrdiff_t.
|
||||
*/
|
||||
typedef size_t png_size_t;
|
||||
typedef ptrdiff_t png_ptrdiff_t;
|
||||
@@ -537,13 +547,13 @@ typedef ptrdiff_t png_ptrdiff_t;
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* png_alloc_size_t is guaranteed to be no smaller than png_size_t, and no
|
||||
* smaller than png_uint_32. Casts from png_size_t or png_uint_32 to
|
||||
/* png_alloc_size_t is guaranteed to be no smaller than size_t, and no
|
||||
* smaller than png_uint_32. Casts from size_t or png_uint_32 to
|
||||
* png_alloc_size_t are not necessary; in fact, it is recommended not to use
|
||||
* them at all so that the compiler can complain when something turns out to be
|
||||
* problematic.
|
||||
*
|
||||
* Casts in the other direction (from png_alloc_size_t to png_size_t or
|
||||
* Casts in the other direction (from png_alloc_size_t to size_t or
|
||||
* png_uint_32) should be explicitly applied; however, we do not expect to
|
||||
* encounter practical situations that require such conversions.
|
||||
*
|
||||
@@ -553,7 +563,7 @@ typedef ptrdiff_t png_ptrdiff_t;
|
||||
#ifdef PNG_SMALL_SIZE_T
|
||||
typedef png_uint_32 png_alloc_size_t;
|
||||
#else
|
||||
typedef png_size_t png_alloc_size_t;
|
||||
typedef size_t png_alloc_size_t;
|
||||
#endif
|
||||
|
||||
/* Prior to 1.6.0 libpng offered limited support for Microsoft C compiler
|
||||
@@ -589,8 +599,8 @@ typedef char * png_charp;
|
||||
typedef const char * png_const_charp;
|
||||
typedef png_fixed_point * png_fixed_point_p;
|
||||
typedef const png_fixed_point * png_const_fixed_point_p;
|
||||
typedef png_size_t * png_size_tp;
|
||||
typedef const png_size_t * png_const_size_tp;
|
||||
typedef size_t * png_size_tp;
|
||||
typedef const size_t * png_const_size_tp;
|
||||
|
||||
#ifdef PNG_STDIO_SUPPORTED
|
||||
typedef FILE * png_FILE_p;
|
||||
|
||||
@@ -36,13 +36,13 @@
|
||||
/* These settings control the formatting of messages in png.c and pngerror.c */
|
||||
/* Moved to pngdebug.h at 1.5.0 */
|
||||
# ifndef PNG_LITERAL_SHARP
|
||||
# define PNG_LITERAL_SHARP 0x23
|
||||
# define PNG_LITERAL_SHARP 0x23U
|
||||
# endif
|
||||
# ifndef PNG_LITERAL_LEFT_SQUARE_BRACKET
|
||||
# define PNG_LITERAL_LEFT_SQUARE_BRACKET 0x5b
|
||||
# define PNG_LITERAL_LEFT_SQUARE_BRACKET 0x5bU
|
||||
# endif
|
||||
# ifndef PNG_LITERAL_RIGHT_SQUARE_BRACKET
|
||||
# define PNG_LITERAL_RIGHT_SQUARE_BRACKET 0x5d
|
||||
# define PNG_LITERAL_RIGHT_SQUARE_BRACKET 0x5dU
|
||||
# endif
|
||||
# ifndef PNG_STRING_NEWLINE
|
||||
# define PNG_STRING_NEWLINE "\n"
|
||||
|
||||
334
pngerror.c
334
pngerror.c
@@ -1,8 +1,8 @@
|
||||
|
||||
/* pngerror.c - stub functions for i/o and memory allocation
|
||||
*
|
||||
* Last changed in libpng 1.6.15 [November 20, 2014]
|
||||
* Copyright (c) 1998-2002,2004,2006-2014 Glenn Randers-Pehrson
|
||||
* 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.)
|
||||
*
|
||||
@@ -17,6 +17,7 @@
|
||||
*/
|
||||
|
||||
#include "pngpriv.h"
|
||||
#define PNG_SRC_FILE PNG_SRC_FILE_pngerror
|
||||
|
||||
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
|
||||
|
||||
@@ -44,7 +45,7 @@ png_error,(png_const_structrp png_ptr, png_const_charp error_message),
|
||||
if (png_ptr != NULL)
|
||||
{
|
||||
if ((png_ptr->flags &
|
||||
(PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) != 0
|
||||
(PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) != 0)
|
||||
{
|
||||
if (*error_message == PNG_LITERAL_SHARP)
|
||||
{
|
||||
@@ -129,6 +130,7 @@ png_safecat(png_charp buffer, size_t bufsize, size_t pos,
|
||||
* and end pointer (which should point just *beyond* the end of the buffer!)
|
||||
* Returns the pointer to the start of the formatted string.
|
||||
*/
|
||||
#define PNG_HAVE_FORMAT_NUMBER /* for the code below */
|
||||
png_charp
|
||||
png_format_number(png_const_charp start, png_charp end, int format,
|
||||
png_alloc_size_t number)
|
||||
@@ -364,8 +366,7 @@ png_benign_error(png_const_structrp png_ptr, png_const_charp error_message)
|
||||
if ((png_ptr->flags & PNG_FLAG_BENIGN_ERRORS_WARN) != 0)
|
||||
{
|
||||
# ifdef PNG_READ_SUPPORTED
|
||||
if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0 &&
|
||||
png_ptr->chunk_name != 0)
|
||||
if (png_ptr->read_struct && png_ptr->chunk_name != 0)
|
||||
png_chunk_warning(png_ptr, error_message);
|
||||
else
|
||||
# endif
|
||||
@@ -375,8 +376,7 @@ png_benign_error(png_const_structrp png_ptr, png_const_charp error_message)
|
||||
else
|
||||
{
|
||||
# ifdef PNG_READ_SUPPORTED
|
||||
if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0 &&
|
||||
png_ptr->chunk_name != 0)
|
||||
if (png_ptr->read_struct && png_ptr->chunk_name != 0)
|
||||
png_chunk_error(png_ptr, error_message);
|
||||
else
|
||||
# endif
|
||||
@@ -419,10 +419,14 @@ png_app_error(png_const_structrp png_ptr, png_const_charp error_message)
|
||||
#if defined(PNG_WARNINGS_SUPPORTED) || \
|
||||
(defined(PNG_READ_SUPPORTED) && defined(PNG_ERROR_TEXT_SUPPORTED))
|
||||
/* These utilities are used internally to build an error message that relates
|
||||
* to the current chunk. The chunk name comes from png_ptr->chunk_name,
|
||||
* which is used to prefix the message. The message is limited in length
|
||||
* to 63 bytes. The name characters are output as hex digits wrapped in []
|
||||
* if the character is invalid.
|
||||
* to the current chunk. The chunk name comes from png_ptr->chunk_name unless
|
||||
* png_ptr->zowner is set in which case that is used in preference. This is
|
||||
* used to prefix the message. The message is limited in length to 63 bytes.
|
||||
* The name characters are output as hex digits wrapped in [] if the character
|
||||
* is invalid.
|
||||
*
|
||||
* Using 'zowner' means that IDAT errors at the end of the IDAT stream are still
|
||||
* reported as from the IDAT chunks.
|
||||
*/
|
||||
#define isnonalpha(c) ((c) < 65 || (c) > 122 || ((c) > 90 && (c) < 97))
|
||||
static PNG_CONST char png_digit[16] = {
|
||||
@@ -434,9 +438,12 @@ static void /* PRIVATE */
|
||||
png_format_buffer(png_const_structrp png_ptr, png_charp buffer, png_const_charp
|
||||
error_message)
|
||||
{
|
||||
png_uint_32 chunk_name = png_ptr->chunk_name;
|
||||
png_uint_32 chunk_name = png_ptr->zowner;
|
||||
int iout = 0, ishift = 24;
|
||||
|
||||
if (chunk_name == 0)
|
||||
chunk_name = png_ptr->chunk_name;
|
||||
|
||||
while (ishift >= 0)
|
||||
{
|
||||
int c = (int)(chunk_name >> ishift) & 0xff;
|
||||
@@ -452,7 +459,7 @@ png_format_buffer(png_const_structrp png_ptr, png_charp buffer, png_const_charp
|
||||
|
||||
else
|
||||
{
|
||||
buffer[iout++] = (char)c;
|
||||
buffer[iout++] = png_check_char(png_ptr, c);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -528,17 +535,14 @@ png_chunk_benign_error(png_const_structrp png_ptr, png_const_charp
|
||||
#endif /* READ */
|
||||
|
||||
void /* PRIVATE */
|
||||
png_chunk_report(png_const_structrp png_ptr, png_const_charp message, int error)
|
||||
(png_chunk_report)(png_const_structrp png_ptr, png_const_charp message,
|
||||
int error)
|
||||
{
|
||||
# ifndef PNG_WARNINGS_SUPPORTED
|
||||
PNG_UNUSED(message)
|
||||
# endif
|
||||
|
||||
/* This is always supported, but for just read or just write it
|
||||
* unconditionally does the right thing.
|
||||
*/
|
||||
# if defined(PNG_READ_SUPPORTED) && defined(PNG_WRITE_SUPPORTED)
|
||||
if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0)
|
||||
if (png_ptr->read_struct)
|
||||
# endif
|
||||
|
||||
# ifdef PNG_READ_SUPPORTED
|
||||
@@ -546,13 +550,16 @@ png_chunk_report(png_const_structrp png_ptr, png_const_charp message, int error)
|
||||
if (error < PNG_CHUNK_ERROR)
|
||||
png_chunk_warning(png_ptr, message);
|
||||
|
||||
else
|
||||
else if (error < PNG_CHUNK_FATAL)
|
||||
png_chunk_benign_error(png_ptr, message);
|
||||
|
||||
else
|
||||
png_chunk_error(png_ptr, message);
|
||||
}
|
||||
# endif
|
||||
|
||||
# if defined(PNG_READ_SUPPORTED) && defined(PNG_WRITE_SUPPORTED)
|
||||
else if ((png_ptr->mode & PNG_IS_READ_STRUCT) == 0)
|
||||
else if (!png_ptr->read_struct)
|
||||
# endif
|
||||
|
||||
# ifdef PNG_WRITE_SUPPORTED
|
||||
@@ -560,14 +567,27 @@ png_chunk_report(png_const_structrp png_ptr, png_const_charp message, int error)
|
||||
if (error < PNG_CHUNK_WRITE_ERROR)
|
||||
png_app_warning(png_ptr, message);
|
||||
|
||||
else
|
||||
else if (error < PNG_CHUNK_FATAL)
|
||||
png_app_error(png_ptr, message);
|
||||
|
||||
else
|
||||
png_error(png_ptr, message);
|
||||
}
|
||||
# endif
|
||||
|
||||
# ifndef PNG_ERROR_TEXT_SUPPORTED
|
||||
PNG_UNUSED(message)
|
||||
# endif
|
||||
}
|
||||
|
||||
#ifdef PNG_ERROR_TEXT_SUPPORTED
|
||||
#ifdef PNG_FLOATING_POINT_SUPPORTED
|
||||
|
||||
#if defined(PNG_FLOATING_POINT_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_FLOATING_ARITHMETIC_SUPPORTED) &&\
|
||||
defined(PNG_sCAL_SUPPORTED))
|
||||
PNG_FUNCTION(void,
|
||||
png_fixed_error,(png_const_structrp png_ptr, png_const_charp name),PNG_NORETURN)
|
||||
{
|
||||
@@ -641,9 +661,9 @@ png_set_longjmp_fn(png_structrp png_ptr, png_longjmp_ptr longjmp_fn,
|
||||
/* This is an internal error in libpng: somehow we have been left
|
||||
* with a stack allocated jmp_buf when the application regained
|
||||
* control. It's always possible to fix this up, but for the moment
|
||||
* this is a png_error because that makes it easy to detect.
|
||||
* this is an affirm because that makes it easy to detect.
|
||||
*/
|
||||
png_error(png_ptr, "Libpng jmp_buf still allocated");
|
||||
impossible("Libpng jmp_buf still allocated");
|
||||
/* png_ptr->jmp_buf_ptr = &png_ptr->jmp_buf_local; */
|
||||
}
|
||||
}
|
||||
@@ -770,9 +790,13 @@ png_longjmp,(png_const_structrp png_ptr, int val),PNG_NORETURN)
|
||||
* choice is to terminate the whole process (or maybe the thread); to do
|
||||
* this the ANSI-C abort() function is used unless a different method is
|
||||
* implemented by overriding the default configuration setting for
|
||||
* PNG_ABORT().
|
||||
* PNG_ABORT (see scripts/pnglibconf.dfa).
|
||||
*
|
||||
* API change: prior to 1.7.0 PNG_ABORT was invoked as a function type macro
|
||||
* with no arguments 'PNG_ABORT();', in 1.7.0 this is changed to a simple
|
||||
* macro that is defined in the configuration.
|
||||
*/
|
||||
PNG_ABORT();
|
||||
PNG_ABORT
|
||||
}
|
||||
|
||||
#ifdef PNG_WARNINGS_SUPPORTED
|
||||
@@ -869,7 +893,7 @@ png_set_strip_error_numbers(png_structrp png_ptr, png_uint_32 strip_mode)
|
||||
if (png_ptr != NULL)
|
||||
{
|
||||
png_ptr->flags &=
|
||||
((~(PNG_FLAG_STRIP_ERROR_NUMBERS |
|
||||
((PNG_BIC_MASK(PNG_FLAG_STRIP_ERROR_NUMBERS |
|
||||
PNG_FLAG_STRIP_ERROR_TEXT))&strip_mode);
|
||||
}
|
||||
}
|
||||
@@ -960,4 +984,258 @@ png_safe_execute(png_imagep image_in, int (*function)(png_voidp), png_voidp arg)
|
||||
return result;
|
||||
}
|
||||
#endif /* SIMPLIFIED READ || SIMPLIFIED_WRITE */
|
||||
|
||||
/* Affirms: minimal code in 'STABLE' builds to return control to the
|
||||
* application via png_error(), more verbose code followed by PNG_ABORT for
|
||||
* all other builds to ensure that internal errors are detected.
|
||||
*
|
||||
* The code always produces a message if it is possible, regardless of the
|
||||
* setting of PNG_ERROR_TEXT_SUPPORTED, except that in stable builds
|
||||
* PNG_ERROR_TEXT_SUPPORTED is honored. See pngpriv.h for the calculation of
|
||||
* the two control macros PNG_RELEASE_BUILD (don't abort; stable build or rc)
|
||||
* and PNG_AFFIRM_TEXT (output text.)
|
||||
*/
|
||||
#if PNG_AFFIRM_TEXT
|
||||
# ifdef PNG_HAVE_FORMAT_NUMBER
|
||||
static size_t
|
||||
png_affirm_number(png_charp buffer, size_t bufsize, size_t pos,
|
||||
unsigned int number, int format)
|
||||
{
|
||||
char numbuf[PNG_NUMBER_BUFFER_SIZE];
|
||||
return png_safecat(buffer, bufsize, pos,
|
||||
png_format_number(numbuf, numbuf + sizeof numbuf, format, number));
|
||||
}
|
||||
# define affirm_number(a,b,c,d,e) png_affirm_number(a,b,c,d,e)
|
||||
# else /* !HAVE_FORMAT_NUMBER */
|
||||
static size_t
|
||||
png_affirm_number(png_charp buffer, size_t bufsize, size_t pos,
|
||||
unsigned int number)
|
||||
{
|
||||
/* binhex it; highly non-portable, assumes the ASCII character set, but
|
||||
* if warnings are turned off then it is unlikely the text will get read
|
||||
* anyway. This binhex variant is (48+val), where 'val' is the next 6
|
||||
* bits of the number, so it starts as '0' (for 0) and ends at 'I' for
|
||||
* 63. The number is wrapped in {}, so 0 comes out as '{}' and 9 comes
|
||||
* out as '{9}' and so on.
|
||||
*/
|
||||
char numbuf[32];
|
||||
int i = sizeof numbuf;
|
||||
|
||||
numbuf[--i] = 0;
|
||||
numbuf[--i] = '}';
|
||||
|
||||
do
|
||||
{
|
||||
if (number > 0)
|
||||
numbuf[--i] = (char)/*SAFE*/((number & 63) + 48), number >>= 6;
|
||||
else
|
||||
{
|
||||
numbuf[--i] = '{';
|
||||
break;
|
||||
}
|
||||
}
|
||||
while (i > 0);
|
||||
|
||||
return png_safecat(buffer, bufsize, pos, numbuf+i);
|
||||
}
|
||||
# define affirm_number(a,b,c,d,e) png_affirm_number(a,b,c,d)
|
||||
#endif /* !HAVE_FORMAT_NUMBER */
|
||||
|
||||
static void
|
||||
affirm_text(png_charp buffer, size_t bufsize,
|
||||
param_deb(png_const_charp condition) unsigned int position)
|
||||
{
|
||||
/* Format the 'position' number and output:
|
||||
*
|
||||
* "<file> <line>: affirm 'condition' failed\n"
|
||||
* " libpng version <version> - <date>\n"
|
||||
* " translated __DATE__ __TIME__"
|
||||
*
|
||||
* In the STABLE versions the output is the same for the last two lines
|
||||
* but the first line becomes:
|
||||
*
|
||||
* "<position>: affirm failed"
|
||||
*
|
||||
* If there is no number formatting the numbers just get replaced by
|
||||
* some binhex (see the utility above).
|
||||
*/
|
||||
size_t pos = 0;
|
||||
|
||||
# if PNG_RELEASE_BUILD /* no 'condition' parameter: minimal text */
|
||||
pos = affirm_number(buffer, bufsize, pos, position, PNG_NUMBER_FORMAT_x);
|
||||
pos = png_safecat(buffer, bufsize, pos, ": affirm failed");
|
||||
# else /* !STABLE */
|
||||
/* Break down 'position' into a file name and a line number: */
|
||||
{
|
||||
# define PNG_apply(f) { #f "\0", PNG_SRC_FILE_ ## f },
|
||||
# define PNG_end { "", PNG_SRC_FILE_LAST }
|
||||
static struct {
|
||||
char filename[28]; /* GCC checks this size */
|
||||
unsigned int base;
|
||||
} fileinfo[] = { PNG_FILES };
|
||||
# undef PNG_apply
|
||||
# undef PNG_end
|
||||
|
||||
unsigned int i;
|
||||
png_const_charp filename;
|
||||
|
||||
/* Do 'nfiles' this way to avoid problems with g++ where it whines
|
||||
* about (size_t) being larger than (int), even though this is a
|
||||
* compile time constant:
|
||||
*/
|
||||
# define nfiles ((sizeof fileinfo)/(sizeof (fileinfo[0])))
|
||||
for (i=0; i < nfiles && position > fileinfo[i].base; ++i) {}
|
||||
|
||||
if (i == 0 || i > nfiles)
|
||||
filename = "UNKNOWN";
|
||||
else
|
||||
{
|
||||
filename = fileinfo[i-1].filename;
|
||||
position -= fileinfo[i-1].base;
|
||||
}
|
||||
# undef nfiles
|
||||
|
||||
pos = png_safecat(buffer, bufsize, pos, filename);
|
||||
pos = png_safecat(buffer, bufsize, pos, ".c ");
|
||||
pos = affirm_number(buffer, bufsize, pos, position,
|
||||
PNG_NUMBER_FORMAT_u);
|
||||
}
|
||||
|
||||
pos = png_safecat(buffer, bufsize, pos, ": affirm '");
|
||||
pos = png_safecat(buffer, bufsize, pos, condition);
|
||||
pos = png_safecat(buffer, bufsize, pos, "' failed\n");
|
||||
# endif /* !STABLE */
|
||||
|
||||
pos = png_safecat(buffer, bufsize, pos, PNG_HEADER_VERSION_STRING);
|
||||
pos = png_safecat(buffer, bufsize, pos,
|
||||
" translated " __DATE__ " " __TIME__);
|
||||
}
|
||||
|
||||
#define affirm_text(b, c, p)\
|
||||
do {\
|
||||
(affirm_text)(b, sizeof b, param_deb(c) (p));\
|
||||
} while (0)
|
||||
|
||||
#endif /* AFFIRM_TEXT */
|
||||
|
||||
PNG_FUNCTION(void,png_affirm,(png_const_structrp png_ptr,
|
||||
param_deb(png_const_charp condition) unsigned int position),PNG_NORETURN)
|
||||
{
|
||||
# if PNG_AFFIRM_TEXT
|
||||
char buffer[512];
|
||||
|
||||
affirm_text(buffer, condition, position);
|
||||
# else /* !AFFIRM_TEXT */
|
||||
PNG_UNUSED(position)
|
||||
# if !PNG_RELEASE_BUILD
|
||||
PNG_UNUSED(condition)
|
||||
# endif
|
||||
# endif /* AFFIRM_TEXT */
|
||||
|
||||
/* Now in STABLE do a png_error, but in other builds output the message
|
||||
* (if possible) then abort (PNG_ABORT).
|
||||
*/
|
||||
# if PNG_RELEASE_BUILD
|
||||
png_error(png_ptr, buffer/*macro parameter used only if ERROR_TEXT*/);
|
||||
# else /* !AFFIRM_ERROR */
|
||||
/* Use console IO if possible; this is because there is no guarantee that
|
||||
* the app 'warning' will output anything. For certain the simplified
|
||||
* API implementation just copies the message (truncated) to the image
|
||||
* message buffer, which makes debugging much more difficult.
|
||||
*
|
||||
* Note that it is possible that neither WARNINGS nor CONSOLE_IO are
|
||||
* supported; in that case no text will be output (and PNG_AFFIRM_TEXT
|
||||
* will be false.)
|
||||
*/
|
||||
# ifdef PNG_CONSOLE_IO_SUPPORTED
|
||||
fprintf(stderr, "%s\n", buffer);
|
||||
PNG_UNUSED(png_ptr)
|
||||
# elif defined PNG_WARNINGS_SUPPORTED
|
||||
if (png_ptr != NULL && png_ptr->warning_fn != NULL)
|
||||
png_ptr->warning_fn(png_constcast(png_structrp, png_ptr), buffer);
|
||||
/* else no way to output the text */
|
||||
# else
|
||||
PNG_UNUSED(png_ptr)
|
||||
# endif
|
||||
|
||||
PNG_ABORT
|
||||
# endif /* AFFIRM_ERROR */
|
||||
}
|
||||
|
||||
#if !PNG_RELEASE_BUILD
|
||||
void /* PRIVATE */
|
||||
png_handled_affirm(png_const_structrp png_ptr, png_const_charp message,
|
||||
unsigned int position)
|
||||
{
|
||||
# if PNG_RELEASE_BUILD
|
||||
/* testing in RC: we want to return control to the caller, so do not
|
||||
* use png_affirm.
|
||||
*/
|
||||
char buffer[512];
|
||||
|
||||
affirm_text(buffer, message, position);
|
||||
|
||||
# ifdef PNG_CONSOLE_IO_SUPPORTED
|
||||
fprintf(stderr, "%s\n", buffer);
|
||||
# elif defined PNG_WARNINGS_SUPPORTED
|
||||
if (png_ptr != NULL && png_ptr->warning_fn != NULL)
|
||||
png_ptr->warning_fn(png_constcast(png_structrp, png_ptr), buffer);
|
||||
/* else no way to output the text */
|
||||
# else
|
||||
PNG_UNUSED(png_ptr)
|
||||
# endif
|
||||
# else
|
||||
png_affirm(png_ptr, message, position);
|
||||
# endif
|
||||
}
|
||||
#endif /* !RELEASE_BUILD */
|
||||
|
||||
#ifdef PNG_RANGE_CHECK_SUPPORTED
|
||||
/* The character/byte checking APIs. These do their own calls to png_affirm
|
||||
* because the caller provides the position.
|
||||
*/
|
||||
unsigned int /* PRIVATE */
|
||||
png_bit_affirm(png_const_structrp png_ptr, unsigned int position,
|
||||
unsigned int u, unsigned int bits)
|
||||
{
|
||||
/* The following avoids overflow errors even if 'bits' is 16 or 32: */
|
||||
if (u <= (1U << bits)-1U)
|
||||
return u;
|
||||
|
||||
png_affirm(png_ptr, param_deb("(bit field) range") position);
|
||||
}
|
||||
|
||||
char /* PRIVATE */
|
||||
png_char_affirm(png_const_structrp png_ptr, unsigned int position, int c)
|
||||
{
|
||||
if (c >= CHAR_MIN && c <= CHAR_MAX)
|
||||
return (char)/*SAFE*/c;
|
||||
|
||||
png_affirm(png_ptr, param_deb("(char) range") position);
|
||||
}
|
||||
|
||||
png_byte /* PRIVATE */
|
||||
png_byte_affirm(png_const_structrp png_ptr, unsigned int position, int b)
|
||||
{
|
||||
/* For the type png_byte the limits.h values are ignored and we check
|
||||
* against the values PNG expects to store in a byte:
|
||||
*/
|
||||
if (b >= 0 && b <= 255)
|
||||
return (png_byte)/*SAFE*/b;
|
||||
|
||||
png_affirm(png_ptr, param_deb("PNG byte range") position);
|
||||
}
|
||||
|
||||
#if INT_MAX >= 65535
|
||||
png_uint_16 /* PRIVATE */
|
||||
png_u16_affirm(png_const_structrp png_ptr, unsigned int position, int b)
|
||||
{
|
||||
/* Check against the PNG 16-bit limit, as with png_byte. */
|
||||
if (b >= 0 && b <= 65535)
|
||||
return (png_uint_16)/*SAFE*/b;
|
||||
|
||||
png_affirm(png_ptr, param_deb("PNG 16-bit range") position);
|
||||
}
|
||||
#endif /* INT_MAX >= 65535 */
|
||||
#endif /* RANGE_CHECK */
|
||||
#endif /* READ || WRITE */
|
||||
|
||||
125
pngget.c
125
pngget.c
@@ -1,8 +1,8 @@
|
||||
|
||||
/* pngget.c - retrieval of values from info struct
|
||||
*
|
||||
* Last changed in libpng 1.6.17 [March 26, 2015]
|
||||
* Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
|
||||
* 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.)
|
||||
*
|
||||
@@ -13,6 +13,7 @@
|
||||
*/
|
||||
|
||||
#include "pngpriv.h"
|
||||
#define PNG_SRC_FILE PNG_SRC_FILE_pngget
|
||||
|
||||
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
|
||||
|
||||
@@ -26,16 +27,18 @@ png_get_valid(png_const_structrp png_ptr, png_const_inforp info_ptr,
|
||||
return(0);
|
||||
}
|
||||
|
||||
png_size_t PNGAPI
|
||||
png_alloc_size_t PNGAPI
|
||||
png_get_rowbytes(png_const_structrp png_ptr, png_const_inforp info_ptr)
|
||||
{
|
||||
if (png_ptr != NULL && info_ptr != NULL)
|
||||
return(info_ptr->rowbytes);
|
||||
return png_calc_rowbytes(png_ptr,
|
||||
PNG_FORMAT_CHANNELS(info_ptr->format) * info_ptr->bit_depth,
|
||||
info_ptr->width);
|
||||
|
||||
return(0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef PNG_INFO_IMAGE_SUPPORTED
|
||||
#ifdef PNG_READ_PNG_SUPPORTED
|
||||
png_bytepp PNGAPI
|
||||
png_get_rows(png_const_structrp png_ptr, png_const_inforp info_ptr)
|
||||
{
|
||||
@@ -79,7 +82,8 @@ png_byte PNGAPI
|
||||
png_get_color_type(png_const_structrp png_ptr, png_const_inforp info_ptr)
|
||||
{
|
||||
if (png_ptr != NULL && info_ptr != NULL)
|
||||
return info_ptr->color_type;
|
||||
return png_check_byte(png_ptr,
|
||||
PNG_COLOR_TYPE_FROM_FORMAT(info_ptr->format));
|
||||
|
||||
return (0);
|
||||
}
|
||||
@@ -316,7 +320,7 @@ png_get_y_offset_pixels(png_const_structrp png_ptr, png_const_inforp info_ptr)
|
||||
static png_uint_32
|
||||
ppi_from_ppm(png_uint_32 ppm)
|
||||
{
|
||||
#if 0
|
||||
#if 0 /*NOT USED*/
|
||||
/* The conversion is *(2.54/100), in binary (32 digits):
|
||||
* .00000110100000001001110101001001
|
||||
*/
|
||||
@@ -365,14 +369,25 @@ png_get_y_pixels_per_inch(png_const_structrp png_ptr, png_const_inforp info_ptr)
|
||||
|
||||
#ifdef PNG_FIXED_POINT_SUPPORTED
|
||||
static png_fixed_point
|
||||
png_fixed_inches_from_microns(png_const_structrp png_ptr, png_int_32 microns)
|
||||
png_fixed_inches_from_microns(png_const_structrp png_ptr,
|
||||
png_int_32 microns)
|
||||
{
|
||||
/* Convert from metres * 1,000,000 to inches * 100,000, meters to
|
||||
* inches is simply *(100/2.54), so we want *(10/2.54) == 500/127.
|
||||
* Notice that this can overflow - a warning is output and 0 is
|
||||
* returned.
|
||||
*/
|
||||
return png_muldiv_warn(png_ptr, microns, 500, 127);
|
||||
png_fixed_point result;
|
||||
|
||||
if (png_muldiv(&result, microns, 500, 127) != 0)
|
||||
return result;
|
||||
|
||||
/* TODO: review this, png_error might be better. */
|
||||
png_warning(png_ptr, "inch to microns overflow");
|
||||
return 0;
|
||||
# ifndef PNG_WARNINGS_SUPPORTED
|
||||
PNG_UNUSED(png_ptr)
|
||||
# endif
|
||||
}
|
||||
|
||||
png_fixed_point PNGAPI
|
||||
@@ -382,9 +397,7 @@ png_get_x_offset_inches_fixed(png_const_structrp png_ptr,
|
||||
return png_fixed_inches_from_microns(png_ptr,
|
||||
png_get_x_offset_microns(png_ptr, info_ptr));
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef PNG_FIXED_POINT_SUPPORTED
|
||||
png_fixed_point PNGAPI
|
||||
png_get_y_offset_inches_fixed(png_const_structrp png_ptr,
|
||||
png_const_inforp info_ptr)
|
||||
@@ -392,7 +405,7 @@ png_get_y_offset_inches_fixed(png_const_structrp png_ptr,
|
||||
return png_fixed_inches_from_microns(png_ptr,
|
||||
png_get_y_offset_microns(png_ptr, info_ptr));
|
||||
}
|
||||
#endif
|
||||
#endif /* FIXED_POINT */
|
||||
|
||||
#ifdef PNG_FLOATING_POINT_SUPPORTED
|
||||
float PNGAPI
|
||||
@@ -456,18 +469,18 @@ png_get_pHYs_dpi(png_const_structrp png_ptr, png_const_inforp info_ptr,
|
||||
return (retval);
|
||||
}
|
||||
#endif /* pHYs */
|
||||
#endif /* INCH_CONVERSIONS */
|
||||
#endif /* INCH_CONVERSIONS */
|
||||
|
||||
/* png_get_channels really belongs in here, too, but it's been around longer */
|
||||
|
||||
#endif /* EASY_ACCESS */
|
||||
#endif /* EASY_ACCESS */
|
||||
|
||||
|
||||
png_byte PNGAPI
|
||||
png_get_channels(png_const_structrp png_ptr, png_const_inforp info_ptr)
|
||||
{
|
||||
if (png_ptr != NULL && info_ptr != NULL)
|
||||
return(info_ptr->channels);
|
||||
return png_check_byte(png_ptr, PNG_FORMAT_CHANNELS(info_ptr->format));
|
||||
|
||||
return (0);
|
||||
}
|
||||
@@ -812,7 +825,7 @@ png_get_IHDR(png_const_structrp png_ptr, png_const_inforp info_ptr,
|
||||
*bit_depth = info_ptr->bit_depth;
|
||||
|
||||
if (color_type != NULL)
|
||||
*color_type = info_ptr->color_type;
|
||||
*color_type = PNG_COLOR_TYPE_FROM_FORMAT(info_ptr->format);
|
||||
|
||||
if (compression_type != NULL)
|
||||
*compression_type = info_ptr->compression_type;
|
||||
@@ -823,16 +836,7 @@ png_get_IHDR(png_const_structrp png_ptr, png_const_inforp info_ptr,
|
||||
if (interlace_type != NULL)
|
||||
*interlace_type = info_ptr->interlace_type;
|
||||
|
||||
/* This is redundant if we can be sure that the info_ptr values were all
|
||||
* assigned in png_set_IHDR(). We do the check anyhow in case an
|
||||
* application has ignored our advice not to mess with the members
|
||||
* of info_ptr directly.
|
||||
*/
|
||||
png_check_IHDR(png_ptr, info_ptr->width, info_ptr->height,
|
||||
info_ptr->bit_depth, info_ptr->color_type, info_ptr->interlace_type,
|
||||
info_ptr->compression_type, info_ptr->filter_type);
|
||||
|
||||
return (1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
#ifdef PNG_oFFs_SUPPORTED
|
||||
@@ -884,9 +888,8 @@ png_get_pCAL(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
#endif
|
||||
|
||||
#ifdef PNG_sCAL_SUPPORTED
|
||||
# ifdef PNG_FIXED_POINT_SUPPORTED
|
||||
# if defined(PNG_FLOATING_ARITHMETIC_SUPPORTED) || \
|
||||
defined(PNG_FLOATING_POINT_SUPPORTED)
|
||||
# ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED
|
||||
# ifdef PNG_FIXED_POINT_SUPPORTED
|
||||
png_uint_32 PNGAPI
|
||||
png_get_sCAL_fixed(png_const_structrp png_ptr, png_const_inforp info_ptr,
|
||||
int *unit, png_fixed_point *width, png_fixed_point *height)
|
||||
@@ -907,9 +910,9 @@ png_get_sCAL_fixed(png_const_structrp png_ptr, png_const_inforp info_ptr,
|
||||
|
||||
return(0);
|
||||
}
|
||||
# endif /* FLOATING_ARITHMETIC */
|
||||
# endif /* FIXED_POINT */
|
||||
# ifdef PNG_FLOATING_POINT_SUPPORTED
|
||||
# endif /* FIXED_POINT */
|
||||
|
||||
# ifdef PNG_FLOATING_POINT_SUPPORTED
|
||||
png_uint_32 PNGAPI
|
||||
png_get_sCAL(png_const_structrp png_ptr, png_const_inforp info_ptr,
|
||||
int *unit, double *width, double *height)
|
||||
@@ -925,7 +928,9 @@ png_get_sCAL(png_const_structrp png_ptr, png_const_inforp info_ptr,
|
||||
|
||||
return(0);
|
||||
}
|
||||
# endif /* FLOATING POINT */
|
||||
# endif /* FLOATING POINT */
|
||||
# endif /* FLOATING_ARITHMETIC */
|
||||
|
||||
png_uint_32 PNGAPI
|
||||
png_get_sCAL_s(png_const_structrp png_ptr, png_const_inforp info_ptr,
|
||||
int *unit, png_charpp width, png_charpp height)
|
||||
@@ -1069,7 +1074,7 @@ png_get_tRNS(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
{
|
||||
png_debug1(1, "in %s retrieval function", "tRNS");
|
||||
|
||||
if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
|
||||
if ((info_ptr->format & PNG_FORMAT_FLAG_COLORMAP) != 0)
|
||||
{
|
||||
if (trans_alpha != NULL)
|
||||
{
|
||||
@@ -1081,7 +1086,7 @@ png_get_tRNS(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
*trans_color = &(info_ptr->trans_color);
|
||||
}
|
||||
|
||||
else /* if (info_ptr->color_type != PNG_COLOR_TYPE_PALETTE) */
|
||||
else /* if (info_ptr->format not colormapped */
|
||||
{
|
||||
if (trans_color != NULL)
|
||||
{
|
||||
@@ -1115,15 +1120,17 @@ png_get_unknown_chunks(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
return info_ptr->unknown_chunks_num;
|
||||
}
|
||||
|
||||
return (0);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
|
||||
png_byte PNGAPI
|
||||
png_get_rgb_to_gray_status (png_const_structrp png_ptr)
|
||||
png_get_rgb_to_gray_status(png_const_structrp png_ptr)
|
||||
{
|
||||
return (png_byte)(png_ptr ? png_ptr->rgb_to_gray_status : 0);
|
||||
if (png_ptr)
|
||||
return png_ptr->rgb_to_gray_status;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1131,31 +1138,25 @@ png_get_rgb_to_gray_status (png_const_structrp png_ptr)
|
||||
png_voidp PNGAPI
|
||||
png_get_user_chunk_ptr(png_const_structrp png_ptr)
|
||||
{
|
||||
return (png_ptr ? png_ptr->user_chunk_ptr : NULL);
|
||||
if (png_ptr)
|
||||
return png_ptr->user_chunk_ptr;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
png_size_t PNGAPI
|
||||
png_alloc_size_t PNGAPI
|
||||
png_get_compression_buffer_size(png_const_structrp png_ptr)
|
||||
{
|
||||
if (png_ptr == NULL)
|
||||
return 0;
|
||||
|
||||
#ifdef PNG_WRITE_SUPPORTED
|
||||
if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0)
|
||||
#endif
|
||||
{
|
||||
#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
|
||||
return png_ptr->IDAT_read_size;
|
||||
#else
|
||||
return PNG_IDAT_READ_SIZE;
|
||||
#endif
|
||||
}
|
||||
# if defined(PNG_SEQUENTIAL_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
|
||||
return png_ptr->IDAT_size;
|
||||
|
||||
#ifdef PNG_WRITE_SUPPORTED
|
||||
else
|
||||
return png_ptr->zbuffer_size;
|
||||
#endif
|
||||
# else
|
||||
return PNG_IDAT_READ_SIZE; /* progressive reader */
|
||||
# endif
|
||||
}
|
||||
|
||||
#ifdef PNG_SET_USER_LIMITS_SUPPORTED
|
||||
@@ -1202,18 +1203,4 @@ png_get_io_chunk_type (png_const_structrp png_ptr)
|
||||
return png_ptr->chunk_name;
|
||||
}
|
||||
#endif /* IO_STATE */
|
||||
|
||||
#ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED
|
||||
# ifdef PNG_GET_PALETTE_MAX_SUPPORTED
|
||||
int PNGAPI
|
||||
png_get_palette_max(png_const_structp png_ptr, png_const_infop info_ptr)
|
||||
{
|
||||
if (png_ptr != NULL && info_ptr != NULL)
|
||||
return png_ptr->num_palette_max;
|
||||
|
||||
return (-1);
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#endif /* READ || WRITE */
|
||||
|
||||
22
pnginfo.h
22
pnginfo.h
@@ -11,7 +11,7 @@
|
||||
* and license in png.h
|
||||
*/
|
||||
|
||||
/* png_info is a structure that holds the information in a PNG file so
|
||||
/* png_info is a structure that holds the information in a PNG file so
|
||||
* that the application can find out the characteristics of the image.
|
||||
* If you are reading the file, this structure will tell you what is
|
||||
* in the PNG file. If you are writing the file, fill in the information
|
||||
@@ -57,25 +57,17 @@ struct png_info_def
|
||||
/* The following are necessary for every PNG file */
|
||||
png_uint_32 width; /* width of image in pixels (from IHDR) */
|
||||
png_uint_32 height; /* height of image in pixels (from IHDR) */
|
||||
png_uint_32 valid; /* valid chunk data (see PNG_INFO_ below) */
|
||||
png_size_t rowbytes; /* bytes needed to hold an untransformed row */
|
||||
unsigned int valid; /* valid chunk data (see PNG_INFO_ in png.h) */
|
||||
png_colorp palette; /* array of color values (valid & PNG_INFO_PLTE) */
|
||||
png_uint_16 num_palette; /* number of color entries in "palette" (PLTE) */
|
||||
png_uint_16 num_trans; /* number of transparent palette color (tRNS) */
|
||||
png_byte bit_depth; /* 1, 2, 4, 8, or 16 bits/channel (from IHDR) */
|
||||
png_byte color_type; /* see PNG_COLOR_TYPE_ below (from IHDR) */
|
||||
unsigned int num_palette:9; /* number of color entries in "palette" (PLTE) */
|
||||
unsigned int num_trans:9; /* number of transparent palette color (tRNS) */
|
||||
unsigned int bit_depth:6; /* 1, 2, 4, 8, 16 or 32 bits/channel */
|
||||
unsigned int format:PNG_RF_BITS; /* row format; see png_struct.h */
|
||||
/* The following three should have been named *_method not *_type */
|
||||
png_byte compression_type; /* must be PNG_COMPRESSION_TYPE_BASE (IHDR) */
|
||||
png_byte filter_type; /* must be PNG_FILTER_TYPE_BASE (from IHDR) */
|
||||
png_byte interlace_type; /* One of PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */
|
||||
|
||||
/* The following are set by png_set_IHDR, called from the application on
|
||||
* write, but the are never actually used by the write code.
|
||||
*/
|
||||
png_byte channels; /* number of data channels per pixel (1, 2, 3, 4) */
|
||||
png_byte pixel_depth; /* number of bits per pixel */
|
||||
png_byte spare_byte; /* to align the data, and for future use */
|
||||
|
||||
#ifdef PNG_READ_SUPPORTED
|
||||
/* This is never set during write */
|
||||
png_byte signature[8]; /* magic bytes read by libpng from start of file */
|
||||
@@ -105,7 +97,6 @@ struct png_info_def
|
||||
/* iCCP chunk data. */
|
||||
png_charp iccp_name; /* profile name */
|
||||
png_bytep iccp_profile; /* International Color Consortium profile data */
|
||||
png_uint_32 iccp_proflen; /* ICC profile data length */
|
||||
#endif
|
||||
|
||||
#ifdef PNG_TEXT_SUPPORTED
|
||||
@@ -127,6 +118,7 @@ struct png_info_def
|
||||
* modified. See the png_time struct for the contents of this struct.
|
||||
*/
|
||||
png_time mod_time;
|
||||
png_byte time_location;
|
||||
#endif
|
||||
|
||||
#ifdef PNG_sBIT_SUPPORTED
|
||||
|
||||
77
pngmem.c
77
pngmem.c
@@ -1,8 +1,8 @@
|
||||
|
||||
/* pngmem.c - stub functions for memory allocation
|
||||
*
|
||||
* Last changed in libpng 1.6.15 [November 20, 2014]
|
||||
* Copyright (c) 1998-2002,2004,2006-2014 Glenn Randers-Pehrson
|
||||
* 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.)
|
||||
*
|
||||
@@ -18,6 +18,7 @@
|
||||
*/
|
||||
|
||||
#include "pngpriv.h"
|
||||
#define PNG_SRC_FILE PNG_SRC_FILE_pngmem
|
||||
|
||||
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
|
||||
/* Free a png_struct */
|
||||
@@ -80,19 +81,23 @@ png_malloc_base,(png_const_structrp png_ptr, png_alloc_size_t size),
|
||||
/* Some compilers complain that this is always true. However, it
|
||||
* can be false when integer overflow happens.
|
||||
*/
|
||||
if (size > 0 && size <= PNG_SIZE_MAX
|
||||
# ifdef PNG_MAX_MALLOC_64K
|
||||
&& size <= 65536U
|
||||
# endif
|
||||
)
|
||||
#ifdef PNG_MAX_MALLOC_64K
|
||||
if (size > 0 && size <= PNG_SIZE_MAX && size <= 65536U)
|
||||
#else
|
||||
if (size > 0 && size <= PNG_SIZE_MAX)
|
||||
#endif
|
||||
{
|
||||
png_voidp result;
|
||||
|
||||
#ifdef PNG_USER_MEM_SUPPORTED
|
||||
if (png_ptr != NULL && png_ptr->malloc_fn != NULL)
|
||||
return png_ptr->malloc_fn(png_constcast(png_structrp,png_ptr), size);
|
||||
result = png_ptr->malloc_fn(png_constcast(png_structrp,png_ptr), size);
|
||||
|
||||
else
|
||||
#endif
|
||||
return malloc((size_t)size); /* checked for truncation above */
|
||||
result = malloc((size_t)size); /* checked for truncation above */
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
else
|
||||
@@ -122,20 +127,17 @@ PNG_FUNCTION(png_voidp /* PRIVATE */,
|
||||
png_malloc_array,(png_const_structrp png_ptr, int nelements,
|
||||
size_t element_size),PNG_ALLOCATED)
|
||||
{
|
||||
if (nelements <= 0 || element_size == 0)
|
||||
png_error(png_ptr, "internal error: array alloc");
|
||||
|
||||
affirm(nelements > 0 && element_size > 0);
|
||||
return png_malloc_array_checked(png_ptr, nelements, element_size);
|
||||
}
|
||||
|
||||
PNG_FUNCTION(png_voidp /* PRIVATE */,
|
||||
png_realloc_array,(png_const_structrp png_ptr, png_const_voidp old_array,
|
||||
png_realloc_array,(png_structrp png_ptr, png_const_voidp old_array,
|
||||
int old_elements, int add_elements, size_t element_size),PNG_ALLOCATED)
|
||||
{
|
||||
/* These are internal errors: */
|
||||
if (add_elements <= 0 || element_size == 0 || old_elements < 0 ||
|
||||
(old_array == NULL && old_elements > 0))
|
||||
png_error(png_ptr, "internal error: array realloc");
|
||||
affirm(add_elements > 0 && element_size > 0 && old_elements >= 0 &&
|
||||
(old_array != NULL || old_elements == 0));
|
||||
|
||||
/* Check for overflow on the elements count (so the caller does not have to
|
||||
* check.)
|
||||
@@ -160,6 +162,15 @@ png_realloc_array,(png_const_structrp png_ptr, png_const_voidp old_array,
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef PNG_READ_SUPPORTED
|
||||
# ifdef PNG_USER_LIMITS_SUPPORTED
|
||||
/* The potential overflow case. Set the cache counter so libpng will
|
||||
* not make any more attempts
|
||||
*/
|
||||
png_ptr->user_chunk_cache_max = 2;
|
||||
# endif
|
||||
#endif
|
||||
|
||||
return NULL; /* error */
|
||||
}
|
||||
#endif /* TEXT || sPLT || STORE_UNKNOWN_CHUNKS */
|
||||
@@ -179,31 +190,11 @@ png_malloc,(png_const_structrp png_ptr, png_alloc_size_t size),PNG_ALLOCATED)
|
||||
ret = png_malloc_base(png_ptr, size);
|
||||
|
||||
if (ret == NULL)
|
||||
png_error(png_ptr, "Out of memory"); /* 'm' means png_malloc */
|
||||
png_error(png_ptr, "Out of memory");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef PNG_USER_MEM_SUPPORTED
|
||||
PNG_FUNCTION(png_voidp,PNGAPI
|
||||
png_malloc_default,(png_const_structrp png_ptr, png_alloc_size_t size),
|
||||
PNG_ALLOCATED PNG_DEPRECATED)
|
||||
{
|
||||
png_voidp ret;
|
||||
|
||||
if (png_ptr == NULL)
|
||||
return NULL;
|
||||
|
||||
/* Passing 'NULL' here bypasses the application provided memory handler. */
|
||||
ret = png_malloc_base(NULL/*use malloc*/, size);
|
||||
|
||||
if (ret == NULL)
|
||||
png_error(png_ptr, "Out of Memory"); /* 'M' means png_malloc_default */
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif /* USER_MEM */
|
||||
|
||||
/* This function was added at libpng version 1.2.3. The png_malloc_warn()
|
||||
* function will issue a png_warning and return NULL instead of issuing a
|
||||
* png_error, if it fails to allocate the requested memory.
|
||||
@@ -239,17 +230,11 @@ png_free(png_const_structrp png_ptr, png_voidp ptr)
|
||||
png_ptr->free_fn(png_constcast(png_structrp,png_ptr), ptr);
|
||||
|
||||
else
|
||||
png_free_default(png_ptr, ptr);
|
||||
}
|
||||
|
||||
PNG_FUNCTION(void,PNGAPI
|
||||
png_free_default,(png_const_structrp png_ptr, png_voidp ptr),PNG_DEPRECATED)
|
||||
{
|
||||
if (png_ptr == NULL || ptr == NULL)
|
||||
return;
|
||||
free(ptr);
|
||||
#else
|
||||
free(ptr);
|
||||
#endif /* USER_MEM */
|
||||
|
||||
free(ptr);
|
||||
}
|
||||
|
||||
#ifdef PNG_USER_MEM_SUPPORTED
|
||||
|
||||
1579
pngpread.c
1579
pngpread.c
File diff suppressed because it is too large
Load Diff
51
pngrio.c
51
pngrio.c
@@ -1,8 +1,8 @@
|
||||
|
||||
/* pngrio.c - functions for data input
|
||||
*
|
||||
* Last changed in libpng 1.6.17 [March 26, 2015]
|
||||
* Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
|
||||
* 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.)
|
||||
*
|
||||
@@ -19,6 +19,7 @@
|
||||
*/
|
||||
|
||||
#include "pngpriv.h"
|
||||
#define PNG_SRC_FILE PNG_SRC_FILE_rio
|
||||
|
||||
#ifdef PNG_READ_SUPPORTED
|
||||
|
||||
@@ -26,18 +27,18 @@
|
||||
* reads from a file pointer. Note that this routine sometimes gets called
|
||||
* with very small lengths, so you should implement some kind of simple
|
||||
* buffering if you are using unbuffered reads. This should never be asked
|
||||
* to read more than 64K on a 16-bit machine.
|
||||
* to read more than 64K on a 16 bit machine.
|
||||
*/
|
||||
void /* PRIVATE */
|
||||
png_read_data(png_structrp png_ptr, png_bytep data, png_size_t length)
|
||||
png_read_data(png_structrp png_ptr, png_voidp data, png_size_t length)
|
||||
{
|
||||
png_debug1(4, "reading %d bytes", (int)length);
|
||||
|
||||
if (png_ptr->read_data_fn != NULL)
|
||||
(*(png_ptr->read_data_fn))(png_ptr, data, length);
|
||||
if (png_ptr->rw_data_fn != NULL)
|
||||
png_ptr->rw_data_fn(png_ptr, png_voidcast(png_bytep,data), length);
|
||||
|
||||
else
|
||||
png_error(png_ptr, "Call to NULL read function");
|
||||
png_app_error(png_ptr, "No read function");
|
||||
}
|
||||
|
||||
#ifdef PNG_STDIO_SUPPORTED
|
||||
@@ -62,7 +63,7 @@ png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
|
||||
if (check != length)
|
||||
png_error(png_ptr, "Read Error");
|
||||
}
|
||||
#endif
|
||||
#endif /* STDIO */
|
||||
|
||||
/* This function allows the application to supply a new input function
|
||||
* for libpng if standard C streams aren't being used.
|
||||
@@ -90,31 +91,19 @@ png_set_read_fn(png_structrp png_ptr, png_voidp io_ptr,
|
||||
if (png_ptr == NULL)
|
||||
return;
|
||||
|
||||
png_ptr->io_ptr = io_ptr;
|
||||
|
||||
#ifdef PNG_STDIO_SUPPORTED
|
||||
if (read_data_fn != NULL)
|
||||
png_ptr->read_data_fn = read_data_fn;
|
||||
|
||||
else
|
||||
png_ptr->read_data_fn = png_default_read_data;
|
||||
#else
|
||||
png_ptr->read_data_fn = read_data_fn;
|
||||
#endif
|
||||
|
||||
#ifdef PNG_WRITE_SUPPORTED
|
||||
/* It is an error to write to a read device */
|
||||
if (png_ptr->write_data_fn != NULL)
|
||||
if (!png_ptr->read_struct)
|
||||
{
|
||||
png_ptr->write_data_fn = NULL;
|
||||
png_warning(png_ptr,
|
||||
"Can't set both read_data_fn and write_data_fn in the"
|
||||
" same structure");
|
||||
png_app_error(png_ptr, "cannot set a read function on a write struct");
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef PNG_WRITE_FLUSH_SUPPORTED
|
||||
png_ptr->output_flush_fn = NULL;
|
||||
#endif
|
||||
if (read_data_fn == NULL)
|
||||
{
|
||||
png_app_error(png_ptr, "API change: png_set_read_fn requires a function");
|
||||
return;
|
||||
}
|
||||
|
||||
png_ptr->io_ptr = io_ptr;
|
||||
png_ptr->rw_data_fn = read_data_fn;
|
||||
}
|
||||
#endif /* READ */
|
||||
|
||||
11237
pngrtran.c
11237
pngrtran.c
File diff suppressed because it is too large
Load Diff
4661
pngrutil.c
4661
pngrutil.c
File diff suppressed because it is too large
Load Diff
575
pngset.c
575
pngset.c
@@ -1,8 +1,8 @@
|
||||
|
||||
/* pngset.c - storage of image information into info struct
|
||||
*
|
||||
* Last changed in libpng 1.6.21 [January 15, 2016]
|
||||
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||
* 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.)
|
||||
*
|
||||
@@ -17,6 +17,7 @@
|
||||
*/
|
||||
|
||||
#include "pngpriv.h"
|
||||
#define PNG_SRC_FILE PNG_SRC_FILE_pngset
|
||||
|
||||
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
|
||||
|
||||
@@ -163,8 +164,6 @@ void PNGAPI
|
||||
png_set_hIST(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
png_const_uint_16p hist)
|
||||
{
|
||||
int i;
|
||||
|
||||
png_debug1(1, "in %s storage function", "hIST");
|
||||
|
||||
if (png_ptr == NULL || info_ptr == NULL)
|
||||
@@ -196,8 +195,12 @@ png_set_hIST(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
|
||||
info_ptr->free_me |= PNG_FREE_HIST;
|
||||
|
||||
for (i = 0; i < info_ptr->num_palette; i++)
|
||||
info_ptr->hist[i] = hist[i];
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < info_ptr->num_palette; i++)
|
||||
info_ptr->hist[i] = hist[i];
|
||||
}
|
||||
|
||||
info_ptr->valid |= PNG_INFO_hIST;
|
||||
}
|
||||
@@ -216,31 +219,16 @@ png_set_IHDR(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
|
||||
info_ptr->width = width;
|
||||
info_ptr->height = height;
|
||||
info_ptr->bit_depth = (png_byte)bit_depth;
|
||||
info_ptr->color_type = (png_byte)color_type;
|
||||
info_ptr->compression_type = (png_byte)compression_type;
|
||||
info_ptr->filter_type = (png_byte)filter_type;
|
||||
info_ptr->interlace_type = (png_byte)interlace_type;
|
||||
info_ptr->bit_depth = png_check_bits(png_ptr, bit_depth, 6);
|
||||
info_ptr->format = png_check_bits(png_ptr,
|
||||
PNG_FORMAT_FROM_COLOR_TYPE(color_type), PNG_RF_BITS);
|
||||
info_ptr->compression_type = png_check_byte(png_ptr, compression_type);
|
||||
info_ptr->filter_type = png_check_byte(png_ptr, filter_type);
|
||||
info_ptr->interlace_type = png_check_byte(png_ptr, interlace_type);
|
||||
|
||||
png_check_IHDR (png_ptr, info_ptr->width, info_ptr->height,
|
||||
info_ptr->bit_depth, info_ptr->color_type, info_ptr->interlace_type,
|
||||
info_ptr->bit_depth, color_type, info_ptr->interlace_type,
|
||||
info_ptr->compression_type, info_ptr->filter_type);
|
||||
|
||||
if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
|
||||
info_ptr->channels = 1;
|
||||
|
||||
else if ((info_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0)
|
||||
info_ptr->channels = 3;
|
||||
|
||||
else
|
||||
info_ptr->channels = 1;
|
||||
|
||||
if ((info_ptr->color_type & PNG_COLOR_MASK_ALPHA) != 0)
|
||||
info_ptr->channels++;
|
||||
|
||||
info_ptr->pixel_depth = (png_byte)(info_ptr->channels * info_ptr->bit_depth);
|
||||
|
||||
info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, width);
|
||||
}
|
||||
|
||||
#ifdef PNG_oFFs_SUPPORTED
|
||||
@@ -255,7 +243,7 @@ png_set_oFFs(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
|
||||
info_ptr->x_offset = offset_x;
|
||||
info_ptr->y_offset = offset_y;
|
||||
info_ptr->offset_unit_type = (png_byte)unit_type;
|
||||
info_ptr->offset_unit_type = png_check_byte(png_ptr, unit_type);
|
||||
info_ptr->valid |= PNG_INFO_oFFs;
|
||||
}
|
||||
#endif
|
||||
@@ -311,8 +299,8 @@ png_set_pCAL(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
png_debug(3, "storing X0, X1, type, and nparams in info");
|
||||
info_ptr->pcal_X0 = X0;
|
||||
info_ptr->pcal_X1 = X1;
|
||||
info_ptr->pcal_type = (png_byte)type;
|
||||
info_ptr->pcal_nparams = (png_byte)nparams;
|
||||
info_ptr->pcal_type = png_check_byte(png_ptr, type);
|
||||
info_ptr->pcal_nparams = png_check_byte(png_ptr, nparams);
|
||||
|
||||
length = strlen(units) + 1;
|
||||
png_debug1(3, "allocating units for info (%lu bytes)",
|
||||
@@ -391,7 +379,7 @@ png_set_sCAL_s(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
sheight[0] == 45 /* '-' */ || !png_check_fp_string(sheight, lengthh))
|
||||
png_error(png_ptr, "Invalid sCAL height");
|
||||
|
||||
info_ptr->scal_unit = (png_byte)unit;
|
||||
info_ptr->scal_unit = png_check_byte(png_ptr, unit);
|
||||
|
||||
++lengthw;
|
||||
|
||||
@@ -432,7 +420,8 @@ png_set_sCAL_s(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
info_ptr->free_me |= PNG_FREE_SCAL;
|
||||
}
|
||||
|
||||
# ifdef PNG_FLOATING_POINT_SUPPORTED
|
||||
# if defined(PNG_FLOATING_POINT_SUPPORTED) &&\
|
||||
defined(PNG_FLOATING_ARITHMETIC_SUPPORTED)
|
||||
void PNGAPI
|
||||
png_set_sCAL(png_const_structrp png_ptr, png_inforp info_ptr, int unit,
|
||||
double width, double height)
|
||||
@@ -503,7 +492,7 @@ png_set_pHYs(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
|
||||
info_ptr->x_pixels_per_unit = res_x;
|
||||
info_ptr->y_pixels_per_unit = res_y;
|
||||
info_ptr->phys_unit_type = (png_byte)unit_type;
|
||||
info_ptr->phys_unit_type = png_check_byte(png_ptr, unit_type);
|
||||
info_ptr->valid |= PNG_INFO_pHYs;
|
||||
}
|
||||
#endif
|
||||
@@ -520,55 +509,44 @@ png_set_PLTE(png_structrp png_ptr, png_inforp info_ptr,
|
||||
if (png_ptr == NULL || info_ptr == NULL)
|
||||
return;
|
||||
|
||||
max_palette_length = (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) ?
|
||||
max_palette_length = (info_ptr->format & PNG_FORMAT_FLAG_COLORMAP) == 0 ?
|
||||
(1 << info_ptr->bit_depth) : PNG_MAX_PALETTE_LENGTH;
|
||||
|
||||
if (num_palette < 0 || num_palette > (int) max_palette_length)
|
||||
{
|
||||
if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
|
||||
png_error(png_ptr, "Invalid palette length");
|
||||
if ((info_ptr->format & PNG_FORMAT_FLAG_COLORMAP) != 0)
|
||||
png_chunk_error(png_ptr, "Invalid palette length");
|
||||
|
||||
else
|
||||
{
|
||||
png_warning(png_ptr, "Invalid palette length");
|
||||
|
||||
png_chunk_report(png_ptr, "Invalid palette length", PNG_CHUNK_ERROR);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if ((num_palette > 0 && palette == NULL) ||
|
||||
(num_palette == 0
|
||||
# ifdef PNG_MNG_FEATURES_SUPPORTED
|
||||
&& (png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE) == 0
|
||||
# endif
|
||||
))
|
||||
{
|
||||
#ifdef PNG_MNG_FEATURES_SUPPORTED
|
||||
if ((num_palette > 0 && palette == NULL) || (num_palette == 0 &&
|
||||
(png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE) == 0))
|
||||
png_error(png_ptr, "Invalid palette");
|
||||
}
|
||||
#else
|
||||
if ((num_palette > 0 && palette == NULL) || num_palette == 0)
|
||||
png_error(png_ptr, "Invalid palette");
|
||||
#endif /* MNG_FEATURES */
|
||||
|
||||
/* It may not actually be necessary to set png_ptr->palette here;
|
||||
* we do it for backward compatibility with the way the png_handle_tRNS
|
||||
* function used to do the allocation.
|
||||
*
|
||||
* 1.6.0: the above statement appears to be incorrect; something has to set
|
||||
* the palette inside png_struct on read.
|
||||
*/
|
||||
png_free_data(png_ptr, info_ptr, PNG_FREE_PLTE, 0);
|
||||
|
||||
/* Changed in libpng-1.2.1 to allocate PNG_MAX_PALETTE_LENGTH instead
|
||||
* of num_palette entries, in case of an invalid PNG file or incorrect
|
||||
* call to png_set_PLTE() with too-large sample values.
|
||||
*/
|
||||
png_ptr->palette = png_voidcast(png_colorp, png_calloc(png_ptr,
|
||||
info_ptr->palette = png_voidcast(png_colorp, png_calloc(png_ptr,
|
||||
PNG_MAX_PALETTE_LENGTH * (sizeof (png_color))));
|
||||
|
||||
if (num_palette > 0)
|
||||
memcpy(png_ptr->palette, palette, num_palette * (sizeof (png_color)));
|
||||
info_ptr->palette = png_ptr->palette;
|
||||
info_ptr->num_palette = png_ptr->num_palette = (png_uint_16)num_palette;
|
||||
memcpy(info_ptr->palette, palette, num_palette * (sizeof (png_color)));
|
||||
|
||||
info_ptr->num_palette = png_check_bits(png_ptr, num_palette, 9);
|
||||
info_ptr->free_me |= PNG_FREE_PLTE;
|
||||
|
||||
info_ptr->valid |= PNG_INFO_PLTE;
|
||||
}
|
||||
|
||||
@@ -648,7 +626,7 @@ png_set_iCCP(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
*/
|
||||
{
|
||||
int result = png_colorspace_set_ICC(png_ptr, &info_ptr->colorspace, name,
|
||||
proflen, profile, info_ptr->color_type);
|
||||
proflen, profile, (info_ptr->format & PNG_FORMAT_FLAG_COLOR) != 0);
|
||||
|
||||
png_colorspace_sync_info(png_ptr, info_ptr);
|
||||
|
||||
@@ -688,7 +666,6 @@ png_set_iCCP(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
|
||||
png_free_data(png_ptr, info_ptr, PNG_FREE_ICCP, 0);
|
||||
|
||||
info_ptr->iccp_proflen = proflen;
|
||||
info_ptr->iccp_name = new_iccp_name;
|
||||
info_ptr->iccp_profile = new_iccp_profile;
|
||||
info_ptr->free_me |= PNG_FREE_ICCP;
|
||||
@@ -696,9 +673,80 @@ png_set_iCCP(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(PNG_TEXT_SUPPORTED) || defined(PNG_tIME_SUPPORTED)
|
||||
static png_byte
|
||||
get_location(png_const_structrp png_ptr)
|
||||
/* Return the correct location flag for a chunk. For a png_set_<chunk>
|
||||
* called during read this is the current read location, for a
|
||||
* png_set_<chunk> called during write it is the following write location
|
||||
* (because the chunks at the current location have already been written.)
|
||||
* For a png_set_<chunk> called before read starts (none of the 'position'
|
||||
* mode bits are set) the position is set to the start (PNG_HAVE_IHDR). For
|
||||
* a png_set_chunk> called before write starts PNG_HAVE_PLTE|PNG_AFTER_IDAT
|
||||
* are set because we don't know whether this is the main png_info or the one
|
||||
* for use after the IDAT from png_write_end.
|
||||
*
|
||||
* The latter behavior gives compatibility with the old behavior of
|
||||
* png_set_text; it only wrote text chunks after the PLTE or IDAT and it just
|
||||
* wrote them once.
|
||||
*/
|
||||
{
|
||||
if ((png_ptr->mode & PNG_AFTER_IDAT) != 0U)
|
||||
return PNG_AFTER_IDAT;
|
||||
|
||||
else if ((png_ptr->mode & PNG_HAVE_PLTE) != 0U)
|
||||
{
|
||||
/* In a write operation PNG_HAVE_PLTE is set when the chunks before the
|
||||
* IDAT are written (in png_write_info), so the location needs to be after
|
||||
* IDAT. In a read the chunk was read after the PLTE but before the IDAT.
|
||||
*/
|
||||
if (png_ptr->read_struct)
|
||||
return PNG_HAVE_PLTE;
|
||||
|
||||
else /* write struct */
|
||||
return PNG_AFTER_IDAT;
|
||||
}
|
||||
|
||||
else if ((png_ptr->mode & PNG_HAVE_IHDR) != 0U)
|
||||
{
|
||||
/* For read this means the chunk is between the IHDR and any PLTE; there
|
||||
* may be none but then there is no order to preserve.
|
||||
*
|
||||
* For write png_write_IHDR has been called and that means that the info
|
||||
* before PLTE has been written, so the chunk goes after.
|
||||
*/
|
||||
if (png_ptr->read_struct)
|
||||
return PNG_HAVE_IHDR;
|
||||
|
||||
else /* write struct */
|
||||
return PNG_HAVE_PLTE;
|
||||
}
|
||||
|
||||
else if ((png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) != 0U)
|
||||
{
|
||||
/* This should not happen on read, on write it means that the app has
|
||||
* started writing so assume the text is meant to go before PLTE.
|
||||
*/
|
||||
return PNG_HAVE_IHDR;
|
||||
}
|
||||
|
||||
/* Either a png_set_<chunk> from the application during read before reading
|
||||
* starts (so mode is 0) or the same for write.
|
||||
*/
|
||||
else
|
||||
{
|
||||
if (png_ptr->read_struct)
|
||||
return PNG_HAVE_IHDR;
|
||||
|
||||
else
|
||||
return PNG_HAVE_PLTE|PNG_AFTER_IDAT;
|
||||
}
|
||||
}
|
||||
#endif /* TEXT || tIME */
|
||||
|
||||
#ifdef PNG_TEXT_SUPPORTED
|
||||
void PNGAPI
|
||||
png_set_text(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
png_set_text(png_structrp png_ptr, png_inforp info_ptr,
|
||||
png_const_textp text_ptr, int num_text)
|
||||
{
|
||||
int ret;
|
||||
@@ -709,12 +757,12 @@ png_set_text(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
}
|
||||
|
||||
int /* PRIVATE */
|
||||
png_set_text_2(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
png_set_text_2(png_structrp png_ptr, png_inforp info_ptr,
|
||||
png_const_textp text_ptr, int num_text)
|
||||
{
|
||||
int i;
|
||||
|
||||
png_debug1(1, "in %lx storage function", png_ptr == NULL ? 0xabadca11U :
|
||||
png_debug1(1, "in %lx storage function", png_ptr == NULL ? 0xabadca11 :
|
||||
(unsigned long)png_ptr->chunk_name);
|
||||
|
||||
if (png_ptr == NULL || info_ptr == NULL || num_text <= 0 || text_ptr == NULL)
|
||||
@@ -731,6 +779,11 @@ png_set_text_2(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
int max_text;
|
||||
png_textp new_text = NULL;
|
||||
|
||||
/* The code below goes horribly wrong if old_num_text ever ends up
|
||||
* negative, so:
|
||||
*/
|
||||
affirm(old_num_text >= 0);
|
||||
|
||||
/* Calculate an appropriate max_text, checking for overflow. */
|
||||
max_text = old_num_text;
|
||||
if (num_text <= INT_MAX - max_text)
|
||||
@@ -820,6 +873,12 @@ png_set_text_2(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
}
|
||||
# endif
|
||||
|
||||
/* Record the location for posterity. On the read side this just says
|
||||
* where the chunk was (approximately). On the write side it says how far
|
||||
* through the write process libpng was before this API was called.
|
||||
*/
|
||||
textp->location = get_location(png_ptr);
|
||||
|
||||
if (text_ptr[i].text == NULL || text_ptr[i].text[0] == '\0')
|
||||
{
|
||||
text_length = 0;
|
||||
@@ -909,24 +968,38 @@ png_set_tIME(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
{
|
||||
png_debug1(1, "in %s storage function", "tIME");
|
||||
|
||||
if (png_ptr == NULL || info_ptr == NULL || mod_time == NULL ||
|
||||
(png_ptr->mode & PNG_WROTE_tIME) != 0)
|
||||
if (png_ptr == NULL || info_ptr == NULL || mod_time == NULL)
|
||||
return;
|
||||
|
||||
/* It is valid to do set the tIME chunk after the IDAT has been written, but
|
||||
* not if one has already been written. This was ignored before - the
|
||||
* previous time was used - this is a bad thing.
|
||||
*/
|
||||
if ((info_ptr->valid & PNG_INFO_tIME) != 0 /* Changing a time chunk */ &&
|
||||
(png_ptr->mode & PNG_HAVE_IHDR) != 0 /* after writing started */)
|
||||
{
|
||||
/* So it can be *set* but it can't be *changed* after the info before PLTE
|
||||
* has been written. (Note that putting tIME into an unknown chunk
|
||||
* currently gets round this; to be fixed.)
|
||||
*/
|
||||
png_app_error(png_ptr, "cannot change tIME after writing starts");
|
||||
return;
|
||||
}
|
||||
|
||||
if (mod_time->month == 0 || mod_time->month > 12 ||
|
||||
mod_time->day == 0 || mod_time->day > 31 ||
|
||||
mod_time->hour > 23 || mod_time->minute > 59 ||
|
||||
mod_time->second > 60)
|
||||
{
|
||||
png_warning(png_ptr, "Ignoring invalid time value");
|
||||
|
||||
png_app_error(png_ptr, "Ignoring invalid time value");
|
||||
return;
|
||||
}
|
||||
|
||||
info_ptr->mod_time = *mod_time;
|
||||
info_ptr->time_location = get_location(png_ptr);
|
||||
info_ptr->valid |= PNG_INFO_tIME;
|
||||
}
|
||||
#endif
|
||||
#endif /* tIME */
|
||||
|
||||
#ifdef PNG_tRNS_SUPPORTED
|
||||
void PNGAPI
|
||||
@@ -936,67 +1009,98 @@ png_set_tRNS(png_structrp png_ptr, png_inforp info_ptr,
|
||||
png_debug1(1, "in %s storage function", "tRNS");
|
||||
|
||||
if (png_ptr == NULL || info_ptr == NULL)
|
||||
|
||||
return;
|
||||
|
||||
if (trans_alpha != NULL)
|
||||
if ((info_ptr->format & PNG_FORMAT_FLAG_ALPHA) != 0)
|
||||
png_chunk_report(png_ptr,
|
||||
"png_set_tRNS: invalid on PNG with alpha channel", PNG_CHUNK_ERROR);
|
||||
|
||||
else if ((info_ptr->format & PNG_FORMAT_FLAG_COLORMAP) != 0)
|
||||
{
|
||||
/* It may not actually be necessary to set png_ptr->trans_alpha here;
|
||||
* we do it for backward compatibility with the way the png_handle_tRNS
|
||||
* function used to do the allocation.
|
||||
*
|
||||
* 1.6.0: The above statement is incorrect; png_handle_tRNS effectively
|
||||
* relies on png_set_tRNS storing the information in png_struct
|
||||
* (otherwise it won't be there for the code in pngrtran.c).
|
||||
*/
|
||||
int max_num;
|
||||
|
||||
png_free_data(png_ptr, info_ptr, PNG_FREE_TRNS, 0);
|
||||
/* Free the old data; num_trans 0 can be used to kill the tRNS */
|
||||
png_free_data(png_ptr, info_ptr, PNG_FREE_TRNS, 0);
|
||||
|
||||
/* Changed from num_trans to PNG_MAX_PALETTE_LENGTH in version 1.2.1 */
|
||||
png_ptr->trans_alpha = info_ptr->trans_alpha = png_voidcast(png_bytep,
|
||||
png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH));
|
||||
/* Do this just in case the old data was not owned by libpng: */
|
||||
info_ptr->valid &= PNG_BIC_MASK(PNG_INFO_tRNS);
|
||||
info_ptr->trans_alpha = NULL;
|
||||
info_ptr->num_trans = 0;
|
||||
|
||||
if (num_trans > 0 && num_trans <= PNG_MAX_PALETTE_LENGTH)
|
||||
memcpy(info_ptr->trans_alpha, trans_alpha, (png_size_t)num_trans);
|
||||
}
|
||||
/* Expect png_set_PLTE to happen before png_set_tRNS, so num_palette will
|
||||
* be set, but this is not a requirement of the API.
|
||||
*/
|
||||
if (info_ptr->num_palette)
|
||||
max_num = info_ptr->num_palette;
|
||||
|
||||
if (trans_color != NULL)
|
||||
{
|
||||
#ifdef PNG_WARNINGS_SUPPORTED
|
||||
if (info_ptr->bit_depth < 16)
|
||||
else
|
||||
max_num = 1 << info_ptr->bit_depth;
|
||||
|
||||
if (num_trans > max_num)
|
||||
{
|
||||
int sample_max = (1 << info_ptr->bit_depth) - 1;
|
||||
|
||||
if ((info_ptr->color_type == PNG_COLOR_TYPE_GRAY &&
|
||||
trans_color->gray > sample_max) ||
|
||||
(info_ptr->color_type == PNG_COLOR_TYPE_RGB &&
|
||||
(trans_color->red > sample_max ||
|
||||
trans_color->green > sample_max ||
|
||||
trans_color->blue > sample_max)))
|
||||
png_warning(png_ptr,
|
||||
"tRNS chunk has out-of-range samples for bit_depth");
|
||||
png_chunk_report(png_ptr, "png_set_tRNS: num_trans too large",
|
||||
PNG_CHUNK_ERROR);
|
||||
/* If control returns simply limit it; the behavior prior to 1.7 was to
|
||||
* issue a warning and skip the palette in png_write_tRNS.
|
||||
*/
|
||||
num_trans = max_num;
|
||||
}
|
||||
#endif
|
||||
|
||||
info_ptr->trans_color = *trans_color;
|
||||
/* But only attempt a malloc if there is something to do; so the app can
|
||||
* set a tRNS array then later delete it.
|
||||
*/
|
||||
if (num_trans > 0 && trans_alpha != NULL)
|
||||
{
|
||||
/* Changed from num_trans to PNG_MAX_PALETTE_LENGTH in version 1.2.1,
|
||||
* this avoids issues where a palette image contains out of range
|
||||
* indices.
|
||||
*/
|
||||
info_ptr->trans_alpha = png_voidcast(png_bytep, png_malloc(png_ptr,
|
||||
PNG_MAX_PALETTE_LENGTH));
|
||||
info_ptr->free_me |= PNG_FREE_TRNS;
|
||||
|
||||
if (num_trans == 0)
|
||||
num_trans = 1;
|
||||
memcpy(info_ptr->trans_alpha, trans_alpha,
|
||||
(unsigned)/*SAFE*/num_trans);
|
||||
info_ptr->valid |= PNG_INFO_tRNS;
|
||||
info_ptr->num_trans = png_check_bits(png_ptr, num_trans, 9);
|
||||
}
|
||||
}
|
||||
|
||||
info_ptr->num_trans = (png_uint_16)num_trans;
|
||||
|
||||
if (num_trans != 0)
|
||||
else /* not a PALETTE image */
|
||||
{
|
||||
info_ptr->valid |= PNG_INFO_tRNS;
|
||||
info_ptr->free_me |= PNG_FREE_TRNS;
|
||||
/* Invalidate any prior transparent color and set num_trans. It is not
|
||||
* used internally in this case but png_get_tRNS still returns it.
|
||||
*/
|
||||
info_ptr->valid &= PNG_BIC_MASK(PNG_INFO_tRNS);
|
||||
info_ptr->num_trans = 0; /* for png_get_tRNS */
|
||||
|
||||
if (trans_color != NULL && info_ptr->bit_depth < 16)
|
||||
{
|
||||
unsigned int sample_max = (1U << info_ptr->bit_depth) - 1U;
|
||||
|
||||
if (!(info_ptr->format & PNG_FORMAT_FLAG_COLOR) ?
|
||||
trans_color->gray <= sample_max :
|
||||
trans_color->red <= sample_max &&
|
||||
trans_color->green <= sample_max &&
|
||||
trans_color->blue <= sample_max)
|
||||
{
|
||||
info_ptr->trans_color = *trans_color;
|
||||
info_ptr->valid |= PNG_INFO_tRNS;
|
||||
info_ptr->num_trans = 1; /* for png_get_tRNS */
|
||||
}
|
||||
|
||||
else
|
||||
png_chunk_report(png_ptr,
|
||||
"tRNS chunk has out-of-range samples for bit_depth",
|
||||
PNG_CHUNK_ERROR);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef PNG_sPLT_SUPPORTED
|
||||
void PNGAPI
|
||||
png_set_sPLT(png_const_structrp png_ptr,
|
||||
png_set_sPLT(png_structrp png_ptr,
|
||||
png_inforp info_ptr, png_const_sPLT_tp entries, int nentries)
|
||||
/*
|
||||
* entries - array of png_sPLT_t structures
|
||||
@@ -1104,13 +1208,13 @@ check_location(png_const_structrp png_ptr, int location)
|
||||
* change; previously the app had to use the
|
||||
* png_set_unknown_chunk_location API below for each chunk.
|
||||
*/
|
||||
if (location == 0 && (png_ptr->mode & PNG_IS_READ_STRUCT) == 0)
|
||||
if (location == 0 && !png_ptr->read_struct)
|
||||
{
|
||||
/* Write struct, so unknown chunks come from the app */
|
||||
png_app_warning(png_ptr,
|
||||
"png_set_unknown_chunks now expects a valid location");
|
||||
/* Use the old behavior */
|
||||
location = (png_byte)(png_ptr->mode &
|
||||
location = png_check_byte(png_ptr, png_ptr->mode &
|
||||
(PNG_HAVE_IHDR|PNG_HAVE_PLTE|PNG_AFTER_IDAT));
|
||||
}
|
||||
|
||||
@@ -1129,11 +1233,11 @@ check_location(png_const_structrp png_ptr, int location)
|
||||
/* The cast is safe because 'location' is a bit mask and only the low four
|
||||
* bits are significant.
|
||||
*/
|
||||
return (png_byte)location;
|
||||
return png_check_byte(png_ptr, location);
|
||||
}
|
||||
|
||||
void PNGAPI
|
||||
png_set_unknown_chunks(png_const_structrp png_ptr,
|
||||
png_set_unknown_chunks(png_structrp png_ptr,
|
||||
png_inforp info_ptr, png_const_unknown_chunkp unknowns, int num_unknowns)
|
||||
{
|
||||
png_unknown_chunkp np;
|
||||
@@ -1148,18 +1252,16 @@ png_set_unknown_chunks(png_const_structrp png_ptr,
|
||||
* code) but may be meaningless if the read or write handling of unknown
|
||||
* chunks is not compiled in.
|
||||
*/
|
||||
# if !defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) && \
|
||||
defined(PNG_READ_SUPPORTED)
|
||||
if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0)
|
||||
# ifndef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
|
||||
if (png_ptr->read_struct)
|
||||
{
|
||||
png_app_error(png_ptr, "no unknown chunk support on read");
|
||||
|
||||
return;
|
||||
}
|
||||
# endif
|
||||
# if !defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED) && \
|
||||
defined(PNG_WRITE_SUPPORTED)
|
||||
if ((png_ptr->mode & PNG_IS_READ_STRUCT) == 0)
|
||||
# ifndef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
|
||||
if (!png_ptr->read_struct)
|
||||
{
|
||||
png_app_error(png_ptr, "no unknown chunk support on write");
|
||||
|
||||
@@ -1178,9 +1280,7 @@ png_set_unknown_chunks(png_const_structrp png_ptr,
|
||||
|
||||
if (np == NULL)
|
||||
{
|
||||
png_chunk_report(png_ptr, "too many unknown chunks",
|
||||
PNG_CHUNK_WRITE_ERROR);
|
||||
|
||||
png_chunk_report(png_ptr, "too many unknown chunks", PNG_CHUNK_ERROR);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1213,7 +1313,7 @@ png_set_unknown_chunks(png_const_structrp png_ptr,
|
||||
if (np->data == NULL)
|
||||
{
|
||||
png_chunk_report(png_ptr, "unknown chunk: out of memory",
|
||||
PNG_CHUNK_WRITE_ERROR);
|
||||
PNG_CHUNK_ERROR);
|
||||
/* But just skip storing the unknown chunk */
|
||||
continue;
|
||||
}
|
||||
@@ -1237,8 +1337,6 @@ png_set_unknown_chunk_location(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
{
|
||||
/* This API is pretty pointless in 1.6.0 because the location can be set
|
||||
* before the call to png_set_unknown_chunks.
|
||||
*
|
||||
* TODO: add a png_app_warning in 1.7
|
||||
*/
|
||||
if (png_ptr != NULL && info_ptr != NULL && chunk >= 0 &&
|
||||
chunk < info_ptr->unknown_chunks_num)
|
||||
@@ -1257,27 +1355,17 @@ png_set_unknown_chunk_location(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
info_ptr->unknown_chunks[chunk].location =
|
||||
check_location(png_ptr, location);
|
||||
}
|
||||
|
||||
/* TODO: make this an error in 1.8 (or maybe it will become one in 1.7!) */
|
||||
else if (png_ptr != NULL)
|
||||
png_app_warning(png_ptr, "unknown chunk index out of range");
|
||||
}
|
||||
#endif /* STORE_UNKNOWN_CHUNKS */
|
||||
|
||||
#ifdef PNG_MNG_FEATURES_SUPPORTED
|
||||
png_uint_32 PNGAPI
|
||||
png_permit_mng_features (png_structrp png_ptr, png_uint_32 mng_features)
|
||||
{
|
||||
png_debug(1, "in png_permit_mng_features");
|
||||
|
||||
if (png_ptr == NULL)
|
||||
return 0;
|
||||
|
||||
png_ptr->mng_features_permitted = mng_features & PNG_ALL_MNG_FEATURES;
|
||||
|
||||
return png_ptr->mng_features_permitted;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
|
||||
static unsigned int
|
||||
add_one_chunk(png_bytep list, unsigned int count, png_const_bytep add, int keep)
|
||||
add_one_chunk(png_structrp png_ptr, png_bytep list, unsigned int count,
|
||||
png_const_bytep add, int keep)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
@@ -1288,8 +1376,8 @@ add_one_chunk(png_bytep list, unsigned int count, png_const_bytep add, int keep)
|
||||
{
|
||||
if (memcmp(list, add, 4) == 0)
|
||||
{
|
||||
list[4] = (png_byte)keep;
|
||||
|
||||
list[4] = keep & 0x3;
|
||||
png_cache_known_unknown(png_ptr, add, keep);
|
||||
return count;
|
||||
}
|
||||
}
|
||||
@@ -1298,7 +1386,8 @@ add_one_chunk(png_bytep list, unsigned int count, png_const_bytep add, int keep)
|
||||
{
|
||||
++count;
|
||||
memcpy(list, add, 4);
|
||||
list[4] = (png_byte)keep;
|
||||
list[4] = png_check_byte(png_ptr, keep);
|
||||
png_cache_known_unknown(png_ptr, add, keep);
|
||||
}
|
||||
|
||||
return count;
|
||||
@@ -1314,16 +1403,27 @@ png_set_keep_unknown_chunks(png_structrp png_ptr, int keep,
|
||||
if (png_ptr == NULL)
|
||||
return;
|
||||
|
||||
/* To actually use IF_SAFE or ALWAYS on read it is necessary to have the
|
||||
* read SAVE code enabled.
|
||||
*/
|
||||
if (keep < 0 || keep >= PNG_HANDLE_CHUNK_LAST)
|
||||
{
|
||||
png_app_error(png_ptr, "png_set_keep_unknown_chunks: invalid keep");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
# ifndef PNG_SAVE_UNKNOWN_CHUNKS_SUPPORTED
|
||||
/* This is only a warning; if the application handles the chunk with a
|
||||
* read callback it may work fine.
|
||||
*/
|
||||
if (png_ptr->read_struct && keep >= PNG_HANDLE_CHUNK_IF_SAFE)
|
||||
png_app_warning(png_ptr,
|
||||
"png_set_keep_unknown_chunks: unsupported keep");
|
||||
# endif
|
||||
|
||||
if (num_chunks_in <= 0)
|
||||
{
|
||||
png_ptr->unknown_default = keep;
|
||||
png_ptr->unknown_default = (unsigned)keep & 0x3;
|
||||
|
||||
/* '0' means just set the flags, so stop here */
|
||||
if (num_chunks_in == 0)
|
||||
@@ -1367,7 +1467,6 @@ png_set_keep_unknown_chunks(png_structrp png_ptr, int keep,
|
||||
* which can be switched off.
|
||||
*/
|
||||
png_app_error(png_ptr, "png_set_keep_unknown_chunks: no chunk list");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1383,7 +1482,6 @@ png_set_keep_unknown_chunks(png_structrp png_ptr, int keep,
|
||||
if (num_chunks + old_num_chunks > UINT_MAX/5)
|
||||
{
|
||||
png_app_error(png_ptr, "png_set_keep_unknown_chunks: too many chunks");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1419,7 +1517,7 @@ png_set_keep_unknown_chunks(png_structrp png_ptr, int keep,
|
||||
|
||||
for (i=0; i<num_chunks; ++i)
|
||||
{
|
||||
old_num_chunks = add_one_chunk(new_list, old_num_chunks,
|
||||
old_num_chunks = add_one_chunk(png_ptr, new_list, old_num_chunks,
|
||||
chunk_list+5*i, keep);
|
||||
}
|
||||
|
||||
@@ -1476,7 +1574,7 @@ png_set_read_user_chunk_fn(png_structrp png_ptr, png_voidp user_chunk_ptr,
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef PNG_INFO_IMAGE_SUPPORTED
|
||||
#ifdef PNG_WRITE_PNG_SUPPORTED
|
||||
void PNGAPI
|
||||
png_set_rows(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
png_bytepp row_pointers)
|
||||
@@ -1498,70 +1596,25 @@ png_set_rows(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
#endif
|
||||
|
||||
void PNGAPI
|
||||
png_set_compression_buffer_size(png_structrp png_ptr, png_size_t size)
|
||||
png_set_compression_buffer_size(png_structrp png_ptr, png_alloc_size_t size)
|
||||
{
|
||||
if (png_ptr == NULL)
|
||||
return;
|
||||
if (png_ptr == NULL)
|
||||
return;
|
||||
|
||||
if (size == 0 || size > PNG_UINT_31_MAX)
|
||||
png_error(png_ptr, "invalid compression buffer size");
|
||||
if (size == 0 ||
|
||||
size > (png_ptr->read_struct ? ZLIB_IO_MAX : PNG_UINT_31_MAX))
|
||||
png_error(png_ptr, "invalid compression buffer size");
|
||||
|
||||
# ifdef PNG_SEQUENTIAL_READ_SUPPORTED
|
||||
if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0)
|
||||
{
|
||||
png_ptr->IDAT_read_size = (png_uint_32)size; /* checked above */
|
||||
return;
|
||||
}
|
||||
# endif
|
||||
|
||||
# ifdef PNG_WRITE_SUPPORTED
|
||||
if ((png_ptr->mode & PNG_IS_READ_STRUCT) == 0)
|
||||
{
|
||||
if (png_ptr->zowner != 0)
|
||||
{
|
||||
png_warning(png_ptr,
|
||||
"Compression buffer size cannot be changed because it is in use");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
#ifndef __COVERITY__
|
||||
/* Some compilers complain that this is always false. However, it
|
||||
* can be true when integer overflow happens.
|
||||
*/
|
||||
if (size > ZLIB_IO_MAX)
|
||||
{
|
||||
png_warning(png_ptr,
|
||||
"Compression buffer size limited to system maximum");
|
||||
size = ZLIB_IO_MAX; /* must fit */
|
||||
}
|
||||
#endif
|
||||
|
||||
if (size < 6)
|
||||
{
|
||||
/* Deflate will potentially go into an infinite loop on a SYNC_FLUSH
|
||||
* if this is permitted.
|
||||
*/
|
||||
png_warning(png_ptr,
|
||||
"Compression buffer size cannot be reduced below 6");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (png_ptr->zbuffer_size != size)
|
||||
{
|
||||
png_free_buffer_list(png_ptr, &png_ptr->zbuffer_list);
|
||||
png_ptr->zbuffer_size = (uInt)size;
|
||||
}
|
||||
}
|
||||
# endif
|
||||
# if (defined PNG_SEQUENTIAL_READ_SUPPORTED) || defined PNG_WRITE_SUPPORTED
|
||||
png_ptr->IDAT_size = (png_uint_32)/*SAFE*/size;
|
||||
# endif /* SEQUENTIAL_READ || WRITE */
|
||||
}
|
||||
|
||||
void PNGAPI
|
||||
png_set_invalid(png_const_structrp png_ptr, png_inforp info_ptr, int mask)
|
||||
{
|
||||
if (png_ptr != NULL && info_ptr != NULL)
|
||||
info_ptr->valid &= ~mask;
|
||||
info_ptr->valid &= PNG_BIC_MASK(mask);
|
||||
}
|
||||
|
||||
|
||||
@@ -1573,7 +1626,7 @@ png_set_user_limits (png_structrp png_ptr, png_uint_32 user_width_max,
|
||||
{
|
||||
/* Images with dimensions larger than these limits will be
|
||||
* rejected by png_set_IHDR(). To accept any PNG datastream
|
||||
* regardless of dimensions, set both limits to 0x7fffffff.
|
||||
* regardless of dimensions, set both limits to 0x7fffffffL.
|
||||
*/
|
||||
if (png_ptr == NULL)
|
||||
return;
|
||||
@@ -1618,114 +1671,8 @@ png_set_benign_errors(png_structrp png_ptr, int allowed)
|
||||
PNG_FLAG_APP_WARNINGS_WARN | PNG_FLAG_APP_ERRORS_WARN;
|
||||
|
||||
else
|
||||
png_ptr->flags &= ~(PNG_FLAG_BENIGN_ERRORS_WARN |
|
||||
png_ptr->flags &= PNG_BIC_MASK(PNG_FLAG_BENIGN_ERRORS_WARN |
|
||||
PNG_FLAG_APP_WARNINGS_WARN | PNG_FLAG_APP_ERRORS_WARN);
|
||||
}
|
||||
#endif /* BENIGN_ERRORS */
|
||||
|
||||
#ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED
|
||||
/* Whether to report invalid palette index; added at libng-1.5.10.
|
||||
* It is possible for an indexed (color-type==3) PNG file to contain
|
||||
* pixels with invalid (out-of-range) indexes if the PLTE chunk has
|
||||
* fewer entries than the image's bit-depth would allow. We recover
|
||||
* from this gracefully by filling any incomplete palette with zeros
|
||||
* (opaque black). By default, when this occurs libpng will issue
|
||||
* a benign error. This API can be used to override that behavior.
|
||||
*/
|
||||
void PNGAPI
|
||||
png_set_check_for_invalid_index(png_structrp png_ptr, int allowed)
|
||||
{
|
||||
png_debug(1, "in png_set_check_for_invalid_index");
|
||||
|
||||
if (allowed > 0)
|
||||
png_ptr->num_palette_max = 0;
|
||||
|
||||
else
|
||||
png_ptr->num_palette_max = -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(PNG_TEXT_SUPPORTED) || defined(PNG_pCAL_SUPPORTED) || \
|
||||
defined(PNG_iCCP_SUPPORTED) || defined(PNG_sPLT_SUPPORTED)
|
||||
/* Check that the tEXt or zTXt keyword is valid per PNG 1.0 specification,
|
||||
* and if invalid, correct the keyword rather than discarding the entire
|
||||
* chunk. The PNG 1.0 specification requires keywords 1-79 characters in
|
||||
* length, forbids leading or trailing whitespace, multiple internal spaces,
|
||||
* and the non-break space (0x80) from ISO 8859-1. Returns keyword length.
|
||||
*
|
||||
* The 'new_key' buffer must be 80 characters in size (for the keyword plus a
|
||||
* trailing '\0'). If this routine returns 0 then there was no keyword, or a
|
||||
* valid one could not be generated, and the caller must png_error.
|
||||
*/
|
||||
png_uint_32 /* PRIVATE */
|
||||
png_check_keyword(png_structrp png_ptr, png_const_charp key, png_bytep new_key)
|
||||
{
|
||||
png_const_charp orig_key = key;
|
||||
png_uint_32 key_len = 0;
|
||||
int bad_character = 0;
|
||||
int space = 1;
|
||||
|
||||
png_debug(1, "in png_check_keyword");
|
||||
|
||||
if (key == NULL)
|
||||
{
|
||||
*new_key = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
while (*key && key_len < 79)
|
||||
{
|
||||
png_byte ch = (png_byte)*key++;
|
||||
|
||||
if ((ch > 32 && ch <= 126) || (ch >= 161 /*&& ch <= 255*/))
|
||||
*new_key++ = ch, ++key_len, space = 0;
|
||||
|
||||
else if (space == 0)
|
||||
{
|
||||
/* A space or an invalid character when one wasn't seen immediately
|
||||
* before; output just a space.
|
||||
*/
|
||||
*new_key++ = 32, ++key_len, space = 1;
|
||||
|
||||
/* If the character was not a space then it is invalid. */
|
||||
if (ch != 32)
|
||||
bad_character = ch;
|
||||
}
|
||||
|
||||
else if (bad_character == 0)
|
||||
bad_character = ch; /* just skip it, record the first error */
|
||||
}
|
||||
|
||||
if (key_len > 0 && space != 0) /* trailing space */
|
||||
{
|
||||
--key_len, --new_key;
|
||||
if (bad_character == 0)
|
||||
bad_character = 32;
|
||||
}
|
||||
|
||||
/* Terminate the keyword */
|
||||
*new_key = 0;
|
||||
|
||||
if (key_len == 0)
|
||||
return 0;
|
||||
|
||||
#ifdef PNG_WARNINGS_SUPPORTED
|
||||
/* Try to only output one warning per keyword: */
|
||||
if (*key != 0) /* keyword too long */
|
||||
png_warning(png_ptr, "keyword truncated");
|
||||
|
||||
else if (bad_character != 0)
|
||||
{
|
||||
PNG_WARNING_PARAMETERS(p)
|
||||
|
||||
png_warning_parameter(p, 1, orig_key);
|
||||
png_warning_parameter_signed(p, 2, PNG_NUMBER_FORMAT_02x, bad_character);
|
||||
|
||||
png_formatted_warning(png_ptr, p, "keyword \"@1\": bad character '0x@2'");
|
||||
}
|
||||
#endif /* WARNINGS */
|
||||
|
||||
return key_len;
|
||||
}
|
||||
#endif /* TEXT || pCAL || iCCP || sPLT */
|
||||
#endif /* READ || WRITE */
|
||||
|
||||
982
pngstruct.h
982
pngstruct.h
File diff suppressed because it is too large
Load Diff
17
pngtest.c
17
pngtest.c
@@ -1,8 +1,8 @@
|
||||
|
||||
/* pngtest.c - a simple test program to test libpng
|
||||
*
|
||||
* Last changed in libpng 1.5.25 [December 3, 2015]
|
||||
* Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
|
||||
* Last changed in libpng 1.5.25 [(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.)
|
||||
*
|
||||
@@ -43,15 +43,6 @@
|
||||
|
||||
#include "png.h"
|
||||
|
||||
/* 1.6.1 added support for the configure test harness, which uses 77 to indicate
|
||||
* a skipped test, in earlier versions we need to succeed on a skipped test, so:
|
||||
*/
|
||||
#if PNG_LIBPNG_VER >= 10601 && defined(HAVE_CONFIG_H)
|
||||
# define SKIP 77
|
||||
#else
|
||||
# define SKIP 0
|
||||
#endif
|
||||
|
||||
/* Known chunks that exist in pngtest.png must be supported or pngtest will fail
|
||||
* simply as a result of re-ordering them. This may be fixed in 1.7
|
||||
*
|
||||
@@ -2074,9 +2065,9 @@ main(void)
|
||||
fprintf(STDERR,
|
||||
" test ignored because libpng was not built with read support\n");
|
||||
/* And skip this test */
|
||||
return SKIP;
|
||||
return PNG_LIBPNG_VER < 10600 ? 0 : 77;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Generate a compiler error if there is an old png.h in the search path. */
|
||||
typedef png_libpng_version_1_6_22beta03 Your_png_h_is_not_version_1_6_22beta03;
|
||||
typedef png_libpng_version_1_7_0beta80 Your_png_h_is_not_version_1_7_0beta80;
|
||||
|
||||
BIN
pngtest.png
BIN
pngtest.png
Binary file not shown.
|
Before Width: | Height: | Size: 8.5 KiB After Width: | Height: | Size: 5.6 KiB |
4258
pngtrans.c
4258
pngtrans.c
File diff suppressed because it is too large
Load Diff
@@ -4,9 +4,10 @@
|
||||
#
|
||||
# Enter build configuration options in this file
|
||||
#
|
||||
# Security settings: by default these limits are unset, you can change them
|
||||
# here by entering the appropriate values as #defines preceded by '@' (to cause,
|
||||
# them to be passed through to the build of pnglibconf.h), for example:
|
||||
# Security settings: these limits have default values that are set in
|
||||
# scripts/pnglibconf.dfa; you can change them here by entering the
|
||||
# appropriate values as #defines preceded by '@' (to cause them
|
||||
# to be passed through to the build of pnglibconf.h), for example:
|
||||
#
|
||||
# @# define PNG_USER_WIDTH_MAX 65535
|
||||
# @# define PNG_USER_HEIGHT_MAX 65535
|
||||
|
||||
97
pngwio.c
97
pngwio.c
@@ -1,8 +1,8 @@
|
||||
|
||||
/* pngwio.c - functions for data output
|
||||
*
|
||||
* Last changed in libpng 1.6.15 [November 20, 2014]
|
||||
* Copyright (c) 1998-2002,2004,2006-2014 Glenn Randers-Pehrson
|
||||
* 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.)
|
||||
*
|
||||
@@ -19,6 +19,7 @@
|
||||
*/
|
||||
|
||||
#include "pngpriv.h"
|
||||
#define PNG_SRC_FILE PNG_SRC_FILE_pngwio
|
||||
|
||||
#ifdef PNG_WRITE_SUPPORTED
|
||||
|
||||
@@ -26,19 +27,23 @@
|
||||
* writes to a file pointer. Note that this routine sometimes gets called
|
||||
* with very small lengths, so you should implement some kind of simple
|
||||
* buffering if you are using unbuffered writes. This should never be asked
|
||||
* to write more than 64K on a 16-bit machine.
|
||||
* to write more than 64K on a 16 bit machine.
|
||||
*/
|
||||
|
||||
void /* PRIVATE */
|
||||
png_write_data(png_structrp png_ptr, png_const_bytep data, png_size_t length)
|
||||
png_write_data(png_structrp png_ptr, png_const_voidp data, png_size_t length)
|
||||
{
|
||||
/* NOTE: write_data_fn must not change the buffer! */
|
||||
if (png_ptr->write_data_fn != NULL )
|
||||
(*(png_ptr->write_data_fn))(png_ptr, png_constcast(png_bytep,data),
|
||||
length);
|
||||
/* NOTE: write_data_fn must not change the buffer!
|
||||
* This cast is required because of the API; changing the type of the
|
||||
* callback would require every app to change the callback and that change
|
||||
* would have to be conditional on the libpng version.
|
||||
*/
|
||||
if (png_ptr->rw_data_fn != NULL )
|
||||
png_ptr->rw_data_fn(png_ptr,
|
||||
png_constcast(png_bytep,png_voidcast(png_const_bytep,data)), length);
|
||||
|
||||
else
|
||||
png_error(png_ptr, "Call to NULL write function");
|
||||
png_app_error(png_ptr, "No write function");
|
||||
}
|
||||
|
||||
#ifdef PNG_STDIO_SUPPORTED
|
||||
@@ -55,36 +60,22 @@ png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
|
||||
if (png_ptr == NULL)
|
||||
return;
|
||||
|
||||
check = fwrite(data, 1, length, (png_FILE_p)(png_ptr->io_ptr));
|
||||
check = fwrite(data, 1, length, png_voidcast(png_FILE_p, png_ptr->io_ptr));
|
||||
|
||||
if (check != length)
|
||||
png_error(png_ptr, "Write Error");
|
||||
}
|
||||
#endif
|
||||
|
||||
/* This function is called to output any data pending writing (normally
|
||||
* to disk). After png_flush is called, there should be no data pending
|
||||
* writing in any buffers.
|
||||
*/
|
||||
#ifdef PNG_WRITE_FLUSH_SUPPORTED
|
||||
void /* PRIVATE */
|
||||
png_flush(png_structrp png_ptr)
|
||||
{
|
||||
if (png_ptr->output_flush_fn != NULL)
|
||||
(*(png_ptr->output_flush_fn))(png_ptr);
|
||||
}
|
||||
|
||||
# ifdef PNG_STDIO_SUPPORTED
|
||||
void PNGCBAPI
|
||||
png_default_flush(png_structp png_ptr)
|
||||
{
|
||||
png_FILE_p io_ptr;
|
||||
|
||||
if (png_ptr == NULL)
|
||||
return;
|
||||
|
||||
io_ptr = png_voidcast(png_FILE_p, (png_ptr->io_ptr));
|
||||
fflush(io_ptr);
|
||||
fflush(png_voidcast(png_FILE_p, (png_ptr->io_ptr)));
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
@@ -125,44 +116,26 @@ png_set_write_fn(png_structrp png_ptr, png_voidp io_ptr,
|
||||
if (png_ptr == NULL)
|
||||
return;
|
||||
|
||||
png_ptr->io_ptr = io_ptr;
|
||||
|
||||
#ifdef PNG_STDIO_SUPPORTED
|
||||
if (write_data_fn != NULL)
|
||||
png_ptr->write_data_fn = write_data_fn;
|
||||
|
||||
else
|
||||
png_ptr->write_data_fn = png_default_write_data;
|
||||
#else
|
||||
png_ptr->write_data_fn = write_data_fn;
|
||||
#endif
|
||||
|
||||
#ifdef PNG_WRITE_FLUSH_SUPPORTED
|
||||
# ifdef PNG_STDIO_SUPPORTED
|
||||
|
||||
if (output_flush_fn != NULL)
|
||||
png_ptr->output_flush_fn = output_flush_fn;
|
||||
|
||||
else
|
||||
png_ptr->output_flush_fn = png_default_flush;
|
||||
|
||||
# else
|
||||
png_ptr->output_flush_fn = output_flush_fn;
|
||||
# endif
|
||||
#else
|
||||
PNG_UNUSED(output_flush_fn)
|
||||
#endif /* WRITE_FLUSH */
|
||||
|
||||
#ifdef PNG_READ_SUPPORTED
|
||||
/* It is an error to read while writing a png file */
|
||||
if (png_ptr->read_data_fn != NULL)
|
||||
if (png_ptr->read_struct)
|
||||
{
|
||||
png_ptr->read_data_fn = NULL;
|
||||
|
||||
png_warning(png_ptr,
|
||||
"Can't set both read_data_fn and write_data_fn in the"
|
||||
" same structure");
|
||||
png_app_error(png_ptr, "cannot set a write function on a read struct");
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (write_data_fn == NULL)
|
||||
{
|
||||
png_app_error(png_ptr,
|
||||
"API change: png_set_write_fn requires a function");
|
||||
return;
|
||||
}
|
||||
|
||||
png_ptr->io_ptr = io_ptr;
|
||||
png_ptr->rw_data_fn = write_data_fn;
|
||||
# ifdef PNG_WRITE_FLUSH_SUPPORTED
|
||||
if (output_flush_fn != NULL)
|
||||
png_ptr->output_flush_fn = output_flush_fn;
|
||||
# else
|
||||
PNG_UNUSED(output_flush_fn)
|
||||
# endif /* WRITE_FLUSH */
|
||||
}
|
||||
#endif /* WRITE */
|
||||
|
||||
1972
pngwrite.c
1972
pngwrite.c
File diff suppressed because it is too large
Load Diff
646
pngwtran.c
646
pngwtran.c
@@ -1,8 +1,8 @@
|
||||
|
||||
/* pngwtran.c - transforms the data in a row for PNG writers
|
||||
*
|
||||
* Last changed in libpng 1.6.18 [July 23, 2015]
|
||||
* Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
|
||||
* Last changed in libpng 1.6.17 [(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.)
|
||||
*
|
||||
@@ -12,565 +12,137 @@
|
||||
*/
|
||||
|
||||
#include "pngpriv.h"
|
||||
|
||||
#ifdef PNG_WRITE_SUPPORTED
|
||||
#ifdef PNG_WRITE_TRANSFORMS_SUPPORTED
|
||||
#define PNG_SRC_FILE PNG_SRC_FILE_pngwtran
|
||||
|
||||
#ifdef PNG_WRITE_PACK_SUPPORTED
|
||||
/* Pack pixels into bytes. Pass the true bit depth in bit_depth. The
|
||||
* row_info bit depth should be 8 (one pixel per byte). The channels
|
||||
* should be 1 (this only happens on grayscale and paletted images).
|
||||
*/
|
||||
/* Pack pixels into bytes. */
|
||||
static void
|
||||
png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth)
|
||||
png_do_write_pack(png_transformp *transform, png_transform_controlp tc)
|
||||
{
|
||||
png_alloc_size_t rowbytes = PNG_TC_ROWBYTES(*tc);
|
||||
png_const_bytep sp = png_voidcast(png_const_bytep, tc->sp);
|
||||
png_const_bytep ep = png_upcast(png_const_bytep, tc->sp) + rowbytes;
|
||||
png_bytep dp = png_voidcast(png_bytep, tc->dp);
|
||||
|
||||
png_debug(1, "in png_do_pack");
|
||||
|
||||
if (row_info->bit_depth == 8 &&
|
||||
row_info->channels == 1)
|
||||
# define png_ptr tc->png_ptr
|
||||
|
||||
switch ((*transform)->args)
|
||||
{
|
||||
switch ((int)bit_depth)
|
||||
case 1:
|
||||
{
|
||||
case 1:
|
||||
unsigned int mask = 0x80, v = 0;
|
||||
|
||||
while (sp < ep)
|
||||
{
|
||||
png_bytep sp, dp;
|
||||
int mask, v;
|
||||
png_uint_32 i;
|
||||
png_uint_32 row_width = row_info->width;
|
||||
if (*sp++ != 0)
|
||||
v |= mask;
|
||||
|
||||
sp = row;
|
||||
dp = row;
|
||||
mask = 0x80;
|
||||
v = 0;
|
||||
mask >>= 1;
|
||||
|
||||
for (i = 0; i < row_width; i++)
|
||||
if (mask == 0)
|
||||
{
|
||||
if (*sp != 0)
|
||||
v |= mask;
|
||||
|
||||
sp++;
|
||||
|
||||
if (mask > 1)
|
||||
mask >>= 1;
|
||||
|
||||
else
|
||||
{
|
||||
mask = 0x80;
|
||||
*dp = (png_byte)v;
|
||||
dp++;
|
||||
v = 0;
|
||||
}
|
||||
mask = 0x80;
|
||||
*dp++ = PNG_BYTE(v);
|
||||
v = 0;
|
||||
}
|
||||
|
||||
if (mask != 0x80)
|
||||
*dp = (png_byte)v;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 2:
|
||||
{
|
||||
png_bytep sp, dp;
|
||||
unsigned int shift;
|
||||
int v;
|
||||
png_uint_32 i;
|
||||
png_uint_32 row_width = row_info->width;
|
||||
|
||||
sp = row;
|
||||
dp = row;
|
||||
shift = 6;
|
||||
v = 0;
|
||||
|
||||
for (i = 0; i < row_width; i++)
|
||||
{
|
||||
png_byte value;
|
||||
|
||||
value = (png_byte)(*sp & 0x03);
|
||||
v |= (value << shift);
|
||||
|
||||
if (shift == 0)
|
||||
{
|
||||
shift = 6;
|
||||
*dp = (png_byte)v;
|
||||
dp++;
|
||||
v = 0;
|
||||
}
|
||||
|
||||
else
|
||||
shift -= 2;
|
||||
|
||||
sp++;
|
||||
}
|
||||
|
||||
if (shift != 6)
|
||||
*dp = (png_byte)v;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 4:
|
||||
{
|
||||
png_bytep sp, dp;
|
||||
unsigned int shift;
|
||||
int v;
|
||||
png_uint_32 i;
|
||||
png_uint_32 row_width = row_info->width;
|
||||
|
||||
sp = row;
|
||||
dp = row;
|
||||
shift = 4;
|
||||
v = 0;
|
||||
|
||||
for (i = 0; i < row_width; i++)
|
||||
{
|
||||
png_byte value;
|
||||
|
||||
value = (png_byte)(*sp & 0x0f);
|
||||
v |= (value << shift);
|
||||
|
||||
if (shift == 0)
|
||||
{
|
||||
shift = 4;
|
||||
*dp = (png_byte)v;
|
||||
dp++;
|
||||
v = 0;
|
||||
}
|
||||
|
||||
else
|
||||
shift -= 4;
|
||||
|
||||
sp++;
|
||||
}
|
||||
|
||||
if (shift != 4)
|
||||
*dp = (png_byte)v;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
if (mask != 0x80)
|
||||
*dp++ = PNG_BYTE(v);
|
||||
break;
|
||||
}
|
||||
|
||||
row_info->bit_depth = (png_byte)bit_depth;
|
||||
row_info->pixel_depth = (png_byte)(bit_depth * row_info->channels);
|
||||
row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,
|
||||
row_info->width);
|
||||
case 2:
|
||||
{
|
||||
unsigned int shift = 8, v = 0;
|
||||
|
||||
while (sp < ep)
|
||||
{
|
||||
shift -= 2;
|
||||
v |= (*sp++ & 0x3) << shift;
|
||||
|
||||
if (shift == 0)
|
||||
{
|
||||
shift = 8;
|
||||
*dp++ = PNG_BYTE(v);
|
||||
v = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (shift != 8)
|
||||
*dp++ = PNG_BYTE(v);
|
||||
break;
|
||||
}
|
||||
|
||||
case 4:
|
||||
{
|
||||
unsigned int shift = 8, v = 0;
|
||||
|
||||
while (sp < ep)
|
||||
{
|
||||
shift -= 4;
|
||||
v |= ((*sp++ & 0xf) << shift);
|
||||
|
||||
if (shift == 0)
|
||||
{
|
||||
shift = 8;
|
||||
*dp++ = PNG_BYTE(v);
|
||||
v = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (shift != 8)
|
||||
*dp++ = PNG_BYTE(v);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
impossible("bit depth");
|
||||
}
|
||||
|
||||
if ((tc->format & PNG_FORMAT_FLAG_COLORMAP) == 0 &&
|
||||
--(tc->range) == 0)
|
||||
tc->format &= PNG_BIC_MASK(PNG_FORMAT_FLAG_RANGE);
|
||||
|
||||
tc->bit_depth = (*transform)->args;
|
||||
tc->sp = tc->dp;
|
||||
# undef png_ptr
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef PNG_WRITE_SHIFT_SUPPORTED
|
||||
/* Shift pixel values to take advantage of whole range. Pass the
|
||||
* true number of bits in bit_depth. The row should be packed
|
||||
* according to row_info->bit_depth. Thus, if you had a row of
|
||||
* bit depth 4, but the pixels only had values from 0 to 7, you
|
||||
* would pass 3 as bit_depth, and this routine would translate the
|
||||
* data to 0 to 15.
|
||||
*/
|
||||
static void
|
||||
png_do_shift(png_row_infop row_info, png_bytep row,
|
||||
png_const_color_8p bit_depth)
|
||||
{
|
||||
png_debug(1, "in png_do_shift");
|
||||
|
||||
if (row_info->color_type != PNG_COLOR_TYPE_PALETTE)
|
||||
{
|
||||
int shift_start[4], shift_dec[4];
|
||||
int channels = 0;
|
||||
|
||||
if ((row_info->color_type & PNG_COLOR_MASK_COLOR) != 0)
|
||||
{
|
||||
shift_start[channels] = row_info->bit_depth - bit_depth->red;
|
||||
shift_dec[channels] = bit_depth->red;
|
||||
channels++;
|
||||
|
||||
shift_start[channels] = row_info->bit_depth - bit_depth->green;
|
||||
shift_dec[channels] = bit_depth->green;
|
||||
channels++;
|
||||
|
||||
shift_start[channels] = row_info->bit_depth - bit_depth->blue;
|
||||
shift_dec[channels] = bit_depth->blue;
|
||||
channels++;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
shift_start[channels] = row_info->bit_depth - bit_depth->gray;
|
||||
shift_dec[channels] = bit_depth->gray;
|
||||
channels++;
|
||||
}
|
||||
|
||||
if ((row_info->color_type & PNG_COLOR_MASK_ALPHA) != 0)
|
||||
{
|
||||
shift_start[channels] = row_info->bit_depth - bit_depth->alpha;
|
||||
shift_dec[channels] = bit_depth->alpha;
|
||||
channels++;
|
||||
}
|
||||
|
||||
/* With low row depths, could only be grayscale, so one channel */
|
||||
if (row_info->bit_depth < 8)
|
||||
{
|
||||
png_bytep bp = row;
|
||||
png_size_t i;
|
||||
unsigned int mask;
|
||||
png_size_t row_bytes = row_info->rowbytes;
|
||||
|
||||
if (bit_depth->gray == 1 && row_info->bit_depth == 2)
|
||||
mask = 0x55;
|
||||
|
||||
else if (row_info->bit_depth == 4 && bit_depth->gray == 3)
|
||||
mask = 0x11;
|
||||
|
||||
else
|
||||
mask = 0xff;
|
||||
|
||||
for (i = 0; i < row_bytes; i++, bp++)
|
||||
{
|
||||
int j;
|
||||
unsigned int v, out;
|
||||
|
||||
v = *bp;
|
||||
out = 0;
|
||||
|
||||
for (j = shift_start[0]; j > -shift_dec[0]; j -= shift_dec[0])
|
||||
{
|
||||
if (j > 0)
|
||||
out |= v << j;
|
||||
|
||||
else
|
||||
out |= (v >> (-j)) & mask;
|
||||
}
|
||||
|
||||
*bp = (png_byte)(out & 0xff);
|
||||
}
|
||||
}
|
||||
|
||||
else if (row_info->bit_depth == 8)
|
||||
{
|
||||
png_bytep bp = row;
|
||||
png_uint_32 i;
|
||||
png_uint_32 istop = channels * row_info->width;
|
||||
|
||||
for (i = 0; i < istop; i++, bp++)
|
||||
{
|
||||
|
||||
const unsigned int c = i%channels;
|
||||
int j;
|
||||
unsigned int v, out;
|
||||
|
||||
v = *bp;
|
||||
out = 0;
|
||||
|
||||
for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c])
|
||||
{
|
||||
if (j > 0)
|
||||
out |= v << j;
|
||||
|
||||
else
|
||||
out |= v >> (-j);
|
||||
}
|
||||
|
||||
*bp = (png_byte)(out & 0xff);
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
png_bytep bp;
|
||||
png_uint_32 i;
|
||||
png_uint_32 istop = channels * row_info->width;
|
||||
|
||||
for (bp = row, i = 0; i < istop; i++)
|
||||
{
|
||||
const unsigned int c = i%channels;
|
||||
int j;
|
||||
unsigned int value, v;
|
||||
|
||||
v = png_get_uint_16(bp);
|
||||
value = 0;
|
||||
|
||||
for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c])
|
||||
{
|
||||
if (j > 0)
|
||||
value |= v << j;
|
||||
|
||||
else
|
||||
value |= v >> (-j);
|
||||
}
|
||||
*bp++ = (png_byte)((value >> 8) & 0xff);
|
||||
*bp++ = (png_byte)(value & 0xff);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED
|
||||
static void
|
||||
png_do_write_swap_alpha(png_row_infop row_info, png_bytep row)
|
||||
{
|
||||
png_debug(1, "in png_do_write_swap_alpha");
|
||||
|
||||
{
|
||||
if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
|
||||
{
|
||||
if (row_info->bit_depth == 8)
|
||||
{
|
||||
/* This converts from ARGB to RGBA */
|
||||
png_bytep sp, dp;
|
||||
png_uint_32 i;
|
||||
png_uint_32 row_width = row_info->width;
|
||||
|
||||
for (i = 0, sp = dp = row; i < row_width; i++)
|
||||
{
|
||||
png_byte save = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = save;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef PNG_WRITE_16BIT_SUPPORTED
|
||||
else
|
||||
{
|
||||
/* This converts from AARRGGBB to RRGGBBAA */
|
||||
png_bytep sp, dp;
|
||||
png_uint_32 i;
|
||||
png_uint_32 row_width = row_info->width;
|
||||
|
||||
for (i = 0, sp = dp = row; i < row_width; i++)
|
||||
{
|
||||
png_byte save[2];
|
||||
save[0] = *(sp++);
|
||||
save[1] = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = save[0];
|
||||
*(dp++) = save[1];
|
||||
}
|
||||
}
|
||||
#endif /* WRITE_16BIT */
|
||||
}
|
||||
|
||||
else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
|
||||
{
|
||||
if (row_info->bit_depth == 8)
|
||||
{
|
||||
/* This converts from AG to GA */
|
||||
png_bytep sp, dp;
|
||||
png_uint_32 i;
|
||||
png_uint_32 row_width = row_info->width;
|
||||
|
||||
for (i = 0, sp = dp = row; i < row_width; i++)
|
||||
{
|
||||
png_byte save = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = save;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef PNG_WRITE_16BIT_SUPPORTED
|
||||
else
|
||||
{
|
||||
/* This converts from AAGG to GGAA */
|
||||
png_bytep sp, dp;
|
||||
png_uint_32 i;
|
||||
png_uint_32 row_width = row_info->width;
|
||||
|
||||
for (i = 0, sp = dp = row; i < row_width; i++)
|
||||
{
|
||||
png_byte save[2];
|
||||
save[0] = *(sp++);
|
||||
save[1] = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = save[0];
|
||||
*(dp++) = save[1];
|
||||
}
|
||||
}
|
||||
#endif /* WRITE_16BIT */
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED
|
||||
static void
|
||||
png_do_write_invert_alpha(png_row_infop row_info, png_bytep row)
|
||||
{
|
||||
png_debug(1, "in png_do_write_invert_alpha");
|
||||
|
||||
{
|
||||
if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
|
||||
{
|
||||
if (row_info->bit_depth == 8)
|
||||
{
|
||||
/* This inverts the alpha channel in RGBA */
|
||||
png_bytep sp, dp;
|
||||
png_uint_32 i;
|
||||
png_uint_32 row_width = row_info->width;
|
||||
|
||||
for (i = 0, sp = dp = row; i < row_width; i++)
|
||||
{
|
||||
/* Does nothing
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*/
|
||||
sp+=3; dp = sp;
|
||||
*dp = (png_byte)(255 - *(sp++));
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef PNG_WRITE_16BIT_SUPPORTED
|
||||
else
|
||||
{
|
||||
/* This inverts the alpha channel in RRGGBBAA */
|
||||
png_bytep sp, dp;
|
||||
png_uint_32 i;
|
||||
png_uint_32 row_width = row_info->width;
|
||||
|
||||
for (i = 0, sp = dp = row; i < row_width; i++)
|
||||
{
|
||||
/* Does nothing
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*/
|
||||
sp+=6; dp = sp;
|
||||
*(dp++) = (png_byte)(255 - *(sp++));
|
||||
*dp = (png_byte)(255 - *(sp++));
|
||||
}
|
||||
}
|
||||
#endif /* WRITE_16BIT */
|
||||
}
|
||||
|
||||
else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
|
||||
{
|
||||
if (row_info->bit_depth == 8)
|
||||
{
|
||||
/* This inverts the alpha channel in GA */
|
||||
png_bytep sp, dp;
|
||||
png_uint_32 i;
|
||||
png_uint_32 row_width = row_info->width;
|
||||
|
||||
for (i = 0, sp = dp = row; i < row_width; i++)
|
||||
{
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = (png_byte)(255 - *(sp++));
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef PNG_WRITE_16BIT_SUPPORTED
|
||||
else
|
||||
{
|
||||
/* This inverts the alpha channel in GGAA */
|
||||
png_bytep sp, dp;
|
||||
png_uint_32 i;
|
||||
png_uint_32 row_width = row_info->width;
|
||||
|
||||
for (i = 0, sp = dp = row; i < row_width; i++)
|
||||
{
|
||||
/* Does nothing
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*/
|
||||
sp+=2; dp = sp;
|
||||
*(dp++) = (png_byte)(255 - *(sp++));
|
||||
*dp = (png_byte)(255 - *(sp++));
|
||||
}
|
||||
}
|
||||
#endif /* WRITE_16BIT */
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Transform the data according to the user's wishes. The order of
|
||||
* transformations is significant.
|
||||
*/
|
||||
void /* PRIVATE */
|
||||
png_do_write_transformations(png_structrp png_ptr, png_row_infop row_info)
|
||||
png_init_write_pack(png_transformp *transform, png_transform_controlp tc)
|
||||
{
|
||||
png_debug(1, "in png_do_write_transformations");
|
||||
# define png_ptr tc->png_ptr
|
||||
debug(tc->init);
|
||||
# undef png_ptr
|
||||
|
||||
if (png_ptr == NULL)
|
||||
return;
|
||||
/* The init routine is called *forward* so the transform control we get has
|
||||
* the required bit depth and the transform routine will increase it to 8
|
||||
* bits per channel. The code doesn't really care how many channels there
|
||||
* are, but the only way to get a channel depth of less than 8 is to have
|
||||
* just one channel.
|
||||
*/
|
||||
if (tc->bit_depth < 8) /* else no packing/unpacking */
|
||||
{
|
||||
if (tc->init == PNG_TC_INIT_FINAL)
|
||||
{
|
||||
(*transform)->fn = png_do_write_pack;
|
||||
/* Record this for the backwards run: */
|
||||
(*transform)->args = tc->bit_depth & 0xf;
|
||||
}
|
||||
|
||||
#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED
|
||||
if ((png_ptr->transformations & PNG_USER_TRANSFORM) != 0)
|
||||
if (png_ptr->write_user_transform_fn != NULL)
|
||||
(*(png_ptr->write_user_transform_fn)) /* User write transform
|
||||
function */
|
||||
(png_ptr, /* png_ptr */
|
||||
row_info, /* row_info: */
|
||||
/* png_uint_32 width; width of row */
|
||||
/* png_size_t rowbytes; number of bytes in row */
|
||||
/* png_byte color_type; color type of pixels */
|
||||
/* png_byte bit_depth; bit depth of samples */
|
||||
/* png_byte channels; number of channels (1-4) */
|
||||
/* png_byte pixel_depth; bits per pixel (depth*channels) */
|
||||
png_ptr->row_buf + 1); /* start of pixel data for row */
|
||||
#endif
|
||||
if ((tc->format & PNG_FORMAT_FLAG_COLORMAP) == 0)
|
||||
{
|
||||
tc->range++;
|
||||
tc->format |= PNG_FORMAT_FLAG_RANGE; /* forwards: backwards cancels */
|
||||
}
|
||||
|
||||
#ifdef PNG_WRITE_FILLER_SUPPORTED
|
||||
if ((png_ptr->transformations & PNG_FILLER) != 0)
|
||||
png_do_strip_channel(row_info, png_ptr->row_buf + 1,
|
||||
!(png_ptr->flags & PNG_FLAG_FILLER_AFTER));
|
||||
#endif
|
||||
tc->bit_depth = 8;
|
||||
}
|
||||
|
||||
#ifdef PNG_WRITE_PACKSWAP_SUPPORTED
|
||||
if ((png_ptr->transformations & PNG_PACKSWAP) != 0)
|
||||
png_do_packswap(row_info, png_ptr->row_buf + 1);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_WRITE_PACK_SUPPORTED
|
||||
if ((png_ptr->transformations & PNG_PACK) != 0)
|
||||
png_do_pack(row_info, png_ptr->row_buf + 1,
|
||||
(png_uint_32)png_ptr->bit_depth);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_WRITE_SWAP_SUPPORTED
|
||||
# ifdef PNG_16BIT_SUPPORTED
|
||||
if ((png_ptr->transformations & PNG_SWAP_BYTES) != 0)
|
||||
png_do_swap(row_info, png_ptr->row_buf + 1);
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef PNG_WRITE_SHIFT_SUPPORTED
|
||||
if ((png_ptr->transformations & PNG_SHIFT) != 0)
|
||||
png_do_shift(row_info, png_ptr->row_buf + 1,
|
||||
&(png_ptr->shift));
|
||||
#endif
|
||||
|
||||
#ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED
|
||||
if ((png_ptr->transformations & PNG_SWAP_ALPHA) != 0)
|
||||
png_do_write_swap_alpha(row_info, png_ptr->row_buf + 1);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED
|
||||
if ((png_ptr->transformations & PNG_INVERT_ALPHA) != 0)
|
||||
png_do_write_invert_alpha(row_info, png_ptr->row_buf + 1);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_WRITE_BGR_SUPPORTED
|
||||
if ((png_ptr->transformations & PNG_BGR) != 0)
|
||||
png_do_bgr(row_info, png_ptr->row_buf + 1);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_WRITE_INVERT_SUPPORTED
|
||||
if ((png_ptr->transformations & PNG_INVERT_MONO) != 0)
|
||||
png_do_invert(row_info, png_ptr->row_buf + 1);
|
||||
#endif
|
||||
else /* the transform is not applicable */
|
||||
(*transform)->fn = NULL;
|
||||
}
|
||||
#endif /* WRITE_TRANSFORMS */
|
||||
#endif /* WRITE */
|
||||
#endif /* WRITE_PACK */
|
||||
|
||||
4849
pngwutil.c
4849
pngwutil.c
File diff suppressed because it is too large
Load Diff
@@ -30,7 +30,7 @@
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
OutputFile="$(OutDir)/libpng16.dll"
|
||||
OutputFile="$(OutDir)/libpng17.dll"
|
||||
LinkIncremental="1"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
@@ -78,7 +78,7 @@
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
OutputFile="$(OutDir)/libpng16d.dll"
|
||||
OutputFile="$(OutDir)/libpng17d.dll"
|
||||
GenerateDebugInformation="TRUE"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
@@ -126,7 +126,7 @@
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
OutputFile="$(OutDir)/libpng16vb.dll"
|
||||
OutputFile="$(OutDir)/libpng17vb.dll"
|
||||
LinkIncremental="1"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
|
||||
@@ -130,7 +130,7 @@ $(TargetPath) ..\..\pngtest.png $(IntDir)\pngout.png"
|
||||
Name="VCLinkerTool"
|
||||
OutputFile="$(OutDir)/pngtest.exe"
|
||||
LinkIncremental="1"
|
||||
IgnoreDefaultLibraryNames="$(IntDir)\libpng16b.lib"
|
||||
IgnoreDefaultLibraryNames="$(IntDir)\libpng17b.lib"
|
||||
SubSystem="1"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
VisualStudio instructions
|
||||
|
||||
libpng version 1.6.22beta03 - March 9, 2016
|
||||
libpng version 1.7.0beta80 - May 6, 2016
|
||||
|
||||
Copyright (c) 2010,2013,2015 Glenn Randers-Pehrson
|
||||
|
||||
@@ -40,7 +40,7 @@ problems.
|
||||
|
||||
If you don't use the Visual Studio defaults your application must still be
|
||||
built with the default runtime option (/MD). If, for some reason, it is not
|
||||
then your application will crash inside libpng16.dll as soon as libpng
|
||||
then your application will crash inside libpng17.dll as soon as libpng
|
||||
tries to read from a file handle you pass in.
|
||||
|
||||
If you do not want to use the DLL, for example for a very small application,
|
||||
|
||||
@@ -63,23 +63,23 @@
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<CustomBuildBeforeTargets>
|
||||
</CustomBuildBeforeTargets>
|
||||
<TargetName>$(ProjectName)16</TargetName>
|
||||
<TargetName>$(ProjectName)17</TargetName>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug Library|Win32'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<CustomBuildBeforeTargets />
|
||||
<TargetName>$(ProjectName)16</TargetName>
|
||||
<TargetName>$(ProjectName)17</TargetName>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<CustomBuildBeforeTargets>
|
||||
</CustomBuildBeforeTargets>
|
||||
<TargetName>$(ProjectName)16</TargetName>
|
||||
<TargetName>$(ProjectName)17</TargetName>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release Library|Win32'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<CustomBuildBeforeTargets />
|
||||
<TargetName>$(ProjectName)16</TargetName>
|
||||
<TargetName>$(ProjectName)17</TargetName>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
@@ -107,7 +107,7 @@
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>zlib.lib</AdditionalDependencies>
|
||||
<Version>16</Version>
|
||||
<Version>17</Version>
|
||||
<AdditionalLibraryDirectories>$(OutDir)</AdditionalLibraryDirectories>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
@@ -164,7 +164,7 @@
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<AdditionalDependencies>zlib.lib</AdditionalDependencies>
|
||||
<Version>16</Version>
|
||||
<Version>17</Version>
|
||||
<AdditionalLibraryDirectories>$(OutDir)</AdditionalLibraryDirectories>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
|
||||
@@ -96,7 +96,7 @@
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>libpng16.lib</AdditionalDependencies>
|
||||
<AdditionalDependencies>libpng17.lib</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>$(OutDir)</AdditionalLibraryDirectories>
|
||||
</Link>
|
||||
<CustomBuildStep>
|
||||
@@ -129,7 +129,7 @@
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>libpng16.lib;zlib.lib</AdditionalDependencies>
|
||||
<AdditionalDependencies>libpng17.lib;zlib.lib</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>$(OutDir)</AdditionalLibraryDirectories>
|
||||
</Link>
|
||||
<CustomBuildStep>
|
||||
@@ -163,7 +163,7 @@
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<AdditionalDependencies>libpng16.lib</AdditionalDependencies>
|
||||
<AdditionalDependencies>libpng17.lib</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>$(OutDir)</AdditionalLibraryDirectories>
|
||||
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
|
||||
</Link>
|
||||
@@ -199,7 +199,7 @@
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<AdditionalDependencies>libpng16.lib;zlib.lib</AdditionalDependencies>
|
||||
<AdditionalDependencies>libpng17.lib;zlib.lib</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>$(OutDir)</AdditionalLibraryDirectories>
|
||||
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
|
||||
</Link>
|
||||
|
||||
@@ -96,7 +96,7 @@
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>libpng16.lib</AdditionalDependencies>
|
||||
<AdditionalDependencies>libpng17.lib</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>$(OutDir)</AdditionalLibraryDirectories>
|
||||
</Link>
|
||||
<CustomBuildStep>
|
||||
@@ -129,7 +129,7 @@
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>libpng16.lib;zlib.lib</AdditionalDependencies>
|
||||
<AdditionalDependencies>libpng17.lib;zlib.lib</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>$(OutDir)</AdditionalLibraryDirectories>
|
||||
</Link>
|
||||
<CustomBuildStep>
|
||||
@@ -164,7 +164,7 @@
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
|
||||
<AdditionalDependencies>libpng16.lib</AdditionalDependencies>
|
||||
<AdditionalDependencies>libpng17.lib</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>$(OutDir)</AdditionalLibraryDirectories>
|
||||
</Link>
|
||||
<CustomBuildStep>
|
||||
@@ -199,7 +199,7 @@
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<AdditionalDependencies>libpng16.lib;zlib.lib</AdditionalDependencies>
|
||||
<AdditionalDependencies>libpng17.lib;zlib.lib</AdditionalDependencies>
|
||||
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
|
||||
<AdditionalLibraryDirectories>$(OutDir)</AdditionalLibraryDirectories>
|
||||
</Link>
|
||||
|
||||
@@ -96,7 +96,7 @@
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>libpng16.lib</AdditionalDependencies>
|
||||
<AdditionalDependencies>libpng17.lib</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>$(OutDir)</AdditionalLibraryDirectories>
|
||||
</Link>
|
||||
<CustomBuildStep>
|
||||
@@ -129,7 +129,7 @@
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>libpng16.lib;zlib.lib</AdditionalDependencies>
|
||||
<AdditionalDependencies>libpng17.lib;zlib.lib</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>$(OutDir)</AdditionalLibraryDirectories>
|
||||
</Link>
|
||||
<CustomBuildStep>
|
||||
@@ -163,7 +163,7 @@
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<AdditionalDependencies>libpng16.lib</AdditionalDependencies>
|
||||
<AdditionalDependencies>libpng17.lib</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>$(OutDir)</AdditionalLibraryDirectories>
|
||||
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
|
||||
</Link>
|
||||
@@ -199,7 +199,7 @@
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<AdditionalDependencies>libpng16.lib;zlib.lib</AdditionalDependencies>
|
||||
<AdditionalDependencies>libpng17.lib;zlib.lib</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>$(OutDir)</AdditionalLibraryDirectories>
|
||||
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
|
||||
</Link>
|
||||
|
||||
@@ -96,7 +96,7 @@
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>libpng16.lib;zlib.lib</AdditionalDependencies>
|
||||
<AdditionalDependencies>libpng17.lib;zlib.lib</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>$(OutDir)</AdditionalLibraryDirectories>
|
||||
</Link>
|
||||
<CustomBuildStep>
|
||||
@@ -129,7 +129,7 @@
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>libpng16.lib;zlib.lib</AdditionalDependencies>
|
||||
<AdditionalDependencies>libpng17.lib;zlib.lib</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>$(OutDir)</AdditionalLibraryDirectories>
|
||||
</Link>
|
||||
<CustomBuildStep>
|
||||
@@ -163,7 +163,7 @@
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<AdditionalDependencies>libpng16.lib;zlib.lib</AdditionalDependencies>
|
||||
<AdditionalDependencies>libpng17.lib;zlib.lib</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>$(OutDir)</AdditionalLibraryDirectories>
|
||||
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
|
||||
</Link>
|
||||
@@ -199,7 +199,7 @@
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<AdditionalDependencies>libpng16.lib;zlib.lib</AdditionalDependencies>
|
||||
<AdditionalDependencies>libpng17.lib;zlib.lib</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>$(OutDir)</AdditionalLibraryDirectories>
|
||||
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
|
||||
</Link>
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
<!--
|
||||
* zlib.props - location of zlib source
|
||||
*
|
||||
* libpng version 1.6.22beta03 - March 9, 2016
|
||||
* libpng version 1.7.0beta80 - May 6, 2016
|
||||
*
|
||||
* Copyright (c) 1998-2011 Glenn Randers-Pehrson
|
||||
* Copyright (c) 2011,2013,2014 Glenn Randers-Pehrson
|
||||
*
|
||||
* This code is released under the libpng license.
|
||||
* For conditions of distribution and use, see the disclaimer
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
|
||||
Makefiles for libpng version 1.6.22beta03 - March 9, 2016
|
||||
Makefiles for libpng version 1.7.0beta80 - May 6, 2016
|
||||
|
||||
pnglibconf.h.prebuilt => Stores configuration settings
|
||||
makefile.linux => Linux/ELF makefile
|
||||
(gcc, creates libpng16.so.16.1.6.22beta03)
|
||||
(gcc, creates libpng17.so.17.1.7.0beta80)
|
||||
makefile.gcc => Generic makefile (gcc, creates static libpng.a)
|
||||
makefile.knr => Archaic UNIX Makefile that converts files with
|
||||
ansi2knr (Requires ansi2knr.c from
|
||||
@@ -33,12 +33,12 @@ pnglibconf.h.prebuilt => Stores configuration settings
|
||||
makefile.os2 => OS/2 Makefile (gcc and emx, requires libpng.def)
|
||||
makefile.sco => For SCO OSr5 ELF and Unixware 7 with Native cc
|
||||
makefile.sggcc => Silicon Graphics (gcc,
|
||||
creates libpng16.so.16.1.6.22beta03)
|
||||
creates libpng17.so.17.1.7.0beta80)
|
||||
makefile.sgi => Silicon Graphics IRIX makefile (cc, creates static lib)
|
||||
makefile.solaris => Solaris 2.X makefile (gcc,
|
||||
creates libpng16.so.16.1.6.22beta03)
|
||||
creates libpng17.so.17.1.7.0beta80)
|
||||
makefile.so9 => Solaris 9 makefile (gcc,
|
||||
creates libpng16.so.16.1.6.22beta03)
|
||||
creates libpng17.so.17.1.7.0beta80)
|
||||
makefile.std => Generic UNIX makefile (cc, creates static libpng.a)
|
||||
makefile.sunos => Sun makefile
|
||||
makefile.32sunu => Sun Ultra 32-bit makefile
|
||||
|
||||
245
scripts/chunkhash.c
Normal file
245
scripts/chunkhash.c
Normal file
@@ -0,0 +1,245 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "pnglibconf.h.prebuilt"
|
||||
#include "../pngpriv.h"
|
||||
|
||||
static const struct
|
||||
{
|
||||
png_uint_32 name;
|
||||
}
|
||||
png_known_chunks[] =
|
||||
/* See pngchunk.h for how this works: */
|
||||
#define PNG_CHUNK_END(n, c1, c2, c3, c4, before, after)\
|
||||
{ png_ ##n }
|
||||
#define PNG_CHUNK(n, c1, c2, c3, c4, before, after)\
|
||||
PNG_CHUNK_END(n, c1, c2, c3, c4, before, after),
|
||||
#define PNG_CHUNK_BEGIN(n, c1, c2, c3, c4, before, after)\
|
||||
PNG_CHUNK_END(n, c1, c2, c3, c4, before, after),
|
||||
{
|
||||
# include "../pngchunk.h"
|
||||
};
|
||||
|
||||
#define C_KNOWN ((sizeof png_known_chunks)/(sizeof png_known_chunks[0]))
|
||||
|
||||
static unsigned int
|
||||
index_of(png_uint_32 name)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
if (name == 0)
|
||||
return 0;
|
||||
|
||||
for (i=0; i<C_KNOWN; ++i) if (png_known_chunks[i].name == name) return i;
|
||||
|
||||
assert("not reached" && 0);
|
||||
}
|
||||
|
||||
static unsigned int bitorder[32];
|
||||
|
||||
#define PNG_CHUNK_HASH(n,shift,s1,s2,s3,s4,s5)\
|
||||
(0x3f & (((n += n >> shift),n += n >> s1),n += n >> s2))
|
||||
|
||||
inline unsigned int hash(png_uint_32 name, unsigned int shift, unsigned int s1,
|
||||
unsigned int s2, unsigned int s3, unsigned int s4, unsigned int s5)
|
||||
{
|
||||
/* Running the search gives (shift,s1,s2) (2,8,16) */
|
||||
//return PNG_CHUNK_HASH(name, shift, s1, s2, s3, s4, s5);
|
||||
name += name >> shift;
|
||||
name += name >> s1;
|
||||
name += name >> s2;
|
||||
//name += name >> s3;
|
||||
return 0x3f & name;
|
||||
/*return 0x3f & ((name) + (
|
||||
((name >> bitorder[s1]) & 0x01) +
|
||||
((name >> (bitorder[s2]-1)) & 0x02) +
|
||||
((name >> (bitorder[s3]-2)) & 0x04) +
|
||||
((name >> (bitorder[s4]-3)) & 0x08) +
|
||||
((name >> (bitorder[s5]-4)) & 0x10)));*/
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
unsigned int s1 = 0, s2 = 0, s3 = 0, s4 = 0, s5 = 0;
|
||||
unsigned int shift = 0;
|
||||
png_uint_32 mask;
|
||||
unsigned int bitcount;
|
||||
unsigned int mineq;
|
||||
png_uint_32 sarray;
|
||||
unsigned int shift_save;
|
||||
png_uint_32 reverse_index_save[64];
|
||||
|
||||
assert(C_KNOWN <= 64);
|
||||
|
||||
/* Check IDAT: */
|
||||
assert(index_of(png_IDAT) == 0);
|
||||
|
||||
/* Build a mask of all the bits that differ in at least one of the known
|
||||
* names.
|
||||
*/
|
||||
{
|
||||
png_uint_32 set, unset;
|
||||
int i;
|
||||
|
||||
for (i=0, set=unset=0; i<C_KNOWN; ++i)
|
||||
{
|
||||
set |= png_known_chunks[i].name;
|
||||
unset |= ~png_known_chunks[i].name;
|
||||
}
|
||||
|
||||
mask = set ^ ~unset;
|
||||
}
|
||||
|
||||
//printf("C_KNOWN = %lu, 0x%.8x\n", C_KNOWN, mask);
|
||||
|
||||
assert(mask == 0x3f1f1f3f);
|
||||
|
||||
/* Print the bit array */
|
||||
{
|
||||
unsigned int i;
|
||||
unsigned int ones[32];
|
||||
|
||||
memset(ones, 0, sizeof ones);
|
||||
|
||||
for (i=0; i<C_KNOWN; ++i)
|
||||
{
|
||||
png_uint_32 name = png_known_chunks[i].name;
|
||||
int j, k;
|
||||
char s[5], b[33];
|
||||
|
||||
PNG_CSTRING_FROM_CHUNK(s, name);
|
||||
for (j=k=0; j<32; ++j)
|
||||
{
|
||||
if ((name >> j) & 1)
|
||||
++ones[j];
|
||||
|
||||
if ((mask >> (31-j)) & 1)
|
||||
b[k++] = ((name >> (31-j)) & 1) ? 'o' : ' ';
|
||||
}
|
||||
|
||||
b[k] = 0;
|
||||
|
||||
//printf("%s: %s\n", s, b);
|
||||
}
|
||||
|
||||
memset(bitorder, 0, sizeof bitorder);
|
||||
bitcount = 0;
|
||||
|
||||
for (i=0; i<C_KNOWN; ++i) if (((C_KNOWN-i) & 1) == 0)
|
||||
{
|
||||
unsigned int lo = (C_KNOWN - i)>>1;
|
||||
unsigned int hi = (C_KNOWN + i)>>1;
|
||||
int j;
|
||||
|
||||
for (j=0; j<32; ++j) if (ones[j] == lo || ones[j] == hi)
|
||||
{
|
||||
//printf(" %2d,", j);
|
||||
bitorder[bitcount++] = j;
|
||||
}
|
||||
}
|
||||
|
||||
//printf("\nbitcount=%u, C_KNOWN=%lu\n", bitcount, C_KNOWN);
|
||||
}
|
||||
|
||||
/* s? are masks to exclude bits from the hash, one for each byte: */
|
||||
mineq = C_KNOWN;
|
||||
sarray = 0;
|
||||
for (shift=0; shift<32; ++shift)
|
||||
for (s1=0; s1<32; ++s1)
|
||||
for (s2=s1+1; s2<32; ++s2)
|
||||
//for (s3=s2+1; s3<32; ++s3)
|
||||
//for (s4=s3+1; s4<bitcount; ++s4)
|
||||
//for (s5=s4+1; s5<bitcount; ++s5)
|
||||
{
|
||||
int i, eq;
|
||||
png_uint_32 reverse_index[64];
|
||||
|
||||
memset(reverse_index, 0, sizeof reverse_index);
|
||||
|
||||
for (i=eq=0; i<C_KNOWN; ++i)
|
||||
{
|
||||
png_uint_32 name = png_known_chunks[i].name;
|
||||
unsigned int h = hash(name, shift, s1, s2, s3, s4, s5);
|
||||
|
||||
if (reverse_index[h] == 0)
|
||||
reverse_index[h] = name;
|
||||
|
||||
else
|
||||
++eq;
|
||||
}
|
||||
|
||||
if (eq == 0)
|
||||
{
|
||||
/* Print the LUT: */
|
||||
printf("static const png_byte png_chunk_lut[64] =\n{ \n ");
|
||||
for (i=0; i<63; ++i)
|
||||
{
|
||||
printf("%2u, ", index_of(reverse_index[i]));
|
||||
if ((i+1 & 0xf) == 0) printf("\n ");
|
||||
}
|
||||
printf("%2u\n};\n\n", index_of(reverse_index[63]));
|
||||
|
||||
//printf("hash: %u, %u, %u, %u, %u, %u\n", shift, s1, s2, s3, s4, s5);
|
||||
printf("#define PNG_CHUNK_HASH(n)\\\n png_chunk_lut[0x3f &"
|
||||
" (((n += n >> %u),n += n >> %u),n += n >> %u)]\n\n",
|
||||
shift, s1, s2);
|
||||
printf("static png_byte\n"
|
||||
"png_chunk_index(png_uint_32 name)\n"
|
||||
"{\n"
|
||||
" name += name >> %u;\n"
|
||||
" name += name >> %u;\n"
|
||||
" name += name >> %u;\n"
|
||||
" return png_chunk_lut[name & 0x3f];\n"
|
||||
"}\n", shift, s1, s2);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (eq < mineq)
|
||||
{
|
||||
mineq = eq;
|
||||
sarray = s1 + bitcount * (s2 + bitcount * (s3 + bitcount *
|
||||
(s4 + bitcount *s5)));
|
||||
memcpy(reverse_index_save, reverse_index, sizeof reverse_index_save);
|
||||
shift_save = shift;
|
||||
}
|
||||
}
|
||||
|
||||
s1 = sarray % bitcount;
|
||||
s2 = (sarray / bitcount) % bitcount;
|
||||
s3 = (sarray / bitcount / bitcount) % bitcount;
|
||||
s4 = (sarray / bitcount / bitcount / bitcount) % bitcount;
|
||||
s5 = (sarray / bitcount / bitcount / bitcount / bitcount) % bitcount;
|
||||
|
||||
printf("best: %u clashes with bits: %u, %u, %u, %u, %u, %u\n",
|
||||
mineq, shift_save, s1, s2, s3, s4, s5);
|
||||
|
||||
{
|
||||
int i;
|
||||
png_uint_32 reverse_index[64];
|
||||
|
||||
memset(reverse_index, 0, sizeof reverse_index);
|
||||
|
||||
for (i=0; i<C_KNOWN; ++i)
|
||||
{
|
||||
png_uint_32 name = png_known_chunks[i].name;
|
||||
unsigned int h = hash(name, shift_save, s1, s2, s3, s4, s5);
|
||||
|
||||
if (reverse_index[h] == 0)
|
||||
reverse_index[h] = name;
|
||||
|
||||
else
|
||||
{
|
||||
char n1[5], n2[5];
|
||||
|
||||
PNG_CSTRING_FROM_CHUNK(n1, reverse_index[h]);
|
||||
PNG_CSTRING_FROM_CHUNK(n2, name);
|
||||
printf("%d <- %s and %s\n", h, n1, n2);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
/* def.c - define format of libpng.def
|
||||
*
|
||||
* Last changed in libpng version 1.6.16 [December 22, 2014]
|
||||
* Last changed in libpng 1.6.16 [December 22, 2014]
|
||||
* Copyright (c) 2011-2014 Glenn Randers-Pehrson
|
||||
*
|
||||
* This code is released under the libpng license.
|
||||
@@ -21,7 +21,7 @@ PNG_DFN "OS2 DESCRIPTION "PNG image compression library""
|
||||
PNG_DFN "OS2 CODE PRELOAD MOVEABLE DISCARDABLE"
|
||||
PNG_DFN ""
|
||||
PNG_DFN "EXPORTS"
|
||||
PNG_DFN ";Version 1.6.22beta03"
|
||||
PNG_DFN ";Version 1.7.0beta80"
|
||||
|
||||
#define PNG_EXPORTA(ordinal, type, name, args, attributes)\
|
||||
PNG_DFN "@" SYMBOL_PREFIX "@@" name "@"
|
||||
|
||||
@@ -33,20 +33,20 @@ clean :
|
||||
|
||||
|
||||
# Other dependencies.
|
||||
png.obj : png.h, pngconf.h, pnglibconf.h, pngpriv.h, pngstruct.h,pnginfo.h, pngdebug.h
|
||||
pngpread.obj : png.h, pngconf.h, pnglibconf.h, pngpriv.h, pngstruct.h,pnginfo.h, pngdebug.h
|
||||
pngset.obj : png.h, pngconf.h, pnglibconf.h, pngpriv.h, pngstruct.h,pnginfo.h, pngdebug.h
|
||||
pngget.obj : png.h, pngconf.h, pnglibconf.h, pngpriv.h, pngstruct.h,pnginfo.h, pngdebug.h
|
||||
pngread.obj : png.h, pngconf.h, pnglibconf.h, pngpriv.h, pngstruct.h,pnginfo.h, pngdebug.h
|
||||
pngrtran.obj : png.h, pngconf.h, pnglibconf.h, pngpriv.h, pngstruct.h,pnginfo.h, pngdebug.h
|
||||
pngrutil.obj : png.h, pngconf.h, pnglibconf.h, pngpriv.h, pngstruct.h,pnginfo.h, pngdebug.h
|
||||
pngerror.obj : png.h, pngconf.h, pnglibconf.h, pngpriv.h, pngstruct.h,pnginfo.h, pngdebug.h
|
||||
pngmem.obj : png.h, pngconf.h, pnglibconf.h, pngpriv.h, pngstruct.h,pnginfo.h, pngdebug.h
|
||||
pngrio.obj : png.h, pngconf.h, pnglibconf.h, pngpriv.h, pngstruct.h,pnginfo.h, pngdebug.h
|
||||
pngwio.obj : png.h, pngconf.h, pnglibconf.h, pngpriv.h, pngstruct.h,pnginfo.h, pngdebug.h
|
||||
pngtrans.obj : png.h, pngconf.h, pnglibconf.h, pngpriv.h, pngstruct.h,pnginfo.h, pngdebug.h
|
||||
pngwrite.obj : png.h, pngconf.h, pnglibconf.h, pngpriv.h, pngstruct.h,pnginfo.h, pngdebug.h
|
||||
pngwtran.obj : png.h, pngconf.h, pnglibconf.h, pngpriv.h, pngstruct.h,pnginfo.h, pngdebug.h
|
||||
pngwutil.obj : png.h, pngconf.h, pnglibconf.h, pngpriv.h, pngstruct.h,pnginfo.h, pngdebug.h
|
||||
png.obj : png.h, pngconf.h, pnglibconf.h, pngpriv.h, pngstruct.h, pnginfo.h, pngdebug.h, pngchunk.h
|
||||
pngpread.obj : png.h, pngconf.h, pnglibconf.h, pngpriv.h, pngstruct.h, pnginfo.h, pngdebug.h, pngchunk.h
|
||||
pngset.obj : png.h, pngconf.h, pnglibconf.h, pngpriv.h, pngstruct.h, pnginfo.h, pngdebug.h, pngchunk.h
|
||||
pngget.obj : png.h, pngconf.h, pnglibconf.h, pngpriv.h, pngstruct.h, pnginfo.h, pngdebug.h, pngchunk.h
|
||||
pngread.obj : png.h, pngconf.h, pnglibconf.h, pngpriv.h, pngstruct.h, pnginfo.h, pngdebug.h, pngchunk.h
|
||||
pngrtran.obj : png.h, pngconf.h, pnglibconf.h, pngpriv.h, pngstruct.h, pnginfo.h, pngdebug.h, pngchunk.h
|
||||
pngrutil.obj : png.h, pngconf.h, pnglibconf.h, pngpriv.h, pngstruct.h, pnginfo.h, pngdebug.h, pngchunk.h
|
||||
pngerror.obj : png.h, pngconf.h, pnglibconf.h, pngpriv.h, pngstruct.h, pnginfo.h, pngdebug.h, pngchunk.h
|
||||
pngmem.obj : png.h, pngconf.h, pnglibconf.h, pngpriv.h, pngstruct.h, pnginfo.h, pngdebug.h, pngchunk.h
|
||||
pngrio.obj : png.h, pngconf.h, pnglibconf.h, pngpriv.h, pngstruct.h, pnginfo.h, pngdebug.h, pngchunk.h
|
||||
pngwio.obj : png.h, pngconf.h, pnglibconf.h, pngpriv.h, pngstruct.h, pnginfo.h, pngdebug.h, pngchunk.h
|
||||
pngtrans.obj : png.h, pngconf.h, pnglibconf.h, pngpriv.h, pngstruct.h, pnginfo.h, pngdebug.h, pngchunk.h
|
||||
pngwrite.obj : png.h, pngconf.h, pnglibconf.h, pngpriv.h, pngstruct.h, pnginfo.h, pngdebug.h, pngchunk.h
|
||||
pngwtran.obj : png.h, pngconf.h, pnglibconf.h, pngpriv.h, pngstruct.h, pnginfo.h, pngdebug.h, pngchunk.h
|
||||
pngwutil.obj : png.h, pngconf.h, pnglibconf.h, pngpriv.h, pngstruct.h, pnginfo.h, pngdebug.h, pngchunk.h
|
||||
|
||||
pngtest.obj : png.h, pngconf.h, pnglibconf.h
|
||||
|
||||
@@ -48,7 +48,6 @@ if ("${INPUTEXT}" STREQUAL ".c" AND "${OUTPUTEXT}" STREQUAL ".out")
|
||||
${CMAKE_C_FLAGS}
|
||||
"-I${SRCDIR}"
|
||||
"-I${BINDIR}"
|
||||
${INCLUDES}
|
||||
"-DPNGLIB_LIBNAME=PNG${PNGLIB_MAJOR}${PNGLIB_MINOR}_0"
|
||||
"-DPNGLIB_VERSION=${PNGLIB_VERSION}"
|
||||
"-DSYMBOL_PREFIX=${SYMBOL_PREFIX}"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
/* intprefix.c - generate an unprefixed internal symbol list
|
||||
*
|
||||
* Last changed in libpng version 1.6.16 [December 22, 2014]
|
||||
* Last changed in libpng 1.6.16 [December 22, 2014]
|
||||
* Copyright (c) 2013-2014 Glenn Randers-Pehrson
|
||||
*
|
||||
* This code is released under the libpng license.
|
||||
|
||||
0
scripts/libpng-config-body.in
Normal file → Executable file
0
scripts/libpng-config-body.in
Normal file → Executable file
2
scripts/libpng-config-head.in
Normal file → Executable file
2
scripts/libpng-config-head.in
Normal file → Executable file
@@ -11,7 +11,7 @@
|
||||
|
||||
# Modeled after libxml-config.
|
||||
|
||||
version=1.6.22beta03
|
||||
version=1.7.0beta80
|
||||
prefix=""
|
||||
libdir=""
|
||||
libs=""
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user