Compare commits
768 Commits
libpng-1.5
...
v1.7.0beta
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 | ||
|
|
5c2d76fdef | ||
|
|
e4f124e335 | ||
|
|
1f84bd7000 | ||
|
|
b76ab1260d | ||
|
|
026b295698 | ||
|
|
eb8e19baa3 | ||
|
|
661bc6f6b0 | ||
|
|
6dae6d8f3b | ||
|
|
5b9a28f2b8 | ||
|
|
5f4b95e513 | ||
|
|
70850fce0c | ||
|
|
9d1ddbb78f | ||
|
|
f2aacefb3f | ||
|
|
4314d63792 | ||
|
|
7b3eefbcfd | ||
|
|
bb39dc545c | ||
|
|
520803d57e | ||
|
|
7f912dbeb5 | ||
|
|
ab1477d662 | ||
|
|
f0fb1746b0 | ||
|
|
f8dfd123e2 | ||
|
|
e6b710cb3f | ||
|
|
be85fa6027 | ||
|
|
43648b02bc | ||
|
|
75fde9e99a | ||
|
|
9a82547afe | ||
|
|
a9f44be8c2 | ||
|
|
e15b1e8136 | ||
|
|
fa63beaa34 | ||
|
|
c39be26f5a | ||
|
|
6ae34790cc | ||
|
|
8de49d0921 | ||
|
|
48cbba8e8e | ||
|
|
b257147015 | ||
|
|
73f826cb49 | ||
|
|
933bc842ac | ||
|
|
329d033d25 | ||
|
|
9c06d78468 | ||
|
|
b98681b49a | ||
|
|
53f7051b1b | ||
|
|
d099973c4f | ||
|
|
97a77a6f7b | ||
|
|
b2aba47a6d | ||
|
|
ed3ca0e3eb | ||
|
|
fd043e5d0d | ||
|
|
cc02f89eb2 | ||
|
|
14d0ca620e | ||
|
|
8010217201 | ||
|
|
702053d110 | ||
|
|
74a9c07fdd | ||
|
|
d0eef28ee1 | ||
|
|
3c1f6983c5 | ||
|
|
4a6c6df6c7 | ||
|
|
025d415838 | ||
|
|
810c99583b | ||
|
|
e9567514dd | ||
|
|
b593b3f035 | ||
|
|
0f08665bfb | ||
|
|
3744f94fd1 | ||
|
|
aa9dea57d7 | ||
|
|
ece07cfe9c | ||
|
|
dbb7e19fda | ||
|
|
e2098ba085 | ||
|
|
26849f4693 | ||
|
|
ad5a993954 | ||
|
|
6954141484 | ||
|
|
ba2dd33d9c | ||
|
|
134c5761fa | ||
|
|
865e14fd32 | ||
|
|
5d1df4fdf4 | ||
|
|
8d3453a22d | ||
|
|
4430b91363 | ||
|
|
dff6f4c4f0 | ||
|
|
432c174b64 | ||
|
|
5f5977e708 | ||
|
|
0a9f8eb272 | ||
|
|
cad0150d12 | ||
|
|
ee427ad39a | ||
|
|
01b813000a | ||
|
|
449db5a9c1 | ||
|
|
80b67e47e8 | ||
|
|
0a9f26e219 | ||
|
|
05ed18e7d1 | ||
|
|
edb3523a9b | ||
|
|
46cb5109bd | ||
|
|
5845d3eabd | ||
|
|
4a37149f66 | ||
|
|
fc58b17772 | ||
|
|
96b917056d | ||
|
|
0546e4e579 | ||
|
|
05af5cd8fb | ||
|
|
d630301d99 | ||
|
|
2ec8409046 | ||
|
|
905cc94e3d | ||
|
|
8f424b8270 | ||
|
|
cc46157421 | ||
|
|
14ca47b453 | ||
|
|
b1e7771d5e | ||
|
|
ff7b7ba060 | ||
|
|
1935d0738f | ||
|
|
04c1c078b9 | ||
|
|
8f4d67218e | ||
|
|
15f6fd3492 | ||
|
|
b45416921b | ||
|
|
040575c80b | ||
|
|
43309056ac | ||
|
|
bc2a57f657 | ||
|
|
56f22f4320 | ||
|
|
cd39adb561 | ||
|
|
b4f5c42092 | ||
|
|
e243a1fbd8 | ||
|
|
747b554a86 | ||
|
|
f229d4df3a | ||
|
|
96027d919f | ||
|
|
58f277c18e | ||
|
|
921648a997 | ||
|
|
23a30f8583 | ||
|
|
48015617d3 | ||
|
|
13a87d9682 | ||
|
|
c1217ee280 | ||
|
|
51d1e2be1b | ||
|
|
f7677a348e | ||
|
|
8fbd60ded2 | ||
|
|
b11b31aea2 | ||
|
|
51624965e2 | ||
|
|
ce9d8a3f48 | ||
|
|
eda53e5770 | ||
|
|
2bc76ffaf1 | ||
|
|
66efa24241 | ||
|
|
0c11b5f8e7 | ||
|
|
f5dcba6b9b | ||
|
|
c26d6e9aac | ||
|
|
42ed02ed9a | ||
|
|
31d66245ea | ||
|
|
d9d7a7e8f0 | ||
|
|
d15d124d6d | ||
|
|
dd6ecbe688 | ||
|
|
aa816c4444 | ||
|
|
209b3e4b79 | ||
|
|
f2715a558a | ||
|
|
845ee6af72 | ||
|
|
9ff37ea94f | ||
|
|
35f2e1768b | ||
|
|
945cb1f9be | ||
|
|
71db131882 | ||
|
|
bf7661f01b | ||
|
|
9066919600 | ||
|
|
1ffbe8c7c1 | ||
|
|
8d0215928d | ||
|
|
b5d0051dcb | ||
|
|
6038b80277 | ||
|
|
b57c1c9e6e | ||
|
|
0c98cc7023 | ||
|
|
6225b0e61e | ||
|
|
d072048925 | ||
|
|
7d4fbb2fbb | ||
|
|
42a2b556e9 | ||
|
|
e2ae0f2f2b | ||
|
|
d6cf3a3791 | ||
|
|
e741cd592e | ||
|
|
0ae4f7b705 | ||
|
|
29a6ba01a7 | ||
|
|
434801a39c | ||
|
|
79a141876a | ||
|
|
eeb1bb678d | ||
|
|
8e92cd51c6 | ||
|
|
363387c9c0 | ||
|
|
6f237b6bf0 | ||
|
|
a0ddf0b5f2 | ||
|
|
5541ea8aaf | ||
|
|
cf49919686 | ||
|
|
363ae65e2b | ||
|
|
cb129a6234 | ||
|
|
dee7577330 | ||
|
|
1c25b9b06b | ||
|
|
0a92b23c4b | ||
|
|
5408b613f8 | ||
|
|
b7e32059d3 | ||
|
|
faf38eea03 | ||
|
|
9eb125e927 | ||
|
|
203e6dd7cf | ||
|
|
16bb03b8b4 | ||
|
|
df44c4c4d9 | ||
|
|
4690b89eaa | ||
|
|
10c0693210 | ||
|
|
17ba5de88f | ||
|
|
7d5bf79d88 | ||
|
|
a4badc4b50 | ||
|
|
b0606ea043 | ||
|
|
566fb611b6 | ||
|
|
c737b7cf70 | ||
|
|
67dba43998 | ||
|
|
bce7988230 | ||
|
|
864270e18f | ||
|
|
74df4f1956 | ||
|
|
aa725a375c | ||
|
|
5578c3719e | ||
|
|
ce3c7330ba | ||
|
|
c8348f80d5 | ||
|
|
612d52afce | ||
|
|
3449169622 | ||
|
|
ead660ae1e | ||
|
|
04afaab56a | ||
|
|
781a90b358 | ||
|
|
61d7058b5b | ||
|
|
db6850b389 | ||
|
|
eda298bc01 | ||
|
|
516c9c97a6 | ||
|
|
0d4d0b4d32 | ||
|
|
5bffd6c6d5 | ||
|
|
816ff328d2 | ||
|
|
34dca8f8e8 | ||
|
|
3167541570 | ||
|
|
6437604a5e | ||
|
|
2dd49fbeae | ||
|
|
f1c0678c16 | ||
|
|
42369ccd85 | ||
|
|
572b078d8c | ||
|
|
40ca77a721 | ||
|
|
05cbe5ae28 | ||
|
|
5cdff4144e | ||
|
|
feecc898d9 | ||
|
|
3a1d63dc69 | ||
|
|
573a51143a | ||
|
|
6690011811 | ||
|
|
dde1f98626 | ||
|
|
aaf1179ec1 | ||
|
|
e044649282 | ||
|
|
a23f3dbcb6 | ||
|
|
a12d2328b4 | ||
|
|
95a8a665e4 | ||
|
|
da2194c0d5 | ||
|
|
1eb2c48458 | ||
|
|
8fb6c6a9b3 | ||
|
|
9c7f99c9cb | ||
|
|
99c7ad2904 | ||
|
|
e7b4d26ec1 | ||
|
|
c35f888c46 | ||
|
|
5635573cfc | ||
|
|
fea2a877c8 | ||
|
|
5bc90389bf | ||
|
|
2312167d51 | ||
|
|
edbcd02133 | ||
|
|
04336ba10f | ||
|
|
da1c5ca65a | ||
|
|
00c6a9a62c | ||
|
|
665031e834 | ||
|
|
0501c1c570 | ||
|
|
1531bd61a0 | ||
|
|
d9fc0622a1 | ||
|
|
6e4184249c | ||
|
|
04ab33560f | ||
|
|
0522f269e0 | ||
|
|
fcd301daed | ||
|
|
4f67e40898 | ||
|
|
f87ef8bcb5 | ||
|
|
a5bf4e3767 | ||
|
|
5d56786eff | ||
|
|
d7c22fb7ec | ||
|
|
939310bac1 | ||
|
|
29fca0d497 | ||
|
|
df477e4652 | ||
|
|
5a956a7a58 | ||
|
|
67ee8cee39 | ||
|
|
28d9339777 | ||
|
|
bc79d70965 | ||
|
|
40b2603687 | ||
|
|
ad41b8838a | ||
|
|
1d7f56ab64 | ||
|
|
3c1c95399b | ||
|
|
d332c67da7 | ||
|
|
b74fb4e49c | ||
|
|
a6f369b150 | ||
|
|
13831bc06e | ||
|
|
adf049e435 | ||
|
|
681c1fc02a | ||
|
|
ba6fbc57ba | ||
|
|
d1dceee2f7 | ||
|
|
94531034cc | ||
|
|
751a93f3ec | ||
|
|
0b3634bcc4 | ||
|
|
efaeadaa86 | ||
|
|
c4f94cbd08 | ||
|
|
26aad85204 | ||
|
|
c4081f05c8 | ||
|
|
eb26ee6602 | ||
|
|
90a87c8853 | ||
|
|
12924f33bd | ||
|
|
ec6d6fa51b | ||
|
|
1f0eaa046c | ||
|
|
6bdefdd977 | ||
|
|
405a398b3e | ||
|
|
8888ea4479 | ||
|
|
0b26ac5dee | ||
|
|
414769b415 | ||
|
|
5e934ba900 | ||
|
|
b72bc15e22 | ||
|
|
4c7e8208b6 | ||
|
|
baeb6d1e92 | ||
|
|
2ddb252d07 | ||
|
|
7455cbf47e | ||
|
|
87fadd5eee | ||
|
|
5b79cd52f4 | ||
|
|
36082cffcd | ||
|
|
e1bb124baa | ||
|
|
15ea1fa337 |
920
ANNOUNCE
@@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
Libpng 1.5.7beta05 - November 22, 2011
|
Libpng 1.7.0beta64 - July 26, 2015
|
||||||
|
|
||||||
This is not intended to be a public release. It will be replaced
|
This is not intended to be a public release. It will be replaced
|
||||||
within a few weeks by a public version or by another test version.
|
within a few weeks by a public version or by another test version.
|
||||||
@@ -9,107 +9,853 @@ Files available for download:
|
|||||||
Source files with LF line endings (for Unix/Linux) and with a
|
Source files with LF line endings (for Unix/Linux) and with a
|
||||||
"configure" script
|
"configure" script
|
||||||
|
|
||||||
1.5.7beta05.tar.xz (LZMA-compressed, recommended)
|
1.7.0beta64.tar.xz (LZMA-compressed, recommended)
|
||||||
1.5.7beta05.tar.gz
|
1.7.0beta64.tar.gz
|
||||||
1.5.7beta05.tar.bz2
|
|
||||||
|
|
||||||
Source files with CRLF line endings (for Windows), without the
|
Source files with CRLF line endings (for Windows), without the
|
||||||
"configure" script
|
"configure" script
|
||||||
|
|
||||||
lp157b05.7z (LZMA-compressed, recommended)
|
lp170b64.7z (LZMA-compressed, recommended)
|
||||||
lp157b05.zip
|
lp170b64.zip
|
||||||
|
|
||||||
Other information:
|
Other information:
|
||||||
|
|
||||||
1.5.7beta05-README.txt
|
1.7.0beta64-README.txt
|
||||||
1.5.7beta05-LICENSE.txt
|
1.7.0beta64-LICENSE.txt
|
||||||
|
libpng-1.7.0beta64-*.asc (armored detached GPG signatures)
|
||||||
|
|
||||||
Changes since the last public release (1.5.6):
|
Changes since the last public release (1.6.0):
|
||||||
|
|
||||||
Version 1.5.7beta01 [November 4, 2011]
|
Version 1.7.0alpha01 [December 15, 2012]
|
||||||
Added support for ARM processor (Mans Rullgard)
|
Started 1.7.0 branch from libpng-1.6.0beta33.
|
||||||
Fixed bug in pngvalid on early allocation failure; fixed type cast in
|
Made 8-bit compose and rgb_to_grayscale accuracy improvements. These
|
||||||
pngmem.c; pngvalid would attempt to call png_error() if the allocation
|
changes cause 16-bit arithmetic to be used for 8-bit data in the gamma
|
||||||
of a png_struct or png_info failed. This would probably have led to a
|
corrected compose and grayscale operations. The arithmetic errors have
|
||||||
crash. The pngmem.c implementation of png_malloc() included a cast
|
three sources all of which are fixed in this commit:
|
||||||
to png_size_t which would fail on large allocations on 16-bit systems.
|
1) 8-bit linear calculations produce massive errors for lower intensity
|
||||||
Fix for the preprocessor of the Intel C compiler. The preprocessor
|
values.
|
||||||
splits adjacent @ signs with a space; this changes the concatentation
|
2) The old 16-bit "16 to 8" gamma table code erroneously wrote the lowest
|
||||||
token from @-@-@ to PNG_JOIN; that should work with all compiler
|
output value into a table entry which corresponded to multiple output
|
||||||
preprocessors.
|
values (so where the value written should have been the closest to the
|
||||||
Paeth filter speed improvements from work by Siarhei Siamashka. This
|
transformed input value.)
|
||||||
changes the 'Paeth' reconstruction function to improve the GCC code
|
3) In a number of cases the code to access the 16-bit table did not round;
|
||||||
generation on x86. The changes are only part of the suggested ones;
|
it did a simple shift, which was wrong and made the side effects of (2)
|
||||||
just the changes that definitely improve speed and remain simple.
|
even worse.
|
||||||
The changes also slightly increase the clarity of the code.
|
The new gamma code does not have the 16-to-8 problem at the cost of slightly
|
||||||
|
more calculations and the algorithm used to minimize the number of
|
||||||
|
calculations has been extended to all the 16-bit tables; it has advantages
|
||||||
|
for any significant gamma correction.
|
||||||
|
Rearranged png_struct, remove unused members, change png_set_filter handling
|
||||||
|
png_struct members rearranged - partly to reorder to avoid packing, partly
|
||||||
|
to put frequently accessed members at the start and partly to make
|
||||||
|
the grouping more clear. png_set_filter code has been rewritten and the
|
||||||
|
code shared with png_write_start_row moved to a common function. Comments
|
||||||
|
in png.h have been made more clear. Minor fixes to
|
||||||
|
contrib/libtests/timepng.c and some of the png_*_tRNS logic, including
|
||||||
|
more error detection in png_set_tRNS.
|
||||||
|
Cleaned up USER_LIMITS feature, removing members from png_struct when not
|
||||||
|
required.
|
||||||
|
Rearranged ARM-NEON optimizations to isolate the machine specific code to
|
||||||
|
the hardware subdirectory, and add comments to pngrutil.c so that
|
||||||
|
implementors of other optimizations will know what to do.
|
||||||
|
Fixed cases of unquoted DESTDIR in Makefile.am.
|
||||||
|
Rebuilt Makefile.in, configure, etc., with autoconf-2.69 and automake-1.12.5.
|
||||||
|
|
||||||
Version 1.5.7beta02 [November 11, 2011]
|
Version 1.7.0alpha02 [December 17, 2012]
|
||||||
Check compression_type parameter in png_get_iCCP and remove spurious
|
Removed functions that were deprecated in libpng-1.6.0:
|
||||||
casts. The compression_type parameter is always assigned to, so must
|
png_reset_zstream(), png_info_init_3(), and png_data_freer() and its
|
||||||
be non-NULL. The cast of the profile length potentially truncated the
|
associated flags.
|
||||||
value unnecessarily on a 16-bit int system, so the cast of the (byte)
|
Removed some duplicated lines from contrib/tools/scale.c and png.c.
|
||||||
compression type to (int) is specified by ANSI-C anyway.
|
Changed some instances of png_warning() to png_app_error().
|
||||||
Fixed FP division by zero in pngvalid.c; the 'test_pixel' code left
|
Updated some left over "1.6.0beta32" in code sources.
|
||||||
the sBIT fields in the test pixel as 0, which resulted in a floating
|
Fixed a "png_structp" prototype (should be png_structrp) in arm_init.c
|
||||||
point division by zero which was irrelevant but causes systems where
|
Updated the version-number hack in pngvalid.c
|
||||||
FP exceptions cause a crash. Added code to pngvalid to turn on FP
|
|
||||||
exceptions if the appropriate glibc support is there to ensure this is
|
|
||||||
tested in the future.
|
|
||||||
Updated scripts/pnglibconf.mak and scripts/makefile.std to handle the
|
|
||||||
new PNG_JOIN macro.
|
|
||||||
Added versioning to pnglibconf.h comments.
|
|
||||||
Simplified read/write API initial version; basic read/write tested on
|
|
||||||
a variety of images, limited documentation (in the header file.)
|
|
||||||
Installed more accurate linear to sRGB conversion tables. The slightly
|
|
||||||
modified tables reduce the number of 16-bit values that
|
|
||||||
convert to an off-by-one 8-bit value. The "makesRGB.c" code that was used
|
|
||||||
to generate the tables is now in a contrib/sRGBtables sub-directory.
|
|
||||||
|
|
||||||
Version 1.5.7beta03 [November 17, 2011]
|
Version 1.7.0alpha03 [December 19, 2012]
|
||||||
Removed PNG_CONST from the sRGB table declarations in pngpriv.h and png.c
|
Cleaned up and enhanced the configure option; libpng now correctly
|
||||||
Added run-time detection of NEON support.
|
links and tests against zlib with a prefix; tests have been clarified; and
|
||||||
Added contrib/libtests; includes simplified API test and timing test and
|
irrelevant or obsolete things (as defined by the autotools man page) have
|
||||||
a color conversion utility for rapid checking of failed 'pngstest' results.
|
been removed.
|
||||||
Multiple transform bug fixes plus a work-round for double gamma correction.
|
Documented new PNG_ABORT behavior in the manual and commentary in pngerror.c
|
||||||
libpng does not support more than one transform that requires linear data
|
Cleaned up whitespace in the synopsis portion of the manpage "libpng.3"
|
||||||
at once - if this is tried typically the results is double gamma
|
Fixed previous support for Z_PREFIX in configure builds, corrected sCAL APIs;
|
||||||
correction. Since the simplified APIs can need rgb to gray combined with
|
some of these use floating point arithmetic so they need to be disabled if
|
||||||
a compose operation it is necessary to do one of these outside the main
|
floating point arithmetic is switched off. This is a quiet API change -
|
||||||
libpng transform code. This check-in also contains fixes to various bugs
|
previously it appeared that the APIs were supported if fixed point
|
||||||
in the simplified APIs themselves and to some bugs in compose and rgb to
|
arithmetic was used internally, however they required certain APIs (floor,
|
||||||
gray (on palette) itself.
|
modf, frexp, atof) that are part of C floating point support. Changed
|
||||||
Fixes for C++ compilation using g++ When libpng source is compiled
|
png_fixed and the gamma code specific version of the same to avoid floor(),
|
||||||
using g++. The compiler imposes C++ rules on the C source; thus it
|
which may be a library function (not an intrinsic). Removed unused #if 0
|
||||||
is desireable to make the source work with either C or C++ rules
|
code.
|
||||||
without throwing away useful error information. This change adds
|
Disassembled the version number in scripts/options.awk (necessary for
|
||||||
png_voidcast to allow C semantic (void*) cases or the corresponding
|
building on SunOs).
|
||||||
C++ static_cast operation, as appropriate.
|
|
||||||
Added --noexecstack to assembler file compilation. GCC does not set
|
|
||||||
this on assembler compilation, even though it does on C compilation.
|
|
||||||
This creates security issues if assembler code is enabled; the
|
|
||||||
work-around is to set it by default in the flags for $(CCAS)
|
|
||||||
Work around compilers that don't support declaration of const data. Some
|
|
||||||
compilers fault 'extern const' data declarations (because the data is
|
|
||||||
not initialized); this turns on const-ness only for compilers where
|
|
||||||
this is known to work.
|
|
||||||
|
|
||||||
Version 1.5.7beta04 [November 17, 2011]
|
Version 1.7.0alpha04 [December 23, 2012]
|
||||||
Since the gcc driver does not recognize the --noexecstack flag, we must
|
Added scripts/makefile.msys contributed by Christopher M. Wheeler
|
||||||
use the -Wa prefix to have it passed through to the assembler.
|
Made default Zlib compression settings be configurable. This adds #defines to
|
||||||
Also removed a duplicate setting of this flag.
|
pnglibconf.h to control the defaults.
|
||||||
Added files that were omitted from the libpng-1.5.7beta03 zip distribution.
|
Fixed Windows build issues, enabled ARM compilation. Various warnings issued
|
||||||
|
by earlier versions of GCC fixed for Cygwin and Min/GW (which both use old
|
||||||
|
GCCs.) ARM support is enabled by default in zlib.props (unsupported by
|
||||||
|
Microsoft) and ARM compilation is made possible by deleting the check for
|
||||||
|
x86. The test programs cannot be run because they are not signed.
|
||||||
|
|
||||||
Version 1.5.7beta05 [November 22, 2011]
|
Version 1.7.0alpha05 [December 24, 2012]
|
||||||
Removed "zTXt" from warning in generic chunk decompression function.
|
Discontinued distributing libpng-1.x.x.tar.bz2.
|
||||||
Validate time settings passed to pngset() and png_convert_to_rfc1123()
|
Discontinued distributing libpng-1.7.0-1.6.0-diff.txt and similar.
|
||||||
(Frank Busse).
|
|
||||||
Allow row_stride==0 to indicate default stride in simplified API.
|
|
||||||
Added MINGW support to CMakeLists.txt
|
|
||||||
Reject invalid compression flag or method when reading the iTXt chunk.
|
|
||||||
|
|
||||||
Send comments/corrections/commendations to png-mng-implement at lists.sf.net:
|
Version 1.7.0alpha06 [January 1, 2013]
|
||||||
|
Fixed 'make distcheck' on SUN OS - libpng.so was not being removed
|
||||||
|
|
||||||
|
Version 1.7.0alpha07 [January 10, 2013]
|
||||||
|
Fixed conceivable but difficult to repro overflow. Also added two test
|
||||||
|
programs to generate and test a PNG which should have the problem.
|
||||||
|
|
||||||
|
Version 1.7.0alpha08 [January 17, 2013]
|
||||||
|
Corrected previous attempt at overflow detection in png_set_unknown_chunks()
|
||||||
|
(CVE-2013-7353). Added overflow detection in png_set_sPLT() and
|
||||||
|
png_set_text_2() (CVE-2013-7354).
|
||||||
|
|
||||||
|
Version 1.7.0alpha09 [January 21, 2013]
|
||||||
|
Pulled changes to multi-chunk handling from libpng-1.6.0beta40.
|
||||||
|
|
||||||
|
Version 1.7.0alpha10 [February 5, 2013]
|
||||||
|
Make symbol prefixing work with the ARM neon optimizations. Also
|
||||||
|
allow pngpriv.h to be included for preprocessor definitions only, so
|
||||||
|
it can be used in non-C/C++ files.
|
||||||
|
Added png_get_palette_max() function.
|
||||||
|
Changed png_size_t to size_t throughout headers, make sRGB check numbers
|
||||||
|
consistent.
|
||||||
|
Fixed ARM support (Mans Rullgard).
|
||||||
|
Removed stray out-of-order #endif and #ifdef (Mans Rullgard).
|
||||||
|
Ported libpng 1.5 options.awk/dfn file handling to 1.7, fixed one bug.
|
||||||
|
Rebuilt Makefile.in, configure, etc., with autoconf-2.69 and automake-1.13.
|
||||||
|
Minor fixes to assembler changes, verified with a dummy .S file
|
||||||
|
Removed cc -E workround, corrected png_get_palette_max API. Tested on
|
||||||
|
SUN OS cc 5.9, which demonstrates the tokenization problem previously
|
||||||
|
avoided by using /lib/cpp. Since all .dfn output is now protected
|
||||||
|
in double quotes unless it is to be macro substituted the fix should work
|
||||||
|
everywhere.
|
||||||
|
|
||||||
|
Version 1.7.0beta01 [February 15, 2013]
|
||||||
|
Enable parallel tests and rearrange TESTS order to take advantage of
|
||||||
|
the massive speed improvements use a make capable of parallel builds
|
||||||
|
on a multi-CPU machine and pass the right arguments to make (-j10000
|
||||||
|
for GNU make) to get the build to run in parallel.
|
||||||
|
Fixed previous support for Z_PREFIX in configure builds, corrected
|
||||||
|
sCAL APIs; some of these use floating point arithmetic so need to be
|
||||||
|
disabled if floating point arithmetic is switched off. This is a quiet API
|
||||||
|
change - previously it appeared that the APIs were supported if fixed point
|
||||||
|
arithmetic was used internally, however they required certain APIs (floor,
|
||||||
|
modf, frexp, atof) that are part of C floating point support. Changed
|
||||||
|
png_fixed and the gamma code specific version of the same to avoid floor(),
|
||||||
|
which may be a library function (not an intrinsic). Removed unused #if 0
|
||||||
|
code.
|
||||||
|
Fixed make distcheck to skip over the test result files. They were
|
||||||
|
being included because the whole of the 'tests' directory is included,
|
||||||
|
fixed to just include the actual test files and tests/pngstest. Also
|
||||||
|
reverted the previous erroneous change to remove the ${srcdir} from the
|
||||||
|
front of contrib, scripts, projects and added an explanation of what is
|
||||||
|
going on to Makefile.am
|
||||||
|
Fixed missing dependency in --prefix builds. The intermediate
|
||||||
|
internal 'prefix.h' file can only be generated correctly after pnglibconf.h,
|
||||||
|
however the dependency was not in Makefile.am. The symptoms are
|
||||||
|
unpredictable depending on the order make chooses to build pngprefix.h and
|
||||||
|
pnglibconf.h, often the error goes unnoticed because there is a system
|
||||||
|
pnglibconf.h to use instead.
|
||||||
|
Accept "," as a separator in pnglibconf.dfa and allow for
|
||||||
|
continuation lines. This adds to the syntax of "option" and "chunk" lines,
|
||||||
|
allowing the elements to be separated by a "," at the end of an element and
|
||||||
|
interpreting a "," at end of line as a continuation - so the following line
|
||||||
|
is read. The new syntax is optional and solely provided for readability.
|
||||||
|
Enclosed the new png_get_palette_max in #ifdef PNG_GET_PALETTE_MAX_SUPPORTED
|
||||||
|
block, and revised pnglibconf.h and pnglibconf.h.prebuilt accordingly.
|
||||||
|
|
||||||
|
Version 1.7.0beta02 [February 18, 2013]
|
||||||
|
Fixed a race condition in the creation of the build 'scripts' directory
|
||||||
|
while building with a parallel make.
|
||||||
|
Use approved/supported Android method to check for NEON, use Linux/POSIX
|
||||||
|
1003.1 API to check /proc/self/auxv avoiding buffer allocation and other
|
||||||
|
library calls (ported from libpng15).
|
||||||
|
Use parentheses more consistently in "#if defined(MACRO)" tests.
|
||||||
|
Folded long lines.
|
||||||
|
|
||||||
|
Version 1.7.0beta03 [February 22, 2013]
|
||||||
|
Reenabled code to allow zero length PLTE chunks for MNG.
|
||||||
|
Fixed ALIGNED_MEMORY support.
|
||||||
|
Allow run-time ARM NEON checking to be disabled. A new configure option:
|
||||||
|
--enable-arm-neon=always will stop the run-time checks. New checks
|
||||||
|
within arm/arm_init.c will cause the code not to be compiled unless
|
||||||
|
__ARM_NEON__ is set. This should make it fail safe (if someone asks
|
||||||
|
for it on then the build will fail if it can't be done.)
|
||||||
|
Updated the INSTALL document.
|
||||||
|
|
||||||
|
Version 1.7.0beta04 [February 27, 2013]
|
||||||
|
Revised INSTALL to recommend using CPPFLAGS instead of INCLUDES.
|
||||||
|
Revised scripts/makefile.freebsd to respect ZLIBLIB and ZLIBINC.
|
||||||
|
Revised scripts/dfn.awk to work with the buggy MSYS awk that has trouble
|
||||||
|
with CRLF line endings.
|
||||||
|
|
||||||
|
Version 1.7.0beta05 [March 5, 2013]
|
||||||
|
Avoid a possible memory leak in contrib/gregbook/readpng.c
|
||||||
|
Changed user chunk callback API to respect global and per chunk defaults.
|
||||||
|
Previously a return of 0 from a user chunk callback would result in the
|
||||||
|
chunk being saved (if this was safe, even if the chunk was unsafe-to-copy);
|
||||||
|
this change respects the defaults set by the application, so unknown chunks
|
||||||
|
can be discarded by default and known-safe ones preserved.
|
||||||
|
Corrected Android builds and corrected libpng.vers with symbol
|
||||||
|
prefixing. This adds an API to set optimization options externally,
|
||||||
|
providing an alternative and general solution for the non-portable
|
||||||
|
run-time tests used by the ARM Neon code. It also makes those tests
|
||||||
|
compile and link on Android. The order of settings vs options in
|
||||||
|
pnglibconf.h is reversed to allow settings to depend on options and
|
||||||
|
options can now set (or override) the defaults for settings.
|
||||||
|
|
||||||
|
Version 1.7.0beta06 [March 13, 2013]
|
||||||
|
Corrected simplified API default gamma for color-mapped output, added
|
||||||
|
a flag to change default. In 1.6.0 when the simplified API was used
|
||||||
|
to produce color-mapped output from an input image with no gamma
|
||||||
|
information the gamma assumed for the input could be different from
|
||||||
|
that assumed for non-color-mapped output. In particular 16-bit depth
|
||||||
|
input files were assumed to be sRGB encoded, whereas in the 'direct'
|
||||||
|
case they were assumed to have linear data. This was an error. The
|
||||||
|
fix makes the simplified API treat all input files the same way and
|
||||||
|
adds a new flag to the png_image::flags member to allow the
|
||||||
|
application/user to specify that 16-bit files contain sRGB data
|
||||||
|
rather than the default linear.
|
||||||
|
Fixed bugs in the pngpixel and makepng test programs.
|
||||||
|
Fixed CMakelists.txt to allow building a single variant of the library
|
||||||
|
(Claudio Bley):
|
||||||
|
Introduced a PNG_LIB_TARGETS variable that lists all activated library
|
||||||
|
targets. It is an error if this variable ends up empty, ie. you have
|
||||||
|
to build at least one library variant.
|
||||||
|
Made the *_COPY targets only depend on library targets actually being build.
|
||||||
|
Use PNG_LIB_TARGETS to unify a code path.
|
||||||
|
Changed the CREATE_SYMLINK macro to expect the full path to a file as the
|
||||||
|
first argument. When symlinking the filename component of that path is
|
||||||
|
determined and used as the link target.
|
||||||
|
Use copy_if_different in the CREATE_SYMLINK macro.
|
||||||
|
Eliminated two warnings from the Intel C compiler. The warnings are
|
||||||
|
technically valid, although a reasonable treatment of division would
|
||||||
|
show it to be incorrect.
|
||||||
|
|
||||||
|
Version 1.7.0beta07 [April 14, 2013]
|
||||||
|
Updated documentation of 1.5.x to 1.6.x changes in iCCP chunk handling.
|
||||||
|
Fixed incorrect warning of excess deflate data. End condition - the
|
||||||
|
warning would be produced if the end of the deflate stream wasn't read
|
||||||
|
in the last row. The warning is harmless.
|
||||||
|
Corrected the test on user transform changes on read. It was in the
|
||||||
|
png_set of the transform function, but that doesn't matter unless the
|
||||||
|
transform function changes the rowbuf size, and that is only valid if
|
||||||
|
transform_info is called.
|
||||||
|
Corrected a misplaced closing bracket in contrib/libtests/pngvalid.c
|
||||||
|
(Flavio Medeiros).
|
||||||
|
Corrected length written to uncompressed iTXt chunks (Samuli Suominen).
|
||||||
|
|
||||||
|
Version 1.7.0beta08 [April 18, 2013]
|
||||||
|
Added contrib/tools/fixitxt.c, to repair the erroneous iTXt chunk length
|
||||||
|
written by libpng-1.6.0 and 1.6.1.
|
||||||
|
Disallow storing sRGB information when the sRGB is not supported.
|
||||||
|
|
||||||
|
Version 1.7.0beta09 [April 24, 2013]
|
||||||
|
Exposed PNG chunk types in png.h
|
||||||
|
Modified png_uint_32 macros/code to make as few assumptions as possible
|
||||||
|
Revised stack marking in arm/filter_neon.S and configure.ac
|
||||||
|
Ensure that NEON filter stuff is completely disabled when switched 'off'.
|
||||||
|
Previously the ARM NEON specific files were still built if the option
|
||||||
|
was switched 'off' as opposed to being explicitly disabled.
|
||||||
|
|
||||||
|
Version 1.7.0beta10 [April 24, 2013]
|
||||||
|
Attempt to fix the PNG_ARM_NEON configuration mess.
|
||||||
|
|
||||||
|
Version 1.7.0beta11 [April 26, 2013]
|
||||||
|
Test for 'arm*', not just 'arm' in the host_cpu configure variable.
|
||||||
|
|
||||||
|
Version 1.7.0beta12 [April 30, 2013]
|
||||||
|
Added png_app_warning for out-of-range unknown chunk index in
|
||||||
|
png_set_unknown_chunk_location().
|
||||||
|
Expanded manual paragraph about writing private chunks.
|
||||||
|
Avoid dereferencing NULL pointer possibly returned from
|
||||||
|
png_create_write_struct() (Andrew Church).
|
||||||
|
|
||||||
|
Version 1.7.0beta13 [May 12, 2013]
|
||||||
|
Revised contrib/pngminim/*/makefile to generate pnglibconf.h with the
|
||||||
|
right zlib header files.
|
||||||
|
Separated CPPFLAGS and CFLAGS in contrib/pngminim/*/makefile
|
||||||
|
Updated contrib/pngminus/pnm2png.c (Paul Stewart):
|
||||||
|
Check for EOF
|
||||||
|
Ignore "#" delimited comments in input file to pnm2png.c.
|
||||||
|
Fixed whitespace handling
|
||||||
|
Added a call to png_set_packing()
|
||||||
|
Initialize dimension values so if sscanf fails at least we have known
|
||||||
|
invalid values.
|
||||||
|
Calculate our own zlib windowBits when decoding rather than trusting the
|
||||||
|
CMF bytes in the PNG datastream.
|
||||||
|
Added an option to force maximum window size for inflating, which was
|
||||||
|
the behavior of libpng15 and earlier.
|
||||||
|
Added png-fix-itxt and png-fix-too-far-back to the built programs and
|
||||||
|
removed warnings from the source code and timepng that are revealed as
|
||||||
|
a result.
|
||||||
|
Detect wrong libpng versions linked to png-fix-too-far-back, which currently
|
||||||
|
only works with libpng versions that can be made to reliably fail when
|
||||||
|
the deflate data contains an out-of-window reference. This means only
|
||||||
|
1.6 and later.
|
||||||
|
Attempt to detect configuration issues with png-fix-too-far-back, which
|
||||||
|
requires both the correct libpng and the correct zlib to function
|
||||||
|
correctly.
|
||||||
|
Check ZLIB_VERNUM for mismatches, enclose #error in quotes
|
||||||
|
Added information in the documentation about problems with and fixes for
|
||||||
|
the bad CRC and bad iTXt chunk situations.
|
||||||
|
|
||||||
|
Version 1.7.0beta14 [June 8, 2013]
|
||||||
|
Removed a redundant test in png_set_IHDR().
|
||||||
|
Added set(CMAKE_CONFIGURATION_TYPES ...) to CMakeLists.txt (Andrew Hundt)
|
||||||
|
Deleted set(CMAKE_BUILD_TYPE) block from CMakeLists.txt
|
||||||
|
Enclose the prototypes for the simplified write API in #ifdef STDIO/#endif
|
||||||
|
Make ARM NEON support work at compile time (not just configure time).
|
||||||
|
This moves the test on __ARM_NEON__ into pngconf.h to avoid issues when
|
||||||
|
using a compiler that compiles for multiple architectures at one time.
|
||||||
|
Removed PNG_FILTER_OPTIMIZATIONS and PNG_ARM_NEON_SUPPORTED from
|
||||||
|
pnglibconf.h, allowing more of the decisions to be made internally
|
||||||
|
(pngpriv.h) during the compile. Without this, symbol prefixing is broken
|
||||||
|
under certain circumstances on ARM platforms. Now only the API parts of
|
||||||
|
the optimizations ('check' vs 'api') are exposed in the public header files
|
||||||
|
except that the new setting PNG_ARM_NEON_OPT documents how libpng makes the
|
||||||
|
decision about whether or not to use the optimizations.
|
||||||
|
Protect symbol prefixing against CC/CPPFLAGS/CFLAGS useage.
|
||||||
|
Previous iOS/Xcode fixes for the ARM NEON optimizations moved the test
|
||||||
|
on __ARM_NEON__ from configure time to compile time. This breaks symbol
|
||||||
|
prefixing because the definition of the special png_init_filter_functions
|
||||||
|
call was hidden at configure time if the relevant compiler arguments are
|
||||||
|
passed in CFLAGS as opposed to CC. This change attempts to avoid all
|
||||||
|
the confusion that would result by declaring the init function even when
|
||||||
|
it is not used, so that it will always get prefixed.
|
||||||
|
|
||||||
|
Version 1.7.0beta15 [June 18, 2013]
|
||||||
|
Revised libpng.3 so that "doclifter" can process it.
|
||||||
|
|
||||||
|
Version 1.7.0beta16 [July 5, 2013]
|
||||||
|
Revised example.c to illustrate use of PNG_DEFAULT_sRGB and PNG_GAMMA_MAC_18
|
||||||
|
as parameters for png_set_gamma(). These have been available since
|
||||||
|
libpng-1.5.4.
|
||||||
|
Renamed contrib/tools/png-fix-too-far-back.c to pngfix.c and revised it
|
||||||
|
to check all compressed chunks known to libpng.
|
||||||
|
Updated documentation to show default behavior of benign errors correctly.
|
||||||
|
Added perfect hash code generation for lists of PNG chunks. This is
|
||||||
|
a work in progress; checked in for use in pngfix.c
|
||||||
|
Ported ARM no-read patch from libpng16.
|
||||||
|
Ported pngfix.c patches from libpng16.
|
||||||
|
|
||||||
|
Version 1.7.0beta17 [August 21, 2013]
|
||||||
|
Revised manual about changes in iTXt chunk handling made in libpng-1.6.0.
|
||||||
|
Added "/* SAFE */" comments in pngrutil.c and pngrtran.c where warnings
|
||||||
|
may be erroneously issued by code-checking applications.
|
||||||
|
Added information about png_set_options() to the manual.
|
||||||
|
Delay calling png_init_filter_functions() until a row with nonzero filter
|
||||||
|
is found.
|
||||||
|
|
||||||
|
Version 1.7.0beta18 [September 16, 2013]
|
||||||
|
Fixed inconsistent conditional compilation of png_chunk_unknown_handling()
|
||||||
|
prototype, definition, and usage. Made it depend on
|
||||||
|
PNG_HANDLE_AS_UNKNOWN_SUPPORTED everywhere.
|
||||||
|
|
||||||
|
Version 1.7.0beta19 [September 30, 2013]
|
||||||
|
Reverted the change to unknown handling #defines; the change breaks 'NOREAD'
|
||||||
|
builds.
|
||||||
|
Fixed default behavior of ARM_NEON_API. If the ARM NEON API option is
|
||||||
|
compiled without the CHECK option it defaulted to on, not off.
|
||||||
|
Catch up with recent libpng16 changes; unknown handling and spelling
|
||||||
|
corrections
|
||||||
|
Avoid up-cast warnings in pngvalid.c. On ARM the alignment requirements of
|
||||||
|
png_modifier are greater than that of png_store and as a consequence
|
||||||
|
compilation of pngvalid.c results in a warning about increased alignment
|
||||||
|
requirements because of the bare cast to (png_modifier*). The code is
|
||||||
|
safe, because the pointer is known to point to a stack allocated
|
||||||
|
png_modifier, but this change avoids the warning.
|
||||||
|
Fixed some grammatical changes and updated the png chunks list.
|
||||||
|
|
||||||
|
Version 1.7.0beta20 [October 13, 2013]
|
||||||
|
Made changes for compatibility with automake 1.14:
|
||||||
|
1) Added the 'compile' program to the list of programs that must be cleaned
|
||||||
|
in autogen.sh
|
||||||
|
2) Added 'subdir-objects' which causes .c files in sub-directories to be
|
||||||
|
compiled such that the corresponding .o files are also in the
|
||||||
|
sub-directory. This is because automake 1.14 warns that the
|
||||||
|
current behavior of compiling to the top level directory may be removed
|
||||||
|
in the future.
|
||||||
|
3) Updated dependencies on pnglibconf.h to match the new .o locations and
|
||||||
|
added all the files in contrib/libtests and contrib/tools that depend
|
||||||
|
on pnglibconf.h
|
||||||
|
4) Added 'BUILD_SOURCES = pnglibconf.h'; this is the automake recommended
|
||||||
|
way of handling the dependencies of sources that are machine generated;
|
||||||
|
unfortunately it only works if the user does 'make all' or 'make check',
|
||||||
|
so the dependencies (3) are still required.
|
||||||
|
Cleaned up (char*) casts of zlib messages. The latest version of the Intel C
|
||||||
|
compiler complains about casting a string literal as (char*), so copied the
|
||||||
|
treatment of z_const from the library code into pngfix.c
|
||||||
|
Simplified error message code in pngunknown. The simplification has the
|
||||||
|
useful side effect of avoiding a bogus warning generated by the latest
|
||||||
|
version of the Intel C compiler (it objects to
|
||||||
|
condition ? string-literal : string-literal).
|
||||||
|
Make autogen.sh work with automake 1.13 as well as 1.14. Do this by always
|
||||||
|
removing the 1.14 'compile' script but never checking for it.
|
||||||
|
|
||||||
|
Version 1.7.0beta21 [November 2, 2013]
|
||||||
|
Added ARMv8 support (James Yu <james.yu at linaro.org>). Added file
|
||||||
|
arm/filter_neon_intrinsics.c; enable with -mfpu=neon.
|
||||||
|
Revised pngvalid to generate size images with as many filters as it can
|
||||||
|
manage, limited by the number of rows.
|
||||||
|
Cleaned up ARM NEON compilation handling. The tests are now in pngpriv.h
|
||||||
|
and detect the broken GCC compilers.
|
||||||
|
Allow clang derived from older GCC versions to use ARM intrinsics. This
|
||||||
|
causes all clang builds that use -mfpu=neon to use the intrinsics code,
|
||||||
|
not the assembler code. This has only been tested on iOS 7. It may be
|
||||||
|
necessary to exclude some earlier clang versions but this seems unlikely.
|
||||||
|
Changed NEON implementation selection mechanism. This allows assembler
|
||||||
|
or intrinsics to be turned on at compile time during the build by defining
|
||||||
|
PNG_ARM_NEON_IMPLEMENTATION to the correct value (2 or 1). This macro
|
||||||
|
is undefined by default and the build type is selected in pngpriv.h.
|
||||||
|
|
||||||
|
Version 1.7.0beta22 [November 7, 2013]
|
||||||
|
Fixed #include in filter_neon_intrinsics.c and ctype macros. The ctype char
|
||||||
|
checking macros take an unsigned char argument, not a signed char.
|
||||||
|
|
||||||
|
Version 1.7.0beta23 [November 24, 2013]
|
||||||
|
Changed #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED in pngpread.c to
|
||||||
|
#ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED to be consistent with
|
||||||
|
what is in pngpriv.h.
|
||||||
|
Moved prototype for png_handle_unknown() in pngpriv.h outside of
|
||||||
|
the #ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED/#endif block.
|
||||||
|
Added "-Wall" to CFLAGS in contrib/pngminim/*/makefile
|
||||||
|
Conditionally compile some unused functions reported by -Wall in
|
||||||
|
pngminim.
|
||||||
|
Fixed 'minimal' builds. Various obviously useful minimal configurations
|
||||||
|
don't build because of missing contrib/libtests test programs and
|
||||||
|
overly complex dependencies in scripts/pnglibconf.dfa. This change
|
||||||
|
adds contrib/conftest/*.dfa files that can be used in automatic build
|
||||||
|
scripts to ensure that these configurations continue to build.
|
||||||
|
Enabled WRITE_INVERT and WRITE_PACK in contrib/pngminim/encoder.
|
||||||
|
Fixed pngvalid 'fail' function declaration on the Intel C Compiler.
|
||||||
|
This reverts to the previous 'static' implementation and works round
|
||||||
|
the 'unused static function' warning by using PNG_UNUSED().
|
||||||
|
|
||||||
|
Version 1.7.0beta24 [December 15, 2013]
|
||||||
|
Removed or marked PNG_UNUSED some harmless "dead assignments" reported
|
||||||
|
by clang scan-build.
|
||||||
|
Changed tabs to 3 spaces in png_debug macros and changed '"%s"m'
|
||||||
|
to '"%s" m' to improve portability among compilers.
|
||||||
|
Changed png_free_default() to free() in pngtest.c
|
||||||
|
Tidied up pngfix inits and fixed pngtest no-write builds.
|
||||||
|
Bookkeeping: Moved functions around (no changes). Moved transform
|
||||||
|
function definitions before the place where they are called so that
|
||||||
|
they can be made static. Move the intrapixel functions and the
|
||||||
|
grayscale palette builder out of the png?tran.c files. The latter
|
||||||
|
isn't a transform function and is no longer used internally, and the
|
||||||
|
former MNG specific functions are better placed in pngread/pngwrite.c
|
||||||
|
Made transform implementation functions static. This makes the internal
|
||||||
|
functions called by png_do_{read|write}_transformations static. On an
|
||||||
|
x86-64 DLL build (Gentoo Linux) this reduces the size of the text
|
||||||
|
segment of the DLL by 1208 bytes, about 0.6%. It also simplifies
|
||||||
|
maintenance by removing the declarations from pngpriv.h and allowing
|
||||||
|
easier changes to the internal interfaces.
|
||||||
|
Handle zero-length PLTE chunk or NULL palette with png_error()
|
||||||
|
instead of png_chunk_report(), which by default issues a warning
|
||||||
|
rather than an error, leading to later reading from a NULL pointer
|
||||||
|
(png_ptr->palette) in png_do_expand_palette(). This is CVE-2013-6954
|
||||||
|
and VU#650142. Libpng-1.6.1 through 1.6.7 and libpng-1.7.0beta03
|
||||||
|
through 1.7.0beta23 are vulnerable. Libpng-1.6.0 and earlier do not
|
||||||
|
have the bug.
|
||||||
|
|
||||||
|
Version 1.7.0beta25 [December 26, 2013]
|
||||||
|
Merged files with version 1.6.8 that have not changed since then.
|
||||||
|
Rebuilt configure scripts with automake-1.14.1 and autoconf-2.69
|
||||||
|
|
||||||
|
Version 1.7.0beta26 [January 1, 2014]
|
||||||
|
Added libpng 1.5 checks to pngvalid.c
|
||||||
|
Merged with 1.5 and 1.6 changes to create a single pngvalid.c
|
||||||
|
Added dSIG to chunk list in png.h
|
||||||
|
Removed #error macro from contrib/tools/pngfix.c (Thomas Klausner).
|
||||||
|
Merged pngrio.c, pngtrans.c, and pngwio.c with libpng-1.6.9
|
||||||
|
Fixed test programs for interlace options. Made pngvalid.c and
|
||||||
|
pngtest.c work correctly when READ_INTERLACING and/or WRITE_INTERLACING
|
||||||
|
are switched off.
|
||||||
|
Changed pngvalid.c to support libpng 1.5, which does not support
|
||||||
|
the PNG_MAXIMUM_INFLATE_WINDOW option, so #define it out when
|
||||||
|
appropriate in pngvalid.c
|
||||||
|
Allow unversioned links created on install to be disabled in configure.
|
||||||
|
In configure builds 'make install' changes/adds links like png.h
|
||||||
|
and libpng.a to point to the newly installed, versioned, files (e.g.
|
||||||
|
libpng17/png.h and libpng17.a). Three new configure options and some
|
||||||
|
rearrangement of Makefile.am allow creation of these links to be disabled.
|
||||||
|
|
||||||
|
Version 1.7.0beta27 [January 10, 2014]
|
||||||
|
Removed potentially misleading warning from png_check_IHDR().
|
||||||
|
|
||||||
|
Version 1.7.0beta28 [January 20, 2014]
|
||||||
|
Updated scripts/makefile.* to use CPPFLAGS (Cosmin).
|
||||||
|
Added clang attribute support (Cosmin).
|
||||||
|
|
||||||
|
Version 1.7.0beta29 [January 30, 2014]
|
||||||
|
Quiet an uninitialized memory warning from VS2013 in png_get_png().
|
||||||
|
|
||||||
|
Version 1.7.0beta30 [February 2, 2014]
|
||||||
|
Fixed a large number of instances where PNGCBAPI was omitted from
|
||||||
|
function definitions.
|
||||||
|
Added pngimage test program for png_read_png and png_write_png. This
|
||||||
|
is a work-in-progress; no tests are run automatically at present and
|
||||||
|
the program by virtue of exhaustively testing all the transforms is
|
||||||
|
very slow.
|
||||||
|
|
||||||
|
Version 1.7.0beta31 [February 6, 2014]
|
||||||
|
Make png_read_png() and png_write_png() prototypes in png.h depend
|
||||||
|
upon PNG_READ_SUPPORTED and PNG_WRITE_SUPPORTED.
|
||||||
|
Removed dependence on !PNG_READ_EXPAND_SUPPORTED for calling
|
||||||
|
png_set_packing() in png_read_png().
|
||||||
|
Completed full working pngimage test program and added two test scripts.
|
||||||
|
Fixed combination of ~alpha with shift. On read invert alpha, processing
|
||||||
|
occurred after shift processing, which causes the final values to be
|
||||||
|
outside the range that should be produced by the shift. Reversing the
|
||||||
|
order on read makes the two transforms work together correctly and mirrors
|
||||||
|
the order used on write.
|
||||||
|
Do not read invalid sBIT chunks. Previously libpng only checked sBIT
|
||||||
|
values on write, so a malicious PNG writer could therefore cause
|
||||||
|
the read code to return an invalid sBIT chunk, which might lead to
|
||||||
|
application errors or crashes. Such chunks are now skipped (with
|
||||||
|
chunk_benign_error).
|
||||||
|
Restored a line, "c = b;", that was inadvertently deleted from the
|
||||||
|
PAETH filtering code from libpng-1.7.0beta24/pngrutil.c. Deleted
|
||||||
|
the other instance of "c = b;" which is the one that triggered a
|
||||||
|
scan-build warning.
|
||||||
|
Support builds with unsupported PNG_TRANSFORM_* values. All of the
|
||||||
|
PNG_TRANSFORM_* values are always defined in png.h and, because they
|
||||||
|
are used for both read and write in some cases, it is not reliable
|
||||||
|
to #if out ones that are totally unsupported. This change adds error
|
||||||
|
detection in png_read_image() and png_write_image() to do a
|
||||||
|
png_app_error() if the app requests something that cannot be done
|
||||||
|
and it adds corresponding code to pngimage.c to handle such options
|
||||||
|
by not attempting to test them.
|
||||||
|
|
||||||
|
Version 1.7.0beta32 [February 26, 2014]
|
||||||
|
Moved redefines of png_error(), png_warning(), png_chunk_error(),
|
||||||
|
and png_chunk_warning() from pngpriv.h to png.h to make them visible
|
||||||
|
to libpng-calling applications.
|
||||||
|
Moved OS dependent code from arm/arm_init.c, to allow the included
|
||||||
|
implementation of the ARM NEON discovery function to be set at
|
||||||
|
build-time and provide sample implementations from the current code in the
|
||||||
|
contrib/arm-neon subdirectory. The __linux__ code has also been changed to
|
||||||
|
compile and link on Android by using /proc/cpuinfo, and the old linux code
|
||||||
|
is in contrib/arm-neon/linux-auxv.c. The new code avoids POSIX and Linux
|
||||||
|
dependencies apart from opening /proc/cpuinfo and is C90 compliant.
|
||||||
|
Check for info_ptr == NULL early in png_read_end() so we don't need to
|
||||||
|
run all the png_handle_*() and depend on them to return if info_ptr == NULL.
|
||||||
|
This improves the performance of png_read_end(png_ptr, NULL) and makes
|
||||||
|
it more robust against future programming errors.
|
||||||
|
Check for __has_extension before using it in pngconf.h, to
|
||||||
|
support older Clang versions (Jeremy Sequoia).
|
||||||
|
Use a user warning handler in contrib/gregbook/readpng2.c instead of default,
|
||||||
|
so warnings will be put on stderr even if libpng has CONSOLE_IO disabled.
|
||||||
|
Added png_ptr->process_mode = PNG_READ_IDAT_MODE in png_push_read_chunk
|
||||||
|
after recognizing the IDAT chunk, which avoids an infinite loop while
|
||||||
|
reading a datastream whose first IDAT chunk is of zero-length.
|
||||||
|
This fixes CERT VU#684412 and CVE-2014-0333.
|
||||||
|
Don't recognize known sRGB profiles as sRGB if they have been hacked,
|
||||||
|
but don't reject them and don't issue a copyright violation warning.
|
||||||
|
Minor editing of contrib/arm-neon/README and contrib/examples/*.c
|
||||||
|
Moved some documentation from png.h to libpng.3 and libpng-manual.txt
|
||||||
|
|
||||||
|
Version 1.7.0beta33 [February 27, 2014]
|
||||||
|
Fixed typos in the manual and in scripts/pnglibconf.dfa (CFLAGS -> CPPFLAGS
|
||||||
|
and PNG_USR_CONFIG -> PNG_USER_CONFIG).
|
||||||
|
|
||||||
|
Version 1.7.0beta34 [March 17, 2014]
|
||||||
|
Treat CRC error handling with png_set_crc_action(), instead of with
|
||||||
|
png_set_benign_errors(), which has been the case since libpng-1.6.0beta18.
|
||||||
|
Use "if (value != 0)" instead of "if (value)" consistently.
|
||||||
|
Changed ZlibSrcDir from 1.2.5 to 1.2.8 in projects/vstudio.
|
||||||
|
Moved configuration information from the manual to the INSTALL file.
|
||||||
|
|
||||||
|
Version 1.7.0beta35 [August 6, 2014]
|
||||||
|
Removed #if/#else/#endif from inside two pow() calls in pngvalid.c because
|
||||||
|
they were handled improperly by Portland Group's PGI-14.1 - PGI-14.3
|
||||||
|
when using its "__builtin_pow()" function.
|
||||||
|
Silence 'unused parameter' build warnings (Cosmin).
|
||||||
|
$(CP) is now used alongside $(RM_F). Also, use 'copy' instead
|
||||||
|
of 'cp' where applicable, and applied other minor makefile changes.
|
||||||
|
Don't warn about invalid dimensions exceeding user limits.
|
||||||
|
Allow an easy replacement of the default pre-built configuration
|
||||||
|
header with a custom header, via the make PNGLIBCONF_H_PREBUILT
|
||||||
|
macro.
|
||||||
|
Fixed a typo in pngrutil.c, introduced in libpng-1.5.6, that interferes
|
||||||
|
with "blocky" expansion of sub-8-bit interlaced PNG files (Eric Huss).
|
||||||
|
Removed scripts/makefile.elf. It has not worked since libpng-1.5.0beta14
|
||||||
|
due to elimination of the PNG_FUNCTION_EXPORT and PNG_DATA_EXPORT
|
||||||
|
definitions from pngconf.h.
|
||||||
|
Ensure that CMakeLists.txt makes the target "lib" directory before making
|
||||||
|
symbolic link into it (SourceForge bug report #226 by Rolf Timmermans).
|
||||||
|
Added opinion that the ECCN (Export Control Classification Number) for
|
||||||
|
libpng is EAR99 to the README file.
|
||||||
|
|
||||||
|
Version 1.7.0beta36 [September 27, 2014]
|
||||||
|
Updated scripts/makefiles from libpng-1.6.13beta04.
|
||||||
|
Minor updates to the manual from libpng-1.6.14beta04.
|
||||||
|
Fixed incorrect handling of the iTXt compression flag in pngrutil.c
|
||||||
|
(bug report by Shunsaku Hirata). Bug was introduced in libpng-1.6.0.
|
||||||
|
|
||||||
|
Version 1.7.0beta37 [September 28, 2014]
|
||||||
|
Merged scripts/*, pngvalid.c and pngfix.c with libpng-1.6.14beta04.
|
||||||
|
|
||||||
|
Version 1.7.0beta38 [October 17, 2014]
|
||||||
|
Added "option READ_iCCP enables READ_COMPRESSED_TEXT" to pnglibconf.dfa
|
||||||
|
Removed unused "text_len" parameter from private function png_write_zTXt().
|
||||||
|
Conditionally compile some code in png_deflate_claim(), when
|
||||||
|
PNG_WARNINGS_SUPPORTED and PNG_ERROR_TEXT_SUPPORTED are disabled.
|
||||||
|
Replaced repeated code in pngpread.c with PNG_PUSH_SAVE_BUFFER_IF_FULL.
|
||||||
|
Added "chunk iTXt enables TEXT" and "chunk zTXt enables TEXT"
|
||||||
|
to pnglibconf.dfa.
|
||||||
|
Removed "option READ_COMPRESSED_TEXT enables READ_TEXT" from pnglibconf.dfa,
|
||||||
|
to make it possible to configure a libpng that supports iCCP but not TEXT.
|
||||||
|
Removed "option WRITE_COMPRESSED_TEXT enables WRITE_TEXT" from pnglibconf.dfa
|
||||||
|
Only mark text chunks as written after successfully writing them.
|
||||||
|
|
||||||
|
Version 1.7.0beta39 [November 1, 2014]
|
||||||
|
Ported cosmetic changes from libpng-1.6.15beta02.
|
||||||
|
|
||||||
|
Version 1.7.0beta40 [November 6, 2014]
|
||||||
|
Made a one-line revision to configure.ac to support ARM on aarch64
|
||||||
|
(bug report by Marcin Juszkiewicz, fix by John Bowler).
|
||||||
|
Use png_get_libpng_ver(NULL) instead of PNG_LIBPNG_VER_STRING in
|
||||||
|
example.c, pngtest.c, and applications in the contrib directory.
|
||||||
|
Avoid out-of-bounds memory access in png_user_version_check().
|
||||||
|
Simplified and future-proofed png_user_version_check().
|
||||||
|
Fixed GCC unsigned int->float warnings. Various versions of GCC
|
||||||
|
seem to generate warnings when an unsigned value is implicitly
|
||||||
|
converted to double. This is probably a GCC bug but this change
|
||||||
|
avoids the issue by explicitly converting to (int) where safe.
|
||||||
|
Free all allocated memory in pngimage. The file buffer cache was left
|
||||||
|
allocated at the end of the program, harmless but it causes memory
|
||||||
|
leak reports from clang.
|
||||||
|
Fixed array size calculations to avoid warnings. At various points
|
||||||
|
in the code the number of elements in an array is calculated using
|
||||||
|
sizeof. This generates a compile time constant of type (size_t) which
|
||||||
|
is then typically assigned to an (unsigned int) or (int). Some versions
|
||||||
|
of GCC on 64-bit systems warn about the apparent narrowing, even though
|
||||||
|
the same compiler does apparently generate the correct, in-range,
|
||||||
|
numeric constant. This adds appropriate, safe, casts to make the
|
||||||
|
warnings go away.
|
||||||
|
|
||||||
|
Version 1.7.0beta41 [November 7, 2014]
|
||||||
|
Added #ifdef PNG_16BIT_SUPPORTED/#endif around png_log16bit() and
|
||||||
|
png_do_swap().
|
||||||
|
Changed all "#endif /* PNG_FEATURE_SUPPORTED */" to "#endif /* FEATURE */"
|
||||||
|
|
||||||
|
Version 1.7.0beta42 [November 20, 2014]
|
||||||
|
The macros passed in the command line to Borland make were ignored if
|
||||||
|
similarly-named macros were already defined in makefiles. This behavior
|
||||||
|
is different from POSIX make and other make programs. Surround the
|
||||||
|
macro definitions with ifndef guards (Cosmin).
|
||||||
|
Added "-D_CRT_SECURE_NO_WARNINGS" to CFLAGS in scripts/makefile.vcwin32.
|
||||||
|
Removed the obsolete $ARCH variable from scripts/makefile.darwin.
|
||||||
|
Merged clang no-warning fix from libpng-1.6.13: png_digit was defined
|
||||||
|
but never used in pngerror.c.
|
||||||
|
|
||||||
|
Version 1.7.0beta43 [December 18, 2014]
|
||||||
|
Added ".align 2" to arm/filter_neon.S to support old GAS assemblers that
|
||||||
|
don't do alignment correctly.
|
||||||
|
Revised Makefile.am and scripts/*.dfn to work with MinGW/MSYS;
|
||||||
|
renamed scripts/*.dfn to scripts/*.c (Bob Friesenhahn and John Bowler).
|
||||||
|
Quiet a "comparison always true" warning in pngstest.c (John Bowler).
|
||||||
|
|
||||||
|
Version 1.7.0beta44 [December 23, 2014]
|
||||||
|
Restored a test on width that was removed from png.c at libpng-1.6.9
|
||||||
|
(Bug report by Alex Eubanks, CVE-2015-0973).
|
||||||
|
Fixed an overflow in png_combine_row() with very wide interlaced images
|
||||||
|
(Bug report and fix by John Bowler, CVE-2014-9495).
|
||||||
|
Corrected the width limit calculation in png_check_IHDR().
|
||||||
|
Removed extraneous handling of PNG_SAFE_LIMITS_SUPPORTED from pngconf.h
|
||||||
|
|
||||||
|
Version 1.7.0beta45 [December 28, 2014]
|
||||||
|
Eliminated the PNG_SAFE_LIMITS macro and restored the 1-million-column
|
||||||
|
and 1-million-row default limits in pnglibconf.dfa, that can be reset
|
||||||
|
by the user at build time or run time. This provides a more robust
|
||||||
|
defense against DOS and as-yet undiscovered overflows.
|
||||||
|
Removed user limits from pngfix. Also pass NULL pointers to
|
||||||
|
png_read_row to skip the unnecessary row de-interlace stuff.
|
||||||
|
Added testing of png_set_packing() to pngvalid.c
|
||||||
|
|
||||||
|
Version 1.7.0beta46 [January 2, 2015]
|
||||||
|
Regenerated configure scripts in the tar distributions with libtool-2.4.4
|
||||||
|
Implement previously untested cases of libpng transforms in pngvalid.c
|
||||||
|
Fixed byte order in 2-byte filler, in png_do_read_filler().
|
||||||
|
Allow user to call png_get_IHDR() with NULL arguments (Reuben Hawkins).
|
||||||
|
|
||||||
|
Version 1.7.0beta47 [January 29, 2015]
|
||||||
|
Made the check for out-of-range values in png_set_tRNS() detect
|
||||||
|
values that are exactly 2^bit_depth, and work on 16-bit platforms.
|
||||||
|
Added PNG_SKIP_sRGB_CHECK_PROFILE choice for png_set_option().
|
||||||
|
Report all IHDR errors before exiting png_check_IHDR().
|
||||||
|
Merged some parts of libpng-1.6.17beta01 and libpng-1.7.0beta47.
|
||||||
|
Added #ifndef __COVERITY__ where needed in png.c, pngrutil.c and
|
||||||
|
pngset.c to avoid warnings about dead code.
|
||||||
|
|
||||||
|
Version 1.7.0beta48 [February 7, 2015]
|
||||||
|
Work around one more Coverity-scan dead-code warning.
|
||||||
|
Do not build png_product2() when it is unused.
|
||||||
|
|
||||||
|
Version 1.7.0beta49 [February 11, 2015]
|
||||||
|
Combined sub_row, up_row, avg_row, and paeth_row buffers into a
|
||||||
|
single try_row buffer.
|
||||||
|
Added PNG_WRITE_CUSTOMIZE_COMPRESSION_SUPPORTED macro, on by default.
|
||||||
|
Consolidated redundant code in pngwutil.c
|
||||||
|
Deal with integer overflow of sum in pngwutil.c
|
||||||
|
|
||||||
|
Version 1.7.0beta50 [February 15, 2015]
|
||||||
|
Combined sub_row, up_row, avg_row, and paeth_row buffers into a
|
||||||
|
single try_row buffer and in cases where two or more of those are
|
||||||
|
being tested, a second tst_row buffer. This improves CPU speed
|
||||||
|
over that achieved by libpng-1.7.0beta49.
|
||||||
|
|
||||||
|
Version 1.7.0beta51 [February 17, 2015]
|
||||||
|
Combined similar parts of png_write_find_filter() into a png_increase_lmins()
|
||||||
|
function.
|
||||||
|
Display user limits in the output from pngtest.
|
||||||
|
Replaced test for harmless integer overflow (wraparound) in pngwutil.c
|
||||||
|
with a method that prevents overflow and does not increase cpu usage
|
||||||
|
significantly.
|
||||||
|
|
||||||
|
Version 1.7.0beta52 [February 21, 2015]
|
||||||
|
Added information about setjmp/simplified API interaction in the
|
||||||
|
manual page and INSTALL file. Added information about using
|
||||||
|
row_pointers with a single height*width*bpp allocated block
|
||||||
|
Rebuilt configure scripts with automake-1.15 and libtool-2.4.6
|
||||||
|
|
||||||
|
Version 1.7.0beta53 [February 23, 2015]
|
||||||
|
Restored compiling of png_reciprocal2 with PNG_NO_16BIT.
|
||||||
|
|
||||||
|
Version 1.7.0beta54 [March 4, 2015]
|
||||||
|
Moved png_set_filter() prototype into a PNG_WRITE_SUPPORTED block
|
||||||
|
of png.h.
|
||||||
|
Conditionally compile a small amount of code in pngwutil.c
|
||||||
|
Avoid runtime checks when converting integer to png_byte with
|
||||||
|
Visual Studio (Sergey Kosarevsky)
|
||||||
|
Merged pngwrite.c with libpng-1.6.17beta06/pngwrite.c
|
||||||
|
|
||||||
|
Version 1.7.0beta55 [March 9, 2015]
|
||||||
|
Removed some comments that the configure script did not handle
|
||||||
|
properly from scripts/pnglibconf.dfa and pnglibconf.h.prebuilt.
|
||||||
|
Spelling fixes ("then", "occured") reported by Lauri Nurmi.
|
||||||
|
Added more error reporting in png_default_read_data().
|
||||||
|
Merged png_free_data() with libpng-1.6.17rc02.
|
||||||
|
|
||||||
|
Version 1.7.0beta56 [March 11, 2015]
|
||||||
|
Updated CMakeLists.txt to add OSX framework, change YES/NO to ON/OFF
|
||||||
|
for consistency, and remove some useless tests (Alexey Petruchik).
|
||||||
|
|
||||||
|
Version 1.7.0beta57 [March 16, 2015]
|
||||||
|
Remove pnglibconf.h, pnglibconf.c, and pnglibconf.out instead of
|
||||||
|
pnglibconf.* in "make clean" (Cosmin).
|
||||||
|
Fix bug in calculation of maxbits, in png_write_sBIT, introduced
|
||||||
|
in libpng-1.6.17beta01 (John Bowler).
|
||||||
|
Revert change to png_default_read_data() made in libpng-1.7.0beta55.
|
||||||
|
|
||||||
|
Version 1.7.0beta58 [March 25, 2015]
|
||||||
|
Implemented affirm() support and usage.
|
||||||
|
Remove pnglibconf.dfn and pnglibconf.pre with "make clean".
|
||||||
|
Added byte, short and other overflow checking
|
||||||
|
Added 'affirm' based overflow checking for debug builds for char
|
||||||
|
and short assignments. Simply ignore the error in release builds
|
||||||
|
(a truncated value will be used without warning). Controlled by
|
||||||
|
PNG_RANGE_CHECK_SUPPORTED.
|
||||||
|
Improved some overflow handling. PNG_RELEASE_BUILD replaces tests
|
||||||
|
where the code depended on the build base type and can be defined on
|
||||||
|
the command line, allowing testing in beta builds. Overflows previously
|
||||||
|
handled by png_warning in png.c have been changed to use new
|
||||||
|
macros/affirm functions so that beta builds will abort on overflow and
|
||||||
|
release builds will quietly ignore it. This avoids release builds
|
||||||
|
producing warnings that are of no use to end users.
|
||||||
|
Check (png_uint_16) casts for overflow. Also removed png_muldiv_warn,
|
||||||
|
added RELEASE/!RELEASE convenience macros. png_muldiv_warn was used in
|
||||||
|
only one place, and the overflow condition is a genuine warning not
|
||||||
|
an internal error. Four macros allow code or function parameters to be
|
||||||
|
condition on RELEASE (or not) builds and tidy up the #ifdef handling of
|
||||||
|
functions.
|
||||||
|
|
||||||
|
Version 1.7.0beta59 [April 19, 2015]
|
||||||
|
Transformed rewrite: changed row_info, added checks. This introduces an
|
||||||
|
internal struct (png_transform_control) to replace row_info and uses
|
||||||
|
that to implement affirms correctly. The change also adds checks on
|
||||||
|
the rowbytes calculation and additional checks on most transform
|
||||||
|
implementations.
|
||||||
|
Added png_uint_16 range checking, pngvalid tRNS, fixed png_uint_16:
|
||||||
|
review of previous checks, removal of some where SAFE. pngvalid: add
|
||||||
|
testing of tRNS for better code coverage pngvalid: correct rgb-to-gray
|
||||||
|
error calculations. Code coverage is still incomplete: see /*UNTESTED*/
|
||||||
|
in pngrtran.c. This fixes some arithmetic errors that caused some tests
|
||||||
|
to fail on some 32-bit platforms (Bug reports by Peter Breitenlohner [i686]
|
||||||
|
and Petr Gajdos [i586]).
|
||||||
|
Suppressed some warnings from the Borland C++ 5.5.1/5.82 compiler
|
||||||
|
(Bug report by Viktor Szaka'ts).
|
||||||
|
|
||||||
|
Version 1.7.0beta60 [May 6, 2015]
|
||||||
|
Replaced "unexpected" with an integer (0xabadca11) in pngset.c
|
||||||
|
where a long was expected, to avoid a compiler warning when PNG_DEBUG > 1.
|
||||||
|
|
||||||
|
Version 1.7.0beta61 [May 31, 2015]
|
||||||
|
Avoid Coverity issue 80858 (REVERSE NULL) in pngtest.c
|
||||||
|
Avoid a harmless potential integer overflow in png_XYZ_from_xy() (Bug
|
||||||
|
report from Christopher Ferris).
|
||||||
|
Changed png_voidcast(), etc., to voidcast(), etc., in contrib/tools/pngfix.c
|
||||||
|
to avoid confusion with the libpng private macros.
|
||||||
|
Fixed old cut&paste bug in the weighted filter selection code in
|
||||||
|
pngwutil.c, introduced in libpng-0.95, March 1997.
|
||||||
|
|
||||||
|
Version 1.7.0beta62 [June 1, 2015]
|
||||||
|
Removed the experimental WRITE_WEIGHTED_FILTERED code, to save a few
|
||||||
|
kbytes of the compiled library size. It never worked properly and as
|
||||||
|
far as we can tell, no one uses it. The png_set_filter_heuristics() and
|
||||||
|
png_set_filter_heuristics_fixed() APIs are retained but deprecated.
|
||||||
|
|
||||||
|
Version 1.7.0beta63 [June 6, 2015]
|
||||||
|
Quieted some Coverity issues in pngfix.c, png-fix-itxt.c, pngvalid.c,
|
||||||
|
pngstest.c, and pngimage.c. Most seem harmless, but png-fix-itxt
|
||||||
|
would only work with iTXt chunks with length 255 or less.
|
||||||
|
Fixed cexcept.h in which GCC 5 reported that one of the auto
|
||||||
|
variables in the Try macro needs to be volatile to prevent value
|
||||||
|
being lost over the setjmp, and fixed g++ build breaks (John Bowler).
|
||||||
|
Moved READ_GAMMA to pngrtran.c. This makes everything in pngrtrans.c
|
||||||
|
depend on READ_TRANSFORMS and moves all the transform gamma (READ_GAMMA)
|
||||||
|
code from elsewhere to png_tran.c. There are no code changes.
|
||||||
|
There is one remaining use of the gamma (16-bit) code in the simplified
|
||||||
|
API in pngread.c but that is because of a long-standing libpng bug,
|
||||||
|
namely that the gamma corrected palette is no produced by
|
||||||
|
png_read_update_info (John Bowler).
|
||||||
|
Completed AArch64 support. The previous change to recognize __ARM_NEON
|
||||||
|
didn't touch all the required preprocessor lines. This change removes
|
||||||
|
support for __ARM_NEON__ completely and makes this consistent.
|
||||||
|
Added #ifdef's to contrib/examples programs so people don't try
|
||||||
|
to compile them without the minimum required support enabled
|
||||||
|
(suggested by Flavio Medeiros).
|
||||||
|
|
||||||
|
Version 1.7.0beta64 [July 26, 2015]
|
||||||
|
Removed non-working progressive reader 'skip' function. This
|
||||||
|
function has apparently never been used. It was implemented
|
||||||
|
to support back-door modification of png_struct in libpng-1.4.x
|
||||||
|
but (because it does nothing and cannot do anything) was apparently
|
||||||
|
never tested (John Bowler).
|
||||||
|
Eliminated the final two Coverity defects (insecure temporary file
|
||||||
|
handling in contrib/libtests/pngstest.c; possible overflow of
|
||||||
|
unsigned char in contrib/tools/png-fix-itxt.c). To use the "secure"
|
||||||
|
file handling, define PNG_USE_MKSTEMP, otherwise "tmpfile()" will
|
||||||
|
be used.
|
||||||
|
Removed some unused WEIGHTED_FILTER macros from png.h and pngstruct.h
|
||||||
|
Rearranged png.h to put the major sections in the same order as
|
||||||
|
in libpng16.
|
||||||
|
Belatedly added Mans Rullgard and James Yu to the list of Contributing
|
||||||
|
Authors.
|
||||||
|
|
||||||
|
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
|
||||||
(subscription required; visit
|
(subscription required; visit
|
||||||
https://lists.sourceforge.net/lists/listinfo/png-mng-implement
|
https://lists.sourceforge.net/lists/listinfo/png-mng-implement
|
||||||
to subscribe) or to glennrp at users.sourceforge.net
|
to subscribe)
|
||||||
|
or to glennrp at users.sourceforge.net
|
||||||
|
|
||||||
Glenn R-P
|
Glenn R-P
|
||||||
|
|||||||
229
CMakeLists.txt
@@ -1,6 +1,6 @@
|
|||||||
# CMakeLists.txt
|
# CMakeLists.txt
|
||||||
|
|
||||||
# Copyright (C) 2007-2011 Glenn Randers-Pehrson
|
# Copyright (C) 2007-2015 Glenn Randers-Pehrson
|
||||||
|
|
||||||
# This code is released under the libpng license.
|
# This code is released under the libpng license.
|
||||||
# For conditions of distribution and use, see the disclaimer
|
# For conditions of distribution and use, see the disclaimer
|
||||||
@@ -9,33 +9,14 @@
|
|||||||
cmake_minimum_required(VERSION 2.4.4)
|
cmake_minimum_required(VERSION 2.4.4)
|
||||||
set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true)
|
set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true)
|
||||||
|
|
||||||
if(UNIX AND NOT DEFINED CMAKE_BUILD_TYPE)
|
set(CMAKE_CONFIGURATION_TYPES "Release;Debug;MinSizeRel;RelWithDebInfo")
|
||||||
if(CMAKE_MAJOR_VERSION EQUAL 2 AND CMAKE_MINOR_VERSION EQUAL 4)
|
|
||||||
# workaround CMake 2.4.x bug
|
|
||||||
set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING
|
|
||||||
"Choose the type of build, options are:
|
|
||||||
None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used)
|
|
||||||
Debug
|
|
||||||
Release
|
|
||||||
RelWithDebInfo
|
|
||||||
MinSizeRel.")
|
|
||||||
else()
|
|
||||||
set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING
|
|
||||||
"Choose the type of build, options are:
|
|
||||||
None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used)
|
|
||||||
Debug
|
|
||||||
Release
|
|
||||||
RelWithDebInfo
|
|
||||||
MinSizeRel.")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
project(libpng C)
|
project(libpng C)
|
||||||
enable_testing()
|
enable_testing()
|
||||||
|
|
||||||
set(PNGLIB_MAJOR 1)
|
set(PNGLIB_MAJOR 1)
|
||||||
set(PNGLIB_MINOR 5)
|
set(PNGLIB_MINOR 7)
|
||||||
set(PNGLIB_RELEASE 7)
|
set(PNGLIB_RELEASE 0)
|
||||||
set(PNGLIB_NAME libpng${PNGLIB_MAJOR}${PNGLIB_MINOR})
|
set(PNGLIB_NAME libpng${PNGLIB_MAJOR}${PNGLIB_MINOR})
|
||||||
set(PNGLIB_VERSION ${PNGLIB_MAJOR}.${PNGLIB_MINOR}.${PNGLIB_RELEASE})
|
set(PNGLIB_VERSION ${PNGLIB_MAJOR}.${PNGLIB_MINOR}.${PNGLIB_RELEASE})
|
||||||
|
|
||||||
@@ -49,8 +30,7 @@ if(NOT WIN32)
|
|||||||
PATHS /usr/lib /usr/local/lib
|
PATHS /usr/lib /usr/local/lib
|
||||||
)
|
)
|
||||||
if(NOT M_LIBRARY)
|
if(NOT M_LIBRARY)
|
||||||
message(STATUS
|
message(STATUS "math lib 'libm' not found; floating point support disabled")
|
||||||
"math library 'libm' not found - floating point support disabled")
|
|
||||||
endif()
|
endif()
|
||||||
else()
|
else()
|
||||||
# not needed on windows
|
# not needed on windows
|
||||||
@@ -58,22 +38,14 @@ else()
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
# COMMAND LINE OPTIONS
|
# COMMAND LINE OPTIONS
|
||||||
if(DEFINED PNG_SHARED)
|
option(PNG_SHARED "Build shared lib" ON)
|
||||||
option(PNG_SHARED "Build shared lib" ${PNG_SHARED})
|
option(PNG_STATIC "Build static lib" ON)
|
||||||
else()
|
option(PNG_TESTS "Build libpng tests" ON)
|
||||||
option(PNG_SHARED "Build shared lib" ON)
|
|
||||||
endif()
|
|
||||||
if(DEFINED PNG_STATIC)
|
|
||||||
option(PNG_STATIC "Build static lib" ${PNG_STATIC})
|
|
||||||
else()
|
|
||||||
option(PNG_STATIC "Build static lib" ON)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
option(PNG_TESTS "Build libpng tests" YES)
|
|
||||||
|
|
||||||
# Many more configuration options could be added here
|
# Many more configuration options could be added here
|
||||||
option(PNG_DEBUG "Build with debug output" NO)
|
option(PNG_FRAMEWORK "Build OS X framework" OFF)
|
||||||
option(PNGARG "Disable ANSI-C prototypes" NO)
|
option(PNG_DEBUG "Build with debug output" OFF)
|
||||||
|
option(PNGARG "Disable ANSI-C prototypes" OFF)
|
||||||
|
|
||||||
# SET LIBNAME
|
# SET LIBNAME
|
||||||
set(PNG_LIB_NAME png${PNGLIB_MAJOR}${PNGLIB_MINOR})
|
set(PNG_LIB_NAME png${PNGLIB_MAJOR}${PNGLIB_MINOR})
|
||||||
@@ -121,12 +93,13 @@ set(pngtest_sources
|
|||||||
pngtest.c
|
pngtest.c
|
||||||
)
|
)
|
||||||
set(pngvalid_sources
|
set(pngvalid_sources
|
||||||
pngvalid.c
|
contrib/libtests/pngvalid.c
|
||||||
|
)
|
||||||
|
set(pngstest_sources
|
||||||
|
contrib/libtests/pngstest.c
|
||||||
)
|
)
|
||||||
# SOME NEEDED DEFINITIONS
|
# SOME NEEDED DEFINITIONS
|
||||||
|
|
||||||
add_definitions(-DPNG_CONFIGURE_LIBPNG)
|
|
||||||
|
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
|
add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
|
||||||
endif(MSVC)
|
endif(MSVC)
|
||||||
@@ -138,8 +111,11 @@ endif()
|
|||||||
# NOW BUILD OUR TARGET
|
# NOW BUILD OUR TARGET
|
||||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${ZLIB_INCLUDE_DIR})
|
include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${ZLIB_INCLUDE_DIR})
|
||||||
|
|
||||||
|
unset(PNG_LIB_TARGETS)
|
||||||
|
|
||||||
if(PNG_SHARED)
|
if(PNG_SHARED)
|
||||||
add_library(${PNG_LIB_NAME} SHARED ${libpng_sources})
|
add_library(${PNG_LIB_NAME} SHARED ${libpng_sources})
|
||||||
|
set(PNG_LIB_TARGETS ${PNG_LIB_NAME})
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
# msvc does not append 'lib' - do it here to have consistent name
|
# msvc does not append 'lib' - do it here to have consistent name
|
||||||
set_target_properties(${PNG_LIB_NAME} PROPERTIES PREFIX "lib")
|
set_target_properties(${PNG_LIB_NAME} PROPERTIES PREFIX "lib")
|
||||||
@@ -149,9 +125,10 @@ if(PNG_SHARED)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(PNG_STATIC)
|
if(PNG_STATIC)
|
||||||
# does not work without changing name
|
# does not work without changing name
|
||||||
set(PNG_LIB_NAME_STATIC ${PNG_LIB_NAME}_static)
|
set(PNG_LIB_NAME_STATIC ${PNG_LIB_NAME}_static)
|
||||||
add_library(${PNG_LIB_NAME_STATIC} STATIC ${libpng_sources})
|
add_library(${PNG_LIB_NAME_STATIC} STATIC ${libpng_sources})
|
||||||
|
list(APPEND PNG_LIB_TARGETS ${PNG_LIB_NAME_STATIC})
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
# msvc does not append 'lib' - do it here to have consistent name
|
# msvc does not append 'lib' - do it here to have consistent name
|
||||||
set_target_properties(${PNG_LIB_NAME_STATIC} PROPERTIES PREFIX "lib")
|
set_target_properties(${PNG_LIB_NAME_STATIC} PROPERTIES PREFIX "lib")
|
||||||
@@ -159,6 +136,29 @@ if(PNG_STATIC)
|
|||||||
target_link_libraries(${PNG_LIB_NAME_STATIC} ${ZLIB_LIBRARY} ${M_LIBRARY})
|
target_link_libraries(${PNG_LIB_NAME_STATIC} ${ZLIB_LIBRARY} ${M_LIBRARY})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(PNG_FRAMEWORK)
|
||||||
|
set(PNG_LIB_NAME_FRAMEWORK ${PNG_LIB_NAME}_framework)
|
||||||
|
add_library(${PNG_LIB_NAME_FRAMEWORK} SHARED ${libpng_sources})
|
||||||
|
list(APPEND PNG_LIB_TARGETS ${PNG_LIB_NAME_FRAMEWORK})
|
||||||
|
set_target_properties(${PNG_LIB_NAME_FRAMEWORK} PROPERTIES
|
||||||
|
FRAMEWORK TRUE
|
||||||
|
FRAMEWORK_VERSION ${PNGLIB_VERSION}
|
||||||
|
MACOSX_FRAMEWORK_SHORT_VERSION_STRING ${PNGLIB_MAJOR}.${PNGLIB_MINOR}
|
||||||
|
MACOSX_FRAMEWORK_BUNDLE_VERSION ${PNGLIB_VERSION}
|
||||||
|
MACOSX_FRAMEWORK_IDENTIFIER org.libpng.libpng
|
||||||
|
XCODE_ATTRIBUTE_INSTALL_PATH "@rpath"
|
||||||
|
PUBLIC_HEADER "${libpng_public_hdrs}"
|
||||||
|
OUTPUT_NAME png)
|
||||||
|
target_link_libraries(${PNG_LIB_NAME_FRAMEWORK} ${ZLIB_LIBRARY} ${M_LIBRARY})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT PNG_LIB_TARGETS)
|
||||||
|
message(SEND_ERROR
|
||||||
|
"No library variant selected to build. "
|
||||||
|
"Please enable at least one of the following options: "
|
||||||
|
" PNG_STATIC, PNG_SHARED, PNG_FRAMEWORK")
|
||||||
|
endif()
|
||||||
|
|
||||||
if(PNG_SHARED AND WIN32)
|
if(PNG_SHARED AND WIN32)
|
||||||
set_target_properties(${PNG_LIB_NAME} PROPERTIES DEFINE_SYMBOL PNG_BUILD_DLL)
|
set_target_properties(${PNG_LIB_NAME} PROPERTIES DEFINE_SYMBOL PNG_BUILD_DLL)
|
||||||
endif()
|
endif()
|
||||||
@@ -172,15 +172,45 @@ if(PNG_TESTS AND PNG_SHARED)
|
|||||||
add_executable(pngvalid ${pngvalid_sources})
|
add_executable(pngvalid ${pngvalid_sources})
|
||||||
target_link_libraries(pngvalid ${PNG_LIB_NAME})
|
target_link_libraries(pngvalid ${PNG_LIB_NAME})
|
||||||
add_test(pngvalid ./pngvalid)
|
add_test(pngvalid ./pngvalid)
|
||||||
|
add_executable(pngstest ${pngstest_sources})
|
||||||
|
target_link_libraries(pngstest ${PNG_LIB_NAME})
|
||||||
|
add_test(pngstest ./pngstest
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn0g01.png
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn0g02.png
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn0g04.png
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn0g08.png
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn0g16.png
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn2c08.png
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn2c16.png
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn3p01.png
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn3p02.png
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn3p04.png
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn3p08.png
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn4a08.png
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn4a16.png
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn6a08.png
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn6a16.png
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbbn0g01.png
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbbn0g02.png
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbbn0g04.png
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbbn2c16.png
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbbn3p08.png
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbgn2c16.png
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbgn3p08.png
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbrn2c08.png
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbwn0g16.png
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbwn3p08.png
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbyn3p08.png
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftp0n0g08.png
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftp0n2c08.png
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftp0n3p08.png
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftp1n3p08.png
|
||||||
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Ensure the CMAKE_LIBRARY_OUTPUT_DIRECTORY is set
|
# Ensure the CMAKE_LIBRARY_OUTPUT_DIRECTORY is set
|
||||||
IF(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
|
IF(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
|
||||||
IF(WIN32)
|
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY "lib")
|
||||||
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY "bin")
|
|
||||||
ELSE(WIN32)
|
|
||||||
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY "lib")
|
|
||||||
ENDIF(WIN32)
|
|
||||||
ENDIF(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
|
ENDIF(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
|
||||||
|
|
||||||
# Set a variable with CMake code which:
|
# Set a variable with CMake code which:
|
||||||
@@ -188,18 +218,20 @@ ENDIF(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
|
|||||||
# copies if different.
|
# copies if different.
|
||||||
macro(CREATE_SYMLINK SRC_FILE DEST_FILE)
|
macro(CREATE_SYMLINK SRC_FILE DEST_FILE)
|
||||||
FILE(REMOVE ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE})
|
FILE(REMOVE ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE})
|
||||||
if(WIN32 AND NOT CYGWIN AND NOT MINGW)
|
if(WIN32 AND NOT CYGWIN AND NOT MSYS)
|
||||||
ADD_CUSTOM_COMMAND(
|
ADD_CUSTOM_COMMAND(
|
||||||
OUTPUT ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE} ${CMAKE_CURRENT_BINARY_DIR}/${DEST_FILE}
|
OUTPUT ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE} ${CMAKE_CURRENT_BINARY_DIR}/${DEST_FILE}
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/${SRC_FILE} ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE}
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${SRC_FILE}" ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE}
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/${SRC_FILE} ${CMAKE_CURRENT_BINARY_DIR}/${DEST_FILE}
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${SRC_FILE}" ${CMAKE_CURRENT_BINARY_DIR}/${DEST_FILE}
|
||||||
DEPENDS ${PNG_LIB_NAME} ${PNG_LIB_NAME_STATIC}
|
DEPENDS ${PNG_LIB_TARGETS}
|
||||||
)
|
)
|
||||||
ADD_CUSTOM_TARGET(${DEST_FILE}_COPY ALL DEPENDS ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE})
|
ADD_CUSTOM_TARGET(${DEST_FILE}_COPY ALL DEPENDS ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE})
|
||||||
else(WIN32 AND NOT CYGWIN AND NOT MINGW)
|
else(WIN32 AND NOT CYGWIN AND NOT MSYS)
|
||||||
execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink ${SRC_FILE} ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
|
get_filename_component(LINK_TARGET "${SRC_FILE}" NAME)
|
||||||
execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink ${SRC_FILE} ${DEST_FILE} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
|
execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
|
||||||
endif(WIN32 AND NOT CYGWIN AND NOT MINGW)
|
execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink "${LINK_TARGET}" ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
|
||||||
|
execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink "${LINK_TARGET}" ${DEST_FILE} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
|
||||||
|
endif(WIN32 AND NOT CYGWIN AND NOT MSYS)
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
# libpng is a library so default to 'lib'
|
# libpng is a library so default to 'lib'
|
||||||
@@ -212,26 +244,26 @@ endif(NOT DEFINED CMAKE_INSTALL_LIBDIR)
|
|||||||
# Only do this on Windows for Cygwin - the files don't make much sense outside
|
# Only do this on Windows for Cygwin - the files don't make much sense outside
|
||||||
# a UNIX look alike
|
# a UNIX look alike
|
||||||
if(NOT WIN32 OR CYGWIN OR MINGW)
|
if(NOT WIN32 OR CYGWIN OR MINGW)
|
||||||
set(prefix ${CMAKE_INSTALL_PREFIX})
|
set(prefix ${CMAKE_INSTALL_PREFIX})
|
||||||
set(exec_prefix ${CMAKE_INSTALL_PREFIX})
|
set(exec_prefix ${CMAKE_INSTALL_PREFIX})
|
||||||
set(libdir ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR})
|
set(libdir ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR})
|
||||||
set(includedir ${CMAKE_INSTALL_PREFIX}/include)
|
set(includedir ${CMAKE_INSTALL_PREFIX}/include)
|
||||||
set(LIBS "-lz -lm")
|
set(LIBS "-lz -lm")
|
||||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng.pc.in
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng.pc.in
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc @ONLY)
|
${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc @ONLY)
|
||||||
CREATE_SYMLINK(${PNGLIB_NAME}.pc libpng.pc)
|
CREATE_SYMLINK(${PNGLIB_NAME}.pc libpng.pc)
|
||||||
|
|
||||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng-config.in
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng-config.in
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config @ONLY)
|
${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config @ONLY)
|
||||||
CREATE_SYMLINK(${PNGLIB_NAME}-config libpng-config)
|
CREATE_SYMLINK(${PNGLIB_NAME}-config libpng-config)
|
||||||
endif(NOT WIN32 OR CYGWIN OR MINGW)
|
endif(NOT WIN32 OR CYGWIN OR MINGW)
|
||||||
|
|
||||||
# SET UP LINKS
|
# SET UP LINKS
|
||||||
if(PNG_SHARED)
|
if(PNG_SHARED)
|
||||||
set_target_properties(${PNG_LIB_NAME} PROPERTIES
|
set_target_properties(${PNG_LIB_NAME} PROPERTIES
|
||||||
# VERSION 15.${PNGLIB_RELEASE}.1.5.7beta05
|
# VERSION 17.${PNGLIB_RELEASE}.1.7.0beta64
|
||||||
VERSION 15.${PNGLIB_RELEASE}.0
|
VERSION 17.${PNGLIB_RELEASE}.0
|
||||||
SOVERSION 15
|
SOVERSION 17
|
||||||
CLEAN_DIRECT_OUTPUT 1)
|
CLEAN_DIRECT_OUTPUT 1)
|
||||||
endif()
|
endif()
|
||||||
if(PNG_STATIC)
|
if(PNG_STATIC)
|
||||||
@@ -256,40 +288,34 @@ endif()
|
|||||||
|
|
||||||
# INSTALL
|
# INSTALL
|
||||||
if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL )
|
if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL )
|
||||||
if(PNG_SHARED)
|
install(TARGETS ${PNG_LIB_TARGETS}
|
||||||
install(TARGETS ${PNG_LIB_NAME}
|
${PNG_EXPORT_RULE}
|
||||||
${PNG_EXPORT_RULE}
|
RUNTIME DESTINATION bin
|
||||||
RUNTIME DESTINATION bin
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
FRAMEWORK DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
|
|
||||||
# Create a symlink for libpng.dll.a => libpng15.dll.a on Cygwin
|
if(PNG_SHARED)
|
||||||
|
# Create a symlink for libpng.dll.a => libpng17.dll.a on Cygwin
|
||||||
if(CYGWIN OR MINGW)
|
if(CYGWIN OR MINGW)
|
||||||
get_target_property(BUILD_TARGET_LOCATION ${PNG_LIB_NAME} LOCATION_${CMAKE_BUILD_TYPE})
|
get_target_property(BUILD_TARGET_LOCATION ${PNG_LIB_NAME} LOCATION_${CMAKE_BUILD_TYPE})
|
||||||
get_filename_component(BUILD_TARGET_FILE ${BUILD_TARGET_LOCATION} NAME)
|
CREATE_SYMLINK(${BUILD_TARGET_LOCATION} libpng${CMAKE_IMPORT_LIBRARY_SUFFIX})
|
||||||
CREATE_SYMLINK(${BUILD_TARGET_FILE} libpng${CMAKE_IMPORT_LIBRARY_SUFFIX})
|
|
||||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_IMPORT_LIBRARY_SUFFIX}
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_IMPORT_LIBRARY_SUFFIX}
|
||||||
DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
endif(CYGWIN OR MINGW)
|
endif(CYGWIN OR MINGW)
|
||||||
|
|
||||||
if(NOT WIN32)
|
if(NOT WIN32)
|
||||||
get_target_property(BUILD_TARGET_LOCATION ${PNG_LIB_NAME} LOCATION_${CMAKE_BUILD_TYPE})
|
get_target_property(BUILD_TARGET_LOCATION ${PNG_LIB_NAME} LOCATION_${CMAKE_BUILD_TYPE})
|
||||||
get_filename_component(BUILD_TARGET_FILE ${BUILD_TARGET_LOCATION} NAME)
|
CREATE_SYMLINK(${BUILD_TARGET_LOCATION} libpng${CMAKE_SHARED_LIBRARY_SUFFIX})
|
||||||
CREATE_SYMLINK(${BUILD_TARGET_FILE} libpng${CMAKE_SHARED_LIBRARY_SUFFIX})
|
|
||||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_SHARED_LIBRARY_SUFFIX}
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_SHARED_LIBRARY_SUFFIX}
|
||||||
DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
endif(NOT WIN32)
|
endif(NOT WIN32)
|
||||||
endif(PNG_SHARED)
|
endif(PNG_SHARED)
|
||||||
|
|
||||||
if(PNG_STATIC)
|
if(PNG_STATIC)
|
||||||
install(TARGETS ${PNG_LIB_NAME_STATIC}
|
|
||||||
${PNG_EXPORT_RULE}
|
|
||||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
||||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
|
||||||
if(NOT WIN32 OR CYGWIN OR MINGW)
|
if(NOT WIN32 OR CYGWIN OR MINGW)
|
||||||
get_target_property(BUILD_TARGET_LOCATION ${PNG_LIB_NAME_STATIC} LOCATION_${CMAKE_BUILD_TYPE})
|
get_target_property(BUILD_TARGET_LOCATION ${PNG_LIB_NAME_STATIC} LOCATION_${CMAKE_BUILD_TYPE})
|
||||||
get_filename_component(BUILD_TARGET_FILE ${BUILD_TARGET_LOCATION} NAME)
|
CREATE_SYMLINK(${BUILD_TARGET_LOCATION} libpng${CMAKE_STATIC_LIBRARY_SUFFIX})
|
||||||
CREATE_SYMLINK(${BUILD_TARGET_FILE} libpng${CMAKE_STATIC_LIBRARY_SUFFIX})
|
|
||||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_STATIC_LIBRARY_SUFFIX}
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_STATIC_LIBRARY_SUFFIX}
|
||||||
DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
endif(NOT WIN32 OR CYGWIN OR MINGW)
|
endif(NOT WIN32 OR CYGWIN OR MINGW)
|
||||||
@@ -301,10 +327,13 @@ if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL )
|
|||||||
install(FILES ${libpng_public_hdrs} DESTINATION include/${PNGLIB_NAME})
|
install(FILES ${libpng_public_hdrs} DESTINATION include/${PNGLIB_NAME})
|
||||||
endif()
|
endif()
|
||||||
if(NOT SKIP_INSTALL_EXECUTABLES AND NOT SKIP_INSTALL_ALL )
|
if(NOT SKIP_INSTALL_EXECUTABLES AND NOT SKIP_INSTALL_ALL )
|
||||||
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config DESTINATION bin)
|
if(NOT WIN32 OR CYGWIN OR MINGW)
|
||||||
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config
|
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config DESTINATION bin)
|
||||||
DESTINATION bin)
|
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config
|
||||||
|
DESTINATION bin)
|
||||||
|
endif(NOT WIN32 OR CYGWIN OR MINGW)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL )
|
if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL )
|
||||||
# Install man pages
|
# Install man pages
|
||||||
if(NOT PNG_MAN_DIR)
|
if(NOT PNG_MAN_DIR)
|
||||||
@@ -313,14 +342,16 @@ if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL )
|
|||||||
install(FILES libpng.3 libpngpf.3 DESTINATION ${PNG_MAN_DIR}/man3)
|
install(FILES libpng.3 libpngpf.3 DESTINATION ${PNG_MAN_DIR}/man3)
|
||||||
install(FILES png.5 DESTINATION ${PNG_MAN_DIR}/man5)
|
install(FILES png.5 DESTINATION ${PNG_MAN_DIR}/man5)
|
||||||
# Install pkg-config files
|
# Install pkg-config files
|
||||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng.pc
|
if(NOT WIN32 OR CYGWIN OR MINGW)
|
||||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng.pc
|
||||||
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|
||||||
DESTINATION bin)
|
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config
|
||||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc
|
DESTINATION bin)
|
||||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc
|
||||||
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|
||||||
DESTINATION bin)
|
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config
|
||||||
|
DESTINATION bin)
|
||||||
|
endif(NOT WIN32 OR CYGWIN OR MINGW)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# On versions of CMake that support it, create an export file CMake
|
# On versions of CMake that support it, create an export file CMake
|
||||||
@@ -329,7 +360,7 @@ if(PNG_EXPORT_RULE AND NOT SKIP_INSTALL_EXPORT AND NOT SKIP_INSTALL_ALL )
|
|||||||
install(EXPORT libpng DESTINATION lib/libpng FILE lib${PNG_LIB_NAME}.cmake)
|
install(EXPORT libpng DESTINATION lib/libpng FILE lib${PNG_LIB_NAME}.cmake)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# what's with libpng-$VER%.txt and all the extra files?
|
# what's with libpng-manual.txt and all the extra files?
|
||||||
|
|
||||||
# UNINSTALL
|
# UNINSTALL
|
||||||
# do we need this?
|
# do we need this?
|
||||||
|
|||||||
316
INSTALL
@@ -1,32 +1,69 @@
|
|||||||
|
|
||||||
Installing libpng
|
Installing libpng
|
||||||
|
|
||||||
|
Contents
|
||||||
|
|
||||||
|
I. Simple installation
|
||||||
|
II. Rebuilding the configure scripts
|
||||||
|
III. Using scripts/makefile*
|
||||||
|
IV. Using cmake
|
||||||
|
V. Directory structure
|
||||||
|
VI. Building with project files
|
||||||
|
VII. Building with makefiles
|
||||||
|
VIII. Configuring libpng for 16-bit platforms
|
||||||
|
IX. Configuring for DOS
|
||||||
|
X. Configuring for Medium Model
|
||||||
|
XI. Prepending a prefix to exported symbols
|
||||||
|
XII. Configuring for compiler xxx:
|
||||||
|
XIII. Removing unwanted object code
|
||||||
|
XIV. Changes to the build and configuration of libpng in libpng-1.5.x
|
||||||
|
XV. Setjmp/longjmp issues
|
||||||
|
XVI. Other sources of information about libpng
|
||||||
|
|
||||||
|
I. Simple installation
|
||||||
|
|
||||||
On Unix/Linux and similar systems, you can simply type
|
On Unix/Linux and similar systems, you can simply type
|
||||||
|
|
||||||
./configure [--prefix=/path]
|
./configure [--prefix=/path]
|
||||||
make check
|
make check
|
||||||
make install
|
make install
|
||||||
|
|
||||||
and ignore the rest of this document.
|
and ignore the rest of this document. "/path" is the path to the directory
|
||||||
|
where you want to install the libpng "lib", "include", and "bin"
|
||||||
|
subdirectories.
|
||||||
|
|
||||||
If configure does not work on your system and you have a reasonably
|
If you downloaded a GIT clone, you will need to run ./autogen.sh before
|
||||||
up-to-date set of tools, running ./autogen.sh before running ./configure
|
running ./configure, to create "configure" and "Makefile.in" which are
|
||||||
may fix the problem. You can also run the individual commands in
|
not included in the GIT repository.
|
||||||
autogen.sh with the --force option, if supported by your version of
|
|
||||||
the tools. To be really sure that you aren't using any of the included
|
Note that "configure" is only included in the "*.tar" distributions and not
|
||||||
pre-built scripts, you can do this:
|
in the "*.zip" or "*.7z" distributions. If you downloaded one of those
|
||||||
|
distributions, see "Building with project files" or "Building with makefiles",
|
||||||
|
below.
|
||||||
|
|
||||||
|
II. Rebuilding the configure scripts
|
||||||
|
|
||||||
|
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, you can do this:
|
||||||
|
|
||||||
./configure --enable-maintainer-mode
|
./configure --enable-maintainer-mode
|
||||||
make maintainer-clean
|
make maintainer-clean
|
||||||
./autogen.sh
|
./autogen.sh --maintainer --clean
|
||||||
|
./autogen.sh --maintainer
|
||||||
./configure [--prefix=/path] [other options]
|
./configure [--prefix=/path] [other options]
|
||||||
make
|
make
|
||||||
make install
|
make install
|
||||||
make check
|
make check
|
||||||
|
|
||||||
|
III. Using scripts/makefile*
|
||||||
|
|
||||||
Instead, you can use one of the custom-built makefiles in the
|
Instead, you can use one of the custom-built makefiles in the
|
||||||
"scripts" directory
|
"scripts" directory
|
||||||
|
|
||||||
|
cp scripts/pnglibconf.h.prebuilt pnglibconf.h
|
||||||
cp scripts/makefile.system makefile
|
cp scripts/makefile.system makefile
|
||||||
make test
|
make test
|
||||||
make install
|
make install
|
||||||
@@ -38,8 +75,28 @@ Or you can use one of the "projects" in the "projects" directory.
|
|||||||
|
|
||||||
Before installing libpng, you must first install zlib, if it
|
Before installing libpng, you must first install zlib, if it
|
||||||
is not already on your system. zlib can usually be found
|
is not already on your system. zlib can usually be found
|
||||||
wherever you got libpng. zlib can be placed in another directory,
|
wherever you got libpng; otherwise go to http://zlib.net. You can place
|
||||||
at the same level as libpng.
|
zlib in in the same directory as libpng or in another directory.
|
||||||
|
|
||||||
|
If your system already has a preinstalled zlib you will still need
|
||||||
|
to have access to the zlib.h and zconf.h include files that
|
||||||
|
correspond to the version of zlib that's installed.
|
||||||
|
|
||||||
|
If you wish to test with a particular zlib that is not first in the
|
||||||
|
standard library search path, put ZLIBLIB, ZLIBINC, CPPFLAGS, LDFLAGS,
|
||||||
|
and LD_LIBRARY_PATH in your environment before running "make test"
|
||||||
|
or "make distcheck":
|
||||||
|
|
||||||
|
ZLIBLIB=/path/to/lib export ZLIBLIB
|
||||||
|
ZLIBINC=/path/to/include export ZLIBINC
|
||||||
|
CPPFLAGS="-I$ZLIBINC" export CPPFLAGS
|
||||||
|
LDFLAGS="-L$ZLIBLIB" export LDFLAGS
|
||||||
|
LD_LIBRARY_PATH="$ZLIBLIB:$LD_LIBRARY_PATH" export LD_LIBRARY_PATH
|
||||||
|
|
||||||
|
If you are using one of the makefile scripts, put ZLIBLIB and ZLIBINC
|
||||||
|
in your environment and type "make ZLIBLIB=$ZLIBLIB ZLIBINC=$ZLIBINC test".
|
||||||
|
|
||||||
|
IV. Using cmake
|
||||||
|
|
||||||
If you want to use "cmake" (see www.cmake.org), type
|
If you want to use "cmake" (see www.cmake.org), type
|
||||||
|
|
||||||
@@ -47,13 +104,15 @@ If you want to use "cmake" (see www.cmake.org), type
|
|||||||
make
|
make
|
||||||
make install
|
make install
|
||||||
|
|
||||||
If your system already has a preinstalled zlib you will still need
|
As when using the simple configure method described above, "/path" points to
|
||||||
to have access to the zlib.h and zconf.h include files that
|
the installation directory where you want to put the libpng "lib", "include",
|
||||||
correspond to the version of zlib that's installed.
|
and "bin" subdirectories.
|
||||||
|
|
||||||
|
V. Directory structure
|
||||||
|
|
||||||
You can rename the directories that you downloaded (they
|
You can rename the directories that you downloaded (they
|
||||||
might be called "libpng-x.y.z" or "libpngNN" and "zlib-1.2.5"
|
might be called "libpng-x.y.z" or "libpngNN" and "zlib-1.2.8"
|
||||||
or "zlib125") so that you have directories called "zlib" and "libpng".
|
or "zlib128") so that you have directories called "zlib" and "libpng".
|
||||||
|
|
||||||
Your directory structure should look like this:
|
Your directory structure should look like this:
|
||||||
|
|
||||||
@@ -61,8 +120,7 @@ Your directory structure should look like this:
|
|||||||
libpng (this directory)
|
libpng (this directory)
|
||||||
INSTALL (this file)
|
INSTALL (this file)
|
||||||
README
|
README
|
||||||
*.h
|
*.h, *.c => libpng source files
|
||||||
*.c
|
|
||||||
CMakeLists.txt => "cmake" script
|
CMakeLists.txt => "cmake" script
|
||||||
configuration files:
|
configuration files:
|
||||||
configure.ac, configure, Makefile.am, Makefile.in,
|
configure.ac, configure, Makefile.am, Makefile.in,
|
||||||
@@ -70,14 +128,10 @@ Your directory structure should look like this:
|
|||||||
libpng-config.in, aclocal.m4, config.h.in, config.sub,
|
libpng-config.in, aclocal.m4, config.h.in, config.sub,
|
||||||
depcomp, install-sh, mkinstalldirs, test-pngtest.sh
|
depcomp, install-sh, mkinstalldirs, test-pngtest.sh
|
||||||
contrib
|
contrib
|
||||||
gregbook
|
arm-neon, conftest, examples, gregbook, libtests, pngminim,
|
||||||
pngminim
|
pngminus, pngsuite, tools, visupng
|
||||||
pngminus
|
|
||||||
pngsuite
|
|
||||||
visupng
|
|
||||||
projects
|
projects
|
||||||
visualc71
|
cbuilder5, owatcom, visualc71, vstudio, xcode
|
||||||
vstudio
|
|
||||||
scripts
|
scripts
|
||||||
makefile.*
|
makefile.*
|
||||||
*.def (module definition files)
|
*.def (module definition files)
|
||||||
@@ -85,29 +139,31 @@ Your directory structure should look like this:
|
|||||||
pngtest.png
|
pngtest.png
|
||||||
etc.
|
etc.
|
||||||
zlib
|
zlib
|
||||||
README
|
README, *.h, *.c contrib, etc.
|
||||||
*.h
|
|
||||||
*.c
|
|
||||||
contrib
|
|
||||||
etc.
|
|
||||||
|
|
||||||
If the line endings in the files look funny, you may wish to get the other
|
If the line endings in the files look funny, you may wish to get the other
|
||||||
distribution of libpng. It is available in both tar.gz (UNIX style line
|
distribution of libpng. It is available in both tar.gz (UNIX style line
|
||||||
endings) and zip (DOS style line endings) formats.
|
endings) and zip (DOS style line endings) formats.
|
||||||
|
|
||||||
|
VI. Building with project files
|
||||||
|
|
||||||
If you are building libpng with MSVC, you can enter the
|
If you are building libpng with MSVC, you can enter the
|
||||||
libpng projects\visualc6 or visualc71 directory and follow the instructions
|
libpng projects\visualc71 or vstudio directory and follow the instructions
|
||||||
in README.txt.
|
in README.txt.
|
||||||
|
|
||||||
Otherwise enter the zlib directory and follow the instructions in zlib/README,
|
Otherwise enter the zlib directory and follow the instructions in zlib/README,
|
||||||
then come back here and run "configure" or choose the appropriate
|
then come back here and run "configure" or choose the appropriate
|
||||||
makefile.sys in the scripts directory.
|
makefile.sys in the scripts directory.
|
||||||
|
|
||||||
|
VII. Building with makefiles
|
||||||
|
|
||||||
Copy the file (or files) that you need from the
|
Copy the file (or files) that you need from the
|
||||||
scripts directory into this directory, for example
|
scripts directory into this directory, for example
|
||||||
|
|
||||||
MSDOS example: copy scripts\makefile.msc makefile
|
MSDOS example: copy scripts\makefile.msc makefile
|
||||||
UNIX example: cp scripts/makefile.std makefile
|
copy scripts\pnglibconf.h.prebuilt pnglibconf.h
|
||||||
|
UNIX example: cp scripts/makefile.std makefile
|
||||||
|
cp scripts/pnglibconf.h.prebuilt pnglibconf.h
|
||||||
|
|
||||||
Read the makefile to see if you need to change any source or
|
Read the makefile to see if you need to change any source or
|
||||||
target directories to match your preferences.
|
target directories to match your preferences.
|
||||||
@@ -130,6 +186,202 @@ do that, run "make install" in the zlib directory first if necessary).
|
|||||||
Some also allow you to run "make test-installed" after you have
|
Some also allow you to run "make test-installed" after you have
|
||||||
run "make install".
|
run "make install".
|
||||||
|
|
||||||
|
VIII. Configuring libpng for 16-bit platforms
|
||||||
|
|
||||||
|
You will want to look into zconf.h to tell zlib (and thus libpng) that
|
||||||
|
it cannot allocate more than 64K at a time. Even if you can, the memory
|
||||||
|
won't be accessible. So limit zlib and libpng to 64K by defining MAXSEG_64K.
|
||||||
|
|
||||||
|
IX. Configuring for DOS
|
||||||
|
|
||||||
|
For DOS users who only have access to the lower 640K, you will
|
||||||
|
have to limit zlib's memory usage via a png_set_compression_mem_level()
|
||||||
|
call. See zlib.h or zconf.h in the zlib library for more information.
|
||||||
|
|
||||||
|
X. Configuring for Medium Model
|
||||||
|
|
||||||
|
Libpng's support for medium model has been tested on most of the popular
|
||||||
|
compilers. Make sure MAXSEG_64K gets defined, USE_FAR_KEYWORD gets
|
||||||
|
defined, and FAR gets defined to far in pngconf.h, and you should be
|
||||||
|
all set. Everything in the library (except for zlib's structure) is
|
||||||
|
expecting far data. You must use the typedefs with the p or pp on
|
||||||
|
the end for pointers (or at least look at them and be careful). Make
|
||||||
|
note that the rows of data are defined as png_bytepp, which is
|
||||||
|
an "unsigned char far * far *".
|
||||||
|
|
||||||
|
XI. Prepending a prefix to exported symbols
|
||||||
|
|
||||||
|
Starting with libpng-1.6.0, you can configure libpng (when using the
|
||||||
|
"configure" script) to prefix all exported symbols by means of the
|
||||||
|
configuration option "--with-libpng-prefix=FOO_", where FOO_ can be any
|
||||||
|
string beginning with a letter and containing only uppercase
|
||||||
|
and lowercase letters, digits, and the underscore (i.e., a C language
|
||||||
|
identifier). This creates a set of macros in pnglibconf.h, so this is
|
||||||
|
transparent to applications; their function calls get transformed by
|
||||||
|
the macros to use the modified names.
|
||||||
|
|
||||||
|
XII. Configuring for compiler xxx:
|
||||||
|
|
||||||
|
All includes for libpng are in pngconf.h. If you need to add, change
|
||||||
|
or delete an include, this is the place to do it.
|
||||||
|
The includes that are not needed outside libpng are placed in pngpriv.h,
|
||||||
|
which is only used by the routines inside libpng itself.
|
||||||
|
The files in libpng proper only include pngpriv.h and png.h, which
|
||||||
|
in turn includes pngconf.h and, as of libpng-1.5.0, pnglibconf.h.
|
||||||
|
As of libpng-1.5.0, pngpriv.h also includes three other private header
|
||||||
|
files, pngstruct.h, pnginfo.h, and pngdebug.h, which contain material
|
||||||
|
that previously appeared in the public headers.
|
||||||
|
|
||||||
|
XIII. Removing unwanted object code
|
||||||
|
|
||||||
|
There are a bunch of #define's in pngconf.h that control what parts of
|
||||||
|
libpng are compiled. All the defines end in _SUPPORTED. If you are
|
||||||
|
never going to use a capability, you can change the #define to #undef
|
||||||
|
before recompiling libpng and save yourself code and data space, or
|
||||||
|
you can turn off individual capabilities with defines that begin with
|
||||||
|
PNG_NO_.
|
||||||
|
|
||||||
|
In libpng-1.5.0 and later, the #define's are in pnglibconf.h instead.
|
||||||
|
|
||||||
|
You can also turn all of the transforms and ancillary chunk capabilities
|
||||||
|
off en masse with compiler directives that define
|
||||||
|
PNG_NO_READ[or WRITE]_TRANSFORMS, or PNG_NO_READ[or WRITE]_ANCILLARY_CHUNKS,
|
||||||
|
or all four, along with directives to turn on any of the capabilities that
|
||||||
|
you do want. The PNG_NO_READ[or WRITE]_TRANSFORMS directives disable the
|
||||||
|
extra transformations but still leave the library fully capable of reading
|
||||||
|
and writing PNG files with all known public chunks. Use of the
|
||||||
|
PNG_NO_READ[or WRITE]_ANCILLARY_CHUNKS directive produces a library
|
||||||
|
that is incapable of reading or writing ancillary chunks. If you are
|
||||||
|
not using the progressive reading capability, you can turn that off
|
||||||
|
with PNG_NO_PROGRESSIVE_READ (don't confuse this with the INTERLACING
|
||||||
|
capability, which you'll still have).
|
||||||
|
|
||||||
|
All the reading and writing specific code are in separate files, so the
|
||||||
|
linker should only grab the files it needs. However, if you want to
|
||||||
|
make sure, or if you are building a stand alone library, all the
|
||||||
|
reading files start with "pngr" and all the writing files start with "pngw".
|
||||||
|
The files that don't match either (like png.c, pngtrans.c, etc.)
|
||||||
|
are used for both reading and writing, and always need to be included.
|
||||||
|
The progressive reader is in pngpread.c
|
||||||
|
|
||||||
|
If you are creating or distributing a dynamically linked library (a .so
|
||||||
|
or DLL file), you should not remove or disable any parts of the library,
|
||||||
|
as this will cause applications linked with different versions of the
|
||||||
|
library to fail if they call functions not available in your library.
|
||||||
|
The size of the library itself should not be an issue, because only
|
||||||
|
those sections that are actually used will be loaded into memory.
|
||||||
|
|
||||||
|
XIV. Changes to the build and configuration of libpng in libpng-1.5.x
|
||||||
|
|
||||||
|
Details of internal changes to the library code can be found in the CHANGES
|
||||||
|
file and in the GIT repository logs. These will be of no concern to the vast
|
||||||
|
majority of library users or builders; however, the few who configure libpng
|
||||||
|
to a non-default feature set may need to change how this is done.
|
||||||
|
|
||||||
|
There should be no need for library builders to alter build scripts if
|
||||||
|
these use the distributed build support - configure or the makefiles -
|
||||||
|
however, users of the makefiles may care to update their build scripts
|
||||||
|
to build pnglibconf.h where the corresponding makefile does not do so.
|
||||||
|
|
||||||
|
Building libpng with a non-default configuration has changed completely.
|
||||||
|
The old method using pngusr.h should still work correctly even though the
|
||||||
|
way pngusr.h is used in the build has been changed; however, library
|
||||||
|
builders will probably want to examine the changes to take advantage of
|
||||||
|
new capabilities and to simplify their build system.
|
||||||
|
|
||||||
|
A. Specific changes to library configuration capabilities
|
||||||
|
|
||||||
|
The exact mechanism used to control attributes of API functions has
|
||||||
|
changed. A single set of operating system independent macro definitions
|
||||||
|
is used and operating system specific directives are defined in
|
||||||
|
pnglibconf.h
|
||||||
|
|
||||||
|
As part of this the mechanism used to choose procedure call standards on
|
||||||
|
those systems that allow a choice has been changed. At present this only
|
||||||
|
affects certain Microsoft (DOS, Windows) and IBM (OS/2) operating systems
|
||||||
|
running on Intel processors. As before, PNGAPI is defined where required
|
||||||
|
to control the exported API functions; however, two new macros, PNGCBAPI
|
||||||
|
and PNGCAPI, are used instead for callback functions (PNGCBAPI) and
|
||||||
|
(PNGCAPI) for functions that must match a C library prototype (currently
|
||||||
|
only png_longjmp_ptr, which must match the C longjmp function.) The new
|
||||||
|
approach is documented in pngconf.h
|
||||||
|
|
||||||
|
Despite these changes, libpng 1.5.0 only supports the native C function
|
||||||
|
calling standard on those platforms tested so far (__cdecl on Microsoft
|
||||||
|
Windows). This is because the support requirements for alternative
|
||||||
|
calling conventions seem to no longer exist. Developers who find it
|
||||||
|
necessary to set PNG_API_RULE to 1 should advise the mailing list
|
||||||
|
(png-mng-implement) of this and library builders who use Openwatcom and
|
||||||
|
therefore set PNG_API_RULE to 2 should also contact the mailing list.
|
||||||
|
|
||||||
|
B. Changes to the configuration mechanism
|
||||||
|
|
||||||
|
Prior to libpng-1.5.0 library builders who needed to configure libpng
|
||||||
|
had either to modify the exported pngconf.h header file to add system
|
||||||
|
specific configuration or had to write feature selection macros into
|
||||||
|
pngusr.h and cause this to be included into pngconf.h by defining
|
||||||
|
PNG_USER_CONFIG. The latter mechanism had the disadvantage that an
|
||||||
|
application built without PNG_USER_CONFIG defined would see the
|
||||||
|
unmodified, default, libpng API and thus would probably fail to link.
|
||||||
|
|
||||||
|
These mechanisms still work in the configure build and in any makefile
|
||||||
|
build that builds pnglibconf.h, although the feature selection macros
|
||||||
|
have changed somewhat as described above. In 1.5.0, however, pngusr.h is
|
||||||
|
processed only once, at the time the exported header file pnglibconf.h is
|
||||||
|
built. pngconf.h no longer includes pngusr.h; therefore, pngusr.h is ignored
|
||||||
|
after the build of pnglibconf.h and it is never included in an application
|
||||||
|
build.
|
||||||
|
|
||||||
|
The formerly used alternative of adding a list of feature macros to the
|
||||||
|
CPPFLAGS setting in the build also still works; however, the macros will be
|
||||||
|
copied to pnglibconf.h and this may produce macro redefinition warnings
|
||||||
|
when the individual C files are compiled.
|
||||||
|
|
||||||
|
All configuration now only works if pnglibconf.h is built from
|
||||||
|
scripts/pnglibconf.dfa. This requires the program awk. Brian Kernighan
|
||||||
|
(the original author of awk) maintains C source code of that awk and this
|
||||||
|
and all known later implementations (often called by subtly different
|
||||||
|
names - nawk and gawk for example) are adequate to build pnglibconf.h.
|
||||||
|
The Sun Microsystems (now Oracle) program 'awk' is an earlier version
|
||||||
|
and does not work; this may also apply to other systems that have a
|
||||||
|
functioning awk called 'nawk'.
|
||||||
|
|
||||||
|
Configuration options are now documented in scripts/pnglibconf.dfa. This
|
||||||
|
file also includes dependency information that ensures a configuration is
|
||||||
|
consistent; that is, if a feature is switched off, dependent features are
|
||||||
|
also switched off. As a recommended alternative to using feature macros in
|
||||||
|
pngusr.h a system builder may also define equivalent options in pngusr.dfa
|
||||||
|
(or, indeed, any file) and add that to the configuration by setting
|
||||||
|
DFA_XTRA to the file name. The makefiles in contrib/pngminim illustrate
|
||||||
|
how to do this, and also illustrate a case where pngusr.h is still required.
|
||||||
|
|
||||||
|
After you have built libpng, the definitions that were recorded in
|
||||||
|
pnglibconf.h are available to your application (pnglibconf.h is included
|
||||||
|
in png.h and gets installed alongside png.h and pngconf.h in your
|
||||||
|
$PREFIX/include directory). Do not edit pnglibconf.h after you have built
|
||||||
|
libpng, because than the settings would not accurately reflect the settings
|
||||||
|
that were used to build libpng.
|
||||||
|
|
||||||
|
XV. Setjmp/longjmp issues
|
||||||
|
|
||||||
|
Libpng uses setjmp()/longjmp() for error handling. Unfortunately setjmp()
|
||||||
|
is known to be not thread-safe on some platforms and we don't know of
|
||||||
|
any platform where it is guaranteed to be thread-safe. Therefore, if
|
||||||
|
your application is going to be using multiple threads, you should
|
||||||
|
configure libpng with PNG_NO_SETJMP in your pngusr.dfa file, with
|
||||||
|
-DPNG_NO_SETJMP on your compile line, or with
|
||||||
|
|
||||||
|
#undef PNG_SETJMP_SUPPORTED
|
||||||
|
|
||||||
|
in your pnglibconf.h or pngusr.h.
|
||||||
|
|
||||||
|
Starting with libpng-1.6.0, the library included a "simplified API".
|
||||||
|
This requires setjmp/longjmp, so you must either build the library
|
||||||
|
with PNG_SETJMP_SUPPORTED defined, or with PNG_SIMPLIFIED_READ_SUPPORTED
|
||||||
|
and PNG_SIMPLIFIED_WRITE_SUPPORTED undefined.
|
||||||
|
|
||||||
|
XVI. Other sources of information about libpng:
|
||||||
|
|
||||||
Further information can be found in the README and libpng-manual.txt
|
Further information can be found in the README and libpng-manual.txt
|
||||||
files, in the individual makefiles, in png.h, and the manual pages
|
files, in the individual makefiles, in png.h, and the manual pages
|
||||||
libpng.3 and png.5.
|
libpng.3 and png.5.
|
||||||
@@ -147,7 +399,7 @@ CFLAGS="-Wall -O -funroll-loops \
|
|||||||
--with-pkgconfigdir=/usr/lib/pkgconfig --includedir=/usr/include
|
--with-pkgconfigdir=/usr/lib/pkgconfig --includedir=/usr/include
|
||||||
|
|
||||||
You can alternatively specify --includedir=/usr/include, /usr/local/include,
|
You can alternatively specify --includedir=/usr/include, /usr/local/include,
|
||||||
/usr/include/libpng%NN%, or whatever.
|
/usr/include/libpng17, or whatever.
|
||||||
|
|
||||||
If you find that the configure script is out-of-date or is not supporting
|
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",
|
your platform properly, try running autogen.sh to regenerate "configure",
|
||||||
|
|||||||
48
LICENSE
@@ -10,21 +10,17 @@ this sentence.
|
|||||||
|
|
||||||
This code is released under the libpng license.
|
This code is released under the libpng license.
|
||||||
|
|
||||||
libpng versions 1.2.6, August 15, 2004, through 1.5.7beta05, November 18, 2011, are
|
libpng versions 1.0.7, July 1, 2000, through 1.7.0beta64, July 26, 2015, are
|
||||||
Copyright (c) 2004, 2006-2011 Glenn Randers-Pehrson, and are
|
Copyright (c) 2000-2002, 2004, 2006-2015 Glenn Randers-Pehrson, and are
|
||||||
distributed according to the same disclaimer and license as libpng-1.2.5
|
|
||||||
with the following individual added to the list of Contributing Authors
|
|
||||||
|
|
||||||
Cosmin Truta
|
|
||||||
|
|
||||||
libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are
|
|
||||||
Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are
|
|
||||||
distributed according to the same disclaimer and license as libpng-1.0.6
|
distributed according to the same disclaimer and license as libpng-1.0.6
|
||||||
with the following individuals added to the list of Contributing Authors
|
with the following individuals added to the list of Contributing Authors:
|
||||||
|
|
||||||
Simon-Pierre Cadieux
|
Simon-Pierre Cadieux
|
||||||
Eric S. Raymond
|
Eric S. Raymond
|
||||||
|
Mans Rullgard
|
||||||
|
Cosmin Truta
|
||||||
Gilles Vollant
|
Gilles Vollant
|
||||||
|
James Yu
|
||||||
|
|
||||||
and with the following additions to the disclaimer:
|
and with the following additions to the disclaimer:
|
||||||
|
|
||||||
@@ -36,17 +32,17 @@ and with the following additions to the disclaimer:
|
|||||||
the user.
|
the user.
|
||||||
|
|
||||||
libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
|
libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
|
||||||
Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are
|
Copyright (c) 1998-2000 Glenn Randers-Pehrson, and are distributed according
|
||||||
distributed according to the same disclaimer and license as libpng-0.96,
|
to the same disclaimer and license as libpng-0.96, with the following
|
||||||
with the following individuals added to the list of Contributing Authors:
|
individuals added to the list of Contributing Authors:
|
||||||
|
|
||||||
Tom Lane
|
Tom Lane
|
||||||
Glenn Randers-Pehrson
|
Glenn Randers-Pehrson
|
||||||
Willem van Schaik
|
Willem van Schaik
|
||||||
|
|
||||||
libpng versions 0.89, June 1996, through 0.96, May 1997, are
|
libpng versions 0.89, June 1996, through 0.96, May 1997, are
|
||||||
Copyright (c) 1996, 1997 Andreas Dilger
|
Copyright (c) 1996-1997 Andreas Dilger, and are
|
||||||
Distributed according to the same disclaimer and license as libpng-0.88,
|
distributed according to the same disclaimer and license as libpng-0.88,
|
||||||
with the following individuals added to the list of Contributing Authors:
|
with the following individuals added to the list of Contributing Authors:
|
||||||
|
|
||||||
John Bowler
|
John Bowler
|
||||||
@@ -57,7 +53,7 @@ with the following individuals added to the list of Contributing Authors:
|
|||||||
Tom Tanner
|
Tom Tanner
|
||||||
|
|
||||||
libpng versions 0.5, May 1995, through 0.88, January 1996, are
|
libpng versions 0.5, May 1995, through 0.88, January 1996, are
|
||||||
Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
|
||||||
|
|
||||||
For the purposes of this copyright and license, "Contributing Authors"
|
For the purposes of this copyright and license, "Contributing Authors"
|
||||||
is defined as the following set of individuals:
|
is defined as the following set of individuals:
|
||||||
@@ -80,13 +76,13 @@ Permission is hereby granted to use, copy, modify, and distribute this
|
|||||||
source code, or portions hereof, for any purpose, without fee, subject
|
source code, or portions hereof, for any purpose, without fee, subject
|
||||||
to the following restrictions:
|
to the following restrictions:
|
||||||
|
|
||||||
1. The origin of this source code must not be misrepresented.
|
1. The origin of this source code must not be misrepresented.
|
||||||
|
|
||||||
2. Altered versions must be plainly marked as such and must not
|
2. Altered versions must be plainly marked as such and must not
|
||||||
be misrepresented as being the original source.
|
be misrepresented as being the original source.
|
||||||
|
|
||||||
3. This Copyright notice may not be removed or altered from any
|
3. This Copyright notice may not be removed or altered from any
|
||||||
source or altered source distribution.
|
source or altered source distribution.
|
||||||
|
|
||||||
The Contributing Authors and Group 42, Inc. specifically permit, without
|
The Contributing Authors and Group 42, Inc. specifically permit, without
|
||||||
fee, and encourage the use of this source code as a component to
|
fee, and encourage the use of this source code as a component to
|
||||||
@@ -94,18 +90,18 @@ supporting the PNG file format in commercial products. If you use this
|
|||||||
source code in a product, acknowledgment is not required but would be
|
source code in a product, acknowledgment is not required but would be
|
||||||
appreciated.
|
appreciated.
|
||||||
|
|
||||||
|
|
||||||
A "png_get_copyright" function is available, for convenient use in "about"
|
A "png_get_copyright" function is available, for convenient use in "about"
|
||||||
boxes and the like:
|
boxes and the like:
|
||||||
|
|
||||||
printf("%s",png_get_copyright(NULL));
|
printf("%s", png_get_copyright(NULL));
|
||||||
|
|
||||||
Also, the PNG logo (in PNG format, of course) is supplied in the
|
Also, the PNG logo (in PNG format, of course) is supplied in the
|
||||||
files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
|
files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
|
||||||
|
|
||||||
Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a
|
Libpng is OSI Certified Open Source Software. OSI Certified Open Source is
|
||||||
certification mark of the Open Source Initiative.
|
a certification mark of the Open Source Initiative. OSI has not addressed
|
||||||
|
the additional disclaimers inserted at version 1.0.7.
|
||||||
|
|
||||||
Glenn Randers-Pehrson
|
Glenn Randers-Pehrson
|
||||||
glennrp at users.sourceforge.net
|
glennrp at users.sourceforge.net
|
||||||
November 18, 2011
|
July 26, 2015
|
||||||
|
|||||||
314
Makefile.am
@@ -4,27 +4,69 @@
|
|||||||
|
|
||||||
PNGLIB_BASENAME= libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@
|
PNGLIB_BASENAME= libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@
|
||||||
|
|
||||||
# libpng does not follow GNU file name conventions
|
ACLOCAL_AMFLAGS = -I scripts
|
||||||
|
|
||||||
# "color-tests" requires automake 1.11.1 or later. Enable it if you like,
|
|
||||||
# to get red "FAIL" and green "PASS" notations during tests.
|
|
||||||
# AUTOMAKE_OPTIONS = foreign color-tests
|
|
||||||
AUTOMAKE_OPTIONS = foreign
|
|
||||||
|
|
||||||
# test programs - run on make check, make distcheck
|
# test programs - run on make check, make distcheck
|
||||||
TESTS_ENVIRONMENT= srcdir=$(srcdir)
|
check_PROGRAMS= pngtest pngunknown pngstest pngvalid pngimage
|
||||||
check_PROGRAMS= pngtest
|
|
||||||
|
# Utilities - installed
|
||||||
|
bin_PROGRAMS= pngfix png-fix-itxt
|
||||||
|
|
||||||
|
# This ensures that pnglibconf.h gets built at the start of 'make all' or
|
||||||
|
# 'make check', but it does not add dependencies to the individual programs,
|
||||||
|
# this is done below.
|
||||||
|
#
|
||||||
|
# IMPORTANT: always add the object modules of new programs to the list below
|
||||||
|
# because otherwise the sequence 'configure; make new-program' will *sometimes*
|
||||||
|
# result in the installed (system) pnglibconf.h being used and the result is
|
||||||
|
# always wrong and always very confusing.
|
||||||
|
BUILT_SOURCES = pnglibconf.h
|
||||||
|
|
||||||
pngtest_SOURCES = pngtest.c
|
pngtest_SOURCES = pngtest.c
|
||||||
pngtest_LDADD = libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@.la
|
pngtest_LDADD = libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@.la
|
||||||
TESTS = test-pngtest.sh
|
|
||||||
|
|
||||||
# Do the following only if the contrib directory is present.
|
pngvalid_SOURCES = contrib/libtests/pngvalid.c
|
||||||
check_PROGRAMS+= pngvalid pngstest
|
|
||||||
pngvalid_SOURCES = pngvalid.c
|
|
||||||
pngstest_SOURCES = contrib/libtests/pngstest.c
|
|
||||||
pngvalid_LDADD = libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@.la
|
pngvalid_LDADD = libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@.la
|
||||||
|
|
||||||
|
pngstest_SOURCES = contrib/libtests/pngstest.c
|
||||||
pngstest_LDADD = libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@.la
|
pngstest_LDADD = libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@.la
|
||||||
TESTS += test-pngvalid-simple.sh test-pngvalid-full.sh test-pngstest.sh
|
|
||||||
|
pngunknown_SOURCES = contrib/libtests/pngunknown.c
|
||||||
|
pngunknown_LDADD = libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@.la
|
||||||
|
|
||||||
|
pngimage_SOURCES = contrib/libtests/pngimage.c
|
||||||
|
pngimage_LDADD = libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@.la
|
||||||
|
|
||||||
|
pngfix_SOURCES = contrib/tools/pngfix.c
|
||||||
|
pngfix_LDADD = libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@.la
|
||||||
|
|
||||||
|
png_fix_itxt_SOURCES = contrib/tools/png-fix-itxt.c
|
||||||
|
|
||||||
|
# Generally these are single line shell scripts to run a test with a particular
|
||||||
|
# set of parameters:
|
||||||
|
TESTS =\
|
||||||
|
tests/pngtest\
|
||||||
|
tests/pngvalid-gamma-16-to-8 tests/pngvalid-gamma-alpha-mode\
|
||||||
|
tests/pngvalid-gamma-background tests/pngvalid-gamma-expand16-alpha-mode\
|
||||||
|
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-interlace-size\
|
||||||
|
tests/pngvalid-progressive-interlace-standard\
|
||||||
|
tests/pngvalid-progressive-interlace-transform\
|
||||||
|
tests/pngvalid-progressive-standard tests/pngvalid-standard\
|
||||||
|
tests/pngstest-0g01 tests/pngstest-0g02 tests/pngstest-0g04\
|
||||||
|
tests/pngstest-0g08 tests/pngstest-0g16 tests/pngstest-2c08\
|
||||||
|
tests/pngstest-2c16 tests/pngstest-3p01 tests/pngstest-3p02\
|
||||||
|
tests/pngstest-3p04 tests/pngstest-3p08 tests/pngstest-4a08\
|
||||||
|
tests/pngstest-4a16 tests/pngstest-6a08 tests/pngstest-6a16\
|
||||||
|
tests/pngstest-error tests/pngunknown-IDAT\
|
||||||
|
tests/pngunknown-discard tests/pngunknown-if-safe tests/pngunknown-sAPI\
|
||||||
|
tests/pngunknown-sTER tests/pngunknown-save tests/pngunknown-vpAg\
|
||||||
|
tests/pngimage-quick tests/pngimage-full
|
||||||
|
|
||||||
|
# These tests are expected, and required, to fail:
|
||||||
|
XFAIL_TESTS = tests/pngstest-error
|
||||||
|
|
||||||
# man pages
|
# man pages
|
||||||
dist_man_MANS= libpng.3 libpngpf.3 png.5
|
dist_man_MANS= libpng.3 libpngpf.3 png.5
|
||||||
@@ -40,16 +82,15 @@ lib_LTLIBRARIES=libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@.la
|
|||||||
libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_SOURCES = png.c pngerror.c\
|
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\
|
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\
|
pngset.c pngtrans.c pngwio.c pngwrite.c pngwtran.c pngwutil.c\
|
||||||
png.h pngconf.h pngdebug.h pnginfo.h pngpriv.h pngstruct.h
|
png.h pngconf.h pngdebug.h pnginfo.h pngpriv.h pngstruct.h pngusr.dfa
|
||||||
|
|
||||||
if PNG_ARM_NEON
|
if PNG_ARM_NEON
|
||||||
libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_SOURCES += arm/filter_neon.S
|
libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_SOURCES += arm/arm_init.c\
|
||||||
|
arm/filter_neon.S arm/filter_neon_intrinsics.c
|
||||||
endif
|
endif
|
||||||
|
|
||||||
nodist_libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_SOURCES = pnglibconf.h
|
nodist_libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_SOURCES = pnglibconf.h
|
||||||
|
|
||||||
libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_CPPFLAGS = @LIBPNG_DEFINES@
|
|
||||||
|
|
||||||
libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_LDFLAGS = -no-undefined -export-dynamic \
|
libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_LDFLAGS = -no-undefined -export-dynamic \
|
||||||
-version-number @PNGLIB_MAJOR@@PNGLIB_MINOR@:@PNGLIB_RELEASE@:0
|
-version-number @PNGLIB_MAJOR@@PNGLIB_MINOR@:@PNGLIB_RELEASE@:0
|
||||||
|
|
||||||
@@ -78,32 +119,41 @@ nodist_pkginclude_HEADERS= pnglibconf.h
|
|||||||
pkgconfigdir = @pkgconfigdir@
|
pkgconfigdir = @pkgconfigdir@
|
||||||
pkgconfig_DATA = libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@.pc
|
pkgconfig_DATA = libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@.pc
|
||||||
|
|
||||||
#extra source distribution files.
|
# Extra source distribution files, '${srcdir}' is used below to stop build files
|
||||||
|
# from those directories being included. This only works if the configure is
|
||||||
|
# not done in the source directory!
|
||||||
EXTRA_DIST= \
|
EXTRA_DIST= \
|
||||||
ANNOUNCE CHANGES INSTALL LICENSE README TODO \
|
ANNOUNCE CHANGES INSTALL LICENSE README TODO \
|
||||||
pngtest.png pngbar.png pngnow.png pngbar.jpg autogen.sh \
|
pngtest.png pngbar.png pngnow.png pngbar.jpg autogen.sh \
|
||||||
${srcdir}/contrib ${srcdir}/projects ${srcdir}/scripts \
|
${srcdir}/contrib ${srcdir}/projects ${srcdir}/scripts \
|
||||||
$(TESTS) \
|
$(TESTS) $(XFAIL_TESTS) tests/pngstest \
|
||||||
CMakeLists.txt example.c libpng-manual.txt
|
CMakeLists.txt example.c libpng-manual.txt
|
||||||
|
|
||||||
SCRIPT_CLEANFILES=scripts/*.out scripts/*.chk scripts/pnglibconf.dfn
|
SCRIPT_CLEANFILES=scripts/*.out scripts/*.chk scripts/pnglibconf.c
|
||||||
|
|
||||||
CLEANFILES= dfn.c dfn?.out pngout.png libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@.pc \
|
CLEANFILES= *.tf? pngout.png libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@.pc \
|
||||||
libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@-config libpng.vers libpng.sym \
|
libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@-config libpng.vers libpng.sym \
|
||||||
check.new pnglibconf.* symbols.new pngtest-log.txt \
|
check.new pnglibconf.h pngprefix.h symbols.new pngtest-log.txt \
|
||||||
|
pnglibconf.out pnglibconf.c pnglibconf.dfn pnglibconf.pre \
|
||||||
$(SCRIPT_CLEANFILES)
|
$(SCRIPT_CLEANFILES)
|
||||||
|
|
||||||
MAINTAINERCLEANFILES = Makefile.in aclocal.m4 config.guess config.h.in \
|
MAINTAINERCLEANFILES = Makefile.in aclocal.m4 config.guess config.h.in \
|
||||||
config.sub configure depcomp install-sh ltmain.sh missing
|
config.sub configure depcomp install-sh ltmain.sh missing
|
||||||
|
|
||||||
# DFNCPP is normally just CPP - the C preprocessor - but on Solaris and maybe
|
# PNG_COPTS give extra options for the C compiler to be used on all compilation
|
||||||
# other operating systems (NeXT?) the C preprocessor selected by configure
|
# steps (unless targe_CFLAGS is specified; that will take precedence over
|
||||||
|
# AM_CFLAGS)
|
||||||
|
PNG_COPTS = @PNG_COPTS@
|
||||||
|
AM_CFLAGS = ${PNG_COPTS}
|
||||||
|
|
||||||
|
# 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
|
# 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
|
# parsing - and therefore fails with the .df files. configure.ac has special
|
||||||
# checks for this and sets DFNCPP appropriately.
|
# checks for this and sets DFNCPP appropriately.
|
||||||
DFNCPP = @DFNCPP@
|
DFNCPP = @DFNCPP@
|
||||||
|
|
||||||
SUFFIXES = .chk .dfn .out
|
SUFFIXES = .chk .out
|
||||||
|
|
||||||
$(PNGLIB_BASENAME).pc: libpng.pc
|
$(PNGLIB_BASENAME).pc: libpng.pc
|
||||||
cp libpng.pc $@
|
cp libpng.pc $@
|
||||||
@@ -112,7 +162,11 @@ $(PNGLIB_BASENAME)-config: libpng-config
|
|||||||
cp libpng-config $@
|
cp libpng-config $@
|
||||||
|
|
||||||
scripts/sym.out scripts/vers.out: png.h pngconf.h pnglibconf.h
|
scripts/sym.out scripts/vers.out: png.h pngconf.h pnglibconf.h
|
||||||
|
scripts/prefix.out: png.h pngconf.h pnglibconf.out
|
||||||
scripts/symbols.out: png.h pngconf.h $(srcdir)/scripts/pnglibconf.h.prebuilt
|
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
|
libpng.sym: scripts/sym.out
|
||||||
rm -f $@
|
rm -f $@
|
||||||
@@ -120,19 +174,59 @@ libpng.sym: scripts/sym.out
|
|||||||
libpng.vers: scripts/vers.out
|
libpng.vers: scripts/vers.out
|
||||||
rm -f $@
|
rm -f $@
|
||||||
cp $? $@
|
cp $? $@
|
||||||
|
|
||||||
|
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 config.h
|
||||||
|
rm -f $@
|
||||||
|
$(AWK) 's==0 && NR>1{print prev}\
|
||||||
|
s==0{prev=$$0}\
|
||||||
|
s==1{print "#define", $$1, "@PNG_PREFIX@" $$1}\
|
||||||
|
s==2{print "#define @PNG_PREFIX@png_" $$1, "PNG_" $$1}\
|
||||||
|
END{print prev}' s=0 pnglibconf.out s=1 scripts/prefix.out\
|
||||||
|
s=2 ${srcdir}/scripts/macro.lst >pnglibconf.tf8
|
||||||
|
mv pnglibconf.tf8 $@
|
||||||
|
|
||||||
|
pngprefix.h: scripts/intprefix.out
|
||||||
|
rm -f pngprefix.tf1
|
||||||
|
$(AWK) '{print "#define", $$1, "@PNG_PREFIX@" $$1}' $? >pngprefix.tf1
|
||||||
|
mv pngprefix.tf1 $@
|
||||||
|
else
|
||||||
pnglibconf.h: pnglibconf.out
|
pnglibconf.h: pnglibconf.out
|
||||||
rm -f $@
|
rm -f $@
|
||||||
cp $? $@
|
cp $? $@
|
||||||
|
|
||||||
|
pngprefix.h: # is empty
|
||||||
|
:>$@
|
||||||
|
endif
|
||||||
|
|
||||||
$(srcdir)/scripts/pnglibconf.h.prebuilt:
|
$(srcdir)/scripts/pnglibconf.h.prebuilt:
|
||||||
@echo "Attempting to build $@" >&2
|
@echo "Attempting to build $@" >&2
|
||||||
@echo "This is a machine generated file, but if you want to make" >&2
|
@echo "This is a machine generated file, but if you want to make" >&2
|
||||||
@echo "a new one simply make 'scripts/pnglibconf.out' and copy that" >&2
|
@echo "a new one simply make 'scripts/pnglibconf.out', copy that" >&2
|
||||||
|
@echo "AND set PNG_ZLIB_VERNUM to 0 (you MUST do this)" >&2
|
||||||
@exit 1
|
@exit 1
|
||||||
|
|
||||||
# The following is necessary to ensure that the local pnglibconf.h is used, not
|
# The following is necessary to ensure that the local pnglibconf.h is used, not
|
||||||
# an installed one (this can happen immediately after on a clean system if
|
# an installed one (this can happen immediately after on a clean system if
|
||||||
# 'make test' is the first thing the user does.)
|
# 'make test' is the first thing the user does.) Only files which include
|
||||||
contrib/libtests/pngstest.o pngvalid.o pngtest.o: pnglibconf.h
|
# one of the png source files (typically png.h or pngpriv.h) need to be listed
|
||||||
|
# here:
|
||||||
|
pngtest.o: pnglibconf.h
|
||||||
|
|
||||||
|
contrib/libtests/makepng.o: pnglibconf.h
|
||||||
|
contrib/libtests/pngstest.o: pnglibconf.h
|
||||||
|
contrib/libtests/pngunknown.o: pnglibconf.h
|
||||||
|
contrib/libtests/pngimage.o: pnglibconf.h
|
||||||
|
contrib/libtests/pngvalid.o: pnglibconf.h
|
||||||
|
contrib/libtests/readpng.o: pnglibconf.h
|
||||||
|
contrib/libtests/tarith.o: pnglibconf.h
|
||||||
|
contrib/libtests/timepng.o: pnglibconf.h
|
||||||
|
|
||||||
|
contrib/tools/makesRGB.o: pnglibconf.h
|
||||||
|
contrib/tools/pngfix.o: pnglibconf.h
|
||||||
|
|
||||||
# We must use -DPNG_NO_USE_READ_MACROS here even when the library may actually
|
# We must use -DPNG_NO_USE_READ_MACROS here even when the library may actually
|
||||||
# be built with PNG_USE_READ_MACROS; this prevents the read macros from
|
# be built with PNG_USE_READ_MACROS; this prevents the read macros from
|
||||||
@@ -142,51 +236,54 @@ SYMBOL_CFLAGS = -DPNGLIB_LIBNAME='PNG@PNGLIB_MAJOR@@PNGLIB_MINOR@_0'\
|
|||||||
-DSYMBOL_PREFIX='$(SYMBOL_PREFIX)'\
|
-DSYMBOL_PREFIX='$(SYMBOL_PREFIX)'\
|
||||||
-DPNG_NO_USE_READ_MACROS -DPNG_BUILDING_SYMBOL_TABLE
|
-DPNG_NO_USE_READ_MACROS -DPNG_BUILDING_SYMBOL_TABLE
|
||||||
|
|
||||||
.dfn.out:
|
if DO_PNG_PREFIX
|
||||||
rm -f $@ dfn.c dfn?.out
|
SYMBOL_CFLAGS += -DPNG_PREFIX='@PNG_PREFIX@'
|
||||||
test -d scripts || mkdir scripts
|
endif
|
||||||
echo '#include "$<"' >dfn.c
|
|
||||||
$(DFNCPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) @LIBPNG_DEFINES@\
|
|
||||||
$(CPPFLAGS) $(SYMBOL_CFLAGS) dfn.c > dfn1.out
|
|
||||||
$(SED) -n -e 's|^.*PNG_DEFN_MAGIC *-\(.*\)- *PNG_DEFN_END.*$$|\1|p'\
|
|
||||||
dfn1.out >dfn2.out
|
|
||||||
$(SED) -e 's| *PNG_JOIN *||g' -e 's| *$$||' dfn2.out >dfn3.out
|
|
||||||
rm -f dfn.c dfn[12].out
|
|
||||||
mv dfn3.out $@
|
|
||||||
|
|
||||||
# The .dfn file for pnglibconf.h is machine generated
|
.c.out:
|
||||||
pnglibconf.dfn: scripts/pnglibconf.dfa scripts/options.awk pngconf.h
|
rm -f $@ $*.tf[12]
|
||||||
rm -f $@ dfn?.out
|
test -d scripts || mkdir scripts || test -d scripts
|
||||||
$(AWK) -f ${srcdir}/scripts/options.awk out=dfn1.out version=search\
|
$(DFNCPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES)\
|
||||||
|
$(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)
|
||||||
|
rm -f $@ $*.tf[45]
|
||||||
|
$(AWK) -f ${srcdir}/scripts/options.awk out=$*.tf4 version=search\
|
||||||
${srcdir}/pngconf.h ${srcdir}/scripts/pnglibconf.dfa\
|
${srcdir}/pngconf.h ${srcdir}/scripts/pnglibconf.dfa\
|
||||||
$(DFA_XTRA) 1>&2
|
${srcdir}/pngusr.dfa $(DFA_XTRA) 1>&2
|
||||||
$(AWK) -f ${srcdir}/scripts/options.awk out=dfn2.out dfn1.out 1>&2
|
$(AWK) -f ${srcdir}/scripts/options.awk out=$*.tf5 $*.tf4 1>&2
|
||||||
rm dfn1.out
|
rm $*.tf4
|
||||||
mv dfn2.out $@
|
mv $*.tf5 $@
|
||||||
|
|
||||||
# Symbol checks (.def and .out files should match)
|
# Symbol checks (.def and .out files should match)
|
||||||
scripts/symbols.chk: scripts/checksym.awk scripts/symbols.def scripts/symbols.out
|
scripts/symbols.chk: scripts/checksym.awk scripts/symbols.def scripts/symbols.out
|
||||||
|
|
||||||
.out.chk:
|
.out.chk:
|
||||||
rm -f $@ symbols.new
|
rm -f $@ $*.new
|
||||||
$(AWK) -f ${srcdir}/scripts/checksym.awk ${srcdir}/scripts/${*F}.def\
|
$(AWK) -f ${srcdir}/scripts/checksym.awk ${srcdir}/scripts/${*F}.def\
|
||||||
$< >&2
|
of="$*.new" $< >&2
|
||||||
mv symbols.new $@
|
mv $*.new $@
|
||||||
|
|
||||||
# used on demand to regenerate the standard header, CPPFLAGS should
|
# used on demand to regenerate the standard header, CPPFLAGS should
|
||||||
# be empty - no non-standard defines
|
# be empty - no non-standard defines
|
||||||
scripts/pnglibconf.dfn: scripts/pnglibconf.dfa scripts/options.awk pngconf.h
|
scripts/pnglibconf.c: scripts/pnglibconf.dfa scripts/options.awk pngconf.h
|
||||||
rm -f $@ dfn?.out
|
rm -f $@ pnglibconf.tf[67]
|
||||||
test -z "$(CPPFLAGS)"
|
test -z "$(CPPFLAGS)"
|
||||||
echo "com @PNGLIB_VERSION@ STANDARD API DEFINITION" |\
|
echo "com @PNGLIB_VERSION@ STANDARD API DEFINITION" |\
|
||||||
$(AWK) -f ${srcdir}/scripts/options.awk out=dfn1.out logunsupported=1
|
$(AWK) -f ${srcdir}/scripts/options.awk out=pnglibconf.tf6\
|
||||||
version=search ${srcdir}/pngconf.h -\
|
logunsupported=1 version=search ${srcdir}/pngconf.h -\
|
||||||
${srcdir}/scripts/pnglibconf.dfa 1>&2
|
${srcdir}/scripts/pnglibconf.dfa 1>&2
|
||||||
$(AWK) -f ${srcdir}/scripts/options.awk out=dfn2.out dfn1.out 1>&2
|
$(AWK) -f ${srcdir}/scripts/options.awk out=pnglibconf.tf7\
|
||||||
rm dfn1.out
|
pnglibconf.tf6 1>&2
|
||||||
mv dfn2.out $@
|
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 \
|
||||||
pnglibconf.h pngpriv.h pngdebug.h pnginfo.h pngstruct.h
|
pnglibconf.h pngpriv.h pngdebug.h pnginfo.h pngstruct.h pngprefix.h
|
||||||
|
|
||||||
test: check-am
|
test: check-am
|
||||||
|
|
||||||
@@ -197,33 +294,76 @@ check: scripts/symbols.chk
|
|||||||
dist-hook:
|
dist-hook:
|
||||||
cd '$(top_distdir)'; rm -f $(SCRIPT_CLEANFILES)
|
cd '$(top_distdir)'; rm -f $(SCRIPT_CLEANFILES)
|
||||||
|
|
||||||
# install the .../include headers as links to the new ones
|
# Make links between installed files with release-specific names and the generic
|
||||||
install-data-hook:
|
# file names. If this install rule is run the generic names will be deleted and
|
||||||
cd $(DESTDIR)$(includedir); rm -f png.h pngconf.h pnglibconf.h
|
# recreated - this has obvious issues for systems with multiple installations.
|
||||||
cd $(DESTDIR)$(includedir); $(LN_S) $(PNGLIB_BASENAME)/png.h png.h
|
|
||||||
cd $(DESTDIR)$(includedir); $(LN_S) $(PNGLIB_BASENAME)/pngconf.h \
|
|
||||||
pngconf.h
|
|
||||||
cd $(DESTDIR)$(includedir); $(LN_S) $(PNGLIB_BASENAME)/pnglibconf.h \
|
|
||||||
pnglibconf.h
|
|
||||||
cd $(DESTDIR)$(pkgconfigdir); rm -f libpng.pc
|
|
||||||
cd $(DESTDIR)$(pkgconfigdir); $(LN_S) $(PNGLIB_BASENAME).pc libpng.pc
|
|
||||||
|
|
||||||
# do evil things to libpng to cause libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@ to be used
|
install-header-links:
|
||||||
install-exec-hook:
|
@set -ex; cd '$(DESTDIR)$(includedir)'; for f in $(HEADERS); do \
|
||||||
cd $(DESTDIR)$(bindir); rm -f libpng-config
|
rm -f "$$f"; $(LN_S) "$(PNGLIB_BASENAME)/$$f" "$$f"; done
|
||||||
cd $(DESTDIR)$(bindir); $(LN_S) $(PNGLIB_BASENAME)-config libpng-config
|
|
||||||
@set -x;\
|
uninstall-header-links:
|
||||||
cd $(DESTDIR)$(libdir);\
|
cd '$(DESTDIR)$(includedir)'; rm -f $(HEADERS)
|
||||||
for ext in a la so so.@PNGLIB_MAJOR@@PNGLIB_MINOR@.@PNGLIB_RELEASE@ sl dylib dll.a; do\
|
|
||||||
rm -f libpng.$$ext;\
|
install-libpng-pc:
|
||||||
if test -f $(PNGLIB_BASENAME).$$ext; then\
|
@set -ex; cd '$(DESTDIR)$(pkgconfigdir)'; rm -f libpng.pc; \
|
||||||
$(LN_S) $(PNGLIB_BASENAME).$$ext libpng.$$ext;\
|
$(LN_S) '$(PNGLIB_BASENAME).pc' libpng.pc
|
||||||
fi;\
|
|
||||||
|
uninstall-libpng-pc:
|
||||||
|
rm -f '$(DESTDIR)$(pkgconfigdir)/libpng.pc'
|
||||||
|
|
||||||
|
# EXT_LIST is a list of the possibly library directory extensions, this exists
|
||||||
|
# because we can't find a good way of discovering the file extensions that are
|
||||||
|
# actually installed on a given system, so instead we check for every extension
|
||||||
|
# we have seen.
|
||||||
|
|
||||||
|
EXT_LIST = a dll.a so so.@PNGLIB_MAJOR@@PNGLIB_MINOR@.@PNGLIB_RELEASE@ la sl dylib
|
||||||
|
|
||||||
|
install-library-links:
|
||||||
|
@set -x; cd '$(DESTDIR)$(libdir)';\
|
||||||
|
for ext in $(EXT_LIST); do\
|
||||||
|
rm -f "libpng.$$ext";\
|
||||||
|
if test -f "$(PNGLIB_BASENAME).$$ext"; then\
|
||||||
|
$(LN_S) "$(PNGLIB_BASENAME).$$ext" "libpng.$$ext" || exit 1;\
|
||||||
|
fi;\
|
||||||
done
|
done
|
||||||
|
|
||||||
uninstall-hook:
|
uninstall-library-links:
|
||||||
cd $(DESTDIR)$(includedir); rm -f png.h pngconf.h pnglibconf.h
|
@set -x; cd '$(DESTDIR)$(libdir)'; for ext in $(EXT_LIST); do\
|
||||||
rm -f $(DESTDIR)$(pkgconfigdir)/libpng.pc
|
rm -f "libpng.$$ext"; done
|
||||||
rm -f $(DESTDIR)$(bindir)/libpng-config
|
|
||||||
rm -f $(DESTDIR)$(libdir)/libpng.a
|
install-libpng-config:
|
||||||
rm -f $(DESTDIR)$(libdir)/libpng.la
|
@set -ex; cd '$(DESTDIR)$(bindir)'; rm -f libpng-config; \
|
||||||
|
$(LN_S) '$(PNGLIB_BASENAME)-config' libpng-config
|
||||||
|
|
||||||
|
uninstall-libpng-config:
|
||||||
|
rm -f '$(DESTDIR)$(bindir)/libpng-config'
|
||||||
|
|
||||||
|
if DO_INSTALL_LINKS
|
||||||
|
# If --enable-unversioned-links is specified the header and lib file links
|
||||||
|
# will be automatically made on a 'make install':
|
||||||
|
|
||||||
|
install-data-hook: install-header-links
|
||||||
|
uninstall-hook: uninstall-header-links
|
||||||
|
install-exec-hook: install-library-links
|
||||||
|
uninstall-hook: uninstall-library-links
|
||||||
|
endif
|
||||||
|
|
||||||
|
if DO_INSTALL_LIBPNG_PC
|
||||||
|
# Likewise, --install-pc causes libpng.pc to be constructed:
|
||||||
|
|
||||||
|
install-data-hook: install-libpng-pc
|
||||||
|
uninstall-hook: uninstall-libpng-pc
|
||||||
|
endif
|
||||||
|
|
||||||
|
if DO_INSTALL_LIBPNG_CONFIG
|
||||||
|
# And --install-config:
|
||||||
|
|
||||||
|
install-exec-hook: install-libpng-config
|
||||||
|
uninstall-hook: uninstall-libpng-config
|
||||||
|
endif
|
||||||
|
|
||||||
|
# The following addition ensures that 'make all' always builds the test programs
|
||||||
|
# too. It used to, but some change either in libpng or configure stopped this
|
||||||
|
# working.
|
||||||
|
all-am: $(check_PROGRAMS)
|
||||||
|
|||||||
1450
Makefile.in
61
README
@@ -1,11 +1,11 @@
|
|||||||
README for libpng version 1.5.7beta05 - November 18, 2011 (shared library 15.0)
|
README for libpng version 1.7.0beta64 - July 26, 2015 (shared library 17.0)
|
||||||
See the note about version numbers near the top of png.h
|
See the note about version numbers near the top of png.h
|
||||||
|
|
||||||
See INSTALL for instructions on how to install libpng.
|
See INSTALL for instructions on how to install libpng.
|
||||||
|
|
||||||
Libpng comes in several distribution formats. Get libpng-*.tar.gz,
|
Libpng comes in several distribution formats. Get libpng-*.tar.gz or
|
||||||
libpng-*.tar.xz or libpng-*.tar.bz2 if you want UNIX-style line endings
|
libpng-*.tar.xz or if you want UNIX-style line endings in the text files,
|
||||||
in the text files, or lpng*.zip if you want DOS-style line endings.
|
or lpng*.7z or lpng*.zip if you want DOS-style line endings.
|
||||||
|
|
||||||
Version 0.89 was the first official release of libpng. Don't let the
|
Version 0.89 was the first official release of libpng. Don't let the
|
||||||
fact that it's the first release fool you. The libpng library has been in
|
fact that it's the first release fool you. The libpng library has been in
|
||||||
@@ -23,18 +23,25 @@ earlier versions if you are using a shared library. The type of the
|
|||||||
png_uint_32, which will affect shared-library applications that use
|
png_uint_32, which will affect shared-library applications that use
|
||||||
this function.
|
this function.
|
||||||
|
|
||||||
To avoid problems with changes to the internals of png_info_struct,
|
To avoid problems with changes to the internals of png info_struct,
|
||||||
new APIs have been made available in 0.95 to avoid direct application
|
new APIs have been made available in 0.95 to avoid direct application
|
||||||
access to info_ptr. These functions are the png_set_<chunk> and
|
access to info_ptr. These functions are the png_set_<chunk> and
|
||||||
png_get_<chunk> functions. These functions should be used when
|
png_get_<chunk> functions. These functions should be used when
|
||||||
accessing/storing the info_struct data, rather than manipulating it
|
accessing/storing the info_struct data, rather than manipulating it
|
||||||
directly, to avoid such problems in the future.
|
directly, to avoid such problems in the future.
|
||||||
|
|
||||||
It is important to note that the APIs do not make current programs
|
It is important to note that the APIs did not make current programs
|
||||||
that access the info struct directly incompatible with the new
|
that access the info struct directly incompatible with the new
|
||||||
library. However, it is strongly suggested that new programs use
|
library, through libpng-1.2.x. In libpng-1.4.x, which was meant to
|
||||||
the new APIs (as shown in example.c and pngtest.c), and older programs
|
be a transitional release, members of the png_struct and the
|
||||||
be converted to the new format, to facilitate upgrades in the future.
|
info_struct can still be accessed, but the compiler will issue a
|
||||||
|
warning about deprecated usage. Since libpng-1.5.0, direct access
|
||||||
|
to these structs is not allowed, and the definitions of the structs
|
||||||
|
reside in private pngstruct.h and pnginfo.h header files that are not
|
||||||
|
accessible to applications. It is strongly suggested that new
|
||||||
|
programs use the new APIs (as shown in example.c and pngtest.c), and
|
||||||
|
older programs be converted to the new format, to facilitate upgrades
|
||||||
|
in the future.
|
||||||
****
|
****
|
||||||
|
|
||||||
Additions since 0.90 include the ability to compile libpng as a
|
Additions since 0.90 include the ability to compile libpng as a
|
||||||
@@ -77,17 +84,21 @@ compression library that is useful for more things than just PNG files.
|
|||||||
You can use zlib as a drop-in replacement for fread() and fwrite() if
|
You can use zlib as a drop-in replacement for fread() and fwrite() if
|
||||||
you are so inclined.
|
you are so inclined.
|
||||||
|
|
||||||
zlib should be available at the same place that libpng is, or at.
|
zlib should be available at the same place that libpng is, or at zlib.net.
|
||||||
ftp://ftp.info-zip.org/pub/infozip/zlib
|
|
||||||
|
|
||||||
You may also want a copy of the PNG specification. It is available
|
You may also want a copy of the PNG specification. It is available
|
||||||
as an RFC, a W3C Recommendation, and an ISO/IEC Standard. You can find
|
as an RFC, a W3C Recommendation, and an ISO/IEC Standard. You can find
|
||||||
these at http://www.libpng.org/pub/png/documents/
|
these at http://www.libpng.org/pub/png/documents/
|
||||||
|
|
||||||
This code is currently being archived at libpng.sf.net in the
|
This code is currently being archived at libpng.sf.net in the
|
||||||
[DOWNLOAD] area, and on CompuServe, Lib 20 (PNG SUPPORT)
|
[DOWNLOAD] area, and at ftp://ftp.simplesystems.org. If you can't find it
|
||||||
at GO GRAPHSUP. If you can't find it in any of those places,
|
in any of those places, e-mail me, and I'll help you find it.
|
||||||
e-mail me, and I'll help you find it.
|
|
||||||
|
I am not a lawyer, but I believe 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).
|
||||||
|
|
||||||
If you have any code changes, requests, problems, etc., please e-mail
|
If you have any code changes, requests, problems, etc., please e-mail
|
||||||
them to me. Also, I'd appreciate any make files or project files,
|
them to me. Also, I'd appreciate any make files or project files,
|
||||||
@@ -123,7 +134,7 @@ and ...". If in doubt, send questions to me. I'll bounce them
|
|||||||
to others, if necessary.
|
to others, if necessary.
|
||||||
|
|
||||||
Please do not send suggestions on how to change PNG. We have
|
Please do not send suggestions on how to change PNG. We have
|
||||||
been discussing PNG for sixteen years now, and it is official and
|
been discussing PNG for twenty years now, and it is official and
|
||||||
finished. If you have suggestions for libpng, however, I'll
|
finished. If you have suggestions for libpng, however, I'll
|
||||||
gladly listen. Even if your suggestion is not used immediately,
|
gladly listen. Even if your suggestion is not used immediately,
|
||||||
it may be used later.
|
it may be used later.
|
||||||
@@ -167,23 +178,25 @@ Files in this distribution:
|
|||||||
pngwrite.c => High-level write functions
|
pngwrite.c => High-level write functions
|
||||||
pngwtran.c => Write data transformations
|
pngwtran.c => Write data transformations
|
||||||
pngwutil.c => Write utility functions
|
pngwutil.c => Write utility functions
|
||||||
|
arm => Contains optimized code for the ARM platform
|
||||||
contrib => Contributions
|
contrib => Contributions
|
||||||
|
examples => Example programs
|
||||||
gregbook => source code for PNG reading and writing, from
|
gregbook => source code for PNG reading and writing, from
|
||||||
Greg Roelofs' "PNG: The Definitive Guide",
|
Greg Roelofs' "PNG: The Definitive Guide",
|
||||||
O'Reilly, 1999
|
O'Reilly, 1999
|
||||||
msvctest => Builds and runs pngtest using a MSVC workspace
|
libtests => Test programs
|
||||||
pngminus => Simple pnm2png and png2pnm programs
|
pngminim => Minimal decoder, encoder, and progressive decoder
|
||||||
pngsuite => Test images
|
programs demonstrating use of pngusr.dfa
|
||||||
visupng => Contains a MSVC workspace for VisualPng
|
pngminus => Simple pnm2png and png2pnm programs
|
||||||
|
pngsuite => Test images
|
||||||
|
tools => Various tools
|
||||||
|
visupng => Contains a MSVC workspace for VisualPng
|
||||||
projects => Contains project files and workspaces for
|
projects => Contains project files and workspaces for
|
||||||
building a DLL
|
building a DLL
|
||||||
cbuilder5 => Contains a Borland workspace for building
|
owatcom => Contains a WATCOM project for building libpng
|
||||||
libpng and zlib
|
|
||||||
visualc6 => Contains a Microsoft Visual C++ (MSVC)
|
|
||||||
workspace for building libpng and zlib
|
|
||||||
visualc71 => Contains a Microsoft Visual C++ (MSVC)
|
visualc71 => Contains a Microsoft Visual C++ (MSVC)
|
||||||
workspace for building libpng and zlib
|
workspace for building libpng and zlib
|
||||||
xcode => Contains an Apple xcode
|
vstudio => Contains a Microsoft Visual C++ (MSVC)
|
||||||
workspace for building libpng and zlib
|
workspace for building libpng and zlib
|
||||||
scripts => Directory containing scripts for building libpng:
|
scripts => Directory containing scripts for building libpng:
|
||||||
(see scripts/README.txt for the list of scripts)
|
(see scripts/README.txt for the list of scripts)
|
||||||
|
|||||||
2
TODO
@@ -6,10 +6,12 @@ Better C++ wrapper/full C++ implementation?
|
|||||||
Fix problem with C++ and EXTERN "C".
|
Fix problem with C++ and EXTERN "C".
|
||||||
cHRM transformation.
|
cHRM transformation.
|
||||||
Remove setjmp/longjmp usage in favor of returning error codes.
|
Remove setjmp/longjmp usage in favor of returning error codes.
|
||||||
|
Palette creation.
|
||||||
Add "grayscale->palette" transformation and "palette->grayscale" detection.
|
Add "grayscale->palette" transformation and "palette->grayscale" detection.
|
||||||
Improved dithering.
|
Improved dithering.
|
||||||
Multi-lingual error and warning message support.
|
Multi-lingual error and warning message support.
|
||||||
Complete sRGB transformation (presently it simply uses gamma=0.45455).
|
Complete sRGB transformation (presently it simply uses gamma=0.45455).
|
||||||
|
Make profile checking optional via a png_set_something() call.
|
||||||
Man pages for function calls.
|
Man pages for function calls.
|
||||||
Better documentation.
|
Better documentation.
|
||||||
Better filter selection
|
Better filter selection
|
||||||
|
|||||||
9465
aclocal.m4
vendored
135
arm/arm_init.c
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
|
||||||
|
/* arm_init.c - NEON optimised filter functions
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014 Glenn Randers-Pehrson
|
||||||
|
* Written by Mans Rullgard, 2011.
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
/* Below, after checking __linux__, various non-C90 POSIX 1003.1 functions are
|
||||||
|
* called.
|
||||||
|
*/
|
||||||
|
#define _POSIX_SOURCE 1
|
||||||
|
|
||||||
|
#include "../pngpriv.h"
|
||||||
|
#define PNG_SRC_FILE PNG_SRC_FILE_arm_arm_init
|
||||||
|
|
||||||
|
#ifdef PNG_READ_SUPPORTED
|
||||||
|
|
||||||
|
#if PNG_ARM_NEON_OPT > 0
|
||||||
|
#ifdef PNG_ARM_NEON_CHECK_SUPPORTED /* Do run-time checks */
|
||||||
|
/* WARNING: it is strongly recommended that you do not build libpng with
|
||||||
|
* run-time checks for CPU features if at all possible. In the case of the ARM
|
||||||
|
* NEON instructions there is no processor-specific way of detecting the
|
||||||
|
* presence of the required support, therefore run-time detection is extremely
|
||||||
|
* OS specific.
|
||||||
|
*
|
||||||
|
* You may set the macro PNG_ARM_NEON_FILE to the file name of file containing
|
||||||
|
* a fragment of C source code which defines the png_have_neon function. There
|
||||||
|
* are a number of implementations in contrib/arm-neon, but the only one that
|
||||||
|
* has partial support is contrib/arm-neon/linux.c - a generic Linux
|
||||||
|
* implementation which reads /proc/cpufino.
|
||||||
|
*/
|
||||||
|
#ifndef PNG_ARM_NEON_FILE
|
||||||
|
# ifdef __linux__
|
||||||
|
# define PNG_ARM_NEON_FILE "contrib/arm-neon/linux.c"
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef PNG_ARM_NEON_FILE
|
||||||
|
|
||||||
|
#include <signal.h> /* for sig_atomic_t */
|
||||||
|
static int png_have_neon(png_structp png_ptr);
|
||||||
|
#include PNG_ARM_NEON_FILE
|
||||||
|
|
||||||
|
#else /* PNG_ARM_NEON_FILE */
|
||||||
|
# error "PNG_ARM_NEON_FILE undefined: no support for run-time ARM NEON checks"
|
||||||
|
#endif /* PNG_ARM_NEON_FILE */
|
||||||
|
#endif /* PNG_ARM_NEON_CHECK_SUPPORTED */
|
||||||
|
|
||||||
|
#ifndef PNG_ALIGNED_MEMORY_SUPPORTED
|
||||||
|
# error "ALIGNED_MEMORY is required; set: -DPNG_ALIGNED_MEMORY_SUPPORTED"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void
|
||||||
|
png_init_filter_functions_neon(png_structp pp, unsigned int bpp)
|
||||||
|
{
|
||||||
|
/* The switch statement is compiled in for ARM_NEON_API, the call to
|
||||||
|
* png_have_neon is compiled in for ARM_NEON_CHECK. If both are defined
|
||||||
|
* the check is only performed if the API has not set the NEON option on
|
||||||
|
* or off explicitly. In this case the check controls what happens.
|
||||||
|
*
|
||||||
|
* If the CHECK is not compiled in and the option is UNSET the behavior prior
|
||||||
|
* to 1.6.7 was to use the NEON code - this was a bug caused by having the
|
||||||
|
* wrong order of the 'ON' and 'default' cases. UNSET now defaults to OFF,
|
||||||
|
* as documented in png.h
|
||||||
|
*/
|
||||||
|
#ifdef PNG_ARM_NEON_API_SUPPORTED
|
||||||
|
switch ((pp->options >> PNG_ARM_NEON) & 3)
|
||||||
|
{
|
||||||
|
case PNG_OPTION_UNSET:
|
||||||
|
/* Allow the run-time check to execute if it has been enabled -
|
||||||
|
* thus both API and CHECK can be turned on. If it isn't supported
|
||||||
|
* this case will fall through to the 'default' below, which just
|
||||||
|
* returns.
|
||||||
|
*/
|
||||||
|
#endif /* PNG_ARM_NEON_API_SUPPORTED */
|
||||||
|
#ifdef PNG_ARM_NEON_CHECK_SUPPORTED
|
||||||
|
{
|
||||||
|
static volatile sig_atomic_t no_neon = -1; /* not checked */
|
||||||
|
|
||||||
|
if (no_neon < 0)
|
||||||
|
no_neon = !png_have_neon(pp);
|
||||||
|
|
||||||
|
if (no_neon)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#ifdef PNG_ARM_NEON_API_SUPPORTED
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#endif /* PNG_ARM_NEON_CHECK_SUPPORTED */
|
||||||
|
|
||||||
|
#ifdef PNG_ARM_NEON_API_SUPPORTED
|
||||||
|
default: /* OFF or INVALID */
|
||||||
|
return;
|
||||||
|
|
||||||
|
case PNG_OPTION_ON:
|
||||||
|
/* Option turned on */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* IMPORTANT: any new external functions used here must be declared using
|
||||||
|
* PNG_INTERNAL_FUNCTION in ../pngpriv.h. This is required so that the
|
||||||
|
* 'prefix' option to configure works:
|
||||||
|
*
|
||||||
|
* ./configure --with-libpng-prefix=foobar_
|
||||||
|
*
|
||||||
|
* Verify you have got this right by running the above command, doing a build
|
||||||
|
* and examining pngprefix.h; it must contain a #define for every external
|
||||||
|
* function you add. (Notice that this happens automatically for the
|
||||||
|
* initialization function.)
|
||||||
|
*/
|
||||||
|
pp->read_filter[PNG_FILTER_VALUE_UP-1] = png_read_filter_row_up_neon;
|
||||||
|
|
||||||
|
if (bpp == 3)
|
||||||
|
{
|
||||||
|
pp->read_filter[PNG_FILTER_VALUE_SUB-1] = png_read_filter_row_sub3_neon;
|
||||||
|
pp->read_filter[PNG_FILTER_VALUE_AVG-1] = png_read_filter_row_avg3_neon;
|
||||||
|
pp->read_filter[PNG_FILTER_VALUE_PAETH-1] =
|
||||||
|
png_read_filter_row_paeth3_neon;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (bpp == 4)
|
||||||
|
{
|
||||||
|
pp->read_filter[PNG_FILTER_VALUE_SUB-1] = png_read_filter_row_sub4_neon;
|
||||||
|
pp->read_filter[PNG_FILTER_VALUE_AVG-1] = png_read_filter_row_avg4_neon;
|
||||||
|
pp->read_filter[PNG_FILTER_VALUE_PAETH-1] =
|
||||||
|
png_read_filter_row_paeth4_neon;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* PNG_ARM_NEON_OPT > 0 */
|
||||||
|
#endif /* READ */
|
||||||
@@ -1,18 +1,36 @@
|
|||||||
|
|
||||||
/* filter_neon.S - NEON optimised filter functions
|
/* filter_neon.S - NEON optimised filter functions
|
||||||
*
|
*
|
||||||
* Copyright (c) 2011 Glenn Randers-Pehrson
|
* Copyright (c) 2014 Glenn Randers-Pehrson
|
||||||
* Written by Mans Rullgard, 2011.
|
* Written by Mans Rullgard, 2011.
|
||||||
|
* Last changed in libpng 1.6.16 [(PENDING RELEASE)]
|
||||||
*
|
*
|
||||||
* This code is released under the libpng license.
|
* This code is released under the libpng license.
|
||||||
* For conditions of distribution and use, see the disclaimer
|
* For conditions of distribution and use, see the disclaimer
|
||||||
* and license in png.h
|
* and license in png.h
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* This is required to get the symbol renames, which are #defines, and the
|
||||||
|
* definitions (or not) of PNG_ARM_NEON_OPT and PNG_ARM_NEON_IMPLEMENTATION.
|
||||||
|
*/
|
||||||
|
#define PNG_VERSION_INFO_ONLY
|
||||||
|
#include "../pngpriv.h"
|
||||||
|
|
||||||
#if defined(__linux__) && defined(__ELF__)
|
#if defined(__linux__) && defined(__ELF__)
|
||||||
.section .note.GNU-stack,"",%progbits /* mark stack as non-executable */
|
.section .note.GNU-stack,"",%progbits /* mark stack as non-executable */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef PNG_READ_SUPPORTED
|
||||||
|
|
||||||
|
/* Assembler NEON support - only works for 32-bit ARM (i.e. it does not work for
|
||||||
|
* ARM64). The code in arm/filter_neon_intrinsics.c supports ARM64, however it
|
||||||
|
* only works if -mfpu=neon is specified on the GCC command line. See pngpriv.h
|
||||||
|
* for the logic which sets PNG_USE_ARM_NEON_ASM:
|
||||||
|
*/
|
||||||
|
#if PNG_ARM_NEON_IMPLEMENTATION == 2 /* hand-coded assembler */
|
||||||
|
|
||||||
|
#if PNG_ARM_NEON_OPT > 0
|
||||||
|
|
||||||
#ifdef __ELF__
|
#ifdef __ELF__
|
||||||
# define ELF
|
# define ELF
|
||||||
#else
|
#else
|
||||||
@@ -29,6 +47,13 @@ ELF .size \name, . - \name
|
|||||||
.purgem endfunc
|
.purgem endfunc
|
||||||
.endm
|
.endm
|
||||||
.text
|
.text
|
||||||
|
|
||||||
|
/* Explicitly specifying alignment here because some versions of
|
||||||
|
* GAS don't align code correctly. This is harmless in correctly
|
||||||
|
* written versions of GAS.
|
||||||
|
*/
|
||||||
|
.align 2
|
||||||
|
|
||||||
.if \export
|
.if \export
|
||||||
.global \name
|
.global \name
|
||||||
.endif
|
.endif
|
||||||
@@ -223,3 +248,6 @@ func png_read_filter_row_paeth3_neon, export=1
|
|||||||
|
|
||||||
pop {r4,pc}
|
pop {r4,pc}
|
||||||
endfunc
|
endfunc
|
||||||
|
#endif /* PNG_ARM_NEON_OPT > 0 */
|
||||||
|
#endif /* PNG_ARM_NEON_IMPLEMENTATION == 2 (assembler) */
|
||||||
|
#endif /* READ */
|
||||||
|
|||||||
374
arm/filter_neon_intrinsics.c
Normal file
@@ -0,0 +1,374 @@
|
|||||||
|
|
||||||
|
/* filter_neon_intrinsics.c - NEON optimised filter functions
|
||||||
|
*
|
||||||
|
* 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.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"
|
||||||
|
#define PNG_SRC_FILE PNG_SRC_FILE_arm_filter_neon_intrinsics
|
||||||
|
|
||||||
|
#ifdef PNG_READ_SUPPORTED
|
||||||
|
|
||||||
|
/* This code requires -mfpu=neon on the command line: */
|
||||||
|
#if PNG_ARM_NEON_IMPLEMENTATION == 1 /* intrinsics code from pngpriv.h */
|
||||||
|
|
||||||
|
#include <arm_neon.h>
|
||||||
|
|
||||||
|
/* libpng row pointers are not necessarily aligned to any particular boundary,
|
||||||
|
* however this code will only work with appropriate alignment. arm/arm_init.c
|
||||||
|
* checks for this (and will not compile unless it is done). This code uses
|
||||||
|
* variants of png_aligncast to avoid compiler warnings.
|
||||||
|
*/
|
||||||
|
#define png_ptr(type,pointer) png_aligncast(type *,pointer)
|
||||||
|
#define png_ptrc(type,pointer) png_aligncastconst(const type *,pointer)
|
||||||
|
|
||||||
|
/* The following relies on a variable 'temp_pointer' being declared with type
|
||||||
|
* 'type'. This is written this way just to hide the GCC strict aliasing
|
||||||
|
* warning; note that the code is safe because there never is an alias between
|
||||||
|
* the input and output pointers.
|
||||||
|
*/
|
||||||
|
#define png_ldr(type,pointer)\
|
||||||
|
(temp_pointer = png_ptr(type,pointer), *temp_pointer)
|
||||||
|
|
||||||
|
#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_bytep rp = row;
|
||||||
|
png_bytep rp_stop = row + row_info->rowbytes;
|
||||||
|
png_const_bytep pp = prev_row;
|
||||||
|
|
||||||
|
for (; rp < rp_stop; rp += 16, pp += 16)
|
||||||
|
{
|
||||||
|
uint8x16_t qrp, qpp;
|
||||||
|
|
||||||
|
qrp = vld1q_u8(rp);
|
||||||
|
qpp = vld1q_u8(pp);
|
||||||
|
qrp = vaddq_u8(qrp, qpp);
|
||||||
|
vst1q_u8(rp, qrp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
png_read_filter_row_sub3_neon(png_row_infop row_info, png_bytep row,
|
||||||
|
png_const_bytep prev_row)
|
||||||
|
{
|
||||||
|
png_bytep rp = row;
|
||||||
|
png_bytep rp_stop = row + row_info->rowbytes;
|
||||||
|
|
||||||
|
uint8x16_t vtmp = vld1q_u8(rp);
|
||||||
|
uint8x8x2_t *vrpt = png_ptr(uint8x8x2_t, &vtmp);
|
||||||
|
uint8x8x2_t vrp = *vrpt;
|
||||||
|
|
||||||
|
uint8x8x4_t vdest;
|
||||||
|
vdest.val[3] = vdup_n_u8(0);
|
||||||
|
|
||||||
|
for (; rp < rp_stop;)
|
||||||
|
{
|
||||||
|
uint8x8_t vtmp1, vtmp2;
|
||||||
|
uint32x2_t *temp_pointer;
|
||||||
|
|
||||||
|
vtmp1 = vext_u8(vrp.val[0], vrp.val[1], 3);
|
||||||
|
vdest.val[0] = vadd_u8(vdest.val[3], vrp.val[0]);
|
||||||
|
vtmp2 = vext_u8(vrp.val[0], vrp.val[1], 6);
|
||||||
|
vdest.val[1] = vadd_u8(vdest.val[0], vtmp1);
|
||||||
|
|
||||||
|
vtmp1 = vext_u8(vrp.val[1], vrp.val[1], 1);
|
||||||
|
vdest.val[2] = vadd_u8(vdest.val[1], vtmp2);
|
||||||
|
vdest.val[3] = vadd_u8(vdest.val[2], vtmp1);
|
||||||
|
|
||||||
|
vtmp = vld1q_u8(rp + 12);
|
||||||
|
vrpt = png_ptr(uint8x8x2_t, &vtmp);
|
||||||
|
vrp = *vrpt;
|
||||||
|
|
||||||
|
vst1_lane_u32(png_ptr(uint32_t,rp), png_ldr(uint32x2_t,&vdest.val[0]), 0);
|
||||||
|
rp += 3;
|
||||||
|
vst1_lane_u32(png_ptr(uint32_t,rp), png_ldr(uint32x2_t,&vdest.val[1]), 0);
|
||||||
|
rp += 3;
|
||||||
|
vst1_lane_u32(png_ptr(uint32_t,rp), png_ldr(uint32x2_t,&vdest.val[2]), 0);
|
||||||
|
rp += 3;
|
||||||
|
vst1_lane_u32(png_ptr(uint32_t,rp), png_ldr(uint32x2_t,&vdest.val[3]), 0);
|
||||||
|
rp += 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
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_bytep rp = row;
|
||||||
|
png_bytep rp_stop = row + row_info->rowbytes;
|
||||||
|
|
||||||
|
uint8x8x4_t vdest;
|
||||||
|
vdest.val[3] = vdup_n_u8(0);
|
||||||
|
|
||||||
|
for (; rp < rp_stop; rp += 16)
|
||||||
|
{
|
||||||
|
uint32x2x4_t vtmp = vld4_u32(png_ptr(uint32_t,rp));
|
||||||
|
uint8x8x4_t *vrpt = png_ptr(uint8x8x4_t,&vtmp);
|
||||||
|
uint8x8x4_t vrp = *vrpt;
|
||||||
|
uint32x2x4_t *temp_pointer;
|
||||||
|
|
||||||
|
vdest.val[0] = vadd_u8(vdest.val[3], vrp.val[0]);
|
||||||
|
vdest.val[1] = vadd_u8(vdest.val[0], vrp.val[1]);
|
||||||
|
vdest.val[2] = vadd_u8(vdest.val[1], vrp.val[2]);
|
||||||
|
vdest.val[3] = vadd_u8(vdest.val[2], vrp.val[3]);
|
||||||
|
vst4_lane_u32(png_ptr(uint32_t,rp), png_ldr(uint32x2x4_t,&vdest), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
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_bytep rp = row;
|
||||||
|
png_const_bytep pp = prev_row;
|
||||||
|
png_bytep rp_stop = row + row_info->rowbytes;
|
||||||
|
|
||||||
|
uint8x16_t vtmp;
|
||||||
|
uint8x8x2_t *vrpt;
|
||||||
|
uint8x8x2_t vrp;
|
||||||
|
uint8x8x4_t vdest;
|
||||||
|
vdest.val[3] = vdup_n_u8(0);
|
||||||
|
|
||||||
|
vtmp = vld1q_u8(rp);
|
||||||
|
vrpt = png_ptr(uint8x8x2_t,&vtmp);
|
||||||
|
vrp = *vrpt;
|
||||||
|
|
||||||
|
for (; rp < rp_stop; pp += 12)
|
||||||
|
{
|
||||||
|
uint8x8_t vtmp1, vtmp2, vtmp3;
|
||||||
|
|
||||||
|
uint8x8x2_t *vppt;
|
||||||
|
uint8x8x2_t vpp;
|
||||||
|
|
||||||
|
uint32x2_t *temp_pointer;
|
||||||
|
|
||||||
|
vtmp = vld1q_u8(pp);
|
||||||
|
vppt = png_ptr(uint8x8x2_t,&vtmp);
|
||||||
|
vpp = *vppt;
|
||||||
|
|
||||||
|
vtmp1 = vext_u8(vrp.val[0], vrp.val[1], 3);
|
||||||
|
vdest.val[0] = vhadd_u8(vdest.val[3], vpp.val[0]);
|
||||||
|
vdest.val[0] = vadd_u8(vdest.val[0], vrp.val[0]);
|
||||||
|
|
||||||
|
vtmp2 = vext_u8(vpp.val[0], vpp.val[1], 3);
|
||||||
|
vtmp3 = vext_u8(vrp.val[0], vrp.val[1], 6);
|
||||||
|
vdest.val[1] = vhadd_u8(vdest.val[0], vtmp2);
|
||||||
|
vdest.val[1] = vadd_u8(vdest.val[1], vtmp1);
|
||||||
|
|
||||||
|
vtmp2 = vext_u8(vpp.val[0], vpp.val[1], 6);
|
||||||
|
vtmp1 = vext_u8(vrp.val[1], vrp.val[1], 1);
|
||||||
|
|
||||||
|
vtmp = vld1q_u8(rp + 12);
|
||||||
|
vrpt = png_ptr(uint8x8x2_t,&vtmp);
|
||||||
|
vrp = *vrpt;
|
||||||
|
|
||||||
|
vdest.val[2] = vhadd_u8(vdest.val[1], vtmp2);
|
||||||
|
vdest.val[2] = vadd_u8(vdest.val[2], vtmp3);
|
||||||
|
|
||||||
|
vtmp2 = vext_u8(vpp.val[1], vpp.val[1], 1);
|
||||||
|
|
||||||
|
vdest.val[3] = vhadd_u8(vdest.val[2], vtmp2);
|
||||||
|
vdest.val[3] = vadd_u8(vdest.val[3], vtmp1);
|
||||||
|
|
||||||
|
vst1_lane_u32(png_ptr(uint32_t,rp), png_ldr(uint32x2_t,&vdest.val[0]), 0);
|
||||||
|
rp += 3;
|
||||||
|
vst1_lane_u32(png_ptr(uint32_t,rp), png_ldr(uint32x2_t,&vdest.val[1]), 0);
|
||||||
|
rp += 3;
|
||||||
|
vst1_lane_u32(png_ptr(uint32_t,rp), png_ldr(uint32x2_t,&vdest.val[2]), 0);
|
||||||
|
rp += 3;
|
||||||
|
vst1_lane_u32(png_ptr(uint32_t,rp), png_ldr(uint32x2_t,&vdest.val[3]), 0);
|
||||||
|
rp += 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
png_read_filter_row_avg4_neon(png_row_infop row_info, png_bytep row,
|
||||||
|
png_const_bytep prev_row)
|
||||||
|
{
|
||||||
|
png_bytep rp = row;
|
||||||
|
png_bytep rp_stop = row + row_info->rowbytes;
|
||||||
|
png_const_bytep pp = prev_row;
|
||||||
|
|
||||||
|
uint8x8x4_t vdest;
|
||||||
|
vdest.val[3] = vdup_n_u8(0);
|
||||||
|
|
||||||
|
for (; rp < rp_stop; rp += 16, pp += 16)
|
||||||
|
{
|
||||||
|
uint32x2x4_t vtmp;
|
||||||
|
uint8x8x4_t *vrpt, *vppt;
|
||||||
|
uint8x8x4_t vrp, vpp;
|
||||||
|
uint32x2x4_t *temp_pointer;
|
||||||
|
|
||||||
|
vtmp = vld4_u32(png_ptr(uint32_t,rp));
|
||||||
|
vrpt = png_ptr(uint8x8x4_t,&vtmp);
|
||||||
|
vrp = *vrpt;
|
||||||
|
vtmp = vld4_u32(png_ptrc(uint32_t,pp));
|
||||||
|
vppt = png_ptr(uint8x8x4_t,&vtmp);
|
||||||
|
vpp = *vppt;
|
||||||
|
|
||||||
|
vdest.val[0] = vhadd_u8(vdest.val[3], vpp.val[0]);
|
||||||
|
vdest.val[0] = vadd_u8(vdest.val[0], vrp.val[0]);
|
||||||
|
vdest.val[1] = vhadd_u8(vdest.val[0], vpp.val[1]);
|
||||||
|
vdest.val[1] = vadd_u8(vdest.val[1], vrp.val[1]);
|
||||||
|
vdest.val[2] = vhadd_u8(vdest.val[1], vpp.val[2]);
|
||||||
|
vdest.val[2] = vadd_u8(vdest.val[2], vrp.val[2]);
|
||||||
|
vdest.val[3] = vhadd_u8(vdest.val[2], vpp.val[3]);
|
||||||
|
vdest.val[3] = vadd_u8(vdest.val[3], vrp.val[3]);
|
||||||
|
|
||||||
|
vst4_lane_u32(png_ptr(uint32_t,rp), png_ldr(uint32x2x4_t,&vdest), 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint8x8_t
|
||||||
|
paeth(uint8x8_t a, uint8x8_t b, uint8x8_t c)
|
||||||
|
{
|
||||||
|
uint8x8_t d, e;
|
||||||
|
uint16x8_t p1, pa, pb, pc;
|
||||||
|
|
||||||
|
p1 = vaddl_u8(a, b); /* a + b */
|
||||||
|
pc = vaddl_u8(c, c); /* c * 2 */
|
||||||
|
pa = vabdl_u8(b, c); /* pa */
|
||||||
|
pb = vabdl_u8(a, c); /* pb */
|
||||||
|
pc = vabdq_u16(p1, pc); /* pc */
|
||||||
|
|
||||||
|
p1 = vcleq_u16(pa, pb); /* pa <= pb */
|
||||||
|
pa = vcleq_u16(pa, pc); /* pa <= pc */
|
||||||
|
pb = vcleq_u16(pb, pc); /* pb <= pc */
|
||||||
|
|
||||||
|
p1 = vandq_u16(p1, pa); /* pa <= pb && pa <= pc */
|
||||||
|
|
||||||
|
d = vmovn_u16(pb);
|
||||||
|
e = vmovn_u16(p1);
|
||||||
|
|
||||||
|
d = vbsl_u8(d, b, c);
|
||||||
|
e = vbsl_u8(e, a, d);
|
||||||
|
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
png_read_filter_row_paeth3_neon(png_row_infop row_info, 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;
|
||||||
|
|
||||||
|
uint8x16_t vtmp;
|
||||||
|
uint8x8x2_t *vrpt;
|
||||||
|
uint8x8x2_t vrp;
|
||||||
|
uint8x8_t vlast = vdup_n_u8(0);
|
||||||
|
uint8x8x4_t vdest;
|
||||||
|
vdest.val[3] = vdup_n_u8(0);
|
||||||
|
|
||||||
|
vtmp = vld1q_u8(rp);
|
||||||
|
vrpt = png_ptr(uint8x8x2_t,&vtmp);
|
||||||
|
vrp = *vrpt;
|
||||||
|
|
||||||
|
for (; rp < rp_stop; pp += 12)
|
||||||
|
{
|
||||||
|
uint8x8x2_t *vppt;
|
||||||
|
uint8x8x2_t vpp;
|
||||||
|
uint8x8_t vtmp1, vtmp2, vtmp3;
|
||||||
|
uint32x2_t *temp_pointer;
|
||||||
|
|
||||||
|
vtmp = vld1q_u8(pp);
|
||||||
|
vppt = png_ptr(uint8x8x2_t,&vtmp);
|
||||||
|
vpp = *vppt;
|
||||||
|
|
||||||
|
vdest.val[0] = paeth(vdest.val[3], vpp.val[0], vlast);
|
||||||
|
vdest.val[0] = vadd_u8(vdest.val[0], vrp.val[0]);
|
||||||
|
|
||||||
|
vtmp1 = vext_u8(vrp.val[0], vrp.val[1], 3);
|
||||||
|
vtmp2 = vext_u8(vpp.val[0], vpp.val[1], 3);
|
||||||
|
vdest.val[1] = paeth(vdest.val[0], vtmp2, vpp.val[0]);
|
||||||
|
vdest.val[1] = vadd_u8(vdest.val[1], vtmp1);
|
||||||
|
|
||||||
|
vtmp1 = vext_u8(vrp.val[0], vrp.val[1], 6);
|
||||||
|
vtmp3 = vext_u8(vpp.val[0], vpp.val[1], 6);
|
||||||
|
vdest.val[2] = paeth(vdest.val[1], vtmp3, vtmp2);
|
||||||
|
vdest.val[2] = vadd_u8(vdest.val[2], vtmp1);
|
||||||
|
|
||||||
|
vtmp1 = vext_u8(vrp.val[1], vrp.val[1], 1);
|
||||||
|
vtmp2 = vext_u8(vpp.val[1], vpp.val[1], 1);
|
||||||
|
|
||||||
|
vtmp = vld1q_u8(rp + 12);
|
||||||
|
vrpt = png_ptr(uint8x8x2_t,&vtmp);
|
||||||
|
vrp = *vrpt;
|
||||||
|
|
||||||
|
vdest.val[3] = paeth(vdest.val[2], vtmp2, vtmp3);
|
||||||
|
vdest.val[3] = vadd_u8(vdest.val[3], vtmp1);
|
||||||
|
|
||||||
|
vlast = vtmp2;
|
||||||
|
|
||||||
|
vst1_lane_u32(png_ptr(uint32_t,rp), png_ldr(uint32x2_t,&vdest.val[0]), 0);
|
||||||
|
rp += 3;
|
||||||
|
vst1_lane_u32(png_ptr(uint32_t,rp), png_ldr(uint32x2_t,&vdest.val[1]), 0);
|
||||||
|
rp += 3;
|
||||||
|
vst1_lane_u32(png_ptr(uint32_t,rp), png_ldr(uint32x2_t,&vdest.val[2]), 0);
|
||||||
|
rp += 3;
|
||||||
|
vst1_lane_u32(png_ptr(uint32_t,rp), png_ldr(uint32x2_t,&vdest.val[3]), 0);
|
||||||
|
rp += 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
png_read_filter_row_paeth4_neon(png_row_infop row_info, png_bytep row,
|
||||||
|
png_const_bytep prev_row)
|
||||||
|
{
|
||||||
|
png_bytep rp = row;
|
||||||
|
png_bytep rp_stop = row + row_info->rowbytes;
|
||||||
|
png_const_bytep pp = prev_row;
|
||||||
|
|
||||||
|
uint8x8_t vlast = vdup_n_u8(0);
|
||||||
|
uint8x8x4_t vdest;
|
||||||
|
vdest.val[3] = vdup_n_u8(0);
|
||||||
|
|
||||||
|
for (; rp < rp_stop; rp += 16, pp += 16)
|
||||||
|
{
|
||||||
|
uint32x2x4_t vtmp;
|
||||||
|
uint8x8x4_t *vrpt, *vppt;
|
||||||
|
uint8x8x4_t vrp, vpp;
|
||||||
|
uint32x2x4_t *temp_pointer;
|
||||||
|
|
||||||
|
vtmp = vld4_u32(png_ptr(uint32_t,rp));
|
||||||
|
vrpt = png_ptr(uint8x8x4_t,&vtmp);
|
||||||
|
vrp = *vrpt;
|
||||||
|
vtmp = vld4_u32(png_ptrc(uint32_t,pp));
|
||||||
|
vppt = png_ptr(uint8x8x4_t,&vtmp);
|
||||||
|
vpp = *vppt;
|
||||||
|
|
||||||
|
vdest.val[0] = paeth(vdest.val[3], vpp.val[0], vlast);
|
||||||
|
vdest.val[0] = vadd_u8(vdest.val[0], vrp.val[0]);
|
||||||
|
vdest.val[1] = paeth(vdest.val[0], vpp.val[1], vpp.val[0]);
|
||||||
|
vdest.val[1] = vadd_u8(vdest.val[1], vrp.val[1]);
|
||||||
|
vdest.val[2] = paeth(vdest.val[1], vpp.val[2], vpp.val[1]);
|
||||||
|
vdest.val[2] = vadd_u8(vdest.val[2], vrp.val[2]);
|
||||||
|
vdest.val[3] = paeth(vdest.val[2], vpp.val[3], vpp.val[2]);
|
||||||
|
vdest.val[3] = vadd_u8(vdest.val[3], vrp.val[3]);
|
||||||
|
|
||||||
|
vlast = vpp.val[3];
|
||||||
|
|
||||||
|
vst4_lane_u32(png_ptr(uint32_t,rp), png_ldr(uint32x2x4_t,&vdest), 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* PNG_ARM_NEON_OPT > 0 */
|
||||||
|
#endif /* PNG_ARM_NEON_IMPLEMENTATION == 1 (intrinsics) */
|
||||||
|
#endif /* READ */
|
||||||
251
autogen.sh
@@ -1,34 +1,225 @@
|
|||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
# a quick hack script to generate necessary files from
|
|
||||||
# auto* tools.
|
|
||||||
#
|
#
|
||||||
# WARNING: if you run this you will change the versions
|
# Run 'autoreconf' to build 'configure', 'Makefile.in' and other configure
|
||||||
# of the tools which are used and, maybe, required!
|
# control files.
|
||||||
|
#
|
||||||
|
# The first time this is run on a GIT checkout the only files that exist are
|
||||||
|
# configure.ac and Makefile.am; all of the autotools support scripts are
|
||||||
|
# missing. They are instantiated with autoreconf --force --install.
|
||||||
|
#
|
||||||
|
# For regular ("tarball") distributions all the files should exist. We do not
|
||||||
|
# want them to be updated *under any circumstances*. It should never be
|
||||||
|
# necessary to run autogen.sh because ./configure --enable-maintainer-mode says
|
||||||
|
# what to do if Makefile.am or configure.ac are changed.
|
||||||
|
#
|
||||||
|
# It is *probably* OK to update the files on a GIT checkout, because they have
|
||||||
|
# come from the local tools, but leave that to the user who is assumed to know
|
||||||
|
# whether it is ok or required.
|
||||||
|
#
|
||||||
|
# This script is intended to work without arguments, there are, however, hidden
|
||||||
|
# arguments (a) for use while testing the script and (b) to fix up systems that
|
||||||
|
# have been broken. If (b) is required the script prompts for the correct
|
||||||
|
# options. For this reason the options are *NOT* documented in the help; this
|
||||||
|
# is deliberate; UTSL.
|
||||||
|
#
|
||||||
|
clean=
|
||||||
|
maintainer=
|
||||||
|
while test $# -gt 0
|
||||||
|
do
|
||||||
|
case "$1" in
|
||||||
|
--maintainer)
|
||||||
|
maintainer=1;;
|
||||||
|
|
||||||
# You can define your own replacements in your environment.
|
--clean)
|
||||||
# $AUTOCONF, $AUTOMAKE, $AUTOHEADER, $AUTOPOINT, $ACLOCAL and $LIBTOOLIZE
|
clean=1;;
|
||||||
|
|
||||||
touch Makefile.am configure.ac
|
*)
|
||||||
{
|
exec >&2
|
||||||
LT=${LIBTOOLIZE-libtoolize}
|
echo "$0: usage: ./autogen.sh"
|
||||||
echo "running $LT" >&2
|
if test -d .git
|
||||||
$LT --force --copy --automake
|
then
|
||||||
} && {
|
echo " ./autogen.sh generates the configure script and"
|
||||||
AL=${ACLOCAL-aclocal}
|
echo " Makefile.in, or refreshes them after changes to Makefile.am"
|
||||||
echo "running $AL" >&2
|
echo " or configure.ac. You may prefer to just run autoreconf."
|
||||||
$AL
|
elif test -z "$maintainer"
|
||||||
} && {
|
then
|
||||||
AH=${AUTOHEADER-autoheader}
|
echo " DO NOT RUN THIS SCRIPT."
|
||||||
echo "running $AH [ignore the warnings]" >&2
|
echo " If you need to change Makefile.am or configure.ac then you"
|
||||||
$AH
|
echo " also need to run ./configure --enable-maintainer-mode and"
|
||||||
} && {
|
echo " use the appropriate autotools, *NOT* this script, to update"
|
||||||
AM=${AUTOMAKE-automake}
|
echo " everything, please check the documentation of autoreconf."
|
||||||
echo "running $AM" >&2
|
echo " WARNING: libpng is intentionally generated with a known,"
|
||||||
$AM --force-missing --foreign -a -c
|
echo " fixed, set of autotools. It is known *NOT* to work with"
|
||||||
} && {
|
echo " the collection of autotools distributed on highly reputable"
|
||||||
AC=${AUTOCONF-autoconf}
|
echo " operating systems."
|
||||||
echo "running $AC" >&2
|
echo " Remember: autotools is GNU software, you are expected to"
|
||||||
$AC
|
echo " pay for support."
|
||||||
} &&
|
else
|
||||||
echo "autogen complete" >&2 ||
|
echo " You have run autogen.sh with --maintainer enabled and you"
|
||||||
echo "ERROR: autogen.sh failed, autogen is incomplete" >&2
|
echo " are not using a GIT distribution, then you have given an"
|
||||||
|
echo " unrecognized argument. This is not good. --maintainer"
|
||||||
|
echo " switches off any assumptions that you might not know what"
|
||||||
|
echo " you are doing."
|
||||||
|
fi
|
||||||
|
exit 1;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
#
|
||||||
|
# First check for a set of the autotools files; if absent then this is assumed
|
||||||
|
# to be a GIT version and the local autotools must be used. If present this
|
||||||
|
# is a tarball distribution and the script should not be used. If partially
|
||||||
|
# present bad things are happening.
|
||||||
|
#
|
||||||
|
# The autotools generated files:
|
||||||
|
libpng_autotools_files="Makefile.in aclocal.m4 config.guess config.h.in
|
||||||
|
config.h.in~ config.sub configure depcomp install-sh ltmain.sh missing\
|
||||||
|
test-driver"
|
||||||
|
#
|
||||||
|
# Files generated by versions of configue >2.68 or automake >1.13 (i.e. later
|
||||||
|
# versions than those required by configure.ac):
|
||||||
|
libpng_autotools_extra="compile"
|
||||||
|
#
|
||||||
|
# These are separate because 'maintainer-clean' does not remove them.
|
||||||
|
libpng_libtool_files="scripts/libtool.m4 scripts/ltoptions.m4\
|
||||||
|
scripts/ltsugar.m4 scripts/ltversion.m4 scripts/lt~obsolete.m4"
|
||||||
|
|
||||||
|
libpng_autotools_dirs="autom4te.cache" # not required
|
||||||
|
#
|
||||||
|
# The configure generated files:
|
||||||
|
libpng_configure_files="Makefile config.h config.log config.status\
|
||||||
|
libpng-config libpng.pc libtool stamp-h1"
|
||||||
|
|
||||||
|
libpng_configure_dirs=".deps"
|
||||||
|
#
|
||||||
|
# We must remove the configure generated files as well as the autotools
|
||||||
|
# generated files if autotools are regenerated because otherwise if configure
|
||||||
|
# has been run without "--enable-maintainer-mode" make can do a partial update
|
||||||
|
# of Makefile. These functions do the two bits of cleaning.
|
||||||
|
clean_autotools(){
|
||||||
|
rm -rf $libpng_autotools_files $libpng_libtool_files $libpng_autotools_dirs
|
||||||
|
rm -rf $libpng_autotools_extra
|
||||||
|
}
|
||||||
|
|
||||||
|
clean_configure(){
|
||||||
|
rm -rf $libpng_configure_files $libpng_configure_dirs
|
||||||
|
}
|
||||||
|
#
|
||||||
|
# Clean: remove everything (this is to help with testing)
|
||||||
|
if test -n "$clean"
|
||||||
|
then
|
||||||
|
clean_configure
|
||||||
|
if test -n "$maintainer"
|
||||||
|
then
|
||||||
|
clean_autotools
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
#
|
||||||
|
# Validate the distribution.
|
||||||
|
libpng_autotools_file_found=
|
||||||
|
libpng_autotools_file_missing=
|
||||||
|
for file in $libpng_autotools_files
|
||||||
|
do
|
||||||
|
if test -f "$file"
|
||||||
|
then
|
||||||
|
libpng_autotools_file_found=1
|
||||||
|
else
|
||||||
|
libpng_autotools_file_missing=1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
#
|
||||||
|
# Presence of one of these does not *invalidate* missing, but absence
|
||||||
|
# invalidates found.
|
||||||
|
for file in $libpng_libtool_files
|
||||||
|
do
|
||||||
|
if test ! -f "$file"
|
||||||
|
then
|
||||||
|
libpng_autotools_file_missing=1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
#
|
||||||
|
# The cache directory doesn't matter - it will be regenerated and does not exist
|
||||||
|
# anyway in a tarball.
|
||||||
|
#
|
||||||
|
# Either everything is missing or everything is there, the --maintainer option
|
||||||
|
# just changes this so that the mode is set to generate all the files.
|
||||||
|
mode=
|
||||||
|
if test -z "$libpng_autotools_file_found" -o -n "$maintainer"
|
||||||
|
then
|
||||||
|
mode="autoreconf"
|
||||||
|
else
|
||||||
|
if test -n "$libpng_autotools_file_missing"
|
||||||
|
then
|
||||||
|
mode="broken"
|
||||||
|
else
|
||||||
|
mode="configure"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
#
|
||||||
|
# So:
|
||||||
|
case "$mode" in
|
||||||
|
autoreconf)
|
||||||
|
# Clean in case configure files exist
|
||||||
|
clean_configure
|
||||||
|
clean_autotools
|
||||||
|
# Everything must be initialized, so use --force
|
||||||
|
if autoreconf --warnings=all --force --install
|
||||||
|
then
|
||||||
|
missing=
|
||||||
|
for file in $libpng_autotools_files
|
||||||
|
do
|
||||||
|
test -f "$file" || missing=1
|
||||||
|
done
|
||||||
|
# ignore the cache directory
|
||||||
|
test -z "$missing" || {
|
||||||
|
exec >&2
|
||||||
|
echo "autoreconf was run, but did not produce all the expected"
|
||||||
|
echo "files. It is likely that your autotools installation is"
|
||||||
|
echo "not compatible with that expected by libpng."
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
else
|
||||||
|
exec >&2
|
||||||
|
echo "autoreconf failed: your version of autotools is incompatible"
|
||||||
|
echo "with this libpng version. Please use a distributed archive"
|
||||||
|
echo "(which includes the autotools generated files) and run configure"
|
||||||
|
echo "instead."
|
||||||
|
exit 1
|
||||||
|
fi;;
|
||||||
|
|
||||||
|
configure)
|
||||||
|
if test -d .git
|
||||||
|
then
|
||||||
|
exec >&2
|
||||||
|
echo "ERROR: running autoreconf on an initialized sytem"
|
||||||
|
echo " This is not necessary; it is only necessary to remake the"
|
||||||
|
echo " autotools generated files if Makefile.am or configure.ac"
|
||||||
|
echo " change and make does the right thing with:"
|
||||||
|
echo
|
||||||
|
echo " ./configure --enable-maintainer-mode."
|
||||||
|
echo
|
||||||
|
echo " You can run autoreconf yourself if you don't like maintainer"
|
||||||
|
echo " mode and you can also just run autoreconf -f -i to initialize"
|
||||||
|
echo " everything in the first place; this script is only for"
|
||||||
|
echo " compatibility with prior releases."
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
exec >&2
|
||||||
|
echo "autogen.sh is intended only to generate 'configure' on systems"
|
||||||
|
echo "that do not have it. You have a complete 'configure', if you"
|
||||||
|
echo "need to change Makefile.am or configure.ac you also need to"
|
||||||
|
echo "run configure with the --enable-maintainer-mode option."
|
||||||
|
exit 1
|
||||||
|
fi;;
|
||||||
|
|
||||||
|
broken)
|
||||||
|
exec >&2
|
||||||
|
echo "Your system has a partial set of autotools generated files."
|
||||||
|
echo "autogen.sh is unable to proceed. The full set of files is"
|
||||||
|
echo "contained in the libpng 'tar' distribution archive and you do"
|
||||||
|
echo "not need to run autogen.sh if you use it."
|
||||||
|
exit 1;;
|
||||||
|
esac
|
||||||
|
|||||||
1526
config.guess
vendored
109
config.h.in
@@ -1,109 +0,0 @@
|
|||||||
/* config.h.in. Generated from configure.ac by autoheader. */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <dlfcn.h> header file. */
|
|
||||||
#undef HAVE_DLFCN_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `feenableexcept' function. */
|
|
||||||
#undef HAVE_FEENABLEEXCEPT
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
|
||||||
#undef HAVE_INTTYPES_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `m' library (-lm). */
|
|
||||||
#undef HAVE_LIBM
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `z' library (-lz). */
|
|
||||||
#undef HAVE_LIBZ
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <malloc.h> header file. */
|
|
||||||
#undef HAVE_MALLOC_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <memory.h> header file. */
|
|
||||||
#undef HAVE_MEMORY_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `memset' function. */
|
|
||||||
#undef HAVE_MEMSET
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `pow' function. */
|
|
||||||
#undef HAVE_POW
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <stdint.h> header file. */
|
|
||||||
#undef HAVE_STDINT_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
|
||||||
#undef HAVE_STDLIB_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <strings.h> header file. */
|
|
||||||
#undef HAVE_STRINGS_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <string.h> header file. */
|
|
||||||
#undef HAVE_STRING_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
|
||||||
#undef HAVE_SYS_STAT_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
|
||||||
#undef HAVE_SYS_TYPES_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <unistd.h> header file. */
|
|
||||||
#undef HAVE_UNISTD_H
|
|
||||||
|
|
||||||
/* Define to the sub-directory in which libtool stores uninstalled libraries.
|
|
||||||
*/
|
|
||||||
#undef LT_OBJDIR
|
|
||||||
|
|
||||||
/* Name of package */
|
|
||||||
#undef PACKAGE
|
|
||||||
|
|
||||||
/* Define to the address where bug reports for this package should be sent. */
|
|
||||||
#undef PACKAGE_BUGREPORT
|
|
||||||
|
|
||||||
/* Define to the full name of this package. */
|
|
||||||
#undef PACKAGE_NAME
|
|
||||||
|
|
||||||
/* Define to the full name and version of this package. */
|
|
||||||
#undef PACKAGE_STRING
|
|
||||||
|
|
||||||
/* Define to the one symbol short name of this package. */
|
|
||||||
#undef PACKAGE_TARNAME
|
|
||||||
|
|
||||||
/* Define to the home page for this package. */
|
|
||||||
#undef PACKAGE_URL
|
|
||||||
|
|
||||||
/* Define to the version of this package. */
|
|
||||||
#undef PACKAGE_VERSION
|
|
||||||
|
|
||||||
/* Align row buffers */
|
|
||||||
#undef PNG_ALIGNED_MEMORY_SUPPORTED
|
|
||||||
|
|
||||||
/* Enable ARM NEON optmizations */
|
|
||||||
#undef PNG_ARM_NEON
|
|
||||||
|
|
||||||
/* Define to 1 if you have the ANSI C header files. */
|
|
||||||
#undef STDC_HEADERS
|
|
||||||
|
|
||||||
/* Define to 1 if your <sys/time.h> declares `struct tm'. */
|
|
||||||
#undef TM_IN_SYS_TIME
|
|
||||||
|
|
||||||
/* Version number of package */
|
|
||||||
#undef VERSION
|
|
||||||
|
|
||||||
/* Define to empty if `const' does not conform to ANSI C. */
|
|
||||||
#undef const
|
|
||||||
|
|
||||||
/* Define to the equivalent of the C99 'restrict' keyword, or to
|
|
||||||
nothing if this is not supported. Do not define if restrict is
|
|
||||||
supported directly. */
|
|
||||||
#undef restrict
|
|
||||||
/* Work around a bug in Sun C++: it does not support _Restrict or
|
|
||||||
__restrict__, even though the corresponding Sun C compiler ends up with
|
|
||||||
"#define restrict _Restrict" or "#define restrict __restrict__" in the
|
|
||||||
previous line. Perhaps some future version of Sun C++ will work with
|
|
||||||
restrict; if so, hopefully it defines __RESTRICT like Sun C does. */
|
|
||||||
#if defined __SUNPRO_CC && !defined __RESTRICT
|
|
||||||
# define _Restrict
|
|
||||||
# define __restrict__
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Define to `unsigned int' if <sys/types.h> does not define. */
|
|
||||||
#undef size_t
|
|
||||||
1757
config.sub
vendored
402
configure.ac
@@ -14,94 +14,241 @@ dnl Makefile.am to upgrade the package name.
|
|||||||
dnl This is here to prevent earlier autoconf from being used, it
|
dnl This is here to prevent earlier autoconf from being used, it
|
||||||
dnl should not be necessary to regenerate configure if the time
|
dnl should not be necessary to regenerate configure if the time
|
||||||
dnl stamps are correct
|
dnl stamps are correct
|
||||||
AC_PREREQ(2.59)
|
AC_PREREQ([2.68])
|
||||||
|
|
||||||
dnl Version number stuff here:
|
dnl Version number stuff here:
|
||||||
|
|
||||||
AC_INIT([libpng], [1.5.7beta05], [png-mng-implement@lists.sourceforge.net])
|
AC_INIT([libpng],[1.7.0beta64],[png-mng-implement@lists.sourceforge.net])
|
||||||
AM_INIT_AUTOMAKE
|
AC_CONFIG_MACRO_DIR([scripts])
|
||||||
dnl stop configure from automagically running automake
|
|
||||||
|
# libpng does not follow GNU file name conventions (hence 'foreign')
|
||||||
|
# color-tests requires automake 1.11 or later
|
||||||
|
# silent-rules requires automake 1.11 or later
|
||||||
|
# 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])
|
||||||
|
# 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
|
||||||
AM_MAINTAINER_MODE
|
AM_MAINTAINER_MODE
|
||||||
|
|
||||||
PNGLIB_VERSION=1.5.7beta05
|
dnl configure.ac and Makefile.am expect automake 1.11.2 or a compatible later
|
||||||
|
dnl version; aclocal.m4 will generate a failure if you use a prior version of
|
||||||
|
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.7.0beta64
|
||||||
PNGLIB_MAJOR=1
|
PNGLIB_MAJOR=1
|
||||||
PNGLIB_MINOR=5
|
PNGLIB_MINOR=7
|
||||||
PNGLIB_RELEASE=7
|
PNGLIB_RELEASE=0
|
||||||
|
|
||||||
dnl End of version number stuff
|
dnl End of version number stuff
|
||||||
|
|
||||||
AC_CONFIG_SRCDIR([pngget.c])
|
AC_CONFIG_SRCDIR([pngget.c])
|
||||||
AM_CONFIG_HEADER(config.h)
|
AC_CONFIG_HEADERS([config.h])
|
||||||
|
|
||||||
# Checks for programs.
|
# Checks for programs.
|
||||||
AC_LANG([C])
|
AC_LANG([C])
|
||||||
AC_PROG_CC
|
AC_PROG_CC
|
||||||
AM_PROG_AS
|
AM_PROG_AS
|
||||||
AC_PROG_LD
|
LT_PATH_LD
|
||||||
AC_PROG_CPP
|
AC_PROG_CPP
|
||||||
AC_CHECK_TOOL(SED, sed, :)
|
AC_PROG_AWK
|
||||||
AC_CHECK_TOOL(AWK, awk, :)
|
|
||||||
AC_PROG_INSTALL
|
AC_PROG_INSTALL
|
||||||
AC_PROG_LN_S
|
AC_PROG_LN_S
|
||||||
AC_PROG_MAKE_SET
|
AC_PROG_MAKE_SET
|
||||||
LT_INIT([win32-dll])
|
|
||||||
|
|
||||||
# On Solaris 10 and 12 CPP gets set to cc -E, however this still
|
dnl libtool/libtoolize; version 2.4.4 is the tested version, this or any
|
||||||
# does some input parsing. We need strict ANSI-C style tokenization,
|
dnl compatible later version may be used
|
||||||
# check this:
|
LT_INIT([win32-dll])
|
||||||
AC_REQUIRE_CPP
|
LT_PREREQ([2.4.4])
|
||||||
AC_MSG_CHECKING([for a C preprocessor that does not parse its input])
|
|
||||||
AC_TRY_CPP([1.5.0 16BIT],
|
# Some awks crash when confronted with pnglibconf.dfa, do a test run now
|
||||||
[DFNCPP="$CPP"],
|
# to make sure this doesn't happen
|
||||||
[DFNCPP=""
|
AC_MSG_CHECKING([that AWK works])
|
||||||
sav_CPP="$CPP"
|
if ${AWK} -f ${srcdir}/scripts/options.awk out="/dev/null" version=search\
|
||||||
for CPP in "${CC-cc} -E" "${CC-cc} -E -traditional-cpp" "/lib/cpp" "cpp"; do
|
${srcdir}/pngconf.h ${srcdir}/scripts/pnglibconf.dfa\
|
||||||
AC_TRY_CPP([1.5.0 16BIT],
|
${srcdir}/pngusr.dfa 1>&2
|
||||||
[DFNCPP="$CPP"]
|
then
|
||||||
[break],,)
|
AC_MSG_RESULT([ok])
|
||||||
done
|
|
||||||
CPP="$sav_CPP"])
|
|
||||||
if test -n "$DFNCPP"; then
|
|
||||||
AC_MSG_RESULT([$DFNCPP])
|
|
||||||
AC_SUBST(DFNCPP)
|
|
||||||
else
|
else
|
||||||
AC_MSG_FAILURE([not found], 1)
|
AC_MSG_FAILURE([failed], 1)
|
||||||
fi
|
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 -E"
|
||||||
|
AC_SUBST(DFNCPP)
|
||||||
|
|
||||||
|
# -Werror cannot be passed to GCC in CFLAGS because configure will fail (it
|
||||||
|
# checks the compiler with a program that generates a warning), add the
|
||||||
|
# following option to deal with this
|
||||||
|
AC_ARG_VAR(PNG_COPTS,
|
||||||
|
[additional flags for the C compiler, use this for options that would]
|
||||||
|
[cause configure itself to fail])
|
||||||
|
AC_ARG_ENABLE(werror,
|
||||||
|
AS_HELP_STRING([[[--enable-werror[=OPT]]]],
|
||||||
|
[Pass -Werror or the given argument to the compiler if it is supported]),
|
||||||
|
[test "$enable_werror" = "yes" && enable_werror="-Werror"
|
||||||
|
if test "$enable_werror" != "no"; then
|
||||||
|
sav_CFLAGS="$CFLAGS"
|
||||||
|
CFLAGS="$enable_werror $CFLAGS"
|
||||||
|
AC_MSG_CHECKING([if the compiler allows $enable_werror])
|
||||||
|
AC_COMPILE_IFELSE(
|
||||||
|
[AC_LANG_SOURCE([
|
||||||
|
[int main(int argc, char **argv){]
|
||||||
|
[return argv[argc-1][0];]
|
||||||
|
[}]])],
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
PNG_COPTS="$PNG_COPTS $enable_werror",
|
||||||
|
AC_MSG_RESULT(no))
|
||||||
|
CFLAGS="$sav_CFLAGS"
|
||||||
|
fi],)
|
||||||
|
|
||||||
# Checks for header files.
|
# Checks for header files.
|
||||||
AC_HEADER_STDC
|
AC_HEADER_STDC
|
||||||
AC_CHECK_HEADERS([malloc.h stdlib.h string.h strings.h])
|
# 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.
|
# Checks for typedefs, structures, and compiler characteristics.
|
||||||
AC_C_CONST
|
# Most of these have been removed from 1.7.0 because they checked for non-ANSI-C
|
||||||
AC_TYPE_SIZE_T
|
# behaviors and the result were, anyway, not used by earlier versions of libpng.
|
||||||
AC_STRUCT_TM
|
|
||||||
AC_C_RESTRICT
|
AC_C_RESTRICT
|
||||||
|
|
||||||
# Checks for library functions.
|
# Checks for library functions; these need to be in order, least demanding to
|
||||||
AC_FUNC_STRTOD
|
# most because the -l directives are added to the head of the list at each
|
||||||
AC_CHECK_FUNCS([memset], , AC_ERROR([memset not found in libc]))
|
# check.
|
||||||
AC_CHECK_FUNCS([pow], , AC_CHECK_LIB(m, pow, , AC_ERROR([cannot find pow])) )
|
# ANSI-C functions: all are required but they don't have to be implemented in
|
||||||
AC_ARG_WITH(zlib-prefix,
|
# libc, it is perfectly ok to configure with an extra, wrapper, library preset
|
||||||
AC_HELP_STRING([--with-zlib-prefix],
|
# in LIBS. NOTE: this list may not be complete
|
||||||
[prefix that may have been used in installed zlib]),
|
AC_CHECK_FUNCS([memset memcpy strncpy],,
|
||||||
[ZPREFIX=${withval}],
|
AC_MSG_FAILURE([missing ANSI-C functions]))
|
||||||
[ZPREFIX='z_'])
|
|
||||||
AC_CHECK_LIB(z, zlibVersion, ,
|
# floor and ceil are required for FLOATING_POINT, but they can be turned off on
|
||||||
AC_CHECK_LIB(z, ${ZPREFIX}zlibVersion, ,
|
# the configure command line (and they are independent.) Default is to 'on'
|
||||||
AC_ERROR([zlib not installed])))
|
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
|
# 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
|
# 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.
|
# library (typically), it's not an error if it is not found.
|
||||||
AC_CHECK_LIB([m], [feenableexcept])
|
AC_SEARCH_LIBS([feenableexcept],[m],AC_DEFINE([HAVE_FEENABLEEXCEPT],[1],
|
||||||
AC_CHECK_FUNCS([feenableexcept])
|
[Define to 1 if the feenableexcept function is available]))
|
||||||
|
# Required by pngvalid:
|
||||||
|
AC_SEARCH_LIBS([ceil],[m])
|
||||||
|
|
||||||
LIBPNG_DEFINES=-DPNG_CONFIGURE_LIBPNG
|
# zlib checks and arguments;
|
||||||
LIBPNG_DEFINES=$LIBPNG_DEFINES
|
# package zlib: argument is the name of the library
|
||||||
AC_SUBST(LIBPNG_DEFINES)
|
# 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'])
|
||||||
|
|
||||||
AC_MSG_CHECKING([if libraries can be versioned])
|
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])
|
AC_MSG_CHECKING([if using Solaris linker])
|
||||||
SLD=`$LD --version 2>&1 | grep Solaris`
|
SLD=`$LD --version 2>&1 | grep Solaris`
|
||||||
@@ -114,6 +261,7 @@ else
|
|||||||
fi
|
fi
|
||||||
AM_CONDITIONAL(HAVE_SOLARIS_LD, test "$have_solaris_ld" = "yes")
|
AM_CONDITIONAL(HAVE_SOLARIS_LD, test "$have_solaris_ld" = "yes")
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([if libraries can be versioned])
|
||||||
# Special case for PE/COFF platforms: ld reports
|
# Special case for PE/COFF platforms: ld reports
|
||||||
# support for version-script, but doesn't actually
|
# support for version-script, but doesn't actually
|
||||||
# DO anything with it.
|
# DO anything with it.
|
||||||
@@ -146,9 +294,9 @@ AM_CONDITIONAL(HAVE_LD_VERSION_SCRIPT, test "$have_ld_version_script" = "yes")
|
|||||||
if test "$have_ld_version_script" = "yes"; then
|
if test "$have_ld_version_script" = "yes"; then
|
||||||
AC_MSG_CHECKING([for symbol prefix])
|
AC_MSG_CHECKING([for symbol prefix])
|
||||||
SYMBOL_PREFIX=`echo "PREFIX=__USER_LABEL_PREFIX__" \
|
SYMBOL_PREFIX=`echo "PREFIX=__USER_LABEL_PREFIX__" \
|
||||||
| ${CPP-${CC-gcc} -E} - 2>&1 \
|
| ${DFNCPP-${CC-gcc -E}} - 2>&1 \
|
||||||
| ${EGREP-grep} "^PREFIX=" \
|
| ${EGREP-grep} "^PREFIX=" \
|
||||||
| ${SED-sed} "s:^PREFIX=::"`
|
| ${SED-sed} -e "s:^PREFIX=::" -e "s:__USER_LABEL_PREFIX__::"`
|
||||||
AC_SUBST(SYMBOL_PREFIX)
|
AC_SUBST(SYMBOL_PREFIX)
|
||||||
AC_MSG_RESULT($SYMBOL_PREFIX)
|
AC_MSG_RESULT($SYMBOL_PREFIX)
|
||||||
fi
|
fi
|
||||||
@@ -162,44 +310,130 @@ AC_SUBST(PNGLIB_RELEASE)
|
|||||||
# Additional arguments (and substitutions)
|
# Additional arguments (and substitutions)
|
||||||
# Allow the pkg-config directory to be set
|
# Allow the pkg-config directory to be set
|
||||||
AC_ARG_WITH(pkgconfigdir,
|
AC_ARG_WITH(pkgconfigdir,
|
||||||
AC_HELP_STRING([--with-pkgconfigdir],
|
AS_HELP_STRING([[[--with-pkgconfigdir]]],
|
||||||
[Use the specified pkgconfig dir (default is libdir/pkgconfig)]),
|
[Use the specified pkgconfig dir (default is libdir/pkgconfig)]),
|
||||||
[pkgconfigdir=${withval}],
|
[pkgconfigdir=${withval}],
|
||||||
[pkgconfigdir='${libdir}/pkgconfig'])
|
[pkgconfigdir='${libdir}/pkgconfig'])
|
||||||
|
|
||||||
AC_SUBST([pkgconfigdir])
|
AC_SUBST([pkgconfigdir])
|
||||||
AC_MSG_NOTICE([pkgconfig directory is ${pkgconfigdir}])
|
AC_MSG_NOTICE([[pkgconfig directory is ${pkgconfigdir}]])
|
||||||
|
|
||||||
# Make the *-config binary config scripts optional
|
# Make the *-config binary config scripts optional
|
||||||
AC_ARG_WITH(binconfigs,
|
AC_ARG_WITH(binconfigs,
|
||||||
AC_HELP_STRING([--with-binconfigs],
|
AS_HELP_STRING([[[--with-binconfigs]]],
|
||||||
[Generate shell libpng-config scripts as well as pkg-config data]
|
[Generate shell libpng-config scripts as well as pkg-config data]
|
||||||
[@<:@default=yes@:>@]),
|
[@<:@default=yes@:>@]),
|
||||||
[if test "${withval}" = no; then
|
[if test "${withval}" = no; then
|
||||||
binconfigs=
|
binconfigs=
|
||||||
AC_MSG_NOTICE([libpng-config scripts will not be built])
|
AC_MSG_NOTICE([[libpng-config scripts will not be built]])
|
||||||
else
|
else
|
||||||
binconfigs='${binconfigs}'
|
binconfigs='${binconfigs}'
|
||||||
fi],
|
fi],
|
||||||
[binconfigs='${binconfigs}'])
|
[binconfigs='${binconfigs}'])
|
||||||
AC_SUBST([binconfigs])
|
AC_SUBST([binconfigs])
|
||||||
|
|
||||||
# Because GCC by default assembles code with an executable stack, even though it
|
# Support for prefixes to the API function names; this will generate defines
|
||||||
# compiles C code with a non-executable stack, it is necessary to do a fixup
|
# at the start of the build to rename exported library functions
|
||||||
# here (this may by GCC specific)
|
AC_ARG_WITH(libpng-prefix,
|
||||||
AC_SUBST([AM_CCASFLAGS], [-Wa,--noexecstack])
|
AS_HELP_STRING([[[--with-libpng-prefix]]],
|
||||||
|
[prefix libpng exported function (API) names with the given value]),
|
||||||
|
[if test "${withval:-no}" != "no"; then
|
||||||
|
AC_SUBST([PNG_PREFIX], [${withval}])
|
||||||
|
fi])
|
||||||
|
AM_CONDITIONAL([DO_PNG_PREFIX], [test "${with_libpng_prefix:-no}" != "no"])
|
||||||
|
|
||||||
|
# Control over what links are made for installed files. Versioned files are
|
||||||
|
# always installed, when the following options are turned on corresponding
|
||||||
|
# unversioned links are also created (normally as symbolic links):
|
||||||
|
AC_ARG_ENABLE([unversioned-links],
|
||||||
|
AS_HELP_STRING([[[--enable-unversioned-links]]],
|
||||||
|
[Installed libpng header files are placed in a versioned subdirectory]
|
||||||
|
[and installed libpng library (including DLL) files are versioned.]
|
||||||
|
[If this option is enabled unversioned links will be created pointing to]
|
||||||
|
[the corresponding installed files. If you use libpng.pc or]
|
||||||
|
[libpng-config for all builds you do not need these links, but if you]
|
||||||
|
[compile programs directly they will typically #include <png.h> and]
|
||||||
|
[link with -lpng; in that case you need the links.]
|
||||||
|
[The links can be installed manually using 'make install-header-links']
|
||||||
|
[and 'make install-library-links' and can be removed using the]
|
||||||
|
[corresponding uninstall- targets. If you do enable this option every]
|
||||||
|
[libpng 'make install' will recreate the links to point to the just]
|
||||||
|
[installed version of libpng. The default is to create the links;]
|
||||||
|
[use --disable-unversioned-links to change this]))
|
||||||
|
|
||||||
|
# The AM_CONDITIONAL test is written so that the default is enabled;
|
||||||
|
# --disable-unversioned-links must be given to turn the option off.
|
||||||
|
AM_CONDITIONAL([DO_INSTALL_LINKS],[test "$enable_unversioned_links" != "no"])
|
||||||
|
|
||||||
|
AC_ARG_ENABLE([unversioned-libpng-pc],
|
||||||
|
AS_HELP_STRING([[[--enable-unversioned-libpng-pc]]],
|
||||||
|
[Install the configuration file 'libpng.pc' as a link to the versioned]
|
||||||
|
[version. This is done by default - use --disable-unversioned-libpng-pc]
|
||||||
|
[to change this.]))
|
||||||
|
AM_CONDITIONAL([DO_INSTALL_LIBPNG_PC],
|
||||||
|
[test "$enable_unversioned_libpng_pc" != "no"])
|
||||||
|
|
||||||
|
AC_ARG_ENABLE([unversioned-libpng-config],
|
||||||
|
AS_HELP_STRING([[[--enable-unversioned-libpng-config]]],
|
||||||
|
[Install the configuration file 'libpng-config' as a link to the]
|
||||||
|
[versioned version. This is done by default - use]
|
||||||
|
[--disable-unversioned-libpng-config to change this.]))
|
||||||
|
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],
|
AC_ARG_ENABLE([arm-neon],
|
||||||
AC_HELP_STRING([--enable-arm-neon], [Enable ARM NEON optimizations]),
|
AS_HELP_STRING([[[--enable-arm-neon]]],
|
||||||
[if test "${enableval}" = yes; then
|
[Enable ARM NEON optimizations: =no/off, check, api, yes/on:]
|
||||||
AC_DEFINE([PNG_ARM_NEON], [1], [Enable ARM NEON optimizations])
|
[no/off: disable the optimizations; check: use internal checking code]
|
||||||
AC_DEFINE([PNG_ALIGNED_MEMORY_SUPPORTED], [1], [Align row buffers])
|
[(deprecated and poorly supported); api: disable by default, enable by]
|
||||||
fi])
|
[a call to png_set_option; yes/on: turn on unconditionally.]
|
||||||
AM_CONDITIONAL([PNG_ARM_NEON], [test "${enable_arm_neon:-no}" = yes])
|
[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])
|
||||||
|
|
||||||
|
AC_MSG_NOTICE([[Extra options for compiler: $PNG_COPTS]])
|
||||||
|
|
||||||
# Config files, substituting as above
|
# Config files, substituting as above
|
||||||
AC_CONFIG_FILES([Makefile libpng.pc:libpng.pc.in])
|
AC_CONFIG_FILES([Makefile libpng.pc])
|
||||||
AC_CONFIG_FILES([libpng-config:libpng-config.in],
|
AC_CONFIG_FILES([libpng-config], [chmod +x libpng-config])
|
||||||
[chmod +x libpng-config])
|
|
||||||
|
|
||||||
AC_OUTPUT
|
AC_OUTPUT
|
||||||
|
|||||||
83
contrib/arm-neon/README
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
OPERATING SYSTEM SPECIFIC ARM NEON DETECTION
|
||||||
|
--------------------------------------------
|
||||||
|
|
||||||
|
Detection of the ability to execute ARM NEON on an ARM processor requires
|
||||||
|
operating system support. (The information is not available in user mode.)
|
||||||
|
|
||||||
|
HOW TO USE THIS
|
||||||
|
---------------
|
||||||
|
|
||||||
|
This directory contains C code fragments that can be included in arm/arm_init.c
|
||||||
|
by setting the macro PNG_ARM_NEON_FILE to the file name in "" or <> at build
|
||||||
|
time. This setting is not recorded in pnglibconf.h and can be changed simply by
|
||||||
|
rebuilding arm/arm_init.o with the required macro definition.
|
||||||
|
|
||||||
|
For any of this code to be used the ARM NEON code must be enabled and run time
|
||||||
|
checks must be supported. I.e.:
|
||||||
|
|
||||||
|
#if PNG_ARM_NEON_OPT > 0
|
||||||
|
#ifdef PNG_ARM_NEON_CHECK_SUPPORTED
|
||||||
|
|
||||||
|
This is done in a 'configure' build by passing configure the argument:
|
||||||
|
|
||||||
|
--enable-arm-neon=check
|
||||||
|
|
||||||
|
Apart from the basic Linux implementation in contrib/arm-neon/linux.c this code
|
||||||
|
is unsupported. That means that it is not even compiled on a regular basis and
|
||||||
|
may be broken in any given minor release.
|
||||||
|
|
||||||
|
FILE FORMAT
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Each file documents its testing status as of the last time it was tested (which
|
||||||
|
may have been a long time ago):
|
||||||
|
|
||||||
|
STATUS: one of:
|
||||||
|
SUPPORTED: This indicates that the file is included in the regularly
|
||||||
|
performed test builds and bugs are fixed when discovered.
|
||||||
|
COMPILED: This indicates that the code did compile at least once. See the
|
||||||
|
more detailed description for the extent to which the result was
|
||||||
|
successful.
|
||||||
|
TESTED: This means the code was fully compiled into the libpng test programs
|
||||||
|
and these were run at least once.
|
||||||
|
|
||||||
|
BUG REPORTS: an email address to which to send reports of problems
|
||||||
|
|
||||||
|
The file is a fragment of C code. It should not define any 'extern' symbols;
|
||||||
|
everything should be static. It must define the function:
|
||||||
|
|
||||||
|
static int png_have_neon(png_structp png_ptr);
|
||||||
|
|
||||||
|
That function must return 1 if ARM NEON instructions are supported, 0 if not.
|
||||||
|
It must not execute png_error unless it detects a bug. A png_error will prevent
|
||||||
|
the reading of the PNG and in the future, writing too.
|
||||||
|
|
||||||
|
BUG REPORTS
|
||||||
|
-----------
|
||||||
|
|
||||||
|
If you mail a bug report for any file that is not SUPPORTED there may only be
|
||||||
|
limited response. Consider fixing it and sending a patch to fix the problem -
|
||||||
|
this is more likely to result in action.
|
||||||
|
|
||||||
|
CONTRIBUTIONS
|
||||||
|
-------------
|
||||||
|
|
||||||
|
You may send contributions of new implementations to
|
||||||
|
png-mng-implement@sourceforge.net. Please write code in strict C90 C where
|
||||||
|
possible. Obviously OS dependencies are to be expected. If you submit code you
|
||||||
|
must have the authors permission and it must have a license that is acceptable
|
||||||
|
to the current maintainer; in particular that license must permit modification
|
||||||
|
and redistribution.
|
||||||
|
|
||||||
|
Please try to make the contribution a single file and give the file a clear and
|
||||||
|
unambiguous name that identifies the target OS. If multiple files really are
|
||||||
|
required put them all in a sub-directory.
|
||||||
|
|
||||||
|
You must also be prepared to handle bug reports from users of the code, either
|
||||||
|
by joining the png-mng-implement mailing list or by providing an email for the
|
||||||
|
"BUG REPORTS" entry or both. Please make sure that the header of the file
|
||||||
|
contains the STATUS and BUG REPORTS fields as above.
|
||||||
|
|
||||||
|
Please list the OS requirements as precisely as possible. Ideally you should
|
||||||
|
also list the environment in which the code has been tested and certainly list
|
||||||
|
any environments where you suspect it might not work.
|
||||||
39
contrib/arm-neon/android-ndk.c
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
/* contrib/arm-neon/android-ndk.c
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014 Glenn Randers-Pehrson
|
||||||
|
* Written by John Bowler, 2014.
|
||||||
|
* Last changed in libpng 1.6.10 [March 6, 2014]
|
||||||
|
*
|
||||||
|
* This code is released under the libpng license.
|
||||||
|
* For conditions of distribution and use, see the disclaimer
|
||||||
|
* and license in png.h
|
||||||
|
*
|
||||||
|
* SEE contrib/arm-neon/README before reporting bugs
|
||||||
|
*
|
||||||
|
* STATUS: COMPILED, UNTESTED
|
||||||
|
* BUG REPORTS: png-mng-implement@sourceforge.net
|
||||||
|
*
|
||||||
|
* png_have_neon implemented for the Android NDK, see:
|
||||||
|
*
|
||||||
|
* Documentation:
|
||||||
|
* http://www.kandroid.org/ndk/docs/CPU-ARM-NEON.html
|
||||||
|
* http://code.google.com/p/android/issues/detail?id=49065
|
||||||
|
*
|
||||||
|
* NOTE: this requires that libpng is built against the Android NDK and linked
|
||||||
|
* with an implementation of the Android ARM 'cpu-features' library. The code
|
||||||
|
* has been compiled only, not linked: no version of the library has been found,
|
||||||
|
* only the header files exist in the NDK.
|
||||||
|
*/
|
||||||
|
#include <cpu-features.h>
|
||||||
|
|
||||||
|
static int
|
||||||
|
png_have_neon(png_structp png_ptr)
|
||||||
|
{
|
||||||
|
/* This is a whole lot easier than the linux code, however it is probably
|
||||||
|
* implemented as below, therefore it is better to cache the result (these
|
||||||
|
* function calls may be slow!)
|
||||||
|
*/
|
||||||
|
PNG_UNUSED(png_ptr)
|
||||||
|
return android_getCpuFamily() == ANDROID_CPU_FAMILY_ARM &&
|
||||||
|
(android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON) != 0;
|
||||||
|
}
|
||||||
120
contrib/arm-neon/linux-auxv.c
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
/* contrib/arm-neon/linux-auxv.c
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014 Glenn Randers-Pehrson
|
||||||
|
* Written by Mans Rullgard, 2011.
|
||||||
|
* Last changed in libpng 1.6.10 [March 6, 2014]
|
||||||
|
*
|
||||||
|
* This code is released under the libpng license.
|
||||||
|
* For conditions of distribution and use, see the disclaimer
|
||||||
|
* and license in png.h
|
||||||
|
*
|
||||||
|
* SEE contrib/arm-neon/README before reporting bugs
|
||||||
|
*
|
||||||
|
* STATUS: COMPILED, TESTED
|
||||||
|
* BUG REPORTS: png-mng-implement@sourceforge.net
|
||||||
|
*
|
||||||
|
* png_have_neon implemented for Linux versions which allow access to
|
||||||
|
* /proc/self/auxv. This is probably faster, cleaner and safer than the code to
|
||||||
|
* read /proc/cpuinfo in contrib/arm-neon/linux, however it is yet another piece
|
||||||
|
* of potentially untested code and has more complex dependencies than the code
|
||||||
|
* to read cpuinfo.
|
||||||
|
*
|
||||||
|
* This generic __linux__ implementation requires reading /proc/self/auxv and
|
||||||
|
* looking at each element for one that records NEON capabilities.
|
||||||
|
*/
|
||||||
|
#include <unistd.h> /* for POSIX 1003.1 */
|
||||||
|
#include <errno.h> /* for EINTR */
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <elf.h>
|
||||||
|
#include <asm/hwcap.h>
|
||||||
|
|
||||||
|
/* A read call may be interrupted, in which case it returns -1 and sets errno to
|
||||||
|
* EINTR if nothing was done, otherwise (if something was done) a partial read
|
||||||
|
* may result.
|
||||||
|
*/
|
||||||
|
static size_t
|
||||||
|
safe_read(png_structp png_ptr, int fd, void *buffer_in, size_t nbytes)
|
||||||
|
{
|
||||||
|
size_t ntotal = 0;
|
||||||
|
char *buffer = png_voidcast(char*, buffer_in);
|
||||||
|
|
||||||
|
while (nbytes > 0)
|
||||||
|
{
|
||||||
|
unsigned int nread;
|
||||||
|
int iread;
|
||||||
|
|
||||||
|
/* Passing nread > INT_MAX to read is implementation defined in POSIX
|
||||||
|
* 1003.1, therefore despite the unsigned argument portable code must
|
||||||
|
* limit the value to INT_MAX!
|
||||||
|
*/
|
||||||
|
if (nbytes > INT_MAX)
|
||||||
|
nread = INT_MAX;
|
||||||
|
|
||||||
|
else
|
||||||
|
nread = (unsigned int)/*SAFE*/nbytes;
|
||||||
|
|
||||||
|
iread = read(fd, buffer, nread);
|
||||||
|
|
||||||
|
if (iread == -1)
|
||||||
|
{
|
||||||
|
/* This is the devil in the details, a read can terminate early with 0
|
||||||
|
* bytes read because of EINTR, yet it still returns -1 otherwise end
|
||||||
|
* of file cannot be distinguished.
|
||||||
|
*/
|
||||||
|
if (errno != EINTR)
|
||||||
|
{
|
||||||
|
png_warning(png_ptr, "/proc read failed");
|
||||||
|
return 0; /* I.e., a permanent failure */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (iread < 0)
|
||||||
|
{
|
||||||
|
/* Not a valid 'read' result: */
|
||||||
|
png_warning(png_ptr, "OS /proc read bug");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (iread > 0)
|
||||||
|
{
|
||||||
|
/* Continue reading until a permanent failure, or EOF */
|
||||||
|
buffer += iread;
|
||||||
|
nbytes -= (unsigned int)/*SAFE*/iread;
|
||||||
|
ntotal += (unsigned int)/*SAFE*/iread;
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
return ntotal;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ntotal; /* nbytes == 0 */
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
png_have_neon(png_structp png_ptr)
|
||||||
|
{
|
||||||
|
int fd = open("/proc/self/auxv", O_RDONLY);
|
||||||
|
Elf32_auxv_t aux;
|
||||||
|
|
||||||
|
/* Failsafe: failure to open means no NEON */
|
||||||
|
if (fd == -1)
|
||||||
|
{
|
||||||
|
png_warning(png_ptr, "/proc/self/auxv open failed");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (safe_read(png_ptr, fd, &aux, sizeof aux) == sizeof aux)
|
||||||
|
{
|
||||||
|
if (aux.a_type == AT_HWCAP && (aux.a_un.a_val & HWCAP_NEON) != 0)
|
||||||
|
{
|
||||||
|
close(fd);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
161
contrib/arm-neon/linux.c
Normal file
@@ -0,0 +1,161 @@
|
|||||||
|
/* contrib/arm-neon/linux.c
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014 Glenn Randers-Pehrson
|
||||||
|
* Written by John Bowler, 2014.
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
* SEE contrib/arm-neon/README before reporting bugs
|
||||||
|
*
|
||||||
|
* STATUS: SUPPORTED
|
||||||
|
* BUG REPORTS: png-mng-implement@sourceforge.net
|
||||||
|
*
|
||||||
|
* png_have_neon implemented for Linux by reading the widely available
|
||||||
|
* pseudo-file /proc/cpuinfo.
|
||||||
|
*
|
||||||
|
* This code is strict ANSI-C and is probably moderately portable; it does
|
||||||
|
* however use <stdio.h> and it assumes that /proc/cpuinfo is never localized.
|
||||||
|
*/
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
static int
|
||||||
|
png_have_neon(png_structp png_ptr)
|
||||||
|
{
|
||||||
|
FILE *f = fopen("/proc/cpuinfo", "rb");
|
||||||
|
|
||||||
|
if (f != NULL)
|
||||||
|
{
|
||||||
|
/* This is a simple state machine which reads the input byte-by-byte until
|
||||||
|
* it gets a match on the 'neon' feature or reaches the end of the stream.
|
||||||
|
*/
|
||||||
|
static const char ch_feature[] = { 70, 69, 65, 84, 85, 82, 69, 83 };
|
||||||
|
static const char ch_neon[] = { 78, 69, 79, 78 };
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
StartLine, Feature, Colon, StartTag, Neon, HaveNeon, SkipTag, SkipLine
|
||||||
|
} state;
|
||||||
|
int counter;
|
||||||
|
|
||||||
|
for (state=StartLine, counter=0;;)
|
||||||
|
{
|
||||||
|
int ch = fgetc(f);
|
||||||
|
|
||||||
|
if (ch == EOF)
|
||||||
|
{
|
||||||
|
/* EOF means error or end-of-file, return false; neon at EOF is
|
||||||
|
* assumed to be a mistake.
|
||||||
|
*/
|
||||||
|
fclose(f);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (state)
|
||||||
|
{
|
||||||
|
case StartLine:
|
||||||
|
/* Match spaces at the start of line */
|
||||||
|
if (ch <= 32) /* skip control characters and space */
|
||||||
|
break;
|
||||||
|
|
||||||
|
counter=0;
|
||||||
|
state = Feature;
|
||||||
|
/* FALL THROUGH */
|
||||||
|
|
||||||
|
case Feature:
|
||||||
|
/* Match 'FEATURE', ASCII case insensitive. */
|
||||||
|
if ((ch & ~0x20) == ch_feature[counter])
|
||||||
|
{
|
||||||
|
if (++counter == (sizeof ch_feature))
|
||||||
|
state = Colon;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* did not match 'feature' */
|
||||||
|
state = SkipLine;
|
||||||
|
/* FALL THROUGH */
|
||||||
|
|
||||||
|
case SkipLine:
|
||||||
|
skipLine:
|
||||||
|
/* Skip everything until we see linefeed or carriage return */
|
||||||
|
if (ch != 10 && ch != 13)
|
||||||
|
break;
|
||||||
|
|
||||||
|
state = StartLine;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Colon:
|
||||||
|
/* Match any number of space or tab followed by ':' */
|
||||||
|
if (ch == 32 || ch == 9)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (ch == 58) /* i.e. ':' */
|
||||||
|
{
|
||||||
|
state = StartTag;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Either a bad line format or a 'feature' prefix followed by
|
||||||
|
* other characters.
|
||||||
|
*/
|
||||||
|
state = SkipLine;
|
||||||
|
goto skipLine;
|
||||||
|
|
||||||
|
case StartTag:
|
||||||
|
/* Skip space characters before a tag */
|
||||||
|
if (ch == 32 || ch == 9)
|
||||||
|
break;
|
||||||
|
|
||||||
|
state = Neon;
|
||||||
|
counter = 0;
|
||||||
|
/* FALL THROUGH */
|
||||||
|
|
||||||
|
case Neon:
|
||||||
|
/* Look for 'neon' tag */
|
||||||
|
if ((ch & ~0x20) == ch_neon[counter])
|
||||||
|
{
|
||||||
|
if (++counter == (sizeof ch_neon))
|
||||||
|
state = HaveNeon;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
state = SkipTag;
|
||||||
|
/* FALL THROUGH */
|
||||||
|
|
||||||
|
case SkipTag:
|
||||||
|
/* Skip non-space characters */
|
||||||
|
if (ch == 10 || ch == 13)
|
||||||
|
state = StartLine;
|
||||||
|
|
||||||
|
else if (ch == 32 || ch == 9)
|
||||||
|
state = StartTag;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HaveNeon:
|
||||||
|
/* Have seen a 'neon' prefix, but there must be a space or new
|
||||||
|
* line character to terminate it.
|
||||||
|
*/
|
||||||
|
if (ch == 10 || ch == 13 || ch == 32 || ch == 9)
|
||||||
|
{
|
||||||
|
fclose(f);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
state = SkipTag;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
png_error(png_ptr, "png_have_neon: internal error (bug)");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef PNG_WARNINGS_SUPPORTED
|
||||||
|
else
|
||||||
|
png_warning(png_ptr, "/proc/cpuinfo open failed");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
49
contrib/conftest/README
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
This directory contains test configuration files, currently always '.dfa' files
|
||||||
|
intended to be used in the build by setting the make macro DFA_XTRA to the name
|
||||||
|
of the file.
|
||||||
|
|
||||||
|
These files are used in release validation of the 'configure' builds of libpng
|
||||||
|
by building 'make check', or 'make all-am' for cross-builds, with each .dfa
|
||||||
|
file.
|
||||||
|
|
||||||
|
The files in this directory may change between minor releases, however
|
||||||
|
contributions describing specific builds of libpng are welcomed. There is no
|
||||||
|
guarantee that libpng will continue to build with such configurations; support
|
||||||
|
for given configurations can be, and has been, dropped between successive minor
|
||||||
|
releases. However if a .dfa file describing a configuration is not in this
|
||||||
|
directory it is very unlikely that it will be tested before a minor release!
|
||||||
|
|
||||||
|
You can use these .dfa files as the basis of new configurations. Files in this
|
||||||
|
directory should not have any use restrictions or restrictive licenses.
|
||||||
|
|
||||||
|
This directory is not included in the .zip and .7z distributions, which do
|
||||||
|
not contain 'configure' scripts.
|
||||||
|
|
||||||
|
DOCUMENTATION
|
||||||
|
=============
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
${srcdir}/pngusr.dfa
|
||||||
|
${srcdir}/contrib/pngminim/*/pngusr.dfa
|
||||||
|
|
||||||
|
Documentation of the options:
|
||||||
|
${srcdir}/scripts/pnglibconf.dfa
|
||||||
|
|
||||||
|
Documentation of the file format:
|
||||||
|
${srcdir}/scripts/options.awk
|
||||||
|
|
||||||
|
FILE NAMING
|
||||||
|
===========
|
||||||
|
|
||||||
|
File names in this directory may NOT contain any of the five characters:
|
||||||
|
|
||||||
|
- , + * ?
|
||||||
|
|
||||||
|
Neither may they contain any space character.
|
||||||
|
|
||||||
|
While other characters may be used it is strongly suggested that file names be
|
||||||
|
limited to lower case Latiin alphabetic characters (a-z), digits (0-9) and, if
|
||||||
|
necessary the underscore (_) character. File names should be about 8 characters
|
||||||
|
long (excluding the .dfa extension). Submitted .dfa files should have names
|
||||||
|
between 7 and 16 characters long, shorter names (6 characters or less) are
|
||||||
|
reserved for standard tests.
|
||||||
58
contrib/conftest/read.dfa
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
# read.dfa
|
||||||
|
# Build time configuration of libpng
|
||||||
|
#
|
||||||
|
# Author: John Bowler
|
||||||
|
# Copyright: (c) John Bowler, 2013
|
||||||
|
# Usage rights:
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
# Build libpng with basic read support. This enables the lowest level libpng
|
||||||
|
# read API - the one where the calling code has to use a loop to read each row.
|
||||||
|
# At present this is the API used by most programs.
|
||||||
|
#
|
||||||
|
# Support is enabled only for those chunks and transformations that are
|
||||||
|
# typically required - others can be added easily.
|
||||||
|
#
|
||||||
|
|
||||||
|
everything = off
|
||||||
|
|
||||||
|
# The sequential read code is enabled here; the progressive code can be used
|
||||||
|
# instead but there is no point enabling both.
|
||||||
|
|
||||||
|
option SEQUENTIAL_READ on
|
||||||
|
|
||||||
|
# Likewise it is pointless enabling both fixed and floating point APIs. Choose
|
||||||
|
# one or the other for both the API and the internal math.
|
||||||
|
|
||||||
|
#Fixed point:
|
||||||
|
#option FIXED_POINT on
|
||||||
|
#option FLOATING_ARITHMETIC off
|
||||||
|
|
||||||
|
#Floating point:
|
||||||
|
option FLOATING_POINT on
|
||||||
|
option FLOATING_ARITHMETIC on
|
||||||
|
|
||||||
|
# Basic error handling, IO and user memory support. The latter allows the
|
||||||
|
# application program to provide its own implementations of 'malloc' and 'free'.
|
||||||
|
option SETJMP on
|
||||||
|
option STDIO on
|
||||||
|
option USER_MEM on
|
||||||
|
|
||||||
|
# To read the full set of PNG images correctly interlace, transparency and
|
||||||
|
# 16-bit support is required. The application can implement interlace itself,
|
||||||
|
# but very few do and it's no longer possible to disable it when READ is
|
||||||
|
# enabled.
|
||||||
|
option READ_tRNS on
|
||||||
|
option READ_16BIT on
|
||||||
|
|
||||||
|
# Everything else is application dependent. This file assumes the app handles
|
||||||
|
# all the native PNG bit layouts, so it doesn't need any of layout change
|
||||||
|
# transforms, but needs libpng to perform gamma correction. It doesn't do any
|
||||||
|
# colorspace stuff and ignores the 'significant bit' information.
|
||||||
|
#
|
||||||
|
# If your app always expands the image to a limited set of bit layouts you
|
||||||
|
# probably want to consider using the simplified API instead of the low level
|
||||||
|
# one - see png.h and s_read.dfa.
|
||||||
|
option READ_GAMMA on
|
||||||
35
contrib/conftest/s_read.dfa
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
# s_read.dfa
|
||||||
|
# Build time configuration of libpng
|
||||||
|
#
|
||||||
|
# Author: John Bowler
|
||||||
|
# Copyright: (c) John Bowler, 2013
|
||||||
|
# Usage rights:
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
# Build libpng with simplified read support (only). This builds a minimal
|
||||||
|
# libpng able to read all PNG formats and convert them into a small number of
|
||||||
|
# well understood memory formats.
|
||||||
|
#
|
||||||
|
|
||||||
|
everything = off
|
||||||
|
|
||||||
|
option SIMPLIFIED_READ on
|
||||||
|
|
||||||
|
# It isn't necessary to chose fixed or floating point for the APIs because the
|
||||||
|
# simplified API doesn't need fixed or floating point numbers. It is necessary
|
||||||
|
# to chose an internal math implementation. The default (because of 'everything
|
||||||
|
# = off') is fixed point - turn the floating point implementation on if you have
|
||||||
|
# hardware floating point or prefer your software floating point implementation.
|
||||||
|
option FLOATING_ARITHMETIC on
|
||||||
|
|
||||||
|
# This is not strictly necessary, but without it the message strings in the API
|
||||||
|
# will not be filled in
|
||||||
|
option ERROR_TEXT on
|
||||||
|
|
||||||
|
# Switching these options on enables the 'AFIRST' and 'BGR' formats - you don't
|
||||||
|
# need this if you don't use them, they just allow the in-memory layout to be
|
||||||
|
# changed to match common hardware formats.
|
||||||
|
option SIMPLIFIED_READ_AFIRST on
|
||||||
|
option SIMPLIFIED_READ_BGR on
|
||||||
33
contrib/conftest/s_write.dfa
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
# s_write.dfa
|
||||||
|
# Build time configuration of libpng
|
||||||
|
#
|
||||||
|
# Author: John Bowler
|
||||||
|
# Copyright: (c) John Bowler, 2013
|
||||||
|
# Usage rights:
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
# Build libpng with (just) simplified write support
|
||||||
|
#
|
||||||
|
|
||||||
|
everything = off
|
||||||
|
|
||||||
|
option SIMPLIFIED_WRITE on
|
||||||
|
|
||||||
|
# It isn't necessary to chose fixed or floating point for the APIs because the
|
||||||
|
# simplified API doesn't need fixed or floating point numbers. It is necessary
|
||||||
|
# to chose an internal math implementation. The default (because of 'everything
|
||||||
|
# = off') is fixed point - turn the floating point implementation on if you have
|
||||||
|
# hardware floating point or prefer your software floating point implementation.
|
||||||
|
option FLOATING_ARITHMETIC on
|
||||||
|
|
||||||
|
# This is not strictly necessary, but without it the message strings in the API
|
||||||
|
# will not be filled in
|
||||||
|
option ERROR_TEXT on
|
||||||
|
|
||||||
|
# Switching these options on enables the 'AFIRST' and 'BGR' formats - you don't
|
||||||
|
# need this if you don't use them, they just allow the in-memory layout to be
|
||||||
|
# changed to match common hardware formats.
|
||||||
|
option SIMPLIFIED_WRITE_AFIRST on
|
||||||
|
option SIMPLIFIED_WRITE_BGR on
|
||||||
36
contrib/conftest/simple.dfa
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
# simple.dfa
|
||||||
|
# Build time configuration of libpng
|
||||||
|
#
|
||||||
|
# Author: John Bowler
|
||||||
|
# Copyright: (c) John Bowler, 2013
|
||||||
|
# Usage rights:
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
# Build libpng with just the simplified APIs (read and write).
|
||||||
|
#
|
||||||
|
|
||||||
|
everything = off
|
||||||
|
|
||||||
|
option SIMPLIFIED_WRITE on
|
||||||
|
option SIMPLIFIED_READ on
|
||||||
|
|
||||||
|
# It isn't necessary to chose fixed or floating point for the APIs because the
|
||||||
|
# simplified API doesn't need fixed or floating point numbers. It is necessary
|
||||||
|
# to chose an internal math implementation. The default (because of 'everything
|
||||||
|
# = off') is fixed point - turn the floating point implementation on if you have
|
||||||
|
# hardware floating point or prefer your software floating point implementation.
|
||||||
|
option FLOATING_ARITHMETIC on
|
||||||
|
|
||||||
|
# This is not strictly necessary, but without it the message strings in the API
|
||||||
|
# will not be filled in
|
||||||
|
option ERROR_TEXT on
|
||||||
|
|
||||||
|
# Switching these options on enables the 'AFIRST' and 'BGR' formats - you don't
|
||||||
|
# need this if you don't use them, they just allow the in-memory layout to be
|
||||||
|
# changed to match common hardware formats.
|
||||||
|
option SIMPLIFIED_READ_AFIRST on
|
||||||
|
option SIMPLIFIED_READ_BGR on
|
||||||
|
option SIMPLIFIED_WRITE_AFIRST on
|
||||||
|
option SIMPLIFIED_WRITE_BGR on
|
||||||
45
contrib/conftest/write.dfa
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
# write.dfa
|
||||||
|
# Build time configuration of libpng
|
||||||
|
#
|
||||||
|
# Author: John Bowler
|
||||||
|
# Copyright: (c) John Bowler, 2013
|
||||||
|
# Usage rights:
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
# Build libpng with no read support and minimal write support.
|
||||||
|
#
|
||||||
|
|
||||||
|
everything = off
|
||||||
|
|
||||||
|
# Switch on the write code - this makes a minimalist encoder
|
||||||
|
|
||||||
|
option WRITE on
|
||||||
|
|
||||||
|
# Choose fixed or floating point APIs and arithmetic. The choices are
|
||||||
|
# independent but normally they will match. It is typically better to use the
|
||||||
|
# floating point if you have floating point hardware. If you don't know, or
|
||||||
|
# (perhaps) to make libpng smaller used fixed point throughout.
|
||||||
|
|
||||||
|
#Fixed point:
|
||||||
|
#option FIXED_POINT on
|
||||||
|
#option FLOATING_ARITHMETIC off
|
||||||
|
|
||||||
|
#Floating point:
|
||||||
|
option FLOATING_POINT on
|
||||||
|
option FLOATING_ARITHMETIC on
|
||||||
|
|
||||||
|
# Basic error handling, IO and user memory support. The latter allows the
|
||||||
|
# application program to provide its own implementations of 'malloc' and 'free'.
|
||||||
|
option SETJMP on
|
||||||
|
option STDIO on
|
||||||
|
option USER_MEM on
|
||||||
|
|
||||||
|
# Everything else is optional. Unlike the read code in libpng the write code
|
||||||
|
# does not need to deal with arbitrary formats, so only add support for things
|
||||||
|
# you really do write! For example you might only write sRGB images, sometimes
|
||||||
|
# with transparency and never write 16 bit images, so:
|
||||||
|
option WRITE_sRGB on
|
||||||
|
option WRITE_tRNS on
|
||||||
|
#option WRITE_16BIT off (this is the default with 'everything = off')
|
||||||
24
contrib/examples/README.txt
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
|
||||||
|
This directory (contrib/examples) contains examples of libpng usage.
|
||||||
|
|
||||||
|
NO COPYRIGHT RIGHTS ARE CLAIMED TO ANY OF THE FILES IN THIS DIRECTORY.
|
||||||
|
|
||||||
|
To the extent possible under law, the authors have waived all copyright and
|
||||||
|
related or neighboring rights to this work. This work is published from:
|
||||||
|
United States.
|
||||||
|
|
||||||
|
The files may be used freely in any way. The intention is that appropriate
|
||||||
|
parts of the files be used in other libpng-using programs without any need for
|
||||||
|
the authors of the using code to seek copyright or license from the original
|
||||||
|
authors.
|
||||||
|
|
||||||
|
The source code and comments in this directory are the original work of the
|
||||||
|
people named below. No other person or organization has made contributions to
|
||||||
|
the work in this directory.
|
||||||
|
|
||||||
|
ORIGINAL AUTHORS
|
||||||
|
The following people have contributed to the code in this directory. None
|
||||||
|
of the people below claim any rights with regard to the contents of this
|
||||||
|
directory.
|
||||||
|
|
||||||
|
John Bowler <jbowler@acm.org>
|
||||||
185
contrib/examples/iccfrompng.c
Normal file
@@ -0,0 +1,185 @@
|
|||||||
|
/*- iccfrompng
|
||||||
|
*
|
||||||
|
* COPYRIGHT: Written by John Cunningham Bowler, 2011.
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* Extract any icc profiles found in the given PNG files. This is a simple
|
||||||
|
* example of a program that extracts information from the header of a PNG file
|
||||||
|
* without processing the image. Notice that some header information may occur
|
||||||
|
* after the image data. Textual data and comments are an example; the approach
|
||||||
|
* in this file won't work reliably for such data because it only looks for the
|
||||||
|
* information in the section of the file that preceeds the image data.
|
||||||
|
*
|
||||||
|
* Compile and link against libpng and zlib, plus anything else required on the
|
||||||
|
* system you use.
|
||||||
|
*
|
||||||
|
* To use supply a list of PNG files containing iCCP chunks, the chunks will be
|
||||||
|
* extracted to a similarly named file with the extension replaced by 'icc',
|
||||||
|
* which will be overwritten without warning.
|
||||||
|
*/
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <setjmp.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include <png.h>
|
||||||
|
|
||||||
|
#if defined(PNG_READ_SUPPORTED) && defined(PNG_STDIO_SUPPORTED) && \
|
||||||
|
defined (PNG_iCCP_SUPPORTED)
|
||||||
|
|
||||||
|
|
||||||
|
static int verbose = 1;
|
||||||
|
static png_byte no_profile[] = "no profile";
|
||||||
|
|
||||||
|
static png_bytep
|
||||||
|
extract(FILE *fp, png_uint_32 *proflen)
|
||||||
|
{
|
||||||
|
png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,0,0,0);
|
||||||
|
png_infop info_ptr = NULL;
|
||||||
|
png_bytep result = NULL;
|
||||||
|
|
||||||
|
/* Initialize for error or no profile: */
|
||||||
|
*proflen = 0;
|
||||||
|
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "iccfrompng: version library mismatch?\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (setjmp(png_jmpbuf(png_ptr)))
|
||||||
|
{
|
||||||
|
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
png_init_io(png_ptr, fp);
|
||||||
|
|
||||||
|
info_ptr = png_create_info_struct(png_ptr);
|
||||||
|
if (info_ptr == NULL)
|
||||||
|
png_error(png_ptr, "OOM allocating info structure");
|
||||||
|
|
||||||
|
png_read_info(png_ptr, info_ptr);
|
||||||
|
|
||||||
|
{
|
||||||
|
png_charp name;
|
||||||
|
int compression_type;
|
||||||
|
png_bytep profile;
|
||||||
|
|
||||||
|
if (png_get_iCCP(png_ptr, info_ptr, &name, &compression_type, &profile,
|
||||||
|
proflen) & PNG_INFO_iCCP)
|
||||||
|
{
|
||||||
|
result = malloc(*proflen);
|
||||||
|
if (result != NULL)
|
||||||
|
memcpy(result, profile, *proflen);
|
||||||
|
|
||||||
|
else
|
||||||
|
png_error(png_ptr, "OOM allocating profile buffer");
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
result = no_profile;
|
||||||
|
}
|
||||||
|
|
||||||
|
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
extract_one_file(const char *filename)
|
||||||
|
{
|
||||||
|
int result = 0;
|
||||||
|
FILE *fp = fopen(filename, "rb");
|
||||||
|
|
||||||
|
if (fp != NULL)
|
||||||
|
{
|
||||||
|
png_uint_32 proflen = 0;
|
||||||
|
png_bytep profile = extract(fp, &proflen);
|
||||||
|
|
||||||
|
if (profile != NULL && profile != no_profile)
|
||||||
|
{
|
||||||
|
size_t len;
|
||||||
|
char *output;
|
||||||
|
|
||||||
|
{
|
||||||
|
const char *ep = strrchr(filename, '.');
|
||||||
|
|
||||||
|
if (ep != NULL)
|
||||||
|
len = ep-filename;
|
||||||
|
|
||||||
|
else
|
||||||
|
len = strlen(filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
output = malloc(len + 5);
|
||||||
|
if (output != NULL)
|
||||||
|
{
|
||||||
|
FILE *of;
|
||||||
|
|
||||||
|
memcpy(output, filename, len);
|
||||||
|
strcpy(output+len, ".icc");
|
||||||
|
|
||||||
|
of = fopen(output, "wb");
|
||||||
|
if (of != NULL)
|
||||||
|
{
|
||||||
|
if (fwrite(profile, proflen, 1, of) == 1 &&
|
||||||
|
fflush(of) == 0 &&
|
||||||
|
fclose(of) == 0)
|
||||||
|
{
|
||||||
|
if (verbose)
|
||||||
|
printf("%s -> %s\n", filename, output);
|
||||||
|
/* Success return */
|
||||||
|
result = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: error writing profile\n", output);
|
||||||
|
if (remove(output))
|
||||||
|
fprintf(stderr, "%s: could not remove file\n", output);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
fprintf(stderr, "%s: failed to open output file\n", output);
|
||||||
|
|
||||||
|
free(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
fprintf(stderr, "%s: OOM allocating string!\n", filename);
|
||||||
|
|
||||||
|
free(profile);
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (verbose && profile == no_profile)
|
||||||
|
printf("%s has no profile\n", filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
fprintf(stderr, "%s: could not open file\n", filename);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int extracted = 0;
|
||||||
|
|
||||||
|
for (i=1; i<argc; ++i)
|
||||||
|
{
|
||||||
|
if (strcmp(argv[i], "-q") == 0)
|
||||||
|
verbose = 0;
|
||||||
|
|
||||||
|
else if (extract_one_file(argv[i]))
|
||||||
|
extracted = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Exit code is true if any extract succeeds */
|
||||||
|
return extracted == 0;
|
||||||
|
}
|
||||||
|
#endif /* READ && STDIO && iCCP */
|
||||||
371
contrib/examples/pngpixel.c
Normal file
@@ -0,0 +1,371 @@
|
|||||||
|
/*- pngpixel
|
||||||
|
*
|
||||||
|
* COPYRIGHT: Written by John Cunningham Bowler, 2011.
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* Read a single pixel value from a PNG file.
|
||||||
|
*
|
||||||
|
* This code illustrates basic 'by-row' reading of a PNG file using libpng.
|
||||||
|
* Rows are read until a particular pixel is found; the value of this pixel is
|
||||||
|
* then printed on stdout.
|
||||||
|
*
|
||||||
|
* The code illustrates how to do this on interlaced as well as non-interlaced
|
||||||
|
* images. Normally you would call png_set_interlace_handling() to have libpng
|
||||||
|
* deal with the interlace for you, but that obliges you to buffer half of the
|
||||||
|
* image to assemble the interlaced rows. In this code
|
||||||
|
* png_set_interlace_handling() is not called and, instead, the code handles the
|
||||||
|
* interlace passes directly looking for the required pixel.
|
||||||
|
*/
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <setjmp.h> /* required for error handling */
|
||||||
|
|
||||||
|
/* Normally use <png.h> here to get the installed libpng, but this is done to
|
||||||
|
* ensure the code picks up the local libpng implementation:
|
||||||
|
*/
|
||||||
|
#include "../../png.h"
|
||||||
|
|
||||||
|
#if defined(PNG_READ_SUPPORTED) && defined(PNG_SEQUENTIAL_READ_SUPPORTED)
|
||||||
|
|
||||||
|
/* Return component 'c' of pixel 'x' from the given row. */
|
||||||
|
static unsigned int
|
||||||
|
component(png_const_bytep row, png_uint_32 x, unsigned int c,
|
||||||
|
unsigned int bit_depth, unsigned int channels)
|
||||||
|
{
|
||||||
|
/* PNG images can be up to 2^31 pixels wide, but this means they can be up to
|
||||||
|
* 2^37 bits wide (for a 64-bit pixel - the largest possible) and hence 2^34
|
||||||
|
* bytes wide. Since the row fitted into memory, however, the following must
|
||||||
|
* work:
|
||||||
|
*/
|
||||||
|
png_uint_32 bit_offset_hi = bit_depth * ((x >> 6) * channels);
|
||||||
|
png_uint_32 bit_offset_lo = bit_depth * ((x & 0x3f) * channels + c);
|
||||||
|
|
||||||
|
row = (png_const_bytep)(((PNG_CONST png_byte (*)[8])row) + bit_offset_hi);
|
||||||
|
row += bit_offset_lo >> 3;
|
||||||
|
bit_offset_lo &= 0x07;
|
||||||
|
|
||||||
|
/* PNG pixels are packed into bytes to put the first pixel in the highest
|
||||||
|
* bits of the byte and into two bytes for 16-bit values with the high 8 bits
|
||||||
|
* first, so:
|
||||||
|
*/
|
||||||
|
switch (bit_depth)
|
||||||
|
{
|
||||||
|
case 1: return (row[0] >> (7-bit_offset_lo)) & 0x01;
|
||||||
|
case 2: return (row[0] >> (6-bit_offset_lo)) & 0x03;
|
||||||
|
case 4: return (row[0] >> (4-bit_offset_lo)) & 0x0f;
|
||||||
|
case 8: return row[0];
|
||||||
|
case 16: return (row[0] << 8) + row[1];
|
||||||
|
default:
|
||||||
|
/* This should never happen; it indicates a bug in this program or in
|
||||||
|
* libpng itself:
|
||||||
|
*/
|
||||||
|
fprintf(stderr, "pngpixel: invalid bit depth %u\n", bit_depth);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Print a pixel from a row returned by libpng; determine the row format, find
|
||||||
|
* the pixel, and print the relevant information to stdout.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
print_pixel(png_structp png_ptr, png_infop info_ptr, png_const_bytep row,
|
||||||
|
png_uint_32 x)
|
||||||
|
{
|
||||||
|
PNG_CONST unsigned int bit_depth = png_get_bit_depth(png_ptr, info_ptr);
|
||||||
|
|
||||||
|
switch (png_get_color_type(png_ptr, info_ptr))
|
||||||
|
{
|
||||||
|
case PNG_COLOR_TYPE_GRAY:
|
||||||
|
printf("GRAY %u\n", component(row, x, 0, bit_depth, 1));
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* The palette case is slightly more difficult - the palette and, if
|
||||||
|
* present, the tRNS ('transparency', though the values are really
|
||||||
|
* opacity) data must be read to give the full picture:
|
||||||
|
*/
|
||||||
|
case PNG_COLOR_TYPE_PALETTE:
|
||||||
|
{
|
||||||
|
PNG_CONST unsigned int index = component(row, x, 0, bit_depth, 1);
|
||||||
|
png_colorp palette = NULL;
|
||||||
|
int num_palette = 0;
|
||||||
|
|
||||||
|
if ((png_get_PLTE(png_ptr, info_ptr, &palette, &num_palette) &
|
||||||
|
PNG_INFO_PLTE) && num_palette > 0 && palette != NULL)
|
||||||
|
{
|
||||||
|
png_bytep trans_alpha = NULL;
|
||||||
|
int num_trans = 0;
|
||||||
|
if ((png_get_tRNS(png_ptr, info_ptr, &trans_alpha, &num_trans,
|
||||||
|
NULL) & PNG_INFO_tRNS) && num_trans > 0 &&
|
||||||
|
trans_alpha != NULL)
|
||||||
|
printf("INDEXED %u = %d %d %d %d\n", index,
|
||||||
|
palette[index].red, palette[index].green,
|
||||||
|
palette[index].blue,
|
||||||
|
index < num_trans ? trans_alpha[index] : 255);
|
||||||
|
|
||||||
|
else /* no transparency */
|
||||||
|
printf("INDEXED %u = %d %d %d\n", index,
|
||||||
|
palette[index].red, palette[index].green,
|
||||||
|
palette[index].blue);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
printf("INDEXED %u = invalid index\n", index);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
|
||||||
|
case PNG_COLOR_TYPE_RGB:
|
||||||
|
printf("RGB %u %u %u\n", component(row, x, 0, bit_depth, 3),
|
||||||
|
component(row, x, 1, bit_depth, 3),
|
||||||
|
component(row, x, 2, bit_depth, 3));
|
||||||
|
return;
|
||||||
|
|
||||||
|
case PNG_COLOR_TYPE_GRAY_ALPHA:
|
||||||
|
printf("GRAY+ALPHA %u %u\n", component(row, x, 0, bit_depth, 2),
|
||||||
|
component(row, x, 1, bit_depth, 2));
|
||||||
|
return;
|
||||||
|
|
||||||
|
case PNG_COLOR_TYPE_RGB_ALPHA:
|
||||||
|
printf("RGBA %u %u %u %u\n", component(row, x, 0, bit_depth, 4),
|
||||||
|
component(row, x, 1, bit_depth, 4),
|
||||||
|
component(row, x, 2, bit_depth, 4),
|
||||||
|
component(row, x, 3, bit_depth, 4));
|
||||||
|
return;
|
||||||
|
|
||||||
|
default:
|
||||||
|
png_error(png_ptr, "pngpixel: invalid color type");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, const char **argv)
|
||||||
|
{
|
||||||
|
/* This program uses the default, <setjmp.h> based, libpng error handling
|
||||||
|
* mechanism, therefore any local variable that exists before the call to
|
||||||
|
* setjmp and is changed after the call to setjmp returns successfully must
|
||||||
|
* be declared with 'volatile' to ensure that their values don't get
|
||||||
|
* destroyed by longjmp:
|
||||||
|
*/
|
||||||
|
volatile int result = 1/*fail*/;
|
||||||
|
|
||||||
|
if (argc == 4)
|
||||||
|
{
|
||||||
|
long x = atol(argv[1]);
|
||||||
|
long y = atol(argv[2]);
|
||||||
|
FILE *f = fopen(argv[3], "rb");
|
||||||
|
volatile png_bytep row = NULL;
|
||||||
|
|
||||||
|
if (f != NULL)
|
||||||
|
{
|
||||||
|
/* libpng requires a callback function for handling errors; this
|
||||||
|
* callback must not return. The default callback function uses a
|
||||||
|
* stored <setjmp.h> style jmp_buf which is held in a png_struct and
|
||||||
|
* writes error messages to stderr. Creating the png_struct is a
|
||||||
|
* little tricky; just copy the following code.
|
||||||
|
*/
|
||||||
|
png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,
|
||||||
|
NULL, NULL, NULL);
|
||||||
|
|
||||||
|
if (png_ptr != NULL)
|
||||||
|
{
|
||||||
|
png_infop info_ptr = png_create_info_struct(png_ptr);
|
||||||
|
|
||||||
|
if (info_ptr != NULL)
|
||||||
|
{
|
||||||
|
/* Declare stack variables to hold pointers to locally allocated
|
||||||
|
* data.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Initialize the error control buffer: */
|
||||||
|
if (setjmp(png_jmpbuf(png_ptr)) == 0)
|
||||||
|
{
|
||||||
|
png_uint_32 width, height;
|
||||||
|
int bit_depth, color_type, interlace_method,
|
||||||
|
compression_method, filter_method;
|
||||||
|
png_bytep row_tmp;
|
||||||
|
|
||||||
|
/* Now associate the recently opened (FILE*) with the default
|
||||||
|
* libpng initialization functions. Sometimes libpng is
|
||||||
|
* compiled without stdio support (it can be difficult to do
|
||||||
|
* in some environments); in that case you will have to write
|
||||||
|
* your own read callback to read data from the (FILE*).
|
||||||
|
*/
|
||||||
|
png_init_io(png_ptr, f);
|
||||||
|
|
||||||
|
/* And read the first part of the PNG file - the header and
|
||||||
|
* all the information up to the first pixel.
|
||||||
|
*/
|
||||||
|
png_read_info(png_ptr, info_ptr);
|
||||||
|
|
||||||
|
/* This fills in enough information to tell us the width of
|
||||||
|
* each row in bytes, allocate the appropriate amount of
|
||||||
|
* space. In this case png_malloc is used - it will not
|
||||||
|
* return if memory isn't available.
|
||||||
|
*/
|
||||||
|
row = png_malloc(png_ptr, png_get_rowbytes(png_ptr,
|
||||||
|
info_ptr));
|
||||||
|
|
||||||
|
/* To avoid the overhead of using a volatile auto copy row_tmp
|
||||||
|
* to a local here - just use row for the png_free below.
|
||||||
|
*/
|
||||||
|
row_tmp = row;
|
||||||
|
|
||||||
|
/* All the information we need is in the header is returned by
|
||||||
|
* png_get_IHDR, if this fails we can now use 'png_error' to
|
||||||
|
* signal the error and return control to the setjmp above.
|
||||||
|
*/
|
||||||
|
if (png_get_IHDR(png_ptr, info_ptr, &width, &height,
|
||||||
|
&bit_depth, &color_type, &interlace_method,
|
||||||
|
&compression_method, &filter_method))
|
||||||
|
{
|
||||||
|
int passes, pass;
|
||||||
|
|
||||||
|
/* png_set_interlace_handling returns the number of
|
||||||
|
* passes required as well as turning on libpng's
|
||||||
|
* handling, but since we do it ourselves this is
|
||||||
|
* necessary:
|
||||||
|
*/
|
||||||
|
switch (interlace_method)
|
||||||
|
{
|
||||||
|
case PNG_INTERLACE_NONE:
|
||||||
|
passes = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PNG_INTERLACE_ADAM7:
|
||||||
|
passes = PNG_INTERLACE_ADAM7_PASSES;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
png_error(png_ptr, "pngpixel: unknown interlace");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now read the pixels, pass-by-pass, row-by-row: */
|
||||||
|
png_start_read_image(png_ptr);
|
||||||
|
|
||||||
|
for (pass=0; pass<passes; ++pass)
|
||||||
|
{
|
||||||
|
png_uint_32 ystart, xstart, ystep, xstep;
|
||||||
|
png_uint_32 py;
|
||||||
|
|
||||||
|
if (interlace_method == PNG_INTERLACE_ADAM7)
|
||||||
|
{
|
||||||
|
/* Sometimes the whole pass is empty because the
|
||||||
|
* image is too narrow or too short. libpng
|
||||||
|
* expects to be called for each row that is
|
||||||
|
* present in the pass, so it may be necessary to
|
||||||
|
* skip the loop below (over py) if the image is
|
||||||
|
* too narrow.
|
||||||
|
*/
|
||||||
|
if (PNG_PASS_COLS(width, pass) == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* We need the starting pixel and the offset
|
||||||
|
* between each pixel in this pass; use the macros
|
||||||
|
* in png.h:
|
||||||
|
*/
|
||||||
|
xstart = PNG_PASS_START_COL(pass);
|
||||||
|
ystart = PNG_PASS_START_ROW(pass);
|
||||||
|
xstep = PNG_PASS_COL_OFFSET(pass);
|
||||||
|
ystep = PNG_PASS_ROW_OFFSET(pass);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ystart = xstart = 0;
|
||||||
|
ystep = xstep = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* To find the pixel, loop over 'py' for each pass
|
||||||
|
* reading a row and then checking to see if it
|
||||||
|
* contains the pixel.
|
||||||
|
*/
|
||||||
|
for (py = ystart; py < height; py += ystep)
|
||||||
|
{
|
||||||
|
png_uint_32 px, ppx;
|
||||||
|
|
||||||
|
/* png_read_row takes two pointers. When libpng
|
||||||
|
* handles the interlace the first is filled in
|
||||||
|
* pixel-by-pixel, and the second receives the same
|
||||||
|
* pixels but they are replicated across the
|
||||||
|
* unwritten pixels so far for each pass. When we
|
||||||
|
* do the interlace, however, they just contain
|
||||||
|
* the pixels from the interlace pass - giving
|
||||||
|
* both is wasteful and pointless, so we pass a
|
||||||
|
* NULL pointer.
|
||||||
|
*/
|
||||||
|
png_read_row(png_ptr, row_tmp, NULL);
|
||||||
|
|
||||||
|
/* Now find the pixel if it is in this row; there
|
||||||
|
* are, of course, much better ways of doing this
|
||||||
|
* than using a for loop:
|
||||||
|
*/
|
||||||
|
if (y == py) for (px = xstart, ppx = 0;
|
||||||
|
px < width; px += xstep, ++ppx) if (x == px)
|
||||||
|
{
|
||||||
|
/* 'ppx' is the index of the pixel in the row
|
||||||
|
* buffer.
|
||||||
|
*/
|
||||||
|
print_pixel(png_ptr, info_ptr, row_tmp, ppx);
|
||||||
|
|
||||||
|
/* Now terminate the loops early - we have
|
||||||
|
* found and handled the required data.
|
||||||
|
*/
|
||||||
|
goto pass_loop_end;
|
||||||
|
} /* x loop */
|
||||||
|
} /* y loop */
|
||||||
|
} /* pass loop */
|
||||||
|
|
||||||
|
/* Finally free the temporary buffer: */
|
||||||
|
pass_loop_end:
|
||||||
|
row = NULL;
|
||||||
|
png_free(png_ptr, row_tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
png_error(png_ptr, "pngpixel: png_get_IHDR failed");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Else libpng has raised an error. An error message has
|
||||||
|
* already been output, so it is only necessary to clean up
|
||||||
|
* locally allocated data:
|
||||||
|
*/
|
||||||
|
if (row != NULL)
|
||||||
|
{
|
||||||
|
/* The default implementation of png_free never errors out
|
||||||
|
* (it just crashes if something goes wrong), but the safe
|
||||||
|
* way of using it is still to clear 'row' before calling
|
||||||
|
* png_free:
|
||||||
|
*/
|
||||||
|
png_bytep row_tmp = row;
|
||||||
|
row = NULL;
|
||||||
|
png_free(png_ptr, row_tmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
png_destroy_info_struct(png_ptr, &info_ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
fprintf(stderr, "pngpixel: out of memory allocating png_info\n");
|
||||||
|
|
||||||
|
png_destroy_read_struct(&png_ptr, NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
fprintf(stderr, "pngpixel: out of memory allocating png_struct\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
fprintf(stderr, "pngpixel: %s: could not open file\n", argv[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
/* Wrong number of arguments */
|
||||||
|
fprintf(stderr, "pngpixel: usage: pngpixel x y png-file\n");
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
#endif /* READ && SEQUENTIAL_READ */
|
||||||
95
contrib/examples/pngtopng.c
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
/*- pngtopng
|
||||||
|
*
|
||||||
|
* COPYRIGHT: Written by John Cunningham Bowler, 2011.
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* Read a PNG and write it out in a fixed format, using the 'simplified API'
|
||||||
|
* that was introduced in libpng-1.6.0.
|
||||||
|
*
|
||||||
|
* This sample code is just the code from the top of 'example.c' with some error
|
||||||
|
* handling added. See example.c for more comments.
|
||||||
|
*/
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
/* Normally use <png.h> here to get the installed libpng, but this is done to
|
||||||
|
* ensure the code picks up the local libpng implementation:
|
||||||
|
*/
|
||||||
|
#include "../../png.h"
|
||||||
|
#if defined(PNG_SIMPLIFIED_READ_SUPPORTED) && \
|
||||||
|
defined(PNG_SIMPLIFIED_WRITE_SUPPORTED)
|
||||||
|
|
||||||
|
int main(int argc, const char **argv)
|
||||||
|
{
|
||||||
|
int result = 1;
|
||||||
|
|
||||||
|
if (argc == 3)
|
||||||
|
{
|
||||||
|
png_image image;
|
||||||
|
|
||||||
|
/* Only the image structure version number needs to be set. */
|
||||||
|
memset(&image, 0, sizeof image);
|
||||||
|
image.version = PNG_IMAGE_VERSION;
|
||||||
|
|
||||||
|
if (png_image_begin_read_from_file(&image, argv[1]))
|
||||||
|
{
|
||||||
|
png_bytep buffer;
|
||||||
|
|
||||||
|
/* Change this to try different formats! If you set a colormap format
|
||||||
|
* then you must also supply a colormap below.
|
||||||
|
*/
|
||||||
|
image.format = PNG_FORMAT_RGBA;
|
||||||
|
|
||||||
|
buffer = malloc(PNG_IMAGE_SIZE(image));
|
||||||
|
|
||||||
|
if (buffer != NULL)
|
||||||
|
{
|
||||||
|
if (png_image_finish_read(&image, NULL/*background*/, buffer,
|
||||||
|
0/*row_stride*/, NULL/*colormap for PNG_FORMAT_FLAG_COLORMAP */))
|
||||||
|
{
|
||||||
|
if (png_image_write_to_file(&image, argv[2],
|
||||||
|
0/*convert_to_8bit*/, buffer, 0/*row_stride*/,
|
||||||
|
NULL/*colormap*/))
|
||||||
|
result = 0;
|
||||||
|
|
||||||
|
else
|
||||||
|
fprintf(stderr, "pngtopng: write %s: %s\n", argv[2],
|
||||||
|
image.message);
|
||||||
|
|
||||||
|
free(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, "pngtopng: read %s: %s\n", argv[1],
|
||||||
|
image.message);
|
||||||
|
|
||||||
|
/* This is the only place where a 'free' is required; libpng does
|
||||||
|
* the cleanup on error and success, but in this case we couldn't
|
||||||
|
* complete the read because of running out of memory.
|
||||||
|
*/
|
||||||
|
png_image_free(&image);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
fprintf(stderr, "pngtopng: out of memory: %lu bytes\n",
|
||||||
|
(unsigned long)PNG_IMAGE_SIZE(image));
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
/* Failed to read the first argument: */
|
||||||
|
fprintf(stderr, "pngtopng: %s: %s\n", argv[1], image.message);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
/* Wrong number of arguments */
|
||||||
|
fprintf(stderr, "pngtopng: usage: pngtopng input-file output-file\n");
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
#endif /* READ && WRITE */
|
||||||
648
contrib/examples/simpleover.c
Normal file
@@ -0,0 +1,648 @@
|
|||||||
|
/*- simpleover
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* Read several PNG files, which should have an alpha channel or transparency
|
||||||
|
* information, and composite them together to produce one or more 16-bit linear
|
||||||
|
* RGBA intermediates. This involves doing the correct 'over' composition to
|
||||||
|
* combine the alpha channels and corresponding data.
|
||||||
|
*
|
||||||
|
* Finally read an output (background) PNG using the 24-bit RGB format (the
|
||||||
|
* PNG will be composited on green (#00ff00) by default if it has an alpha
|
||||||
|
* channel), and apply the intermediate image generated above to specified
|
||||||
|
* locations in the image.
|
||||||
|
*
|
||||||
|
* The command line has the general format:
|
||||||
|
*
|
||||||
|
* simpleover <background.png> [output.png]
|
||||||
|
* {--sprite=width,height,name {[--at=x,y] {sprite.png}}}
|
||||||
|
* {--add=name {x,y}}
|
||||||
|
*
|
||||||
|
* The --sprite and --add options may occur multiple times. They are executed
|
||||||
|
* in order. --add may refer to any sprite already read.
|
||||||
|
*
|
||||||
|
* This code is intended to show how to composite multiple images together
|
||||||
|
* correctly. Apart from the libpng Simplified API the only work done in here
|
||||||
|
* is to combine multiple input PNG images into a single sprite; this involves
|
||||||
|
* a Porter-Duff 'over' operation and the input PNG images may, as a result,
|
||||||
|
* be regarded as being layered one on top of the other with the first (leftmost
|
||||||
|
* on the command line) being at the bottom and the last on the top.
|
||||||
|
*/
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
/* Normally use <png.h> here to get the installed libpng, but this is done to
|
||||||
|
* ensure the code picks up the local libpng implementation, so long as this
|
||||||
|
* file is linked against a sufficiently recent libpng (1.6+) it is ok to
|
||||||
|
* change this to <png.h>:
|
||||||
|
*/
|
||||||
|
#include "../../png.h"
|
||||||
|
|
||||||
|
#ifdef PNG_SIMPLIFIED_READ_SUPPORTED
|
||||||
|
|
||||||
|
#define sprite_name_chars 15
|
||||||
|
struct sprite {
|
||||||
|
FILE *file;
|
||||||
|
png_uint_16p buffer;
|
||||||
|
unsigned int width;
|
||||||
|
unsigned int height;
|
||||||
|
char name[sprite_name_chars+1];
|
||||||
|
};
|
||||||
|
|
||||||
|
#if 0 /* div by 65535 test program */
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
double err = 0;
|
||||||
|
unsigned int xerr = 0;
|
||||||
|
unsigned int r = 32769;
|
||||||
|
{
|
||||||
|
unsigned int x = 0;
|
||||||
|
|
||||||
|
do {
|
||||||
|
unsigned int t = x + (x >> 16) /*+ (x >> 31)*/ + r;
|
||||||
|
double v = x, errtest;
|
||||||
|
|
||||||
|
if (t < x) {
|
||||||
|
fprintf(stderr, "overflow: %u+%u -> %u\n", x, r, t);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
v /= 65535;
|
||||||
|
errtest = v;
|
||||||
|
t >>= 16;
|
||||||
|
errtest -= t;
|
||||||
|
|
||||||
|
if (errtest > err) {
|
||||||
|
err = errtest;
|
||||||
|
xerr = x;
|
||||||
|
|
||||||
|
if (errtest >= .5) {
|
||||||
|
fprintf(stderr, "error: %u/65535 = %f, not %u, error %f\n",
|
||||||
|
x, v, t, errtest);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (++x <= 65535U*65535U);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("error %f @ %u\n", err, xerr);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif /* div by 65535 test program */
|
||||||
|
|
||||||
|
static void
|
||||||
|
sprite_op(const struct sprite *sprite, int x_offset, int y_offset,
|
||||||
|
png_imagep image, const png_uint_16 *buffer)
|
||||||
|
{
|
||||||
|
/* This is where the Porter-Duff 'Over' operator is evaluated; change this
|
||||||
|
* code to change the operator (this could be parameterized). Any other
|
||||||
|
* image processing operation could be used here.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/* Check for an x or y offset that pushes any part of the image beyond the
|
||||||
|
* right or bottom of the sprite:
|
||||||
|
*/
|
||||||
|
if ((y_offset < 0 || (unsigned)/*SAFE*/y_offset < sprite->height) &&
|
||||||
|
(x_offset < 0 || (unsigned)/*SAFE*/x_offset < sprite->width))
|
||||||
|
{
|
||||||
|
unsigned int y = 0;
|
||||||
|
|
||||||
|
if (y_offset < 0)
|
||||||
|
y = -y_offset; /* Skip to first visible row */
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
unsigned int x = 0;
|
||||||
|
|
||||||
|
if (x_offset < 0)
|
||||||
|
x = -x_offset;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
/* In and out are RGBA values, so: */
|
||||||
|
const png_uint_16 *in_pixel = buffer + (y * image->width + x)*4;
|
||||||
|
png_uint_32 in_alpha = in_pixel[3];
|
||||||
|
|
||||||
|
/* This is the optimized Porter-Duff 'Over' operation, when the
|
||||||
|
* input alpha is 0 the output is not changed.
|
||||||
|
*/
|
||||||
|
if (in_alpha > 0)
|
||||||
|
{
|
||||||
|
png_uint_16 *out_pixel = sprite->buffer +
|
||||||
|
((y+y_offset) * sprite->width + (x+x_offset))*4;
|
||||||
|
|
||||||
|
/* This is the weight to apply to the output: */
|
||||||
|
in_alpha = 65535-in_alpha;
|
||||||
|
|
||||||
|
if (in_alpha > 0)
|
||||||
|
{
|
||||||
|
/* The input must be composed onto the output. This means
|
||||||
|
* multiplying the current output pixel value by the inverse
|
||||||
|
* of the input alpha (1-alpha). A division is required but
|
||||||
|
* it is by the constant 65535. Approximate this as:
|
||||||
|
*
|
||||||
|
* (x + (x >> 16) + 32769) >> 16;
|
||||||
|
*
|
||||||
|
* This is exact (and does not overflow) for all values of
|
||||||
|
* x in the range 0..65535*65535. (Note that the calculation
|
||||||
|
* produces the closest integer; the maximum error is <0.5).
|
||||||
|
*/
|
||||||
|
png_uint_32 tmp;
|
||||||
|
|
||||||
|
# define compose(c)\
|
||||||
|
tmp = out_pixel[c] * in_alpha;\
|
||||||
|
tmp = (tmp + (tmp >> 16) + 32769) >> 16;\
|
||||||
|
out_pixel[c] = tmp + in_pixel[c]
|
||||||
|
|
||||||
|
/* The following is very vectorizable... */
|
||||||
|
compose(0);
|
||||||
|
compose(1);
|
||||||
|
compose(2);
|
||||||
|
compose(3);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
out_pixel[0] = in_pixel[0],
|
||||||
|
out_pixel[1] = in_pixel[1],
|
||||||
|
out_pixel[2] = in_pixel[2],
|
||||||
|
out_pixel[3] = in_pixel[3];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (++x < image->width);
|
||||||
|
}
|
||||||
|
while (++y < image->height);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
create_sprite(struct sprite *sprite, int *argc, const char ***argv)
|
||||||
|
{
|
||||||
|
/* Read the arguments and create this sprite. The sprite buffer has already
|
||||||
|
* been allocated. This reads the input PNGs one by one in linear format,
|
||||||
|
* composes them onto the sprite buffer (the code in the function above)
|
||||||
|
* then saves the result, converting it on the fly to PNG RGBA 8-bit format.
|
||||||
|
*/
|
||||||
|
while (*argc > 0)
|
||||||
|
{
|
||||||
|
char tombstone;
|
||||||
|
int x = 0, y = 0;
|
||||||
|
|
||||||
|
if ((*argv)[0][0] == '-' && (*argv)[0][1] == '-')
|
||||||
|
{
|
||||||
|
/* The only supported option is --at. */
|
||||||
|
if (sscanf((*argv)[0], "--at=%d,%d%c", &x, &y, &tombstone) != 2)
|
||||||
|
break; /* success; caller will parse this option */
|
||||||
|
|
||||||
|
++*argv, --*argc;
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* The argument has to be a file name */
|
||||||
|
png_image image;
|
||||||
|
|
||||||
|
image.version = PNG_IMAGE_VERSION;
|
||||||
|
image.opaque = NULL;
|
||||||
|
|
||||||
|
if (png_image_begin_read_from_file(&image, (*argv)[0]))
|
||||||
|
{
|
||||||
|
png_uint_16p buffer;
|
||||||
|
|
||||||
|
image.format = PNG_FORMAT_LINEAR_RGB_ALPHA;
|
||||||
|
|
||||||
|
buffer = malloc(PNG_IMAGE_SIZE(image));
|
||||||
|
|
||||||
|
if (buffer != NULL)
|
||||||
|
{
|
||||||
|
if (png_image_finish_read(&image, NULL/*background*/, buffer,
|
||||||
|
0/*row_stride*/,
|
||||||
|
NULL/*colormap for PNG_FORMAT_FLAG_COLORMAP*/))
|
||||||
|
{
|
||||||
|
/* This is the place where the Porter-Duff 'Over' operator
|
||||||
|
* needs to be done by this code. In fact, any image
|
||||||
|
* processing required can be done here; the data is in
|
||||||
|
* the correct format (linear, 16-bit) and source and
|
||||||
|
* destination are in memory.
|
||||||
|
*/
|
||||||
|
sprite_op(sprite, x, y, &image, buffer);
|
||||||
|
free(buffer);
|
||||||
|
++*argv, --*argc;
|
||||||
|
/* And continue to the next argument */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
free(buffer);
|
||||||
|
fprintf(stderr, "simpleover: read %s: %s\n", (*argv)[0],
|
||||||
|
image.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, "simpleover: out of memory: %lu bytes\n",
|
||||||
|
(unsigned long)PNG_IMAGE_SIZE(image));
|
||||||
|
|
||||||
|
/* png_image_free must be called if we abort the Simplified API
|
||||||
|
* read because of a problem detected in this code. If problems
|
||||||
|
* are detected in the Simplified API it cleans up itself.
|
||||||
|
*/
|
||||||
|
png_image_free(&image);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Failed to read the first argument: */
|
||||||
|
fprintf(stderr, "simpleover: %s: %s\n", (*argv)[0], image.message);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0; /* failure */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* All the sprite operations have completed successfully. Save the RGBA
|
||||||
|
* buffer as a PNG using the simplified write API.
|
||||||
|
*/
|
||||||
|
sprite->file = tmpfile();
|
||||||
|
|
||||||
|
if (sprite->file != NULL)
|
||||||
|
{
|
||||||
|
png_image save;
|
||||||
|
|
||||||
|
memset(&save, 0, sizeof save);
|
||||||
|
save.version = PNG_IMAGE_VERSION;
|
||||||
|
save.opaque = NULL;
|
||||||
|
save.width = sprite->width;
|
||||||
|
save.height = sprite->height;
|
||||||
|
save.format = PNG_FORMAT_LINEAR_RGB_ALPHA;
|
||||||
|
save.flags = PNG_IMAGE_FLAG_FAST;
|
||||||
|
save.colormap_entries = 0;
|
||||||
|
|
||||||
|
if (png_image_write_to_stdio(&save, sprite->file, 1/*convert_to_8_bit*/,
|
||||||
|
sprite->buffer, 0/*row_stride*/, NULL/*colormap*/))
|
||||||
|
{
|
||||||
|
/* Success; the buffer is no longer needed: */
|
||||||
|
free(sprite->buffer);
|
||||||
|
sprite->buffer = NULL;
|
||||||
|
return 1; /* ok */
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
fprintf(stderr, "simpleover: write sprite %s: %s\n", sprite->name,
|
||||||
|
save.message);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
fprintf(stderr, "simpleover: sprite %s: could not allocate tmpfile: %s\n",
|
||||||
|
sprite->name, strerror(errno));
|
||||||
|
|
||||||
|
return 0; /* fail */
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
add_sprite(png_imagep output, png_bytep out_buf, struct sprite *sprite,
|
||||||
|
int *argc, const char ***argv)
|
||||||
|
{
|
||||||
|
/* Given a --add argument naming this sprite, perform the operations listed
|
||||||
|
* in the following arguments. The arguments are expected to have the form
|
||||||
|
* (x,y), which is just an offset at which to add the sprite to the
|
||||||
|
* output.
|
||||||
|
*/
|
||||||
|
while (*argc > 0)
|
||||||
|
{
|
||||||
|
char tombstone;
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
if ((*argv)[0][0] == '-' && (*argv)[0][1] == '-')
|
||||||
|
return 1; /* success */
|
||||||
|
|
||||||
|
if (sscanf((*argv)[0], "%d,%d%c", &x, &y, &tombstone) == 2)
|
||||||
|
{
|
||||||
|
/* Now add the new image into the sprite data, but only if it
|
||||||
|
* will fit.
|
||||||
|
*/
|
||||||
|
if (x < 0 || y < 0 ||
|
||||||
|
(unsigned)/*SAFE*/x >= output->width ||
|
||||||
|
(unsigned)/*SAFE*/y >= output->height ||
|
||||||
|
sprite->width > output->width-x ||
|
||||||
|
sprite->height > output->height-y)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "simpleover: sprite %s @ (%d,%d) outside image\n",
|
||||||
|
sprite->name, x, y);
|
||||||
|
/* Could just skip this, but for the moment it is an error */
|
||||||
|
return 0; /* error */
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Since we know the sprite fits we can just read it into the
|
||||||
|
* output using the simplified API.
|
||||||
|
*/
|
||||||
|
png_image in;
|
||||||
|
|
||||||
|
in.version = PNG_IMAGE_VERSION;
|
||||||
|
rewind(sprite->file);
|
||||||
|
|
||||||
|
if (png_image_begin_read_from_stdio(&in, sprite->file))
|
||||||
|
{
|
||||||
|
in.format = PNG_FORMAT_RGB; /* force compose */
|
||||||
|
|
||||||
|
if (png_image_finish_read(&in, NULL/*background*/,
|
||||||
|
out_buf + (y*output->width + x)*3/*RGB*/,
|
||||||
|
output->width*3/*row_stride*/,
|
||||||
|
NULL/*colormap for PNG_FORMAT_FLAG_COLORMAP*/))
|
||||||
|
{
|
||||||
|
++*argv, --*argc;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The read failed: */
|
||||||
|
fprintf(stderr, "simpleover: add sprite %s: %s\n", sprite->name,
|
||||||
|
in.message);
|
||||||
|
return 0; /* error */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, "simpleover: --add='%s': invalid position %s\n",
|
||||||
|
sprite->name, (*argv)[0]);
|
||||||
|
return 0; /* error */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1; /* ok */
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
simpleover_process(png_imagep output, png_bytep out_buf, int argc,
|
||||||
|
const char **argv)
|
||||||
|
{
|
||||||
|
int result = 1; /* success */
|
||||||
|
# define csprites 10/*limit*/
|
||||||
|
# define str(a) #a
|
||||||
|
int nsprites = 0;
|
||||||
|
struct sprite sprites[csprites];
|
||||||
|
|
||||||
|
while (argc > 0)
|
||||||
|
{
|
||||||
|
result = 0; /* fail */
|
||||||
|
|
||||||
|
if (strncmp(argv[0], "--sprite=", 9) == 0)
|
||||||
|
{
|
||||||
|
char tombstone;
|
||||||
|
|
||||||
|
if (nsprites < csprites)
|
||||||
|
{
|
||||||
|
int n;
|
||||||
|
|
||||||
|
sprites[nsprites].width = sprites[nsprites].height = 0;
|
||||||
|
sprites[nsprites].name[0] = 0;
|
||||||
|
|
||||||
|
n = sscanf(argv[0], "--sprite=%u,%u,%" str(sprite_name_chars) "s%c",
|
||||||
|
&sprites[nsprites].width, &sprites[nsprites].height,
|
||||||
|
sprites[nsprites].name, &tombstone);
|
||||||
|
|
||||||
|
if ((n == 2 || n == 3) &&
|
||||||
|
sprites[nsprites].width > 0 && sprites[nsprites].height > 0)
|
||||||
|
{
|
||||||
|
size_t buf_size, tmp;
|
||||||
|
|
||||||
|
/* Default a name if not given. */
|
||||||
|
if (sprites[nsprites].name[0] == 0)
|
||||||
|
sprintf(sprites[nsprites].name, "sprite-%d", nsprites+1);
|
||||||
|
|
||||||
|
/* Allocate a buffer for the sprite and calculate the buffer
|
||||||
|
* size:
|
||||||
|
*/
|
||||||
|
buf_size = sizeof (png_uint_16 [4]);
|
||||||
|
buf_size *= sprites[nsprites].width;
|
||||||
|
buf_size *= sprites[nsprites].height;
|
||||||
|
|
||||||
|
/* This can overflow a (size_t); check for this: */
|
||||||
|
tmp = buf_size;
|
||||||
|
tmp /= sprites[nsprites].width;
|
||||||
|
tmp /= sprites[nsprites].height;
|
||||||
|
|
||||||
|
if (tmp == sizeof (png_uint_16 [4]))
|
||||||
|
{
|
||||||
|
sprites[nsprites].buffer = malloc(buf_size);
|
||||||
|
/* This buffer must be initialized to transparent: */
|
||||||
|
memset(sprites[nsprites].buffer, 0, buf_size);
|
||||||
|
|
||||||
|
if (sprites[nsprites].buffer != NULL)
|
||||||
|
{
|
||||||
|
sprites[nsprites].file = NULL;
|
||||||
|
++argv, --argc;
|
||||||
|
|
||||||
|
if (create_sprite(sprites+nsprites++, &argc, &argv))
|
||||||
|
{
|
||||||
|
result = 1; /* still ok */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
break; /* error */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Overflow, or OOM */
|
||||||
|
fprintf(stderr, "simpleover: %s: sprite too large\n", argv[0]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, "simpleover: %s: invalid sprite (%u,%u)\n",
|
||||||
|
argv[0], sprites[nsprites].width, sprites[nsprites].height);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, "simpleover: %s: too many sprites\n", argv[0]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (strncmp(argv[0], "--add=", 6) == 0)
|
||||||
|
{
|
||||||
|
const char *name = argv[0]+6;
|
||||||
|
int isprite = nsprites;
|
||||||
|
|
||||||
|
++argv, --argc;
|
||||||
|
|
||||||
|
while (--isprite >= 0)
|
||||||
|
{
|
||||||
|
if (strcmp(sprites[isprite].name, name) == 0)
|
||||||
|
{
|
||||||
|
if (!add_sprite(output, out_buf, sprites+isprite, &argc, &argv))
|
||||||
|
goto out; /* error in add_sprite */
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isprite < 0) /* sprite not found */
|
||||||
|
{
|
||||||
|
fprintf(stderr, "simpleover: --add='%s': sprite not found\n", name);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, "simpleover: %s: unrecognized operation\n", argv[0]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = 1; /* ok */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clean up the cache of sprites: */
|
||||||
|
out:
|
||||||
|
while (--nsprites >= 0)
|
||||||
|
{
|
||||||
|
if (sprites[nsprites].buffer != NULL)
|
||||||
|
free(sprites[nsprites].buffer);
|
||||||
|
|
||||||
|
if (sprites[nsprites].file != NULL)
|
||||||
|
(void)fclose(sprites[nsprites].file);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, const char **argv)
|
||||||
|
{
|
||||||
|
int result = 1; /* default to fail */
|
||||||
|
|
||||||
|
if (argc >= 2)
|
||||||
|
{
|
||||||
|
int argi = 2;
|
||||||
|
const char *output = NULL;
|
||||||
|
png_image image;
|
||||||
|
|
||||||
|
if (argc > 2 && argv[2][0] != '-'/*an operation*/)
|
||||||
|
{
|
||||||
|
output = argv[2];
|
||||||
|
argi = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
image.version = PNG_IMAGE_VERSION;
|
||||||
|
image.opaque = NULL;
|
||||||
|
|
||||||
|
if (png_image_begin_read_from_file(&image, argv[1]))
|
||||||
|
{
|
||||||
|
png_bytep buffer;
|
||||||
|
|
||||||
|
image.format = PNG_FORMAT_RGB; /* 24-bit RGB */
|
||||||
|
|
||||||
|
buffer = malloc(PNG_IMAGE_SIZE(image));
|
||||||
|
|
||||||
|
if (buffer != NULL)
|
||||||
|
{
|
||||||
|
png_color background = {0, 0xff, 0}; /* fully saturated green */
|
||||||
|
|
||||||
|
if (png_image_finish_read(&image, &background, buffer,
|
||||||
|
0/*row_stride*/, NULL/*colormap for PNG_FORMAT_FLAG_COLORMAP */))
|
||||||
|
{
|
||||||
|
/* At this point png_image_finish_read has cleaned up the
|
||||||
|
* allocated data in png_image, and only the buffer needs to be
|
||||||
|
* freed.
|
||||||
|
*
|
||||||
|
* Perform the remaining operations:
|
||||||
|
*/
|
||||||
|
if (simpleover_process(&image, buffer, argc-argi, argv+argi))
|
||||||
|
{
|
||||||
|
/* Write the output: */
|
||||||
|
if ((output != NULL &&
|
||||||
|
png_image_write_to_file(&image, output,
|
||||||
|
0/*convert_to_8bit*/, buffer, 0/*row_stride*/,
|
||||||
|
NULL/*colormap*/)) ||
|
||||||
|
(output == NULL &&
|
||||||
|
png_image_write_to_stdio(&image, stdout,
|
||||||
|
0/*convert_to_8bit*/, buffer, 0/*row_stride*/,
|
||||||
|
NULL/*colormap*/)))
|
||||||
|
result = 0;
|
||||||
|
|
||||||
|
else
|
||||||
|
fprintf(stderr, "simpleover: write %s: %s\n",
|
||||||
|
output == NULL ? "stdout" : output, image.message);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* else simpleover_process writes an error message */
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
fprintf(stderr, "simpleover: read %s: %s\n", argv[1],
|
||||||
|
image.message);
|
||||||
|
|
||||||
|
free(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, "simpleover: out of memory: %lu bytes\n",
|
||||||
|
(unsigned long)PNG_IMAGE_SIZE(image));
|
||||||
|
|
||||||
|
/* This is the only place where a 'free' is required; libpng does
|
||||||
|
* the cleanup on error and success, but in this case we couldn't
|
||||||
|
* complete the read because of running out of memory.
|
||||||
|
*/
|
||||||
|
png_image_free(&image);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Failed to read the first argument: */
|
||||||
|
fprintf(stderr, "simpleover: %s: %s\n", argv[1], image.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Usage message */
|
||||||
|
fprintf(stderr,
|
||||||
|
"simpleover: usage: simpleover background.png [output.png]\n"
|
||||||
|
" Output 'background.png' as a 24-bit RGB PNG file in 'output.png'\n"
|
||||||
|
" or, if not given, stdout. 'background.png' will be composited\n"
|
||||||
|
" on fully saturated green.\n"
|
||||||
|
"\n"
|
||||||
|
" Optionally, before output, process additional PNG files:\n"
|
||||||
|
"\n"
|
||||||
|
" --sprite=width,height,name {[--at=x,y] {sprite.png}}\n"
|
||||||
|
" Produce a transparent sprite of size (width,height) and with\n"
|
||||||
|
" name 'name'.\n"
|
||||||
|
" For each sprite.png composite it using a Porter-Duff 'Over'\n"
|
||||||
|
" operation at offset (x,y) in the sprite (defaulting to (0,0)).\n"
|
||||||
|
" Input PNGs will be truncated to the area of the sprite.\n"
|
||||||
|
"\n"
|
||||||
|
" --add='name' {x,y}\n"
|
||||||
|
" Optionally, before output, composite a sprite, 'name', which\n"
|
||||||
|
" must have been previously produced using --sprite, at each\n"
|
||||||
|
" offset (x,y) in the output image. Each sprite must fit\n"
|
||||||
|
" completely within the output image.\n"
|
||||||
|
"\n"
|
||||||
|
" PNG files are processed in the order they occur on the command\n"
|
||||||
|
" line and thus the first PNG processed appears as the bottommost\n"
|
||||||
|
" in the output image.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
#endif /* SIMPLIFIED_READ */
|
||||||
@@ -47,7 +47,8 @@ CC = gcc
|
|||||||
#CC = i386-mingw32msvc-gcc # e.g., Linux -> Win32 cross-compilation
|
#CC = i386-mingw32msvc-gcc # e.g., Linux -> Win32 cross-compilation
|
||||||
LD = $(CC)
|
LD = $(CC)
|
||||||
RM = rm -f
|
RM = rm -f
|
||||||
CFLAGS = -O -Wall $(INCS) $(MINGW_CCFLAGS)
|
CPPFLAGS = $(INCS)
|
||||||
|
CFLAGS = -O -Wall $(MINGW_CCFLAGS)
|
||||||
# [note that -Wall is a gcc-specific compilation flag ("most warnings on")]
|
# [note that -Wall is a gcc-specific compilation flag ("most warnings on")]
|
||||||
# [-ansi, -pedantic and -W can also be used]
|
# [-ansi, -pedantic and -W can also be used]
|
||||||
LDFLAGS = $(MINGW_LDFLAGS)
|
LDFLAGS = $(MINGW_LDFLAGS)
|
||||||
@@ -85,10 +86,10 @@ EXES = $(STATIC_EXES) $(DYNAMIC_EXES)
|
|||||||
# implicit make rules -------------------------------------------------------
|
# implicit make rules -------------------------------------------------------
|
||||||
|
|
||||||
.c$(O):
|
.c$(O):
|
||||||
$(CC) -c $(CFLAGS) $<
|
$(CC) -c $(CPPFLAGS) $(CFLAGS) $<
|
||||||
|
|
||||||
%.pic$(O): %.c
|
%.pic$(O): %.c
|
||||||
$(CC) -c $(CFLAGS) -DPNG_BUILD_DLL -o $@ $<
|
$(CC) -c $(CPPFLAGS) $(CFLAGS) -DPNG_BUILD_DLL -o $@ $<
|
||||||
|
|
||||||
|
|
||||||
# dependencies --------------------------------------------------------------
|
# dependencies --------------------------------------------------------------
|
||||||
|
|||||||
@@ -23,9 +23,9 @@
|
|||||||
|
|
||||||
# macros --------------------------------------------------------------------
|
# macros --------------------------------------------------------------------
|
||||||
|
|
||||||
PNGINC = -I/usr/local/include/libpng15
|
PNGINC = -I/usr/local/include/libpng17
|
||||||
PNGLIB = -L/usr/local/lib -lpng15 # dynamically linked against libpng
|
PNGLIB = -L/usr/local/lib -lpng17 # dynamically linked against libpng
|
||||||
#PNGLIB = /usr/local/lib/libpng15.a # statically linked against libpng
|
#PNGLIB = /usr/local/lib/libpng17.a # statically linked against libpng
|
||||||
# or:
|
# or:
|
||||||
#PNGINC = -I../..
|
#PNGINC = -I../..
|
||||||
#PNGLIB = -L../.. -lpng
|
#PNGLIB = -L../.. -lpng
|
||||||
@@ -53,7 +53,8 @@ CC = cc
|
|||||||
LD = cc
|
LD = cc
|
||||||
RM = rm -f
|
RM = rm -f
|
||||||
# ABI must be the same as that used to build libpng.
|
# ABI must be the same as that used to build libpng.
|
||||||
ABI=
|
ABI =
|
||||||
|
CPPFLAGS =
|
||||||
CFLAGS = $(ABI) -O -fullwarn $(INCS)
|
CFLAGS = $(ABI) -O -fullwarn $(INCS)
|
||||||
LDFLAGS = $(ABI)
|
LDFLAGS = $(ABI)
|
||||||
O = .o
|
O = .o
|
||||||
@@ -73,7 +74,7 @@ EXES = $(RPNG)$(E) $(RPNG2)$(E) $(WPNG)$(E)
|
|||||||
# implicit make rules -------------------------------------------------------
|
# implicit make rules -------------------------------------------------------
|
||||||
|
|
||||||
.c$(O):
|
.c$(O):
|
||||||
$(CC) -c $(CFLAGS) $<
|
$(CC) -c $(CPPFLAGS) $(CFLAGS) $<
|
||||||
|
|
||||||
|
|
||||||
# dependencies --------------------------------------------------------------
|
# dependencies --------------------------------------------------------------
|
||||||
|
|||||||
@@ -26,14 +26,14 @@
|
|||||||
# macros --------------------------------------------------------------------
|
# macros --------------------------------------------------------------------
|
||||||
|
|
||||||
#PNGDIR = /usr/local/lib
|
#PNGDIR = /usr/local/lib
|
||||||
#PNGINC = -I/usr/local/include/libpng15
|
#PNGINC = -I/usr/local/include/libpng17
|
||||||
#PNGLIBd = -L$(PNGDIR) -lpng15 # dynamically linked, installed libpng
|
#PNGLIBd = -L$(PNGDIR) -lpng17 # dynamically linked, installed libpng
|
||||||
#PNGLIBs = $(PNGDIR)/libpng15.a # statically linked, installed libpng
|
#PNGLIBs = $(PNGDIR)/libpng17.a # statically linked, installed libpng
|
||||||
# or:
|
# or:
|
||||||
PNGDIR = ../..# this one is for libpng-x.y.z/contrib/gregbook builds
|
PNGDIR = ../..# this one is for libpng-x.y.z/contrib/gregbook builds
|
||||||
#PNGDIR = ../libpng
|
#PNGDIR = ../libpng
|
||||||
PNGINC = -I$(PNGDIR)
|
PNGINC = -I$(PNGDIR)
|
||||||
PNGLIBd = -Wl,-rpath,$(PNGDIR) -L$(PNGDIR) -lpng15 # dynamically linked
|
PNGLIBd = -Wl,-rpath,$(PNGDIR) -L$(PNGDIR) -lpng17 # dynamically linked
|
||||||
PNGLIBs = $(PNGDIR)/libpng.a # statically linked, local libpng
|
PNGLIBs = $(PNGDIR)/libpng.a # statically linked, local libpng
|
||||||
|
|
||||||
ZDIR = /usr/local/lib
|
ZDIR = /usr/local/lib
|
||||||
@@ -64,7 +64,8 @@ WLIBSs = $(PNGLIBs) $(ZLIBs)
|
|||||||
CC = gcc
|
CC = gcc
|
||||||
LD = gcc
|
LD = gcc
|
||||||
RM = rm -f
|
RM = rm -f
|
||||||
CFLAGS = -O -Wall $(INCS) -DFEATURE_LOOP
|
CPPFLAGS = $(INCS) -DFEATURE_LOOP
|
||||||
|
CFLAGS = -O -Wall
|
||||||
# [note that -Wall is a gcc-specific compilation flag ("most warnings on")]
|
# [note that -Wall is a gcc-specific compilation flag ("most warnings on")]
|
||||||
# [-ansi, -pedantic and -W can also be used]
|
# [-ansi, -pedantic and -W can also be used]
|
||||||
LDFLAGS =
|
LDFLAGS =
|
||||||
@@ -92,7 +93,7 @@ EXES = $(STATIC_EXES) $(DYNAMIC_EXES)
|
|||||||
# implicit make rules -------------------------------------------------------
|
# implicit make rules -------------------------------------------------------
|
||||||
|
|
||||||
.c$(O):
|
.c$(O):
|
||||||
$(CC) -c $(CFLAGS) $<
|
$(CC) -c $(CPPFLAGS) $(CFLAGS) $<
|
||||||
|
|
||||||
|
|
||||||
# dependencies --------------------------------------------------------------
|
# dependencies --------------------------------------------------------------
|
||||||
|
|||||||
@@ -53,7 +53,8 @@ WLIBS = $(PNGLIB) $(ZLIB)
|
|||||||
CC = cl
|
CC = cl
|
||||||
LD = link
|
LD = link
|
||||||
RM = del
|
RM = del
|
||||||
CFLAGS = -nologo -O -W3 $(INCS) $(cvars)
|
CPPFLAGS = $(INCS)
|
||||||
|
CFLAGS = -nologo -O -W3 $(cvars)
|
||||||
# [note that -W3 is an MSVC-specific compilation flag ("all warnings on")]
|
# [note that -W3 is an MSVC-specific compilation flag ("all warnings on")]
|
||||||
# [see %devstudio%\vc\include\win32.mak for cvars macro definition]
|
# [see %devstudio%\vc\include\win32.mak for cvars macro definition]
|
||||||
O = .obj
|
O = .obj
|
||||||
@@ -76,7 +77,7 @@ EXES = $(RPNG)$(E) $(RPNG2)$(E) $(WPNG)$(E)
|
|||||||
# implicit make rules -------------------------------------------------------
|
# implicit make rules -------------------------------------------------------
|
||||||
|
|
||||||
.c$(O):
|
.c$(O):
|
||||||
$(CC) -c $(CFLAGS) $<
|
$(CC) -c $(CPPFLAGS) $(CFLAGS) $<
|
||||||
|
|
||||||
|
|
||||||
# dependencies --------------------------------------------------------------
|
# dependencies --------------------------------------------------------------
|
||||||
|
|||||||
@@ -55,8 +55,9 @@
|
|||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <zlib.h>
|
||||||
|
|
||||||
#include "png.h" /* libpng header; includes zlib.h */
|
#include "png.h" /* libpng header */
|
||||||
#include "readpng.h" /* typedefs, common macros, public prototypes */
|
#include "readpng.h" /* typedefs, common macros, public prototypes */
|
||||||
|
|
||||||
/* future versions of libpng will provide this macro: */
|
/* future versions of libpng will provide this macro: */
|
||||||
@@ -214,6 +215,10 @@ uch *readpng_get_image(double display_exponent, int *pChannels, ulg *pRowbytes)
|
|||||||
* libpng function */
|
* libpng function */
|
||||||
|
|
||||||
if (setjmp(png_jmpbuf(png_ptr))) {
|
if (setjmp(png_jmpbuf(png_ptr))) {
|
||||||
|
free(image_data);
|
||||||
|
image_data = NULL;
|
||||||
|
free(row_pointers);
|
||||||
|
row_pointers = NULL;
|
||||||
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -69,6 +69,7 @@ static void readpng2_row_callback(png_structp png_ptr, png_bytep new_row,
|
|||||||
png_uint_32 row_num, int pass);
|
png_uint_32 row_num, int pass);
|
||||||
static void readpng2_end_callback(png_structp png_ptr, png_infop info_ptr);
|
static void readpng2_end_callback(png_structp png_ptr, png_infop info_ptr);
|
||||||
static void readpng2_error_handler(png_structp png_ptr, png_const_charp msg);
|
static void readpng2_error_handler(png_structp png_ptr, png_const_charp msg);
|
||||||
|
static void readpng2_warning_handler(png_structp png_ptr, png_const_charp msg);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -104,7 +105,7 @@ int readpng2_init(mainprog_info *mainprog_ptr)
|
|||||||
/* could also replace libpng warning-handler (final NULL), but no need: */
|
/* could also replace libpng warning-handler (final NULL), but no need: */
|
||||||
|
|
||||||
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, mainprog_ptr,
|
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, mainprog_ptr,
|
||||||
readpng2_error_handler, NULL);
|
readpng2_error_handler, readpng2_warning_handler);
|
||||||
if (!png_ptr)
|
if (!png_ptr)
|
||||||
return 4; /* out of memory */
|
return 4; /* out of memory */
|
||||||
|
|
||||||
@@ -136,29 +137,23 @@ int readpng2_init(mainprog_info *mainprog_ptr)
|
|||||||
* used, i.e., all chunks recognized by libpng except for IHDR, PLTE, IDAT,
|
* used, i.e., all chunks recognized by libpng except for IHDR, PLTE, IDAT,
|
||||||
* IEND, tRNS, bKGD, gAMA, and sRGB (small performance improvement) */
|
* IEND, tRNS, bKGD, gAMA, and sRGB (small performance improvement) */
|
||||||
{
|
{
|
||||||
/* These byte strings were copied from png.h. If a future libpng
|
/* These byte strings were copied from png.h. If a future version
|
||||||
* version recognizes more chunks, add them to this list. If a
|
* of readpng2.c recognizes more chunks, add them to this list.
|
||||||
* future version of readpng2.c recognizes more chunks, delete them
|
*/
|
||||||
* from this list. */
|
static PNG_CONST png_byte chunks_to_process[] = {
|
||||||
static /* const */ png_byte chunks_to_ignore[] = {
|
98, 75, 71, 68, '\0', /* bKGD */
|
||||||
99, 72, 82, 77, '\0', /* cHRM */
|
103, 65, 77, 65, '\0', /* gAMA */
|
||||||
104, 73, 83, 84, '\0', /* hIST */
|
115, 82, 71, 66, '\0', /* sRGB */
|
||||||
105, 67, 67, 80, '\0', /* iCCP */
|
};
|
||||||
105, 84, 88, 116, '\0', /* iTXt */
|
|
||||||
111, 70, 70, 115, '\0', /* oFFs */
|
|
||||||
112, 67, 65, 76, '\0', /* pCAL */
|
|
||||||
112, 72, 89, 115, '\0', /* pHYs */
|
|
||||||
115, 66, 73, 84, '\0', /* sBIT */
|
|
||||||
115, 67, 65, 76, '\0', /* sCAL */
|
|
||||||
115, 80, 76, 84, '\0', /* sPLT */
|
|
||||||
115, 84, 69, 82, '\0', /* sTER */
|
|
||||||
116, 69, 88, 116, '\0', /* tEXt */
|
|
||||||
116, 73, 77, 69, '\0', /* tIME */
|
|
||||||
122, 84, 88, 116, '\0' /* zTXt */
|
|
||||||
};
|
|
||||||
|
|
||||||
png_set_keep_unknown_chunks(png_ptr, 1 /* PNG_HANDLE_CHUNK_NEVER */,
|
/* Ignore all chunks except for IHDR, PLTE, tRNS, IDAT, and IEND */
|
||||||
chunks_to_ignore, sizeof(chunks_to_ignore)/5);
|
png_set_keep_unknown_chunks(png_ptr, -1 /* PNG_HANDLE_CHUNK_NEVER */,
|
||||||
|
NULL, -1);
|
||||||
|
|
||||||
|
/* But do not ignore chunks in the "chunks_to_process" list */
|
||||||
|
png_set_keep_unknown_chunks(png_ptr,
|
||||||
|
0 /* PNG_HANDLE_CHUNK_AS_DEFAULT */, chunks_to_process,
|
||||||
|
sizeof(chunks_to_process)/5);
|
||||||
}
|
}
|
||||||
#endif /* PNG_HANDLE_AS_UNKNOWN_SUPPORTED */
|
#endif /* PNG_HANDLE_AS_UNKNOWN_SUPPORTED */
|
||||||
|
|
||||||
@@ -453,6 +448,8 @@ static void readpng2_end_callback(png_structp png_ptr, png_infop info_ptr)
|
|||||||
|
|
||||||
/* all done */
|
/* all done */
|
||||||
|
|
||||||
|
(void)info_ptr; /* Unused */
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -473,7 +470,12 @@ void readpng2_cleanup(mainprog_info *mainprog_ptr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void readpng2_warning_handler(png_structp png_ptr, png_const_charp msg)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "readpng2 libpng warning: %s\n", msg);
|
||||||
|
fflush(stderr);
|
||||||
|
(void)png_ptr; /* Unused */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void readpng2_error_handler(png_structp png_ptr, png_const_charp msg)
|
static void readpng2_error_handler(png_structp png_ptr, png_const_charp msg)
|
||||||
|
|||||||
@@ -163,8 +163,12 @@ uch *readpng_get_image(double display_exponent, int *pChannels, ulg *pRowbytes)
|
|||||||
|
|
||||||
/* now we can go ahead and just read the whole image */
|
/* now we can go ahead and just read the whole image */
|
||||||
|
|
||||||
fread(image_data, 1L, rowbytes*height, saved_infile);
|
if (fread(image_data, 1L, rowbytes*height, saved_infile) <
|
||||||
|
rowbytes*height) {
|
||||||
|
free (image_data);
|
||||||
|
image_data = NULL;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
return image_data;
|
return image_data;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,8 +55,9 @@
|
|||||||
|
|
||||||
|
|
||||||
#include <stdlib.h> /* for exit() prototype */
|
#include <stdlib.h> /* for exit() prototype */
|
||||||
|
#include <zlib.h>
|
||||||
|
|
||||||
#include "png.h" /* libpng header; includes zlib.h and setjmp.h */
|
#include "png.h" /* libpng header, includes setjmp.h */
|
||||||
#include "writepng.h" /* typedefs, common macros, public prototypes */
|
#include "writepng.h" /* typedefs, common macros, public prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
57
contrib/libtests/fakepng.c
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
/* Fake a PNG - just write it out directly. */
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <zlib.h> /* for crc32 */
|
||||||
|
|
||||||
|
void
|
||||||
|
put_uLong(uLong val)
|
||||||
|
{
|
||||||
|
putchar(val >> 24);
|
||||||
|
putchar(val >> 16);
|
||||||
|
putchar(val >> 8);
|
||||||
|
putchar(val >> 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
put_chunk(const unsigned char *chunk, uInt length)
|
||||||
|
{
|
||||||
|
uLong crc;
|
||||||
|
|
||||||
|
put_uLong(length-4); /* Exclude the tag */
|
||||||
|
|
||||||
|
fwrite(chunk, length, 1, stdout);
|
||||||
|
|
||||||
|
crc = crc32(0, Z_NULL, 0);
|
||||||
|
put_uLong(crc32(crc, chunk, length));
|
||||||
|
}
|
||||||
|
|
||||||
|
const unsigned char signature[] =
|
||||||
|
{
|
||||||
|
137, 80, 78, 71, 13, 10, 26, 10
|
||||||
|
};
|
||||||
|
|
||||||
|
const unsigned char IHDR[] =
|
||||||
|
{
|
||||||
|
73, 72, 68, 82, /* IHDR */
|
||||||
|
0, 0, 0, 1, /* width */
|
||||||
|
0, 0, 0, 1, /* height */
|
||||||
|
1, /* bit depth */
|
||||||
|
0, /* color type: greyscale */
|
||||||
|
0, /* compression method */
|
||||||
|
0, /* filter method */
|
||||||
|
0 /* interlace method: none */
|
||||||
|
};
|
||||||
|
|
||||||
|
const unsigned char unknown[] =
|
||||||
|
{
|
||||||
|
'u', 'n', 'K', 'n' /* "unKn" - private safe to copy */
|
||||||
|
};
|
||||||
|
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
fwrite(signature, sizeof signature, 1, stdout);
|
||||||
|
put_chunk(IHDR, sizeof IHDR);
|
||||||
|
|
||||||
|
for(;;)
|
||||||
|
put_chunk(unknown, sizeof unknown);
|
||||||
|
}
|
||||||
102
contrib/libtests/gentests.sh
Executable file
@@ -0,0 +1,102 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# Copyright (c) 2013 John Cunningham Bowler
|
||||||
|
#
|
||||||
|
# Last changed in libpng 1.6.0 [February 14, 2013]
|
||||||
|
#
|
||||||
|
# This code is released under the libpng license.
|
||||||
|
# For conditions of distribution and use, see the disclaimer
|
||||||
|
# and license in png.h
|
||||||
|
#
|
||||||
|
# Generate a set of PNG test images. The images are generated in a
|
||||||
|
# sub-directory called 'tests' by default, however a command line argument will
|
||||||
|
# change that name. The generation requires a built version of makepng in the
|
||||||
|
# current directory.
|
||||||
|
#
|
||||||
|
usage(){
|
||||||
|
exec >&2
|
||||||
|
echo "$0 [<directory>]"
|
||||||
|
echo ' Generate a set of PNG test files in "directory" ("tests" by default)'
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
mp="$PWD/makepng"
|
||||||
|
test -x "$mp" || {
|
||||||
|
exec >&2
|
||||||
|
echo "$0: the 'makepng' program must exist"
|
||||||
|
echo " in the directory within which this program:"
|
||||||
|
echo " $mp"
|
||||||
|
echo " is executed"
|
||||||
|
usage
|
||||||
|
}
|
||||||
|
|
||||||
|
# Just one argument: the directory
|
||||||
|
testdir="tests"
|
||||||
|
test $# -gt 1 && {
|
||||||
|
testdir="$1"
|
||||||
|
shift
|
||||||
|
}
|
||||||
|
test $# -eq 0 || usage
|
||||||
|
|
||||||
|
# Take care not to clobber something
|
||||||
|
if test -e "$testdir"
|
||||||
|
then
|
||||||
|
test -d "$testdir" || usage
|
||||||
|
else
|
||||||
|
# mkdir -p isn't portable, so do the following
|
||||||
|
mkdir "$testdir" 2>/dev/null || mkdir -p "$testdir" || usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
# This fails in a very satisfactory way if it's not accessible
|
||||||
|
cd "$testdir"
|
||||||
|
:>"test$$.png" || {
|
||||||
|
exec >&2
|
||||||
|
echo "$testdir: directory not writable"
|
||||||
|
usage
|
||||||
|
}
|
||||||
|
rm "test$$.png" || {
|
||||||
|
exec >&2
|
||||||
|
echo "$testdir: you have create but not write privileges here."
|
||||||
|
echo " This is unexpected. You have a spurion; "'"'"test$$.png"'"'"."
|
||||||
|
echo " You need to remove this yourself. Try a different directory."
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Now call makepng ($mp) to create every file we can think of with a
|
||||||
|
# reasonable name
|
||||||
|
doit(){
|
||||||
|
for gamma in "" --sRGB --linear --1.8
|
||||||
|
do
|
||||||
|
case "$gamma" in
|
||||||
|
"")
|
||||||
|
gname=;;
|
||||||
|
--sRGB)
|
||||||
|
gname="-srgb";;
|
||||||
|
--linear)
|
||||||
|
gname="-lin";;
|
||||||
|
--1.8)
|
||||||
|
gname="-18";;
|
||||||
|
*)
|
||||||
|
gname="-$gamma";;
|
||||||
|
esac
|
||||||
|
"$mp" $gamma "$1" "$2" "test-$1-$2$gname.png"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
#
|
||||||
|
for ct in gray palette
|
||||||
|
do
|
||||||
|
for bd in 1 2 4 8
|
||||||
|
do
|
||||||
|
doit "$ct" "$bd"
|
||||||
|
done
|
||||||
|
done
|
||||||
|
#
|
||||||
|
doit "gray" "16"
|
||||||
|
#
|
||||||
|
for ct in gray-alpha rgb rgb-alpha
|
||||||
|
do
|
||||||
|
for bd in 8 16
|
||||||
|
do
|
||||||
|
doit "$ct" "$bd"
|
||||||
|
done
|
||||||
|
done
|
||||||
1486
contrib/libtests/makepng.c
Normal file
1652
contrib/libtests/pngimage.c
Normal file
1245
contrib/libtests/pngunknown.c
Normal file
104
contrib/libtests/readpng.c
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
/* readpng.c
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013 John Cunningham Bowler
|
||||||
|
*
|
||||||
|
* Last changed in libpng 1.6.1 [March 28, 2013]
|
||||||
|
*
|
||||||
|
* This code is released under the libpng license.
|
||||||
|
* For conditions of distribution and use, see the disclaimer
|
||||||
|
* and license in png.h
|
||||||
|
*
|
||||||
|
* Load an arbitrary number of PNG files (from the command line, or, if there
|
||||||
|
* are no arguments on the command line, from stdin) then run a time test by
|
||||||
|
* reading each file by row. The test does nothing with the read result and
|
||||||
|
* does no transforms. The only output is a time as a floating point number of
|
||||||
|
* seconds with 9 decimal digits.
|
||||||
|
*/
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#if defined(HAVE_CONFIG_H) && !defined(PNG_NO_CONFIG_H)
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Define the following to use this test against your installed libpng, rather
|
||||||
|
* than the one being built here:
|
||||||
|
*/
|
||||||
|
#ifdef PNG_FREESTANDING_TESTS
|
||||||
|
# include <png.h>
|
||||||
|
#else
|
||||||
|
# include "../../png.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static int
|
||||||
|
read_png(FILE *fp)
|
||||||
|
{
|
||||||
|
png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,0,0,0);
|
||||||
|
png_infop info_ptr = NULL;
|
||||||
|
png_bytep row = NULL, display = NULL;
|
||||||
|
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (setjmp(png_jmpbuf(png_ptr)))
|
||||||
|
{
|
||||||
|
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
||||||
|
if (row != NULL) free(row);
|
||||||
|
if (display != NULL) free(display);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
png_init_io(png_ptr, fp);
|
||||||
|
|
||||||
|
info_ptr = png_create_info_struct(png_ptr);
|
||||||
|
if (info_ptr == NULL)
|
||||||
|
png_error(png_ptr, "OOM allocating info structure");
|
||||||
|
|
||||||
|
png_set_keep_unknown_chunks(png_ptr, PNG_HANDLE_CHUNK_ALWAYS, NULL, 0);
|
||||||
|
|
||||||
|
png_read_info(png_ptr, info_ptr);
|
||||||
|
|
||||||
|
{
|
||||||
|
png_size_t rowbytes = png_get_rowbytes(png_ptr, info_ptr);
|
||||||
|
|
||||||
|
row = malloc(rowbytes);
|
||||||
|
display = malloc(rowbytes);
|
||||||
|
|
||||||
|
if (row == NULL || display == NULL)
|
||||||
|
png_error(png_ptr, "OOM allocating row buffers");
|
||||||
|
|
||||||
|
{
|
||||||
|
png_uint_32 height = png_get_image_height(png_ptr, info_ptr);
|
||||||
|
int passes = png_set_interlace_handling(png_ptr);
|
||||||
|
int pass;
|
||||||
|
|
||||||
|
png_start_read_image(png_ptr);
|
||||||
|
|
||||||
|
for (pass = 0; pass < passes; ++pass)
|
||||||
|
{
|
||||||
|
png_uint_32 y = height;
|
||||||
|
|
||||||
|
/* NOTE: this trashes the row each time; interlace handling won't
|
||||||
|
* work, but this avoids memory thrashing for speed testing.
|
||||||
|
*/
|
||||||
|
while (y-- > 0)
|
||||||
|
png_read_row(png_ptr, row, display);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make sure to read to the end of the file: */
|
||||||
|
png_read_end(png_ptr, info_ptr);
|
||||||
|
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
||||||
|
free(row);
|
||||||
|
free(display);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
/* Exit code 0 on success. */
|
||||||
|
return !read_png(stdin);
|
||||||
|
}
|
||||||
999
contrib/libtests/tarith.c
Normal file
@@ -0,0 +1,999 @@
|
|||||||
|
|
||||||
|
/* tarith.c
|
||||||
|
*
|
||||||
|
* Copyright (c) 2011-2013 John Cunningham Bowler
|
||||||
|
*
|
||||||
|
* Last changed in libpng 1.6.0 [February 14, 2013]
|
||||||
|
*
|
||||||
|
* This code is released under the libpng license.
|
||||||
|
* For conditions of distribution and use, see the disclaimer
|
||||||
|
* and license in png.h
|
||||||
|
*
|
||||||
|
* Test internal arithmetic functions of libpng.
|
||||||
|
*
|
||||||
|
* This code must be linked against a math library (-lm), but does not require
|
||||||
|
* libpng or zlib to work. Because it includes the complete source of 'png.c'
|
||||||
|
* it tests the code with whatever compiler options are used to build it.
|
||||||
|
* Changing these options can substantially change the errors in the
|
||||||
|
* calculations that the compiler chooses!
|
||||||
|
*/
|
||||||
|
#define _POSIX_SOURCE 1
|
||||||
|
#define _ISOC99_SOURCE 1
|
||||||
|
|
||||||
|
/* Obtain a copy of the code to be tested (plus other things), disabling
|
||||||
|
* stuff that is not required.
|
||||||
|
*/
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#include "../../pngpriv.h"
|
||||||
|
|
||||||
|
#define png_error png_warning
|
||||||
|
|
||||||
|
void png_warning(png_const_structrp png_ptr, png_const_charp msg)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "validation: %s\n", msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define png_fixed_error png_fixed_warning
|
||||||
|
|
||||||
|
void png_fixed_warning(png_const_structrp png_ptr, png_const_charp msg)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "overflow in: %s\n", msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define png_set_error_fn(pp, ep, efp, wfp) ((void)0)
|
||||||
|
#define png_malloc(pp, s) malloc(s)
|
||||||
|
#define png_malloc_warn(pp, s) malloc(s)
|
||||||
|
#define png_malloc_base(pp, s) malloc(s)
|
||||||
|
#define png_calloc(pp, s) calloc(1, (s))
|
||||||
|
#define png_free(pp, s) free(s)
|
||||||
|
|
||||||
|
#define png_safecat(b, sb, pos, str) (pos)
|
||||||
|
#define png_format_number(start, end, format, number) (start)
|
||||||
|
|
||||||
|
#define crc32(crc, pp, s) (crc)
|
||||||
|
#define inflateReset(zs) Z_OK
|
||||||
|
|
||||||
|
#define png_create_struct(type) (0)
|
||||||
|
#define png_destroy_struct(pp) ((void)0)
|
||||||
|
#define png_create_struct_2(type, m, mm) (0)
|
||||||
|
#define png_destroy_struct_2(pp, f, mm) ((void)0)
|
||||||
|
|
||||||
|
#undef PNG_SIMPLIFIED_READ_SUPPORTED
|
||||||
|
#undef PNG_SIMPLIFIED_WRITE_SUPPORTED
|
||||||
|
#undef PNG_USER_MEM_SUPPORTED
|
||||||
|
|
||||||
|
#include "../../png.c"
|
||||||
|
|
||||||
|
/* Validate ASCII to fp routines. */
|
||||||
|
static int verbose = 0;
|
||||||
|
|
||||||
|
int validation_ascii_to_fp(int count, int argc, char **argv)
|
||||||
|
{
|
||||||
|
int showall = 0;
|
||||||
|
double max_error=2; /* As a percentage error-in-last-digit/.5 */
|
||||||
|
double max_error_abs=17; /* Used when precision is DBL_DIG */
|
||||||
|
double max = 0;
|
||||||
|
double max_abs = 0;
|
||||||
|
double test = 0; /* Important to test this. */
|
||||||
|
int precision = 5;
|
||||||
|
int nonfinite = 0;
|
||||||
|
int finite = 0;
|
||||||
|
int ok = 0;
|
||||||
|
int failcount = 0;
|
||||||
|
int minorarith = 0;
|
||||||
|
|
||||||
|
while (--argc > 0)
|
||||||
|
if (strcmp(*++argv, "-a") == 0)
|
||||||
|
showall = 1;
|
||||||
|
else if (strcmp(*argv, "-e") == 0 && argc > 0)
|
||||||
|
{
|
||||||
|
--argc;
|
||||||
|
max_error = atof(*++argv);
|
||||||
|
}
|
||||||
|
else if (strcmp(*argv, "-E") == 0 && argc > 0)
|
||||||
|
{
|
||||||
|
--argc;
|
||||||
|
max_error_abs = atof(*++argv);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, "unknown argument %s\n", *argv);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
png_size_t index;
|
||||||
|
int state, failed = 0;
|
||||||
|
char buffer[64];
|
||||||
|
|
||||||
|
if (isfinite(test))
|
||||||
|
++finite;
|
||||||
|
else
|
||||||
|
++nonfinite;
|
||||||
|
|
||||||
|
if (verbose)
|
||||||
|
fprintf(stderr, "%.*g %d\n", DBL_DIG, test, precision);
|
||||||
|
|
||||||
|
/* Check for overflow in the buffer by setting a marker. */
|
||||||
|
memset(buffer, 71, sizeof buffer);
|
||||||
|
|
||||||
|
png_ascii_from_fp(0, buffer, precision+10, test, precision);
|
||||||
|
|
||||||
|
/* Allow for a three digit exponent, this stuff will fail if
|
||||||
|
* the exponent is bigger than this!
|
||||||
|
*/
|
||||||
|
if (buffer[precision+7] != 71)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%g[%d] -> '%s'[%lu] buffer overflow\n", test,
|
||||||
|
precision, buffer, (unsigned long)strlen(buffer));
|
||||||
|
failed = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Following are used for the number parser below and must be
|
||||||
|
* initialized to zero.
|
||||||
|
*/
|
||||||
|
state = 0;
|
||||||
|
index = 0;
|
||||||
|
if (!isfinite(test))
|
||||||
|
{
|
||||||
|
/* Expect 'inf' */
|
||||||
|
if (test >= 0 && strcmp(buffer, "inf") ||
|
||||||
|
test < 0 && strcmp(buffer, "-inf"))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%g[%d] -> '%s' but expected 'inf'\n", test,
|
||||||
|
precision, buffer);
|
||||||
|
failed = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!png_check_fp_number(buffer, precision+10, &state, &index) ||
|
||||||
|
buffer[index] != 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%g[%d] -> '%s' but has bad format ('%c')\n", test,
|
||||||
|
precision, buffer, buffer[index]);
|
||||||
|
failed = 1;
|
||||||
|
}
|
||||||
|
else if (PNG_FP_IS_NEGATIVE(state) && !(test < 0))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%g[%d] -> '%s' but negative value not so reported\n",
|
||||||
|
test, precision, buffer);
|
||||||
|
failed = 1;
|
||||||
|
assert(!PNG_FP_IS_ZERO(state));
|
||||||
|
assert(!PNG_FP_IS_POSITIVE(state));
|
||||||
|
}
|
||||||
|
else if (PNG_FP_IS_ZERO(state) && !(test == 0))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%g[%d] -> '%s' but zero value not so reported\n",
|
||||||
|
test, precision, buffer);
|
||||||
|
failed = 1;
|
||||||
|
assert(!PNG_FP_IS_NEGATIVE(state));
|
||||||
|
assert(!PNG_FP_IS_POSITIVE(state));
|
||||||
|
}
|
||||||
|
else if (PNG_FP_IS_POSITIVE(state) && !(test > 0))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%g[%d] -> '%s' but postive value not so reported\n",
|
||||||
|
test, precision, buffer);
|
||||||
|
failed = 1;
|
||||||
|
assert(!PNG_FP_IS_NEGATIVE(state));
|
||||||
|
assert(!PNG_FP_IS_ZERO(state));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Check the result against the original. */
|
||||||
|
double out = atof(buffer);
|
||||||
|
double change = fabs((out - test)/test);
|
||||||
|
double allow = .5/pow(10,
|
||||||
|
(precision >= DBL_DIG) ? DBL_DIG-1 : precision-1);
|
||||||
|
|
||||||
|
/* NOTE: if you hit this error case are you compiling with gcc
|
||||||
|
* and -O0? Try -O2 - the errors can accumulate if the FP
|
||||||
|
* code above is not optimized and may drift outside the .5 in
|
||||||
|
* DBL_DIG allowed. In any case a small number of errors may
|
||||||
|
* occur (very small ones - 1 or 2%) because of rounding in the
|
||||||
|
* calculations, either in the conversion API or in atof.
|
||||||
|
*/
|
||||||
|
if (change >= allow && (isfinite(out) ||
|
||||||
|
fabs(test/DBL_MAX) <= 1-allow))
|
||||||
|
{
|
||||||
|
double percent = (precision >= DBL_DIG) ? max_error_abs : max_error;
|
||||||
|
double allowp = (change-allow)*100/allow;
|
||||||
|
|
||||||
|
if (precision >= DBL_DIG)
|
||||||
|
{
|
||||||
|
if (max_abs < allowp) max_abs = allowp;
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (max < allowp) max = allowp;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (showall || allowp >= percent)
|
||||||
|
{
|
||||||
|
fprintf(stderr,
|
||||||
|
"%.*g[%d] -> '%s' -> %.*g number changed (%g > %g (%d%%))\n",
|
||||||
|
DBL_DIG, test, precision, buffer, DBL_DIG, out, change, allow,
|
||||||
|
(int)round(allowp));
|
||||||
|
failed = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
++minorarith;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (failed)
|
||||||
|
++failcount;
|
||||||
|
else
|
||||||
|
++ok;
|
||||||
|
|
||||||
|
skip:
|
||||||
|
/* Generate a new number and precision. */
|
||||||
|
precision = rand();
|
||||||
|
if (precision & 1) test = -test;
|
||||||
|
precision >>= 1;
|
||||||
|
|
||||||
|
/* Generate random numbers. */
|
||||||
|
if (test == 0 || !isfinite(test))
|
||||||
|
test = precision+1;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Derive the exponent from the previous rand() value. */
|
||||||
|
int exponent = precision % (DBL_MAX_EXP - DBL_MIN_EXP) + DBL_MIN_EXP;
|
||||||
|
int tmp;
|
||||||
|
test = frexp(test * rand(), &tmp);
|
||||||
|
test = ldexp(test, exponent);
|
||||||
|
precision >>= 8; /* arbitrary */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This limits the precision to 32 digits, enough for standard
|
||||||
|
* IEEE implementations which have at most 15 digits.
|
||||||
|
*/
|
||||||
|
precision = (precision & 0x1f) + 1;
|
||||||
|
}
|
||||||
|
while (--count);
|
||||||
|
|
||||||
|
printf("Tested %d finite values, %d non-finite, %d OK (%d failed) %d minor "
|
||||||
|
"arithmetic errors\n", finite, nonfinite, ok, failcount, minorarith);
|
||||||
|
printf(" Error with >=%d digit precision %.2f%%\n", DBL_DIG, max_abs);
|
||||||
|
printf(" Error with < %d digit precision %.2f%%\n", DBL_DIG, max);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Observe that valid FP numbers have the forms listed in the PNG extensions
|
||||||
|
* specification:
|
||||||
|
*
|
||||||
|
* [+,-]{integer,integer.fraction,.fraction}[{e,E}[+,-]integer]
|
||||||
|
*
|
||||||
|
* Test each of these in turn, including invalid cases.
|
||||||
|
*/
|
||||||
|
typedef enum checkfp_state
|
||||||
|
{
|
||||||
|
start, fraction, exponent, states
|
||||||
|
} checkfp_state;
|
||||||
|
|
||||||
|
/* The characters (other than digits) that characterize the states: */
|
||||||
|
static const char none[] = "";
|
||||||
|
static const char hexdigits[16] = "0123456789ABCDEF";
|
||||||
|
|
||||||
|
static const struct
|
||||||
|
{
|
||||||
|
const char *start; /* Characters valid at the start */
|
||||||
|
const char *end; /* Valid characters that end the state */
|
||||||
|
const char *tests; /* Characters to test after 2 digits seen */
|
||||||
|
}
|
||||||
|
state_characters[states] =
|
||||||
|
{
|
||||||
|
/* start: */ { "+-.", ".eE", "+-.e*0369" },
|
||||||
|
/* fraction: */ { none, "eE", "+-.E#0147" },
|
||||||
|
/* exponent: */ { "+-", none, "+-.eE^0258" }
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
char number[1024]; /* Buffer for number being tested */
|
||||||
|
int limit; /* Command line limit */
|
||||||
|
int verbose; /* Shadows global variable */
|
||||||
|
int ctimes; /* Number of numbers tested */
|
||||||
|
int cmillions; /* Count of millions of numbers */
|
||||||
|
int cinvalid; /* Invalid strings checked */
|
||||||
|
int cnoaccept; /* Characters not accepted */
|
||||||
|
}
|
||||||
|
checkfp_command;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int cnumber; /* Index into number string */
|
||||||
|
checkfp_state check_state; /* Current number state */
|
||||||
|
int at_start; /* At start (first character) of state */
|
||||||
|
int cdigits_in_state; /* Digits seen in that state */
|
||||||
|
int limit; /* Limit on same for checking all chars */
|
||||||
|
int state; /* Current parser state */
|
||||||
|
int is_negative; /* Number is negative */
|
||||||
|
int is_zero; /* Number is (still) zero */
|
||||||
|
int number_was_valid; /* Previous character validity */
|
||||||
|
}
|
||||||
|
checkfp_control;
|
||||||
|
|
||||||
|
static int check_all_characters(checkfp_command *co, checkfp_control c);
|
||||||
|
|
||||||
|
static int check_some_characters(checkfp_command *co, checkfp_control c,
|
||||||
|
const char *tests);
|
||||||
|
|
||||||
|
static int check_one_character(checkfp_command *co, checkfp_control c, int ch)
|
||||||
|
{
|
||||||
|
/* Test this character (ch) to ensure the parser does the correct thing.
|
||||||
|
*/
|
||||||
|
png_size_t index = 0;
|
||||||
|
const char test = (char)ch;
|
||||||
|
const int number_is_valid = png_check_fp_number(&test, 1, &c.state, &index);
|
||||||
|
const int character_accepted = (index == 1);
|
||||||
|
|
||||||
|
if (c.check_state != exponent && isdigit(ch) && ch != '0')
|
||||||
|
c.is_zero = 0;
|
||||||
|
|
||||||
|
if (c.check_state == start && c.at_start && ch == '-')
|
||||||
|
c.is_negative = 1;
|
||||||
|
|
||||||
|
if (isprint(ch))
|
||||||
|
co->number[c.cnumber++] = (char)ch;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
co->number[c.cnumber++] = '<';
|
||||||
|
co->number[c.cnumber++] = hexdigits[(ch >> 4) & 0xf];
|
||||||
|
co->number[c.cnumber++] = hexdigits[ch & 0xf];
|
||||||
|
co->number[c.cnumber++] = '>';
|
||||||
|
}
|
||||||
|
co->number[c.cnumber] = 0;
|
||||||
|
|
||||||
|
if (co->verbose > 1)
|
||||||
|
fprintf(stderr, "%s\n", co->number);
|
||||||
|
|
||||||
|
if (++(co->ctimes) == 1000000)
|
||||||
|
{
|
||||||
|
if (co->verbose == 1)
|
||||||
|
fputc('.', stderr);
|
||||||
|
co->ctimes = 0;
|
||||||
|
++(co->cmillions);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!number_is_valid)
|
||||||
|
++(co->cinvalid);
|
||||||
|
|
||||||
|
if (!character_accepted)
|
||||||
|
++(co->cnoaccept);
|
||||||
|
|
||||||
|
/* This should never fail (it's a serious bug if it does): */
|
||||||
|
if (index != 0 && index != 1)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: read beyond end of string (%lu)\n", co->number,
|
||||||
|
(unsigned long)index);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Validate the new state, note that the PNG_FP_IS_ macros all return
|
||||||
|
* false unless the number is valid.
|
||||||
|
*/
|
||||||
|
if (PNG_FP_IS_NEGATIVE(c.state) !=
|
||||||
|
(number_is_valid && !c.is_zero && c.is_negative))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: negative when it is not\n", co->number);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (PNG_FP_IS_ZERO(c.state) != (number_is_valid && c.is_zero))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: zero when it is not\n", co->number);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (PNG_FP_IS_POSITIVE(c.state) !=
|
||||||
|
(number_is_valid && !c.is_zero && !c.is_negative))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: positive when it is not\n", co->number);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Testing a digit */
|
||||||
|
if (isdigit(ch))
|
||||||
|
{
|
||||||
|
if (!character_accepted)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: digit '%c' not accepted\n", co->number, ch);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!number_is_valid)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: saw a digit (%c) but number not valid\n",
|
||||||
|
co->number, ch);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
++c.cdigits_in_state;
|
||||||
|
c.at_start = 0;
|
||||||
|
c.number_was_valid = 1;
|
||||||
|
|
||||||
|
/* Continue testing characters in this state. Either test all of
|
||||||
|
* them or, if we have already seen one digit in this state, just test a
|
||||||
|
* limited set.
|
||||||
|
*/
|
||||||
|
if (c.cdigits_in_state < 1)
|
||||||
|
return check_all_characters(co, c);
|
||||||
|
|
||||||
|
else
|
||||||
|
return check_some_characters(co, c,
|
||||||
|
state_characters[c.check_state].tests);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* A non-digit; is it allowed here? */
|
||||||
|
else if (((ch == '+' || ch == '-') && c.check_state != fraction &&
|
||||||
|
c.at_start) ||
|
||||||
|
(ch == '.' && c.check_state == start) ||
|
||||||
|
((ch == 'e' || ch == 'E') && c.number_was_valid &&
|
||||||
|
c.check_state != exponent))
|
||||||
|
{
|
||||||
|
if (!character_accepted)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: character '%c' not accepted\n", co->number, ch);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The number remains valid after start of fraction but nowhere else. */
|
||||||
|
if (number_is_valid && (c.check_state != start || ch != '.'))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: saw a non-digit (%c) but number valid\n",
|
||||||
|
co->number, ch);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
c.number_was_valid = number_is_valid;
|
||||||
|
|
||||||
|
/* Check for a state change. When changing to 'fraction' if the number
|
||||||
|
* is valid at this point set the at_start to false to allow an exponent
|
||||||
|
* 'e' to come next.
|
||||||
|
*/
|
||||||
|
if (c.check_state == start && ch == '.')
|
||||||
|
{
|
||||||
|
c.check_state = fraction;
|
||||||
|
c.at_start = !number_is_valid;
|
||||||
|
c.cdigits_in_state = 0;
|
||||||
|
c.limit = co->limit;
|
||||||
|
return check_all_characters(co, c);
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (c.check_state < exponent && (ch == 'e' || ch == 'E'))
|
||||||
|
{
|
||||||
|
c.check_state = exponent;
|
||||||
|
c.at_start = 1;
|
||||||
|
c.cdigits_in_state = 0;
|
||||||
|
c.limit = co->limit;
|
||||||
|
return check_all_characters(co, c);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Else it was a sign, and the state doesn't change. */
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (ch != '-' && ch != '+')
|
||||||
|
{
|
||||||
|
fprintf(stderr, "checkfp: internal error (1)\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
c.at_start = 0;
|
||||||
|
return check_all_characters(co, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Testing an invalid character */
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (character_accepted)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: character '%c' [0x%.2x] accepted\n", co->number,
|
||||||
|
ch, ch);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (number_is_valid != c.number_was_valid)
|
||||||
|
{
|
||||||
|
fprintf(stderr,
|
||||||
|
"%s: character '%c' [0x%.2x] changed number validity\n", co->number,
|
||||||
|
ch, ch);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Do nothing - the parser has stuck; return success and keep going with
|
||||||
|
* the next character.
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Successful return (the caller will try the next character.) */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int check_all_characters(checkfp_command *co, checkfp_control c)
|
||||||
|
{
|
||||||
|
int ch;
|
||||||
|
|
||||||
|
if (c.cnumber+4 < sizeof co->number) for (ch=0; ch<256; ++ch)
|
||||||
|
{
|
||||||
|
if (!check_one_character(co, c, ch))
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int check_some_characters(checkfp_command *co, checkfp_control c,
|
||||||
|
const char *tests)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
--(c.limit);
|
||||||
|
|
||||||
|
if (c.cnumber+4 < sizeof co->number && c.limit >= 0)
|
||||||
|
{
|
||||||
|
if (c.limit > 0) for (i=0; tests[i]; ++i)
|
||||||
|
{
|
||||||
|
if (!check_one_character(co, c, tests[i]))
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* At the end check all the characters. */
|
||||||
|
else
|
||||||
|
return check_all_characters(co, c);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int validation_checkfp(int count, int argc, char **argv)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
checkfp_command command;
|
||||||
|
checkfp_control control;
|
||||||
|
|
||||||
|
command.number[0] = 0;
|
||||||
|
command.limit = 3;
|
||||||
|
command.verbose = verbose;
|
||||||
|
command.ctimes = 0;
|
||||||
|
command.cmillions = 0;
|
||||||
|
command.cinvalid = 0;
|
||||||
|
command.cnoaccept = 0;
|
||||||
|
|
||||||
|
while (--argc > 0)
|
||||||
|
{
|
||||||
|
++argv;
|
||||||
|
if (argc > 1 && strcmp(*argv, "-l") == 0)
|
||||||
|
{
|
||||||
|
--argc;
|
||||||
|
command.limit = atoi(*++argv);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, "unknown argument %s\n", *argv);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
control.cnumber = 0;
|
||||||
|
control.check_state = start;
|
||||||
|
control.at_start = 1;
|
||||||
|
control.cdigits_in_state = 0;
|
||||||
|
control.limit = command.limit;
|
||||||
|
control.state = 0;
|
||||||
|
control.is_negative = 0;
|
||||||
|
control.is_zero = 1;
|
||||||
|
control.number_was_valid = 0;
|
||||||
|
|
||||||
|
result = check_all_characters(&command, control);
|
||||||
|
|
||||||
|
printf("checkfp: %s: checked %d,%.3d,%.3d,%.3d strings (%d invalid)\n",
|
||||||
|
result ? "pass" : "FAIL", command.cmillions / 1000,
|
||||||
|
command.cmillions % 1000, command.ctimes / 1000, command.ctimes % 1000,
|
||||||
|
command.cinvalid);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
int validation_muldiv(int count, int argc, char **argv)
|
||||||
|
{
|
||||||
|
int tested = 0;
|
||||||
|
int overflow = 0;
|
||||||
|
int error = 0;
|
||||||
|
int error64 = 0;
|
||||||
|
int passed = 0;
|
||||||
|
int randbits = 0;
|
||||||
|
png_uint_32 randbuffer;
|
||||||
|
png_fixed_point a;
|
||||||
|
png_int_32 times, div;
|
||||||
|
|
||||||
|
while (--argc > 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "unknown argument %s\n", *++argv);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Find out about the random number generator. */
|
||||||
|
randbuffer = RAND_MAX;
|
||||||
|
while (randbuffer != 0) ++randbits, randbuffer >>= 1;
|
||||||
|
printf("Using random number generator that makes %d bits\n", randbits);
|
||||||
|
for (div=0; div<32; div += randbits)
|
||||||
|
randbuffer = (randbuffer << randbits) ^ rand();
|
||||||
|
|
||||||
|
a = 0;
|
||||||
|
times = div = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
png_fixed_point result;
|
||||||
|
/* NOTE: your mileage may vary, a type is required below that can
|
||||||
|
* hold 64 bits or more, if floating point is used a 64 bit or
|
||||||
|
* better mantissa is required.
|
||||||
|
*/
|
||||||
|
long long int fp, fpround;
|
||||||
|
unsigned long hi, lo;
|
||||||
|
int ok;
|
||||||
|
|
||||||
|
/* Check the values, png_64bit_product can only handle positive
|
||||||
|
* numbers, so correct for that here.
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
long u1, u2;
|
||||||
|
int n = 0;
|
||||||
|
if (a < 0) u1 = -a, n = 1; else u1 = a;
|
||||||
|
if (times < 0) u2 = -times, n = !n; else u2 = times;
|
||||||
|
png_64bit_product(u1, u2, &hi, &lo);
|
||||||
|
if (n)
|
||||||
|
{
|
||||||
|
/* -x = ~x+1 */
|
||||||
|
lo = ((~lo) + 1) & 0xffffffff;
|
||||||
|
hi = ~hi;
|
||||||
|
if (lo == 0) ++hi;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fp = a;
|
||||||
|
fp *= times;
|
||||||
|
if ((fp & 0xffffffff) != lo || ((fp >> 32) & 0xffffffff) != hi)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "png_64bit_product %d * %d -> %lx|%.8lx not %llx\n",
|
||||||
|
a, times, hi, lo, fp);
|
||||||
|
++error64;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (div != 0)
|
||||||
|
{
|
||||||
|
/* Round - this is C round to zero. */
|
||||||
|
if ((fp < 0) != (div < 0))
|
||||||
|
fp -= div/2;
|
||||||
|
else
|
||||||
|
fp += div/2;
|
||||||
|
|
||||||
|
fp /= div;
|
||||||
|
fpround = fp;
|
||||||
|
/* Assume 2's complement here: */
|
||||||
|
ok = fpround <= PNG_UINT_31_MAX &&
|
||||||
|
fpround >= -1-(long long int)PNG_UINT_31_MAX;
|
||||||
|
if (!ok) ++overflow;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ok = 0, ++overflow, fpround = fp/*misleading*/;
|
||||||
|
|
||||||
|
if (verbose)
|
||||||
|
fprintf(stderr, "TEST %d * %d / %d -> %lld (%s)\n", a, times, div,
|
||||||
|
fp, ok ? "ok" : "overflow");
|
||||||
|
|
||||||
|
++tested;
|
||||||
|
if (png_muldiv(&result, a, times, div) != ok)
|
||||||
|
{
|
||||||
|
++error;
|
||||||
|
if (ok)
|
||||||
|
fprintf(stderr, "%d * %d / %d -> overflow (expected %lld)\n", a,
|
||||||
|
times, div, fp);
|
||||||
|
else
|
||||||
|
fprintf(stderr, "%d * %d / %d -> %d (expected overflow %lld)\n", a,
|
||||||
|
times, div, result, fp);
|
||||||
|
}
|
||||||
|
else if (ok && result != fpround)
|
||||||
|
{
|
||||||
|
++error;
|
||||||
|
fprintf(stderr, "%d * %d / %d -> %d not %lld\n", a, times, div, result,
|
||||||
|
fp);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
++passed;
|
||||||
|
|
||||||
|
/* Generate three new values, this uses rand() and rand() only returns
|
||||||
|
* up to RAND_MAX.
|
||||||
|
*/
|
||||||
|
/* CRUDE */
|
||||||
|
a += times;
|
||||||
|
times += div;
|
||||||
|
div = randbuffer;
|
||||||
|
randbuffer = (randbuffer << randbits) ^ rand();
|
||||||
|
}
|
||||||
|
while (--count > 0);
|
||||||
|
|
||||||
|
printf("%d tests including %d overflows, %d passed, %d failed (%d 64 bit "
|
||||||
|
"errors)\n", tested, overflow, passed, error, error64);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* When FP is on this just becomes a speed test - compile without FP to get real
|
||||||
|
* validation.
|
||||||
|
*/
|
||||||
|
#ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED
|
||||||
|
#define LN2 .000010576586617430806112933839 /* log(2)/65536 */
|
||||||
|
#define L2INV 94548.46219969910586572651 /* 65536/log(2) */
|
||||||
|
|
||||||
|
/* For speed testing, need the internal functions too: */
|
||||||
|
static png_uint_32 png_log8bit(unsigned x)
|
||||||
|
{
|
||||||
|
if (x > 0)
|
||||||
|
return (png_uint_32)floor(.5-log(x/255.)*L2INV);
|
||||||
|
|
||||||
|
return 0xffffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
static png_uint_32 png_log16bit(png_uint_32 x)
|
||||||
|
{
|
||||||
|
if (x > 0)
|
||||||
|
return (png_uint_32)floor(.5-log(x/65535.)*L2INV);
|
||||||
|
|
||||||
|
return 0xffffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
static png_uint_32 png_exp(png_uint_32 x)
|
||||||
|
{
|
||||||
|
return (png_uint_32)floor(.5 + exp(x * -LN2) * 0xffffffffU);
|
||||||
|
}
|
||||||
|
|
||||||
|
static png_byte png_exp8bit(png_uint_32 log)
|
||||||
|
{
|
||||||
|
return (png_byte)floor(.5 + exp(log * -LN2) * 255);
|
||||||
|
}
|
||||||
|
|
||||||
|
static png_uint_16 png_exp16bit(png_uint_32 log)
|
||||||
|
{
|
||||||
|
return (png_uint_16)floor(.5 + exp(log * -LN2) * 65535);
|
||||||
|
}
|
||||||
|
#endif /* FLOATING_ARITHMETIC */
|
||||||
|
|
||||||
|
int validation_gamma(int argc, char **argv)
|
||||||
|
{
|
||||||
|
double gamma[9] = { 2.2, 1.8, 1.52, 1.45, 1., 1/1.45, 1/1.52, 1/1.8, 1/2.2 };
|
||||||
|
double maxerr;
|
||||||
|
int i, silent=0, onlygamma=0;
|
||||||
|
|
||||||
|
/* Silence the output with -s, just test the gamma functions with -g: */
|
||||||
|
while (--argc > 0)
|
||||||
|
if (strcmp(*++argv, "-s") == 0)
|
||||||
|
silent = 1;
|
||||||
|
else if (strcmp(*argv, "-g") == 0)
|
||||||
|
onlygamma = 1;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, "unknown argument %s\n", *argv);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!onlygamma)
|
||||||
|
{
|
||||||
|
/* First validate the log functions: */
|
||||||
|
maxerr = 0;
|
||||||
|
for (i=0; i<256; ++i)
|
||||||
|
{
|
||||||
|
double correct = -log(i/255.)/log(2.)*65536;
|
||||||
|
double error = png_log8bit(i) - correct;
|
||||||
|
|
||||||
|
if (i != 0 && fabs(error) > maxerr)
|
||||||
|
maxerr = fabs(error);
|
||||||
|
|
||||||
|
if (i == 0 && png_log8bit(i) != 0xffffffff ||
|
||||||
|
i != 0 && png_log8bit(i) != floor(correct+.5))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "8 bit log error: %d: got %u, expected %f\n",
|
||||||
|
i, png_log8bit(i), correct);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!silent)
|
||||||
|
printf("maximum 8 bit log error = %f\n", maxerr);
|
||||||
|
|
||||||
|
maxerr = 0;
|
||||||
|
for (i=0; i<65536; ++i)
|
||||||
|
{
|
||||||
|
double correct = -log(i/65535.)/log(2.)*65536;
|
||||||
|
double error = png_log16bit(i) - correct;
|
||||||
|
|
||||||
|
if (i != 0 && fabs(error) > maxerr)
|
||||||
|
maxerr = fabs(error);
|
||||||
|
|
||||||
|
if (i == 0 && png_log16bit(i) != 0xffffffff ||
|
||||||
|
i != 0 && png_log16bit(i) != floor(correct+.5))
|
||||||
|
{
|
||||||
|
if (error > .68) /* By experiment error is less than .68 */
|
||||||
|
{
|
||||||
|
fprintf(stderr, "16 bit log error: %d: got %u, expected %f"
|
||||||
|
" error: %f\n", i, png_log16bit(i), correct, error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!silent)
|
||||||
|
printf("maximum 16 bit log error = %f\n", maxerr);
|
||||||
|
|
||||||
|
/* Now exponentiations. */
|
||||||
|
maxerr = 0;
|
||||||
|
for (i=0; i<=0xfffff; ++i)
|
||||||
|
{
|
||||||
|
double correct = exp(-i/65536. * log(2.)) * (65536. * 65536);
|
||||||
|
double error = png_exp(i) - correct;
|
||||||
|
|
||||||
|
if (fabs(error) > maxerr)
|
||||||
|
maxerr = fabs(error);
|
||||||
|
if (fabs(error) > 1883) /* By experiment. */
|
||||||
|
{
|
||||||
|
fprintf(stderr, "32 bit exp error: %d: got %u, expected %f"
|
||||||
|
" error: %f\n", i, png_exp(i), correct, error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!silent)
|
||||||
|
printf("maximum 32 bit exp error = %f\n", maxerr);
|
||||||
|
|
||||||
|
maxerr = 0;
|
||||||
|
for (i=0; i<=0xfffff; ++i)
|
||||||
|
{
|
||||||
|
double correct = exp(-i/65536. * log(2.)) * 255;
|
||||||
|
double error = png_exp8bit(i) - correct;
|
||||||
|
|
||||||
|
if (fabs(error) > maxerr)
|
||||||
|
maxerr = fabs(error);
|
||||||
|
if (fabs(error) > .50002) /* By experiment */
|
||||||
|
{
|
||||||
|
fprintf(stderr, "8 bit exp error: %d: got %u, expected %f"
|
||||||
|
" error: %f\n", i, png_exp8bit(i), correct, error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!silent)
|
||||||
|
printf("maximum 8 bit exp error = %f\n", maxerr);
|
||||||
|
|
||||||
|
maxerr = 0;
|
||||||
|
for (i=0; i<=0xfffff; ++i)
|
||||||
|
{
|
||||||
|
double correct = exp(-i/65536. * log(2.)) * 65535;
|
||||||
|
double error = png_exp16bit(i) - correct;
|
||||||
|
|
||||||
|
if (fabs(error) > maxerr)
|
||||||
|
maxerr = fabs(error);
|
||||||
|
if (fabs(error) > .524) /* By experiment */
|
||||||
|
{
|
||||||
|
fprintf(stderr, "16 bit exp error: %d: got %u, expected %f"
|
||||||
|
" error: %f\n", i, png_exp16bit(i), correct, error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!silent)
|
||||||
|
printf("maximum 16 bit exp error = %f\n", maxerr);
|
||||||
|
} /* !onlygamma */
|
||||||
|
|
||||||
|
/* Test the overall gamma correction. */
|
||||||
|
for (i=0; i<9; ++i)
|
||||||
|
{
|
||||||
|
unsigned j;
|
||||||
|
double g = gamma[i];
|
||||||
|
png_fixed_point gfp = floor(g * PNG_FP_1 + .5);
|
||||||
|
|
||||||
|
if (!silent)
|
||||||
|
printf("Test gamma %f\n", g);
|
||||||
|
|
||||||
|
maxerr = 0;
|
||||||
|
for (j=0; j<256; ++j)
|
||||||
|
{
|
||||||
|
double correct = pow(j/255., g) * 255;
|
||||||
|
png_byte out = png_gamma_8bit_correct(j, gfp);
|
||||||
|
double error = out - correct;
|
||||||
|
|
||||||
|
if (fabs(error) > maxerr)
|
||||||
|
maxerr = fabs(error);
|
||||||
|
if (out != floor(correct+.5))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "8bit %d ^ %f: got %d expected %f error %f\n",
|
||||||
|
j, g, out, correct, error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!silent)
|
||||||
|
printf("gamma %f: maximum 8 bit error %f\n", g, maxerr);
|
||||||
|
|
||||||
|
maxerr = 0;
|
||||||
|
for (j=0; j<65536; ++j)
|
||||||
|
{
|
||||||
|
double correct = pow(j/65535., g) * 65535;
|
||||||
|
png_uint_16 out = png_gamma_16bit_correct(j, gfp);
|
||||||
|
double error = out - correct;
|
||||||
|
|
||||||
|
if (fabs(error) > maxerr)
|
||||||
|
maxerr = fabs(error);
|
||||||
|
if (fabs(error) > 1.62)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "16bit %d ^ %f: got %d expected %f error %f\n",
|
||||||
|
j, g, out, correct, error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!silent)
|
||||||
|
printf("gamma %f: maximum 16 bit error %f\n", g, maxerr);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**************************** VALIDATION TESTS ********************************/
|
||||||
|
/* Various validation routines are included herein, they require some
|
||||||
|
* definition for png_warning and png_error, seetings of VALIDATION:
|
||||||
|
*
|
||||||
|
* 1: validates the ASCII to floating point conversions
|
||||||
|
* 2: validates png_muldiv
|
||||||
|
* 3: accuracy test of fixed point gamma tables
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* The following COUNT (10^8) takes about 1 hour on a 1GHz Pentium IV
|
||||||
|
* processor.
|
||||||
|
*/
|
||||||
|
#define COUNT 1000000000
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int count = COUNT;
|
||||||
|
|
||||||
|
while (argc > 1)
|
||||||
|
{
|
||||||
|
if (argc > 2 && strcmp(argv[1], "-c") == 0)
|
||||||
|
{
|
||||||
|
count = atoi(argv[2]);
|
||||||
|
argc -= 2;
|
||||||
|
argv += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (strcmp(argv[1], "-v") == 0)
|
||||||
|
{
|
||||||
|
++verbose;
|
||||||
|
--argc;
|
||||||
|
++argv;
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count > 0 && argc > 1)
|
||||||
|
{
|
||||||
|
if (strcmp(argv[1], "ascii") == 0)
|
||||||
|
return validation_ascii_to_fp(count, argc-1, argv+1);
|
||||||
|
else if (strcmp(argv[1], "checkfp") == 0)
|
||||||
|
return validation_checkfp(count, argc-1, argv+1);
|
||||||
|
else if (strcmp(argv[1], "muldiv") == 0)
|
||||||
|
return validation_muldiv(count, argc-1, argv+1);
|
||||||
|
else if (strcmp(argv[1], "gamma") == 0)
|
||||||
|
return validation_gamma(argc-1, argv+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Bad argument: */
|
||||||
|
fprintf(stderr,
|
||||||
|
"usage: tarith [-v] [-c count] {ascii,muldiv,gamma} [args]\n");
|
||||||
|
fprintf(stderr, " arguments: ascii [-a (all results)] [-e error%%]\n");
|
||||||
|
fprintf(stderr, " checkfp [-l max-number-chars]\n");
|
||||||
|
fprintf(stderr, " muldiv\n");
|
||||||
|
fprintf(stderr, " gamma -s (silent) -g (only gamma; no log)\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
/* timepng.c
|
/* timepng.c
|
||||||
*
|
*
|
||||||
* Copyright (c) 2011 John Cunningham Bowler
|
* Copyright (c) 2013 John Cunningham Bowler
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.5.7 [(PENDING RELEASE)]
|
* Last changed in libpng 1.6.1 [March 28, 2013]
|
||||||
*
|
*
|
||||||
* This code is released under the libpng license.
|
* This code is released under the libpng license.
|
||||||
* For conditions of distribution and use, see the disclaimer
|
* For conditions of distribution and use, see the disclaimer
|
||||||
@@ -14,12 +14,26 @@
|
|||||||
* does no transforms. The only output is a time as a floating point number of
|
* does no transforms. The only output is a time as a floating point number of
|
||||||
* seconds with 9 decimal digits.
|
* seconds with 9 decimal digits.
|
||||||
*/
|
*/
|
||||||
|
#define _POSIX_C_SOURCE 199309L /* for clock_gettime */
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
#include "png.h"
|
#if defined(HAVE_CONFIG_H) && !defined(PNG_NO_CONFIG_H)
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Define the following to use this test against your installed libpng, rather
|
||||||
|
* than the one being built here:
|
||||||
|
*/
|
||||||
|
#ifdef PNG_FREESTANDING_TESTS
|
||||||
|
# include <png.h>
|
||||||
|
#else
|
||||||
|
# include "../../png.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
static int read_png(FILE *fp)
|
static int read_png(FILE *fp)
|
||||||
{
|
{
|
||||||
@@ -238,7 +252,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
while (fgets(filename, FILENAME_MAX+1, stdin))
|
while (fgets(filename, FILENAME_MAX+1, stdin))
|
||||||
{
|
{
|
||||||
int len = strlen(filename);
|
size_t len = strlen(filename);
|
||||||
|
|
||||||
if (filename[len-1] == '\n')
|
if (filename[len-1] == '\n')
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
|
||||||
This demonstrates the use of PNG_USER_CONFIG, pngusr.h and pngusr.dfa
|
This demonstrates the use of PNG_USER_CONFIG, pngusr.h and pngusr.dfa
|
||||||
to build minimal decoder, encoder, and progressive reader applications.
|
to build minimal decoder, encoder, and progressive reader applications.
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,8 @@ LD=$(CC)
|
|||||||
RM=rm -f
|
RM=rm -f
|
||||||
COPY=cp
|
COPY=cp
|
||||||
|
|
||||||
CFLAGS=-DPNG_USER_CONFIG -DNO_GZCOMPRESS -DNO_GZIP -I. -O1
|
CPPFLAGS=-I. -DPNG_USER_CONFIG -DNO_GZCOMPRESS -DZ_SOLO -DNO_GZIP
|
||||||
|
CFLAGS=-O1 -Wall
|
||||||
|
|
||||||
C=.c
|
C=.c
|
||||||
O=.o
|
O=.o
|
||||||
@@ -81,7 +82,7 @@ OBJS = $(PROGOBJS) $(PNGOBJS) $(ZOBJS)
|
|||||||
|
|
||||||
# note: dependencies do not work on implicit rule lines
|
# note: dependencies do not work on implicit rule lines
|
||||||
.c$(O):
|
.c$(O):
|
||||||
$(CC) -c $(CFLAGS) $<
|
$(CC) -c $(CPPFLAGS) $(CFLAGS) $<
|
||||||
|
|
||||||
# dependencies
|
# dependencies
|
||||||
|
|
||||||
@@ -95,16 +96,16 @@ pngm2pnm$(E): $(OBJS)
|
|||||||
# The CPP_FLAGS setting causes pngusr.h to be included in
|
# The CPP_FLAGS setting causes pngusr.h to be included in
|
||||||
# both the build of pnglibconf.h and, subsequently, when
|
# both the build of pnglibconf.h and, subsequently, when
|
||||||
# building libpng itself.
|
# building libpng itself.
|
||||||
$(PNGCONF): $(PNGSRC)/scripts/pnglibconf.mak\
|
$(PNGCONF): $(PNGSRC)/scripts/pnglibconf.mak $(ZH)\
|
||||||
$(PNGSRC)/scripts/pnglibconf.dfa \
|
$(PNGSRC)/scripts/pnglibconf.dfa \
|
||||||
$(PNGSRC)/scripts/options.awk pngusr.h pngusr.dfa
|
$(PNGSRC)/scripts/options.awk pngusr.h pngusr.dfa
|
||||||
$(RM) pnglibconf.h pnglibconf.dfn
|
$(RM) pnglibconf.h pnglibconf.dfn
|
||||||
$(MAKE) $(MAKEFLAGS) -f $(PNGSRC)/scripts/pnglibconf.mak\
|
$(MAKE) -f $(PNGSRC)/scripts/pnglibconf.mak $(MAKEFLAGS)\
|
||||||
srcdir=$(PNGSRC) CPPFLAGS="-DPNG_USER_CONFIG"\
|
srcdir=$(PNGSRC) CPPFLAGS="-DPNG_USER_CONFIG -I."\
|
||||||
DFA_XTRA="pngusr.dfa" $@
|
DFA_XTRA="pngusr.dfa" $@
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(MAKE) $(MAKEFLAGS) -f $(PNGSRC)/scripts/pnglibconf.mak\
|
$(MAKE) -f $(PNGSRC)/scripts/pnglibconf.mak $(MAKEFLAGS)\
|
||||||
srcdir=$(PNGSRC) clean
|
srcdir=$(PNGSRC) clean
|
||||||
$(RM) pngm2pnm$(O)
|
$(RM) pngm2pnm$(O)
|
||||||
$(RM) pngm2pnm$(E)
|
$(RM) pngm2pnm$(E)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# pngminim/decoder/pngusr.dfa
|
# pngminim/decoder/pngusr.dfa
|
||||||
#
|
#
|
||||||
# Copyright (c) 2010-2011 Glenn Randers-Pehrson
|
# Copyright (c) 2010-2013 Glenn Randers-Pehrson
|
||||||
#
|
#
|
||||||
# This code is released under the libpng license.
|
# This code is released under the libpng license.
|
||||||
# For conditions of distribution and use, see the disclaimer
|
# For conditions of distribution and use, see the disclaimer
|
||||||
@@ -37,3 +37,4 @@ option SETJMP on
|
|||||||
option STDIO on
|
option STDIO on
|
||||||
option READ_EXPAND on
|
option READ_EXPAND on
|
||||||
option READ_STRIP_16_TO_8 on
|
option READ_STRIP_16_TO_8 on
|
||||||
|
option USER_LIMITS on
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/* minrdpngconf.h: headers to make a minimal png-read-only library
|
/* minrdpngconf.h: headers to make a minimal png-read-only library
|
||||||
*
|
*
|
||||||
* Copyright (c) 2007, 2010-2011 Glenn Randers-Pehrson
|
* Copyright (c) 2007, 2010-2013 Glenn Randers-Pehrson
|
||||||
*
|
*
|
||||||
* This code is released under the libpng license.
|
* This code is released under the libpng license.
|
||||||
* For conditions of distribution and use, see the disclaimer
|
* For conditions of distribution and use, see the disclaimer
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
* affect the API (so are not recorded in pnglibconf.h)
|
* affect the API (so are not recorded in pnglibconf.h)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define PNG_NO_WARNINGS
|
#define PNG_RELEASE_BUILD 1
|
||||||
#define PNG_ALIGN_TYPE PNG_ALIGN_NONE
|
#define PNG_ALIGN_TYPE PNG_ALIGN_NONE
|
||||||
|
|
||||||
#endif /* MINRDPNGCONF_H */
|
#endif /* MINRDPNGCONF_H */
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
This demonstrates the use of PNG_USER_CONFIG and pngusr.h
|
This demonstrates the use of PNG_USER_CONFIG and pngusr.h
|
||||||
|
|
||||||
The makefile builds a minimal write-only decoder with embedded libpng
|
The makefile builds a minimal write-only encoder with embedded libpng
|
||||||
and zlib.
|
and zlib.
|
||||||
|
|
||||||
Specify the location of the zlib source (1.2.1 or later) as ZLIBSRC
|
Specify the location of the zlib source (1.2.1 or later) as ZLIBSRC
|
||||||
|
|||||||
@@ -14,7 +14,8 @@ LD=$(CC)
|
|||||||
RM=rm -f
|
RM=rm -f
|
||||||
COPY=cp
|
COPY=cp
|
||||||
|
|
||||||
CFLAGS=-DPNG_USER_CONFIG -DNO_GZIP -I. -O1
|
CPPFLAGS=-I. -DPNG_USER_CONFIG -DNO_GZCOMPRESS -DZ_SOLO -DNO_GZIP
|
||||||
|
CFLAGS=-O1 -Wall
|
||||||
|
|
||||||
C=.c
|
C=.c
|
||||||
O=.o
|
O=.o
|
||||||
@@ -80,7 +81,7 @@ OBJS = $(PROGOBJS) $(PNGOBJS) $(ZOBJS)
|
|||||||
# implicit make rules -------------------------------------------------------
|
# implicit make rules -------------------------------------------------------
|
||||||
|
|
||||||
.c$(O):
|
.c$(O):
|
||||||
$(CC) -c $(CFLAGS) $<
|
$(CC) -c $(CPPFLAGS) $(CFLAGS) $<
|
||||||
|
|
||||||
# dependencies
|
# dependencies
|
||||||
|
|
||||||
@@ -94,16 +95,16 @@ pnm2pngm$(E): $(OBJS)
|
|||||||
# The CPP_FLAGS setting causes pngusr.h to be included in
|
# The CPP_FLAGS setting causes pngusr.h to be included in
|
||||||
# both the build of pnglibconf.h and, subsequently, when
|
# both the build of pnglibconf.h and, subsequently, when
|
||||||
# building libpng itself.
|
# building libpng itself.
|
||||||
$(PNGCONF): $(PNGSRC)/scripts/pnglibconf.mak\
|
$(PNGCONF): $(PNGSRC)/scripts/pnglibconf.mak $(ZH)\
|
||||||
$(PNGSRC)/scripts/pnglibconf.dfa \
|
$(PNGSRC)/scripts/pnglibconf.dfa \
|
||||||
$(PNGSRC)/scripts/options.awk pngusr.h pngusr.dfa
|
$(PNGSRC)/scripts/options.awk pngusr.h pngusr.dfa
|
||||||
$(RM) pnglibconf.h pnglibconf.dfn
|
$(RM) pnglibconf.h pnglibconf.dfn
|
||||||
$(MAKE) $(MAKEFLAGS) -f $(PNGSRC)/scripts/pnglibconf.mak\
|
$(MAKE) -f $(PNGSRC)/scripts/pnglibconf.mak $(MAKEFLAGS)\
|
||||||
srcdir=$(PNGSRC) CPPFLAGS="-DPNG_USER_CONFIG"\
|
srcdir=$(PNGSRC) CPPFLAGS="-DPNG_USER_CONFIG -I."\
|
||||||
DFA_XTRA="pngusr.dfa" $@
|
DFA_XTRA="pngusr.dfa" $@
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(MAKE) $(MAKEFLAGS) -f $(PNGSRC)/scripts/pnglibconf.mak\
|
$(MAKE) -f $(PNGSRC)/scripts/pnglibconf.mak $(MAKEFLAGS)\
|
||||||
srcdir=$(PNGSRC) clean
|
srcdir=$(PNGSRC) clean
|
||||||
$(RM) pnm2pngm$(O)
|
$(RM) pnm2pngm$(O)
|
||||||
$(RM) pnm2pngm$(E)
|
$(RM) pnm2pngm$(E)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# pngminim/encoder/pngusr.dfa
|
# pngminim/encoder/pngusr.dfa
|
||||||
#
|
#
|
||||||
# Copyright (c) 2010-2011 Glenn Randers-Pehrson
|
# Copyright (c) 2010-2013 Glenn Randers-Pehrson
|
||||||
#
|
#
|
||||||
# This code is released under the libpng license.
|
# This code is released under the libpng license.
|
||||||
# For conditions of distribution and use, see the disclaimer
|
# For conditions of distribution and use, see the disclaimer
|
||||||
@@ -14,6 +14,10 @@ everything = off
|
|||||||
|
|
||||||
option WRITE on
|
option WRITE on
|
||||||
|
|
||||||
|
# These 2 options are required if you need to read PBM (P1 or P4) files.
|
||||||
|
option WRITE_INVERT on
|
||||||
|
option WRITE_PACK on
|
||||||
|
|
||||||
# You must choose fixed or floating point arithmetic:
|
# You must choose fixed or floating point arithmetic:
|
||||||
# option FLOATING_POINT on
|
# option FLOATING_POINT on
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/* minwrpngconf.h: headers to make a minimal png-write-only library
|
/* minwrpngconf.h: headers to make a minimal png-write-only library
|
||||||
*
|
*
|
||||||
* Copyright (c) 2007, 2010-2011 Glenn Randers-Pehrson
|
* Copyright (c) 2007, 2010-2013 Glenn Randers-Pehrson
|
||||||
*
|
*
|
||||||
* This code is released under the libpng license.
|
* This code is released under the libpng license.
|
||||||
* For conditions of distribution and use, see the disclaimer
|
* For conditions of distribution and use, see the disclaimer
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
* affect the API (so are not recorded in pnglibconf.h)
|
* affect the API (so are not recorded in pnglibconf.h)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define PNG_NO_WARNINGS
|
#define PNG_RELEASE_BUILD 1
|
||||||
#define PNG_ALIGN_TYPE PNG_ALIGN_NONE
|
#define PNG_ALIGN_TYPE PNG_ALIGN_NONE
|
||||||
|
|
||||||
#endif /* MINWRPNGCONF_H */
|
#endif /* MINWRPNGCONF_H */
|
||||||
|
|||||||
@@ -30,7 +30,8 @@ XLIB = -L/usr/X11R6/lib -lX11
|
|||||||
#LIBS = $(XLIB)
|
#LIBS = $(XLIB)
|
||||||
LIBS = $(XLIB) -lm #platforms that need libm
|
LIBS = $(XLIB) -lm #platforms that need libm
|
||||||
|
|
||||||
CFLAGS=-DPNG_USER_CONFIG -DNO_GZCOMPRESS -DNO_GZIP -I. $(XINC) -O1
|
CPPFLAGS=-I. $(XINC) -DPNG_USER_CONFIG -DNO_GZCOMPRESS -DZ_SOLO -DNO_GZIP
|
||||||
|
CFLAGS=-O1 -Wall
|
||||||
|
|
||||||
C=.c
|
C=.c
|
||||||
O=.o
|
O=.o
|
||||||
@@ -96,7 +97,7 @@ OBJS = $(PROGOBJS) $(PNGOBJS) $(ZOBJS)
|
|||||||
# implicit make rules -------------------------------------------------------
|
# implicit make rules -------------------------------------------------------
|
||||||
|
|
||||||
.c$(O):
|
.c$(O):
|
||||||
$(CC) -c $(CFLAGS) $<
|
$(CC) -c $(CPPFLAGS) $(CFLAGS) $<
|
||||||
|
|
||||||
# dependencies
|
# dependencies
|
||||||
|
|
||||||
@@ -110,16 +111,16 @@ rpng2-x$(E): $(OBJS)
|
|||||||
# The CPP_FLAGS setting causes pngusr.h to be included in
|
# The CPP_FLAGS setting causes pngusr.h to be included in
|
||||||
# both the build of pnglibconf.h and, subsequently, when
|
# both the build of pnglibconf.h and, subsequently, when
|
||||||
# building libpng itself.
|
# building libpng itself.
|
||||||
$(PNGCONF): $(PNGSRC)/scripts/pnglibconf.mak\
|
$(PNGCONF): $(PNGSRC)/scripts/pnglibconf.mak $(ZH)\
|
||||||
$(PNGSRC)/scripts/pnglibconf.dfa \
|
$(PNGSRC)/scripts/pnglibconf.dfa \
|
||||||
$(PNGSRC)/scripts/options.awk pngusr.h pngusr.dfa
|
$(PNGSRC)/scripts/options.awk pngusr.h pngusr.dfa
|
||||||
$(RM) pnglibconf.h pnglibconf.dfn
|
$(RM) pnglibconf.h pnglibconf.dfn
|
||||||
$(MAKE) $(MAKEFLAGS) -f $(PNGSRC)/scripts/pnglibconf.mak\
|
$(MAKE) -f $(PNGSRC)/scripts/pnglibconf.mak $(MAKEFLAGS)\
|
||||||
srcdir=$(PNGSRC) CPPFLAGS="-DPNG_USER_CONFIG"\
|
srcdir=$(PNGSRC) CPPFLAGS="-DPNG_USER_CONFIG -I."\
|
||||||
DFA_XTRA="pngusr.dfa" $@
|
DFA_XTRA="pngusr.dfa" $@
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(MAKE) $(MAKEFLAGS) -f $(PNGSRC)/scripts/pnglibconf.mak\
|
$(MAKE) -f $(PNGSRC)/scripts/pnglibconf.mak $(MAKEFLAGS)\
|
||||||
srcdir=$(PNGSRC) clean
|
srcdir=$(PNGSRC) clean
|
||||||
$(RM) rpng2-x$(O)
|
$(RM) rpng2-x$(O)
|
||||||
$(RM) rpng2-x$(E)
|
$(RM) rpng2-x$(E)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# pngminim/preader/pngusr.dfa
|
# pngminim/preader/pngusr.dfa
|
||||||
#
|
#
|
||||||
# Copyright (c) 2010-2011 Glenn Randers-Pehrson
|
# Copyright (c) 2010-2013 Glenn Randers-Pehrson
|
||||||
#
|
#
|
||||||
# This code is released under the libpng license.
|
# This code is released under the libpng license.
|
||||||
# For conditions of distribution and use, see the disclaimer
|
# For conditions of distribution and use, see the disclaimer
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/* minrdpngconf.h: headers to make a minimal png-read-only library
|
/* minrdpngconf.h: headers to make a minimal png-read-only library
|
||||||
*
|
*
|
||||||
* Copyright (c) 2009, 2010-2011 Glenn Randers-Pehrson
|
* Copyright (c) 2009, 2010-2013 Glenn Randers-Pehrson
|
||||||
*
|
*
|
||||||
* This code is released under the libpng license.
|
* This code is released under the libpng license.
|
||||||
* For conditions of distribution and use, see the disclaimer
|
* For conditions of distribution and use, see the disclaimer
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
* affect the API (so are not recorded in pnglibconf.h)
|
* affect the API (so are not recorded in pnglibconf.h)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define PNG_NO_WARNINGS
|
#define PNG_RELEASE_BUILD 1
|
||||||
#define PNG_ALIGN_TYPE PNG_ALIGN_NONE
|
#define PNG_ALIGN_TYPE PNG_ALIGN_NONE
|
||||||
|
|
||||||
#endif /* MINPRDPNGCONF_H */
|
#endif /* MINPRDPNGCONF_H */
|
||||||
|
|||||||
@@ -8,9 +8,9 @@ LD=$(CC)
|
|||||||
RM=rm -f
|
RM=rm -f
|
||||||
|
|
||||||
#PNGPATH = /usr/local
|
#PNGPATH = /usr/local
|
||||||
#PNGINC = -I$(PNGPATH)/include/libpng15
|
#PNGINC = -I$(PNGPATH)/include/libpng17
|
||||||
#PNGLIB = -L$(PNGPATH)/lib -lpng15
|
#PNGLIB = -L$(PNGPATH)/lib -lpng17
|
||||||
#PNGLIBS = $(PNGPATH)/lib/libpng15.a
|
#PNGLIBS = $(PNGPATH)/lib/libpng17.a
|
||||||
PNGINC = -I../..
|
PNGINC = -I../..
|
||||||
PNGLIB = -L../.. -lpng
|
PNGLIB = -L../.. -lpng
|
||||||
PNGLIBS = ../../libpng.a
|
PNGLIBS = ../../libpng.a
|
||||||
|
|||||||
0
contrib/pngminus/png2pnm.bat
Normal file → Executable file
@@ -18,6 +18,7 @@
|
|||||||
#include <mem.h>
|
#include <mem.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#endif
|
#endif
|
||||||
|
#include <zlib.h>
|
||||||
|
|
||||||
#ifndef BOOL
|
#ifndef BOOL
|
||||||
#define BOOL unsigned char
|
#define BOOL unsigned char
|
||||||
|
|||||||
0
contrib/pngminus/png2pnm.sh
Normal file → Executable file
0
contrib/pngminus/pngminus.bat
Normal file → Executable file
0
contrib/pngminus/pngminus.sh
Normal file → Executable file
0
contrib/pngminus/pnm2png.bat
Normal file → Executable file
@@ -18,6 +18,7 @@
|
|||||||
#include <mem.h>
|
#include <mem.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#endif
|
#endif
|
||||||
|
#include <zlib.h>
|
||||||
|
|
||||||
#ifndef BOOL
|
#ifndef BOOL
|
||||||
#define BOOL unsigned char
|
#define BOOL unsigned char
|
||||||
@@ -197,6 +198,9 @@ BOOL pnm2png (FILE *pnm_file, FILE *png_file, FILE *alpha_file, BOOL interlace,
|
|||||||
char height_token[16];
|
char height_token[16];
|
||||||
char maxval_token[16];
|
char maxval_token[16];
|
||||||
int color_type;
|
int color_type;
|
||||||
|
unsigned long ul_width=0, ul_alpha_width=0;
|
||||||
|
unsigned long ul_height=0, ul_alpha_height=0;
|
||||||
|
unsigned long ul_maxval=0;
|
||||||
png_uint_32 width, alpha_width;
|
png_uint_32 width, alpha_width;
|
||||||
png_uint_32 height, alpha_height;
|
png_uint_32 height, alpha_height;
|
||||||
png_uint_32 maxval;
|
png_uint_32 maxval;
|
||||||
@@ -206,6 +210,9 @@ BOOL pnm2png (FILE *pnm_file, FILE *png_file, FILE *alpha_file, BOOL interlace,
|
|||||||
int alpha_present;
|
int alpha_present;
|
||||||
int row, col;
|
int row, col;
|
||||||
BOOL raw, alpha_raw = FALSE;
|
BOOL raw, alpha_raw = FALSE;
|
||||||
|
#if defined(PNG_WRITE_INVERT_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED)
|
||||||
|
BOOL packed_bitmap = FALSE;
|
||||||
|
#endif
|
||||||
png_uint_32 tmp16;
|
png_uint_32 tmp16;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@@ -218,20 +225,36 @@ BOOL pnm2png (FILE *pnm_file, FILE *png_file, FILE *alpha_file, BOOL interlace,
|
|||||||
}
|
}
|
||||||
else if ((type_token[1] == '1') || (type_token[1] == '4'))
|
else if ((type_token[1] == '1') || (type_token[1] == '4'))
|
||||||
{
|
{
|
||||||
|
#if defined(PNG_WRITE_INVERT_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED)
|
||||||
raw = (type_token[1] == '4');
|
raw = (type_token[1] == '4');
|
||||||
color_type = PNG_COLOR_TYPE_GRAY;
|
color_type = PNG_COLOR_TYPE_GRAY;
|
||||||
|
get_token(pnm_file, width_token);
|
||||||
|
sscanf (width_token, "%lu", &ul_width);
|
||||||
|
width = (png_uint_32) ul_width;
|
||||||
|
get_token(pnm_file, height_token);
|
||||||
|
sscanf (height_token, "%lu", &ul_height);
|
||||||
|
height = (png_uint_32) ul_height;
|
||||||
bit_depth = 1;
|
bit_depth = 1;
|
||||||
|
packed_bitmap = TRUE;
|
||||||
|
#else
|
||||||
|
fprintf (stderr, "PNM2PNG built without PNG_WRITE_INVERT_SUPPORTED and \n");
|
||||||
|
fprintf (stderr, "PNG_WRITE_PACK_SUPPORTED can't read PBM (P1,P4) files\n");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else if ((type_token[1] == '2') || (type_token[1] == '5'))
|
else if ((type_token[1] == '2') || (type_token[1] == '5'))
|
||||||
{
|
{
|
||||||
raw = (type_token[1] == '5');
|
raw = (type_token[1] == '5');
|
||||||
color_type = PNG_COLOR_TYPE_GRAY;
|
color_type = PNG_COLOR_TYPE_GRAY;
|
||||||
get_token(pnm_file, width_token);
|
get_token(pnm_file, width_token);
|
||||||
sscanf (width_token, "%lu", &width);
|
sscanf (width_token, "%lu", &ul_width);
|
||||||
|
width = (png_uint_32) ul_width;
|
||||||
get_token(pnm_file, height_token);
|
get_token(pnm_file, height_token);
|
||||||
sscanf (height_token, "%lu", &height);
|
sscanf (height_token, "%lu", &ul_height);
|
||||||
|
height = (png_uint_32) ul_height;
|
||||||
get_token(pnm_file, maxval_token);
|
get_token(pnm_file, maxval_token);
|
||||||
sscanf (maxval_token, "%lu", &maxval);
|
sscanf (maxval_token, "%lu", &ul_maxval);
|
||||||
|
maxval = (png_uint_32) ul_maxval;
|
||||||
|
|
||||||
if (maxval <= 1)
|
if (maxval <= 1)
|
||||||
bit_depth = 1;
|
bit_depth = 1;
|
||||||
else if (maxval <= 3)
|
else if (maxval <= 3)
|
||||||
@@ -248,11 +271,14 @@ BOOL pnm2png (FILE *pnm_file, FILE *png_file, FILE *alpha_file, BOOL interlace,
|
|||||||
raw = (type_token[1] == '6');
|
raw = (type_token[1] == '6');
|
||||||
color_type = PNG_COLOR_TYPE_RGB;
|
color_type = PNG_COLOR_TYPE_RGB;
|
||||||
get_token(pnm_file, width_token);
|
get_token(pnm_file, width_token);
|
||||||
sscanf (width_token, "%lu", &width);
|
sscanf (width_token, "%lu", &ul_width);
|
||||||
|
width = (png_uint_32) ul_width;
|
||||||
get_token(pnm_file, height_token);
|
get_token(pnm_file, height_token);
|
||||||
sscanf (height_token, "%lu", &height);
|
sscanf (height_token, "%lu", &ul_height);
|
||||||
|
height = (png_uint_32) ul_height;
|
||||||
get_token(pnm_file, maxval_token);
|
get_token(pnm_file, maxval_token);
|
||||||
sscanf (maxval_token, "%lu", &maxval);
|
sscanf (maxval_token, "%lu", &ul_maxval);
|
||||||
|
maxval = (png_uint_32) ul_maxval;
|
||||||
if (maxval <= 1)
|
if (maxval <= 1)
|
||||||
bit_depth = 1;
|
bit_depth = 1;
|
||||||
else if (maxval <= 3)
|
else if (maxval <= 3)
|
||||||
@@ -287,15 +313,18 @@ BOOL pnm2png (FILE *pnm_file, FILE *png_file, FILE *alpha_file, BOOL interlace,
|
|||||||
{
|
{
|
||||||
alpha_raw = (type_token[1] == '5');
|
alpha_raw = (type_token[1] == '5');
|
||||||
get_token(alpha_file, width_token);
|
get_token(alpha_file, width_token);
|
||||||
sscanf (width_token, "%lu", &alpha_width);
|
sscanf (width_token, "%lu", &ul_alpha_width);
|
||||||
|
alpha_width=(png_uint_32) ul_alpha_width;
|
||||||
if (alpha_width != width)
|
if (alpha_width != width)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
get_token(alpha_file, height_token);
|
get_token(alpha_file, height_token);
|
||||||
sscanf (height_token, "%lu", &alpha_height);
|
sscanf (height_token, "%lu", &ul_alpha_height);
|
||||||
|
alpha_height = (png_uint_32) ul_alpha_height;
|
||||||
if (alpha_height != height)
|
if (alpha_height != height)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
get_token(alpha_file, maxval_token);
|
get_token(alpha_file, maxval_token);
|
||||||
sscanf (maxval_token, "%lu", &maxval);
|
sscanf (maxval_token, "%lu", &ul_maxval);
|
||||||
|
maxval = (png_uint_32) ul_maxval;
|
||||||
if (maxval <= 1)
|
if (maxval <= 1)
|
||||||
alpha_depth = 1;
|
alpha_depth = 1;
|
||||||
else if (maxval <= 3)
|
else if (maxval <= 3)
|
||||||
@@ -329,8 +358,14 @@ BOOL pnm2png (FILE *pnm_file, FILE *png_file, FILE *alpha_file, BOOL interlace,
|
|||||||
|
|
||||||
alpha_present = (channels - 1) % 2;
|
alpha_present = (channels - 1) % 2;
|
||||||
|
|
||||||
/* row_bytes is the width x number of channels x (bit-depth / 8) */
|
#if defined(PNG_WRITE_INVERT_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED)
|
||||||
row_bytes = width * channels * ((bit_depth <= 8) ? 1 : 2);
|
if (packed_bitmap)
|
||||||
|
/* row data is as many bytes as can fit width x channels x bit_depth */
|
||||||
|
row_bytes = (width * channels * bit_depth + 7) / 8;
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
/* row_bytes is the width x number of channels x (bit-depth / 8) */
|
||||||
|
row_bytes = width * channels * ((bit_depth <= 8) ? 1 : 2);
|
||||||
|
|
||||||
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)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@@ -340,40 +375,48 @@ BOOL pnm2png (FILE *pnm_file, FILE *png_file, FILE *alpha_file, BOOL interlace,
|
|||||||
|
|
||||||
for (row = 0; row < height; row++)
|
for (row = 0; row < height; row++)
|
||||||
{
|
{
|
||||||
for (col = 0; col < width; col++)
|
#if defined(PNG_WRITE_INVERT_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED)
|
||||||
|
if (packed_bitmap) {
|
||||||
|
for (i = 0; i < row_bytes; i++)
|
||||||
|
/* png supports this format natively so no conversion is needed */
|
||||||
|
*pix_ptr++ = get_data (pnm_file, 8);
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
for (i = 0; i < (channels - alpha_present); i++)
|
for (col = 0; col < width; col++)
|
||||||
{
|
{
|
||||||
if (raw)
|
for (i = 0; i < (channels - alpha_present); i++)
|
||||||
*pix_ptr++ = get_data (pnm_file, bit_depth);
|
{
|
||||||
else
|
if (raw)
|
||||||
if (bit_depth <= 8)
|
*pix_ptr++ = get_data (pnm_file, bit_depth);
|
||||||
*pix_ptr++ = get_value (pnm_file, bit_depth);
|
|
||||||
else
|
else
|
||||||
{
|
if (bit_depth <= 8)
|
||||||
tmp16 = get_value (pnm_file, bit_depth);
|
*pix_ptr++ = get_value (pnm_file, bit_depth);
|
||||||
*pix_ptr = (png_byte) ((tmp16 >> 8) & 0xFF);
|
else
|
||||||
pix_ptr++;
|
{
|
||||||
*pix_ptr = (png_byte) (tmp16 & 0xFF);
|
tmp16 = get_value (pnm_file, bit_depth);
|
||||||
pix_ptr++;
|
*pix_ptr = (png_byte) ((tmp16 >> 8) & 0xFF);
|
||||||
}
|
pix_ptr++;
|
||||||
}
|
*pix_ptr = (png_byte) (tmp16 & 0xFF);
|
||||||
|
pix_ptr++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (alpha) /* read alpha-channel from pgm file */
|
if (alpha) /* read alpha-channel from pgm file */
|
||||||
{
|
{
|
||||||
if (alpha_raw)
|
if (alpha_raw)
|
||||||
*pix_ptr++ = get_data (alpha_file, alpha_depth);
|
*pix_ptr++ = get_data (alpha_file, alpha_depth);
|
||||||
else
|
|
||||||
if (alpha_depth <= 8)
|
|
||||||
*pix_ptr++ = get_value (alpha_file, bit_depth);
|
|
||||||
else
|
else
|
||||||
{
|
if (alpha_depth <= 8)
|
||||||
tmp16 = get_value (alpha_file, bit_depth);
|
*pix_ptr++ = get_value (alpha_file, bit_depth);
|
||||||
*pix_ptr++ = (png_byte) ((tmp16 >> 8) & 0xFF);
|
else
|
||||||
*pix_ptr++ = (png_byte) (tmp16 & 0xFF);
|
{
|
||||||
}
|
tmp16 = get_value (alpha_file, bit_depth);
|
||||||
} /* if alpha */
|
*pix_ptr++ = (png_byte) ((tmp16 >> 8) & 0xFF);
|
||||||
|
*pix_ptr++ = (png_byte) (tmp16 & 0xFF);
|
||||||
|
}
|
||||||
|
} /* if alpha */
|
||||||
|
} /* if packed_bitmap */
|
||||||
} /* end for col */
|
} /* end for col */
|
||||||
} /* end for row */
|
} /* end for row */
|
||||||
|
|
||||||
@@ -390,6 +433,14 @@ BOOL pnm2png (FILE *pnm_file, FILE *png_file, FILE *alpha_file, BOOL interlace,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(PNG_WRITE_INVERT_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED)
|
||||||
|
if (packed_bitmap == TRUE)
|
||||||
|
{
|
||||||
|
png_set_packing (png_ptr);
|
||||||
|
png_set_invert_mono (png_ptr);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* setjmp() must be called in every function that calls a PNG-reading libpng function */
|
/* setjmp() must be called in every function that calls a PNG-reading libpng function */
|
||||||
if (setjmp (png_jmpbuf(png_ptr)))
|
if (setjmp (png_jmpbuf(png_ptr)))
|
||||||
{
|
{
|
||||||
@@ -446,19 +497,32 @@ BOOL pnm2png (FILE *pnm_file, FILE *png_file, FILE *alpha_file, BOOL interlace,
|
|||||||
void get_token(FILE *pnm_file, char *token)
|
void get_token(FILE *pnm_file, char *token)
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
int ret;
|
||||||
|
|
||||||
/* remove white-space */
|
/* remove white-space and comment lines */
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
token[i] = (unsigned char) fgetc (pnm_file);
|
ret = fgetc(pnm_file);
|
||||||
|
if (ret == '#') {
|
||||||
|
/* the rest of this line is a comment */
|
||||||
|
do
|
||||||
|
{
|
||||||
|
ret = fgetc(pnm_file);
|
||||||
|
}
|
||||||
|
while ((ret != '\n') && (ret != '\r') && (ret != EOF));
|
||||||
|
}
|
||||||
|
if (ret == EOF) break;
|
||||||
|
token[i] = (unsigned char) ret;
|
||||||
}
|
}
|
||||||
while ((token[i] == '\n') || (token[i] == '\r') || (token[i] == ' '));
|
while ((token[i] == '\n') || (token[i] == '\r') || (token[i] == ' '));
|
||||||
|
|
||||||
/* read string */
|
/* read string */
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
|
ret = fgetc(pnm_file);
|
||||||
|
if (ret == EOF) break;
|
||||||
i++;
|
i++;
|
||||||
token[i] = (unsigned char) fgetc (pnm_file);
|
token[i] = (unsigned char) ret;
|
||||||
}
|
}
|
||||||
while ((token[i] != '\n') && (token[i] != '\r') && (token[i] != ' '));
|
while ((token[i] != '\n') && (token[i] != '\r') && (token[i] != ' '));
|
||||||
|
|
||||||
@@ -510,6 +574,7 @@ png_uint_32 get_value (FILE *pnm_file, int depth)
|
|||||||
{
|
{
|
||||||
static png_uint_32 mask = 0;
|
static png_uint_32 mask = 0;
|
||||||
png_byte token[16];
|
png_byte token[16];
|
||||||
|
unsigned long ul_ret_value;
|
||||||
png_uint_32 ret_value;
|
png_uint_32 ret_value;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
@@ -518,7 +583,8 @@ png_uint_32 get_value (FILE *pnm_file, int depth)
|
|||||||
mask = (mask << 1) | 0x01;
|
mask = (mask << 1) | 0x01;
|
||||||
|
|
||||||
get_token (pnm_file, (char *) token);
|
get_token (pnm_file, (char *) token);
|
||||||
sscanf ((const char *) token, "%lu", &ret_value);
|
sscanf ((const char *) token, "%lu", &ul_ret_value);
|
||||||
|
ret_value = (png_uint_32) ul_ret_value;
|
||||||
|
|
||||||
ret_value &= mask;
|
ret_value &= mask;
|
||||||
|
|
||||||
|
|||||||
0
contrib/pngminus/pnm2png.sh
Normal file → Executable file
@@ -1,7 +1,8 @@
|
|||||||
|
|
||||||
pngsuite
|
pngsuite
|
||||||
--------
|
--------
|
||||||
(c) Willem van Schaik, 1999, 2011
|
(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
|
Permission to use, copy, modify, and distribute these images for any
|
||||||
purpose and without fee is hereby granted.
|
purpose and without fee is hereby granted.
|
||||||
@@ -38,6 +39,8 @@ can use them to test the proper functioning of PNG software.
|
|||||||
basn6a08.png 8-bit RGBA
|
basn6a08.png 8-bit RGBA
|
||||||
basn6a16.png 16-bit RGBA
|
basn6a16.png 16-bit RGBA
|
||||||
|
|
||||||
|
ftbbn0g01.png 1-bit grayscale, black bKGD
|
||||||
|
ftbbn0g02.png 2-bit grayscale, black bKGD
|
||||||
ftbbn0g04.png 4-bit grayscale, black bKGD
|
ftbbn0g04.png 4-bit grayscale, black bKGD
|
||||||
ftbbn2c16.png 16-bit truecolor, black bKGD
|
ftbbn2c16.png 16-bit truecolor, black bKGD
|
||||||
ftbbn3p08.png 8-bit paletted, black bKGD
|
ftbbn3p08.png 8-bit paletted, black bKGD
|
||||||
|
|||||||
BIN
contrib/pngsuite/ftbbn0g01.png
Normal file
|
After Width: | Height: | Size: 176 B |
BIN
contrib/pngsuite/ftbbn0g02.png
Normal file
|
After Width: | Height: | Size: 197 B |
|
Before Width: | Height: | Size: 429 B After Width: | Height: | Size: 429 B |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 719 B After Width: | Height: | Size: 719 B |
26
contrib/tools/README.txt
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
This directory (contrib/tools) contains tools used by the authors of libpng.
|
||||||
|
|
||||||
|
Code and data placed in this directory is not required to build libpng,
|
||||||
|
however the code in this directory has been used to generate data or code in
|
||||||
|
the body of the libpng source. The source code identifies where this has
|
||||||
|
been done. Code in this directory may not compile on all operating systems
|
||||||
|
that libpng supports.
|
||||||
|
|
||||||
|
NO COPYRIGHT RIGHTS ARE CLAIMED TO ANY OF THE FILES IN THIS DIRECTORY.
|
||||||
|
|
||||||
|
To the extent possible under law, the authors have waived all copyright and
|
||||||
|
related or neighboring rights to this work. This work is published from:
|
||||||
|
United States.
|
||||||
|
|
||||||
|
The files may be used freely in any way.
|
||||||
|
|
||||||
|
The source code and comments in this directory are the original work of the
|
||||||
|
people named below. No other person or organization has made contributions to
|
||||||
|
the work in this directory.
|
||||||
|
|
||||||
|
ORIGINAL AUTHORS
|
||||||
|
The following people have contributed to the code in this directory. None
|
||||||
|
of the people below claim any rights with regard to the contents of this
|
||||||
|
directory.
|
||||||
|
|
||||||
|
John Bowler <jbowler@acm.org>
|
||||||
102
contrib/tools/checksum-icc.c
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
/* checksum-icc.c
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013 John Cunningham Bowler
|
||||||
|
*
|
||||||
|
* Last changed in libpng 1.6.0 [February 14, 2013]
|
||||||
|
*
|
||||||
|
* This code is released under the libpng license.
|
||||||
|
* For conditions of distribution and use, see the disclaimer
|
||||||
|
* and license in png.h
|
||||||
|
*
|
||||||
|
* Generate crc32 and adler32 checksums of the given input files, used to
|
||||||
|
* generate check-codes for use when matching ICC profiles within libpng.
|
||||||
|
*/
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include <zlib.h>
|
||||||
|
|
||||||
|
static int
|
||||||
|
read_one_file(FILE *ip, const char *name)
|
||||||
|
{
|
||||||
|
uLong length = 0;
|
||||||
|
uLong a32 = adler32(0, NULL, 0);
|
||||||
|
uLong c32 = crc32(0, NULL, 0);
|
||||||
|
Byte header[132];
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
int ch = getc(ip);
|
||||||
|
Byte b;
|
||||||
|
|
||||||
|
if (ch == EOF) break;
|
||||||
|
|
||||||
|
b = (Byte)ch;
|
||||||
|
|
||||||
|
if (length < sizeof header)
|
||||||
|
header[length] = b;
|
||||||
|
|
||||||
|
++length;
|
||||||
|
a32 = adler32(a32, &b, 1);
|
||||||
|
c32 = crc32(c32, &b, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ferror(ip))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* Success */
|
||||||
|
printf("PNG_ICC_CHECKSUM(0x%8.8lx, 0x%8.8lx,\n PNG_MD5("
|
||||||
|
"0x%2.2x%2.2x%2.2x%2.2x, 0x%2.2x%2.2x%2.2x%2.2x, 0x%2.2x%2.2x%2.2x%2.2x,"
|
||||||
|
" 0x%2.2x%2.2x%2.2x%2.2x), %d,\n"
|
||||||
|
" \"%4.4d/%2.2d/%2.2d %2.2d:%2.2d:%2.2d\", %lu, \"%s\")\n",
|
||||||
|
(unsigned long)a32, (unsigned long)c32,
|
||||||
|
header[84], header[85], header[86], header[87],
|
||||||
|
header[88], header[89], header[90], header[91],
|
||||||
|
header[92], header[93], header[94], header[95],
|
||||||
|
header[96], header[97], header[98], header[99],
|
||||||
|
# define u16(x) (header[x] * 256 + header[x+1])
|
||||||
|
# define u32(x) (u16(x) * 65536 + u16(x+2))
|
||||||
|
u32(64), u16(24), u16(26), u16(28), u16(30), u16(32), u16(34),
|
||||||
|
(unsigned long)length, name);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int err = 0;
|
||||||
|
|
||||||
|
printf("/* adler32, crc32, MD5[16], intent, date, length, file-name */\n");
|
||||||
|
|
||||||
|
if (argc > 1)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i=1; i<argc; ++i)
|
||||||
|
{
|
||||||
|
FILE *ip = fopen(argv[i], "rb");
|
||||||
|
|
||||||
|
if (ip == NULL || !read_one_file(ip, argv[i]))
|
||||||
|
{
|
||||||
|
err = 1;
|
||||||
|
perror(argv[i]);
|
||||||
|
fprintf(stderr, "%s: read error\n", argv[i]);
|
||||||
|
printf("/* ERROR: %s */\n", argv[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
(void)fclose(ip);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!read_one_file(stdin, "-"))
|
||||||
|
{
|
||||||
|
err = 1;
|
||||||
|
perror("stdin");
|
||||||
|
fprintf(stderr, "stdin: read error\n");
|
||||||
|
printf("/* ERROR: stdin */\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
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
@@ -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 */
|
||||||
@@ -1,14 +1,14 @@
|
|||||||
/*-
|
/*-
|
||||||
* convert.c
|
* convert.c
|
||||||
*
|
*
|
||||||
|
* Last changed in libpng 1.6.0 [February 14, 2013]
|
||||||
|
*
|
||||||
|
* COPYRIGHT: Written by John Cunningham Bowler, 2013.
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
* Convert 8-bit sRGB or 16-bit linear values to another format.
|
* Convert 8-bit sRGB or 16-bit linear values to another format.
|
||||||
*
|
|
||||||
* Last changed in libpng 1.5.7 [(PENDING RELEASE)]
|
|
||||||
* Copyright (c) 2011 Written by John Cunningham Bowler
|
|
||||||
*
|
|
||||||
* This code is released under the libpng license.
|
|
||||||
* For conditions of distribution and use, see the disclaimer
|
|
||||||
* and license in png.h
|
|
||||||
*/
|
*/
|
||||||
#define _ISOC99_SOURCE 1
|
#define _ISOC99_SOURCE 1
|
||||||
|
|
||||||
867
contrib/tools/genpng.c
Normal file
@@ -0,0 +1,867 @@
|
|||||||
|
/*- genpng
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* Generate a PNG with an alpha channel, correctly.
|
||||||
|
*
|
||||||
|
* This is a test case generator; the resultant PNG files are only of interest
|
||||||
|
* to those of us who care about whether the edges of circles are green, red,
|
||||||
|
* or yellow.
|
||||||
|
*
|
||||||
|
* The program generates an RGB+Alpha PNG of a given size containing the given
|
||||||
|
* shapes on a transparent background:
|
||||||
|
*
|
||||||
|
* genpng width height { shape }
|
||||||
|
* shape ::= color width shape x1 y1 x2 y2
|
||||||
|
*
|
||||||
|
* 'color' is:
|
||||||
|
*
|
||||||
|
* black white red green yellow blue brown purple pink orange gray cyan
|
||||||
|
*
|
||||||
|
* The point is to have colors that are linguistically meaningful plus that old
|
||||||
|
* bugbear of the department store dress murders, Cyan, the only color we argue
|
||||||
|
* about.
|
||||||
|
*
|
||||||
|
* 'shape' is:
|
||||||
|
*
|
||||||
|
* circle: an ellipse
|
||||||
|
* square: a rectangle
|
||||||
|
* line: a straight line
|
||||||
|
*
|
||||||
|
* Each shape is followed by four numbers, these are two points in the output
|
||||||
|
* coordinate space (as real numbers) which describe the circle, square, or
|
||||||
|
* line. The shape is filled if it is preceded by 'filled' (not valid for
|
||||||
|
* 'line') or is drawn with a line, in which case the width of the line must
|
||||||
|
* precede the shape.
|
||||||
|
*
|
||||||
|
* The whole set of information can be repeated as many times as desired:
|
||||||
|
*
|
||||||
|
* shape ::= color width shape x1 y1 x2 y2
|
||||||
|
*
|
||||||
|
* color ::= black|white|red|green|yellow|blue
|
||||||
|
* color ::= brown|purple|pink|orange|gray|cyan
|
||||||
|
* width ::= filled
|
||||||
|
* width ::= <number>
|
||||||
|
* shape ::= circle|square|line
|
||||||
|
* x1 ::= <number>
|
||||||
|
* x2 ::= <number>
|
||||||
|
* y1 ::= <number>
|
||||||
|
* y2 ::= <number>
|
||||||
|
*
|
||||||
|
* The output PNG is generated by down-sampling a 4x supersampled image using
|
||||||
|
* a bi-cubic filter. The bi-cubic has a 2 (output) pixel width, so an 8x8
|
||||||
|
* array of super-sampled points contribute to each output pixel. The value of
|
||||||
|
* a super-sampled point is found using an unfiltered, aliased, infinite
|
||||||
|
* precision image: Each shape from the last to the first is checked to see if
|
||||||
|
* the point is in the drawn area and, if it is, the color of the point is the
|
||||||
|
* color of the shape and the alpha is 1, if not the previous shape is checked.
|
||||||
|
*
|
||||||
|
* This is an aliased algorithm because no filtering is done; a point is either
|
||||||
|
* inside or outside each shape and 'close' points do not contribute to the
|
||||||
|
* sample. The down-sampling is relied on to correct the error of not using
|
||||||
|
* a filter.
|
||||||
|
*
|
||||||
|
* The line end-caps are 'flat'; they go through the points. The square line
|
||||||
|
* joins are mitres; the outside of the lines are continued to the point of
|
||||||
|
* intersection.
|
||||||
|
*/
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
/* Normally use <png.h> here to get the installed libpng, but this is done to
|
||||||
|
* ensure the code picks up the local libpng implementation:
|
||||||
|
*/
|
||||||
|
#include "../../png.h"
|
||||||
|
|
||||||
|
#if defined(PNG_SIMPLIFIED_WRITE_SUPPORTED) && defined(PNG_STDIO_SUPPORTED)
|
||||||
|
|
||||||
|
static const struct color
|
||||||
|
{
|
||||||
|
const char *name;
|
||||||
|
double red;
|
||||||
|
double green;
|
||||||
|
double blue;
|
||||||
|
} colors[] =
|
||||||
|
/* color ::= black|white|red|green|yellow|blue
|
||||||
|
* color ::= brown|purple|pink|orange|gray|cyan
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
{ "black", 0, 0, 0 },
|
||||||
|
{ "white", 1, 1, 1 },
|
||||||
|
{ "red", 1, 0, 0 },
|
||||||
|
{ "green", 0, 1, 0 },
|
||||||
|
{ "yellow", 1, 1, 0 },
|
||||||
|
{ "blue", 0, 0, 1 },
|
||||||
|
{ "brown", .5, .125, 0 },
|
||||||
|
{ "purple", 1, 0, 1 },
|
||||||
|
{ "pink", 1, .5, .5 },
|
||||||
|
{ "orange", 1, .5, 0 },
|
||||||
|
{ "gray", 0, .5, .5 },
|
||||||
|
{ "cyan", 0, 1, 1 }
|
||||||
|
};
|
||||||
|
#define color_count ((sizeof colors)/(sizeof colors[0]))
|
||||||
|
|
||||||
|
static const struct color *
|
||||||
|
color_of(const char *arg)
|
||||||
|
{
|
||||||
|
int icolor = color_count;
|
||||||
|
|
||||||
|
while (--icolor >= 0)
|
||||||
|
{
|
||||||
|
if (strcmp(colors[icolor].name, arg) == 0)
|
||||||
|
return colors+icolor;
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stderr, "genpng: invalid color %s\n", arg);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static double
|
||||||
|
width_of(const char *arg)
|
||||||
|
{
|
||||||
|
if (strcmp(arg, "filled") == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
char *ep = NULL;
|
||||||
|
double w = strtod(arg, &ep);
|
||||||
|
|
||||||
|
if (ep != NULL && *ep == 0 && w > 0)
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stderr, "genpng: invalid line width %s\n", arg);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static double
|
||||||
|
coordinate_of(const char *arg)
|
||||||
|
{
|
||||||
|
char *ep = NULL;
|
||||||
|
double w = strtod(arg, &ep);
|
||||||
|
|
||||||
|
if (ep != NULL && *ep == 0)
|
||||||
|
return w;
|
||||||
|
|
||||||
|
fprintf(stderr, "genpng: invalid coordinate value %s\n", arg);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct arg; /* forward declaration */
|
||||||
|
|
||||||
|
typedef int (*shape_fn_ptr)(const struct arg *arg, double x, double y);
|
||||||
|
/* A function to determine if (x,y) is inside the shape.
|
||||||
|
*
|
||||||
|
* There are two implementations:
|
||||||
|
*
|
||||||
|
* inside_fn: returns true if the point is inside
|
||||||
|
* check_fn: returns;
|
||||||
|
* -1: the point is outside the shape by more than the filter width (2)
|
||||||
|
* 0: the point may be inside the shape
|
||||||
|
* +1: the point is inside the shape by more than the filter width
|
||||||
|
*/
|
||||||
|
#define OUTSIDE (-1)
|
||||||
|
#define INSIDE (1)
|
||||||
|
|
||||||
|
struct arg
|
||||||
|
{
|
||||||
|
const struct color *color;
|
||||||
|
shape_fn_ptr inside_fn;
|
||||||
|
shape_fn_ptr check_fn;
|
||||||
|
double width; /* line width, 0 for 'filled' */
|
||||||
|
double x1, y1, x2, y2;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* IMPLEMENTATION NOTE:
|
||||||
|
*
|
||||||
|
* We want the contribution of each shape to the sample corresponding to each
|
||||||
|
* pixel. This could be obtained by super sampling the image to infinite
|
||||||
|
* dimensions, finding each point within the shape and assigning that a value
|
||||||
|
* '1' while leaving every point outside the shape with value '0' then
|
||||||
|
* downsampling to the image size with sinc; computationally very expensive.
|
||||||
|
*
|
||||||
|
* Approximations are as follows:
|
||||||
|
*
|
||||||
|
* 1) If the pixel coordinate is within the shape assume the sample has the
|
||||||
|
* shape color and is opaque, else assume there is no contribution from
|
||||||
|
* the shape.
|
||||||
|
*
|
||||||
|
* This is the equivalent of aliased rendering or resampling an image with
|
||||||
|
* a block filter. The maximum error in the calculated alpha (which will
|
||||||
|
* always be 0 or 1) is 0.5.
|
||||||
|
*
|
||||||
|
* 2) If the shape is within a square of size 1x1 centered on the pixel assume
|
||||||
|
* that the shape obscures an amount of the pixel equal to its area within
|
||||||
|
* that square.
|
||||||
|
*
|
||||||
|
* This is the equivalent of 'pixel coverage' alpha calculation or resampling
|
||||||
|
* an image with a bi-linear filter. The maximum error is over 0.2, but the
|
||||||
|
* results are often acceptable.
|
||||||
|
*
|
||||||
|
* This can be approximated by applying (1) to a super-sampled image then
|
||||||
|
* downsampling with a bi-linear filter. The error in the super-sampled
|
||||||
|
* image is 0.5 per sample, but the resampling reduces this.
|
||||||
|
*
|
||||||
|
* 3) Use a better filter with a super-sampled image; in the limit this is the
|
||||||
|
* sinc() approach.
|
||||||
|
*
|
||||||
|
* 4) Do the geometric calculation; a bivariate definite integral across the
|
||||||
|
* shape, unfortunately this means evaluating Si(x), the integral of sinc(x),
|
||||||
|
* which is still a lot of math.
|
||||||
|
*
|
||||||
|
* This code uses approach (3) with a bi-cubic filter and 8x super-sampling
|
||||||
|
* and method (1) for the super-samples. This means that the sample is either
|
||||||
|
* 0 or 1, depending on whether the sub-pixel is within or outside the shape.
|
||||||
|
* The bi-cubic weights are also fixed and the 16 required weights are
|
||||||
|
* pre-computed here (note that the 'scale' setting will need to be changed if
|
||||||
|
* 'super' is increased).
|
||||||
|
*
|
||||||
|
* The code also calculates a sum to the edge of the filter. This is not
|
||||||
|
* currently used by could be used to optimize the calculation.
|
||||||
|
*/
|
||||||
|
#if 0 /* bc code */
|
||||||
|
scale=10
|
||||||
|
super=8
|
||||||
|
define bicubic(x) {
|
||||||
|
if (x <= 1) return (1.5*x - 2.5)*x*x + 1;
|
||||||
|
if (x < 2) return (((2.5 - 0.5*x)*x - 4)*x + 2);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
define sum(x) {
|
||||||
|
auto s;
|
||||||
|
s = 0;
|
||||||
|
while (x < 2*super) {
|
||||||
|
s = s + bicubic(x/super);
|
||||||
|
x = x + 1;
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
define results(x) {
|
||||||
|
auto b, s;
|
||||||
|
b = bicubic(x/super);
|
||||||
|
s = sum(x);
|
||||||
|
|
||||||
|
print " /*", x, "*/ { ", b, ", ", s, " }";
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
x=0
|
||||||
|
while (x<2*super) {
|
||||||
|
x = x + results(x)
|
||||||
|
if (x < 2*super) print ","
|
||||||
|
print "\n"
|
||||||
|
}
|
||||||
|
quit
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define BICUBIC1(x) /* |x| <= 1 */ ((1.5*(x)* - 2.5)*(x)*(x) + 1)
|
||||||
|
#define BICUBIC2(x) /* 1 < |x| < 2 */ (((2.5 - 0.5*(x))*(x) - 4)*(x) + 2)
|
||||||
|
#define FILTER_WEIGHT 9 /* Twice the first sum below */
|
||||||
|
#define FILTER_WIDTH 2 /* Actually half the width; -2..+2 */
|
||||||
|
#define FILTER_STEPS 8 /* steps per filter unit */
|
||||||
|
static const double
|
||||||
|
bicubic[16][2] =
|
||||||
|
{
|
||||||
|
/* These numbers are exact; the weight for the filter is 1/9, but this
|
||||||
|
* would make the numbers inexact, so it is not included here.
|
||||||
|
*/
|
||||||
|
/* bicubic sum */
|
||||||
|
/* 0*/ { 1.0000000000, 4.5000000000 },
|
||||||
|
/* 1*/ { .9638671875, 3.5000000000 },
|
||||||
|
/* 2*/ { .8671875000, 2.5361328125 },
|
||||||
|
/* 3*/ { .7275390625, 1.6689453125 },
|
||||||
|
/* 4*/ { .5625000000, .9414062500 },
|
||||||
|
/* 5*/ { .3896484375, .3789062500 },
|
||||||
|
/* 6*/ { .2265625000, -.0107421875 },
|
||||||
|
/* 7*/ { .0908203125, -.2373046875 },
|
||||||
|
/* 8*/ { 0, -.3281250000 },
|
||||||
|
/* 9*/ { -.0478515625, -.3281250000 },
|
||||||
|
/*10*/ { -.0703125000, -.2802734375 },
|
||||||
|
/*11*/ { -.0732421875, -.2099609375 },
|
||||||
|
/*12*/ { -.0625000000, -.1367187500 },
|
||||||
|
/*13*/ { -.0439453125, -.0742187500 },
|
||||||
|
/*14*/ { -.0234375000, -.0302734375 },
|
||||||
|
/*15*/ { -.0068359375, -.0068359375 }
|
||||||
|
};
|
||||||
|
|
||||||
|
static double
|
||||||
|
alpha_calc(const struct arg *arg, double x, double y)
|
||||||
|
{
|
||||||
|
/* For [x-2..x+2],[y-2,y+2] calculate the weighted bicubic given a function
|
||||||
|
* which tells us whether a point is inside or outside the shape. First
|
||||||
|
* check if we need to do this at all:
|
||||||
|
*/
|
||||||
|
switch (arg->check_fn(arg, x, y))
|
||||||
|
{
|
||||||
|
case OUTSIDE:
|
||||||
|
return 0; /* all samples outside the shape */
|
||||||
|
|
||||||
|
case INSIDE:
|
||||||
|
return 1; /* all samples inside the shape */
|
||||||
|
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
int dy;
|
||||||
|
double alpha = 0;
|
||||||
|
|
||||||
|
# define FILTER_D (FILTER_WIDTH*FILTER_STEPS-1)
|
||||||
|
for (dy=-FILTER_D; dy<=FILTER_D; ++dy)
|
||||||
|
{
|
||||||
|
double wy = bicubic[abs(dy)][0];
|
||||||
|
|
||||||
|
if (wy != 0)
|
||||||
|
{
|
||||||
|
double alphay = 0;
|
||||||
|
int dx;
|
||||||
|
|
||||||
|
for (dx=-FILTER_D; dx<=FILTER_D; ++dx)
|
||||||
|
{
|
||||||
|
double wx = bicubic[abs(dx)][0];
|
||||||
|
|
||||||
|
if (wx != 0 && arg->inside_fn(arg, x+dx/16, y+dy/16))
|
||||||
|
alphay += wx;
|
||||||
|
}
|
||||||
|
|
||||||
|
alpha += wy * alphay;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This needs to be weighted for each dimension: */
|
||||||
|
return alpha / (FILTER_WEIGHT*FILTER_WEIGHT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* These are the shape functions. */
|
||||||
|
/* "square",
|
||||||
|
* { inside_square_filled, check_square_filled },
|
||||||
|
* { inside_square, check_square }
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
square_check(double x, double y, double x1, double y1, double x2, double y2)
|
||||||
|
/* Is x,y inside the square (x1,y1)..(x2,y2)? */
|
||||||
|
{
|
||||||
|
/* Do a modified Cohen-Sutherland on one point, bit patterns that indicate
|
||||||
|
* 'outside' are:
|
||||||
|
*
|
||||||
|
* x<x1 | x<y1 | x<x2 | x<y2
|
||||||
|
* 0 x 0 x To the right
|
||||||
|
* 1 x 1 x To the left
|
||||||
|
* x 0 x 0 Below
|
||||||
|
* x 1 x 1 Above
|
||||||
|
*
|
||||||
|
* So 'inside' is (x<x1) != (x<x2) && (y<y1) != (y<y2);
|
||||||
|
*/
|
||||||
|
return ((x<x1) ^ (x<x2)) & ((y<y1) ^ (y<y2));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
inside_square_filled(const struct arg *arg, double x, double y)
|
||||||
|
{
|
||||||
|
return square_check(x, y, arg->x1, arg->y1, arg->x2, arg->y2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
square_check_line(const struct arg *arg, double x, double y, double w)
|
||||||
|
/* Check for a point being inside the boundaries implied by the given arg
|
||||||
|
* and assuming a width 2*w each side of the boundaries. This returns the
|
||||||
|
* 'check' INSIDE/OUTSIDE/0 result but note the semantics:
|
||||||
|
*
|
||||||
|
* +--------------+
|
||||||
|
* | | OUTSIDE
|
||||||
|
* | INSIDE |
|
||||||
|
* | |
|
||||||
|
* +--------------+
|
||||||
|
*
|
||||||
|
* And '0' means within the line boundaries.
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
double cx = (arg->x1+arg->x2)/2;
|
||||||
|
double wx = fabs(arg->x1-arg->x2)/2;
|
||||||
|
double cy = (arg->y1+arg->y2)/2;
|
||||||
|
double wy = fabs(arg->y1-arg->y2)/2;
|
||||||
|
|
||||||
|
if (square_check(x, y, cx-wx-w, cy-wy-w, cx+wx+w, cy+wy+w))
|
||||||
|
{
|
||||||
|
/* Inside, but maybe too far; check for the redundant case where
|
||||||
|
* the lines overlap:
|
||||||
|
*/
|
||||||
|
wx -= w;
|
||||||
|
wy -= w;
|
||||||
|
if (wx > 0 && wy > 0 && square_check(x, y, cx-wx, cy-wy, cx+wx, cy+wy))
|
||||||
|
return INSIDE; /* between (inside) the boundary lines. */
|
||||||
|
|
||||||
|
return 0; /* inside the lines themselves. */
|
||||||
|
}
|
||||||
|
|
||||||
|
return OUTSIDE; /* outside the boundary lines. */
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
check_square_filled(const struct arg *arg, double x, double y)
|
||||||
|
{
|
||||||
|
/* The filter extends +/-FILTER_WIDTH each side of each output point, so
|
||||||
|
* the check has to expand and contract the square by that amount; '0'
|
||||||
|
* means close enough to the edge of the square that the bicubic filter has
|
||||||
|
* to be run, OUTSIDE means alpha==0, INSIDE means alpha==1.
|
||||||
|
*/
|
||||||
|
return square_check_line(arg, x, y, FILTER_WIDTH);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
inside_square(const struct arg *arg, double x, double y)
|
||||||
|
{
|
||||||
|
/* Return true if within the drawn lines, else false, no need to distinguish
|
||||||
|
* INSIDE vs OUTSIDE here:
|
||||||
|
*/
|
||||||
|
return square_check_line(arg, x, y, arg->width/2) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
check_square(const struct arg *arg, double x, double y)
|
||||||
|
{
|
||||||
|
/* So for this function a result of 'INSIDE' means inside the actual lines.
|
||||||
|
*/
|
||||||
|
double w = arg->width/2;
|
||||||
|
|
||||||
|
if (square_check_line(arg, x, y, w+FILTER_WIDTH) == 0)
|
||||||
|
{
|
||||||
|
/* Somewhere close to the boundary lines. If far enough inside one of
|
||||||
|
* them then we can return INSIDE:
|
||||||
|
*/
|
||||||
|
w -= FILTER_WIDTH;
|
||||||
|
|
||||||
|
if (w > 0 && square_check_line(arg, x, y, w) == 0)
|
||||||
|
return INSIDE;
|
||||||
|
|
||||||
|
/* Point is somewhere in the filter region: */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
else /* Inside or outside the square by more than w+FILTER_WIDTH. */
|
||||||
|
return OUTSIDE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* "circle",
|
||||||
|
* { inside_circle_filled, check_circle_filled },
|
||||||
|
* { inside_circle, check_circle }
|
||||||
|
*
|
||||||
|
* The functions here are analoguous to the square ones; however, they check
|
||||||
|
* the corresponding ellipse as opposed to the rectangle.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
circle_check(double x, double y, double x1, double y1, double x2, double y2)
|
||||||
|
{
|
||||||
|
if (square_check(x, y, x1, y1, x2, y2))
|
||||||
|
{
|
||||||
|
/* Inside the square, so maybe inside the circle too: */
|
||||||
|
const double cx = (x1 + x2)/2;
|
||||||
|
const double cy = (y1 + y2)/2;
|
||||||
|
const double dx = x1 - x2;
|
||||||
|
const double dy = y1 - y2;
|
||||||
|
|
||||||
|
x = (x - cx)/dx;
|
||||||
|
y = (y - cy)/dy;
|
||||||
|
|
||||||
|
/* It is outside if the distance from the center is more than half the
|
||||||
|
* diameter:
|
||||||
|
*/
|
||||||
|
return x*x+y*y < .25;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0; /* outside */
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
inside_circle_filled(const struct arg *arg, double x, double y)
|
||||||
|
{
|
||||||
|
return circle_check(x, y, arg->x1, arg->y1, arg->x2, arg->y2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
circle_check_line(const struct arg *arg, double x, double y, double w)
|
||||||
|
/* Check for a point being inside the boundaries implied by the given arg
|
||||||
|
* and assuming a width 2*w each side of the boundaries. This function has
|
||||||
|
* the same semantic as square_check_line but tests the circle.
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
double cx = (arg->x1+arg->x2)/2;
|
||||||
|
double wx = fabs(arg->x1-arg->x2)/2;
|
||||||
|
double cy = (arg->y1+arg->y2)/2;
|
||||||
|
double wy = fabs(arg->y1-arg->y2)/2;
|
||||||
|
|
||||||
|
if (circle_check(x, y, cx-wx-w, cy-wy-w, cx+wx+w, cy+wy+w))
|
||||||
|
{
|
||||||
|
/* Inside, but maybe too far; check for the redundant case where
|
||||||
|
* the lines overlap:
|
||||||
|
*/
|
||||||
|
wx -= w;
|
||||||
|
wy -= w;
|
||||||
|
if (wx > 0 && wy > 0 && circle_check(x, y, cx-wx, cy-wy, cx+wx, cy+wy))
|
||||||
|
return INSIDE; /* between (inside) the boundary lines. */
|
||||||
|
|
||||||
|
return 0; /* inside the lines themselves. */
|
||||||
|
}
|
||||||
|
|
||||||
|
return OUTSIDE; /* outside the boundary lines. */
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
check_circle_filled(const struct arg *arg, double x, double y)
|
||||||
|
{
|
||||||
|
return circle_check_line(arg, x, y, FILTER_WIDTH);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
inside_circle(const struct arg *arg, double x, double y)
|
||||||
|
{
|
||||||
|
return circle_check_line(arg, x, y, arg->width/2) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
check_circle(const struct arg *arg, double x, double y)
|
||||||
|
{
|
||||||
|
/* Exactly as the 'square' code. */
|
||||||
|
double w = arg->width/2;
|
||||||
|
|
||||||
|
if (circle_check_line(arg, x, y, w+FILTER_WIDTH) == 0)
|
||||||
|
{
|
||||||
|
w -= FILTER_WIDTH;
|
||||||
|
|
||||||
|
if (w > 0 && circle_check_line(arg, x, y, w) == 0)
|
||||||
|
return INSIDE;
|
||||||
|
|
||||||
|
/* Point is somewhere in the filter region: */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
else /* Inside or outside the square by more than w+FILTER_WIDTH. */
|
||||||
|
return OUTSIDE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* "line",
|
||||||
|
* { NULL, NULL }, There is no 'filled' line.
|
||||||
|
* { inside_line, check_line }
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
line_check(double x, double y, double x1, double y1, double x2, double y2,
|
||||||
|
double w, double expand)
|
||||||
|
{
|
||||||
|
/* Shift all the points to (arg->x1, arg->y1) */
|
||||||
|
double lx = x2 - x1;
|
||||||
|
double ly = y2 - y1;
|
||||||
|
double len2 = lx*lx + ly*ly;
|
||||||
|
double cross, dot;
|
||||||
|
|
||||||
|
x -= x1;
|
||||||
|
y -= y1;
|
||||||
|
|
||||||
|
/* The dot product is the distance down the line, the cross product is
|
||||||
|
* the distance away from the line:
|
||||||
|
*
|
||||||
|
* distance = |cross| / sqrt(len2)
|
||||||
|
*/
|
||||||
|
cross = x * ly - y * lx;
|
||||||
|
|
||||||
|
/* If 'distance' is more than w the point is definitely outside the line:
|
||||||
|
*
|
||||||
|
* distance >= w
|
||||||
|
* |cross| >= w * sqrt(len2)
|
||||||
|
* cross^2 >= w^2 * len2:
|
||||||
|
*/
|
||||||
|
if (cross*cross >= (w+expand)*(w+expand)*len2)
|
||||||
|
return 0; /* outside */
|
||||||
|
|
||||||
|
/* Now find the distance *along* the line; this comes from the dot product
|
||||||
|
* lx.x+ly.y. The actual distance (in pixels) is:
|
||||||
|
*
|
||||||
|
* distance = dot / sqrt(len2)
|
||||||
|
*/
|
||||||
|
dot = lx * x + ly * y;
|
||||||
|
|
||||||
|
/* The test for 'outside' is:
|
||||||
|
*
|
||||||
|
* distance < 0 || distance > sqrt(len2)
|
||||||
|
* -> dot / sqrt(len2) > sqrt(len2)
|
||||||
|
* -> dot > len2
|
||||||
|
*
|
||||||
|
* But 'expand' is used for the filter width and needs to be handled too:
|
||||||
|
*/
|
||||||
|
return dot > -expand && dot < len2+expand;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
inside_line(const struct arg *arg, double x, double y)
|
||||||
|
{
|
||||||
|
return line_check(x, y, arg->x1, arg->y1, arg->x2, arg->y2, arg->width/2, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
check_line(const struct arg *arg, double x, double y)
|
||||||
|
{
|
||||||
|
/* The end caps of the line must be checked too; it's not enough just to
|
||||||
|
* widen the line by FILTER_WIDTH; 'expand' exists for this purpose:
|
||||||
|
*/
|
||||||
|
if (line_check(x, y, arg->x1, arg->y1, arg->x2, arg->y2, arg->width/2,
|
||||||
|
FILTER_WIDTH))
|
||||||
|
{
|
||||||
|
/* Inside the line+filter; far enough inside that the filter isn't
|
||||||
|
* required?
|
||||||
|
*/
|
||||||
|
if (arg->width > 2*FILTER_WIDTH &&
|
||||||
|
line_check(x, y, arg->x1, arg->y1, arg->x2, arg->y2, arg->width/2,
|
||||||
|
-FILTER_WIDTH))
|
||||||
|
return INSIDE;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return OUTSIDE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct
|
||||||
|
{
|
||||||
|
const char *name;
|
||||||
|
shape_fn_ptr function[2/*fill,line*/][2];
|
||||||
|
# define FN_INSIDE 0
|
||||||
|
# define FN_CHECK 1
|
||||||
|
} shape_defs[] =
|
||||||
|
{
|
||||||
|
{ "square",
|
||||||
|
{ { inside_square_filled, check_square_filled },
|
||||||
|
{ inside_square, check_square } }
|
||||||
|
},
|
||||||
|
{ "circle",
|
||||||
|
{ { inside_circle_filled, check_circle_filled },
|
||||||
|
{ inside_circle, check_circle } }
|
||||||
|
},
|
||||||
|
{ "line",
|
||||||
|
{ { NULL, NULL },
|
||||||
|
{ inside_line, check_line } }
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#define shape_count ((sizeof shape_defs)/(sizeof shape_defs[0]))
|
||||||
|
|
||||||
|
static shape_fn_ptr
|
||||||
|
shape_of(const char *arg, double width, int f)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
for (i=0; i<shape_count; ++i) if (strcmp(shape_defs[i].name, arg) == 0)
|
||||||
|
{
|
||||||
|
shape_fn_ptr fn = shape_defs[i].function[width != 0][f];
|
||||||
|
|
||||||
|
if (fn != NULL)
|
||||||
|
return fn;
|
||||||
|
|
||||||
|
fprintf(stderr, "genpng: %s %s not supported\n",
|
||||||
|
width == 0 ? "filled" : "unfilled", arg);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stderr, "genpng: %s: not a valid shape name\n", arg);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
parse_arg(struct arg *arg, const char **argv/*7 arguments*/)
|
||||||
|
{
|
||||||
|
/* shape ::= color width shape x1 y1 x2 y2 */
|
||||||
|
arg->color = color_of(argv[0]);
|
||||||
|
arg->width = width_of(argv[1]);
|
||||||
|
arg->inside_fn = shape_of(argv[2], arg->width, FN_INSIDE);
|
||||||
|
arg->check_fn = shape_of(argv[2], arg->width, FN_CHECK);
|
||||||
|
arg->x1 = coordinate_of(argv[3]);
|
||||||
|
arg->y1 = coordinate_of(argv[4]);
|
||||||
|
arg->x2 = coordinate_of(argv[5]);
|
||||||
|
arg->y2 = coordinate_of(argv[6]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static png_uint_32
|
||||||
|
read_wh(const char *name, const char *str)
|
||||||
|
/* read a PNG width or height */
|
||||||
|
{
|
||||||
|
char *ep = NULL;
|
||||||
|
unsigned long ul = strtoul(str, &ep, 10);
|
||||||
|
|
||||||
|
if (ep != NULL && *ep == 0 && ul > 0 && ul <= 0x7fffffff)
|
||||||
|
return (png_uint_32)/*SAFE*/ul;
|
||||||
|
|
||||||
|
fprintf(stderr, "genpng: %s: invalid number %s\n", name, str);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
pixel(png_uint_16p p, struct arg *args, int nargs, double x, double y)
|
||||||
|
{
|
||||||
|
/* Fill in the pixel by checking each shape (args[nargs]) for effects on
|
||||||
|
* the corresponding sample:
|
||||||
|
*/
|
||||||
|
double r=0, g=0, b=0, a=0;
|
||||||
|
|
||||||
|
while (--nargs >= 0 && a != 1)
|
||||||
|
{
|
||||||
|
/* NOTE: alpha_calc can return a value outside the range 0..1 with the
|
||||||
|
* bicubic filter.
|
||||||
|
*/
|
||||||
|
const double alpha = alpha_calc(args+nargs, x, y) * (1-a);
|
||||||
|
|
||||||
|
r += alpha * args[nargs].color->red;
|
||||||
|
g += alpha * args[nargs].color->green;
|
||||||
|
b += alpha * args[nargs].color->blue;
|
||||||
|
a += alpha;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 'a' may be negative or greater than 1; if it is, negative clamp the
|
||||||
|
* pixel to 0 if >1 clamp r/g/b:
|
||||||
|
*/
|
||||||
|
if (a > 0)
|
||||||
|
{
|
||||||
|
if (a > 1)
|
||||||
|
{
|
||||||
|
if (r > 1) r = 1;
|
||||||
|
if (g > 1) g = 1;
|
||||||
|
if (b > 1) b = 1;
|
||||||
|
a = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* And fill in the pixel: */
|
||||||
|
p[0] = (png_uint_16)/*SAFE*/round(r * 65535);
|
||||||
|
p[1] = (png_uint_16)/*SAFE*/round(g * 65535);
|
||||||
|
p[2] = (png_uint_16)/*SAFE*/round(b * 65535);
|
||||||
|
p[3] = (png_uint_16)/*SAFE*/round(a * 65535);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
p[3] = p[2] = p[1] = p[0] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, const char **argv)
|
||||||
|
{
|
||||||
|
int convert_to_8bit = 0;
|
||||||
|
|
||||||
|
/* There is one option: --8bit: */
|
||||||
|
if (argc > 1 && strcmp(argv[1], "--8bit") == 0)
|
||||||
|
--argc, ++argv, convert_to_8bit = 1;
|
||||||
|
|
||||||
|
if (argc >= 3)
|
||||||
|
{
|
||||||
|
png_uint_16p buffer;
|
||||||
|
int nshapes;
|
||||||
|
png_image image;
|
||||||
|
# define max_shapes 256
|
||||||
|
struct arg arg_list[max_shapes];
|
||||||
|
|
||||||
|
/* The libpng Simplified API write code requires a fully initialized
|
||||||
|
* structure.
|
||||||
|
*/
|
||||||
|
memset(&image, 0, sizeof image);
|
||||||
|
image.version = PNG_IMAGE_VERSION;
|
||||||
|
image.opaque = NULL;
|
||||||
|
image.width = read_wh("width", argv[1]);
|
||||||
|
image.height = read_wh("height", argv[2]);
|
||||||
|
image.format = PNG_FORMAT_LINEAR_RGB_ALPHA;
|
||||||
|
image.flags = 0;
|
||||||
|
image.colormap_entries = 0;
|
||||||
|
|
||||||
|
/* Check the remainder of the arguments */
|
||||||
|
for (nshapes=0; 3+7*(nshapes+1) <= argc && nshapes < max_shapes;
|
||||||
|
++nshapes)
|
||||||
|
parse_arg(arg_list+nshapes, argv+3+7*nshapes);
|
||||||
|
|
||||||
|
if (3+7*nshapes != argc)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "genpng: %s: too many arguments\n", argv[3+7*nshapes]);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Create the buffer: */
|
||||||
|
buffer = malloc(PNG_IMAGE_SIZE(image));
|
||||||
|
|
||||||
|
if (buffer != NULL)
|
||||||
|
{
|
||||||
|
png_uint_32 y;
|
||||||
|
|
||||||
|
/* Write each row... */
|
||||||
|
for (y=0; y<image.height; ++y)
|
||||||
|
{
|
||||||
|
png_uint_32 x;
|
||||||
|
|
||||||
|
/* Each pixel in each row: */
|
||||||
|
for (x=0; x<image.width; ++x)
|
||||||
|
pixel(buffer + 4*(x + y*image.width), arg_list, nshapes, x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Write the result (to stdout) */
|
||||||
|
if (png_image_write_to_stdio(&image, stdout, convert_to_8bit,
|
||||||
|
buffer, 0/*row_stride*/, NULL/*colormap*/))
|
||||||
|
{
|
||||||
|
free(buffer);
|
||||||
|
return 0; /* success */
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
fprintf(stderr, "genpng: write stdout: %s\n", image.message);
|
||||||
|
|
||||||
|
free(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
fprintf(stderr, "genpng: out of memory: %lu bytes\n",
|
||||||
|
(unsigned long)PNG_IMAGE_SIZE(image));
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Wrong number of arguments */
|
||||||
|
fprintf(stderr, "genpng: usage: genpng [--8bit] width height {shape}\n"
|
||||||
|
" Generate a transparent PNG in RGBA (truecolor+alpha) format\n"
|
||||||
|
" containing the given shape or shapes. Shapes are defined:\n"
|
||||||
|
"\n"
|
||||||
|
" shape ::= color width shape x1 y1 x2 y2\n"
|
||||||
|
" color ::= black|white|red|green|yellow|blue\n"
|
||||||
|
" color ::= brown|purple|pink|orange|gray|cyan\n"
|
||||||
|
" width ::= filled|<number>\n"
|
||||||
|
" shape ::= circle|square|line\n"
|
||||||
|
" x1,x2 ::= <number>\n"
|
||||||
|
" y1,y2 ::= <number>\n"
|
||||||
|
"\n"
|
||||||
|
" Numbers are floating point numbers describing points relative to\n"
|
||||||
|
" the top left of the output PNG as pixel coordinates. The 'width'\n"
|
||||||
|
" parameter is either the width of the line (in output pixels) used\n"
|
||||||
|
" to draw the shape or 'filled' to indicate that the shape should\n"
|
||||||
|
" be filled with the color.\n"
|
||||||
|
"\n"
|
||||||
|
" Colors are interpreted loosely to give access to the eight full\n"
|
||||||
|
" intensity RGB values:\n"
|
||||||
|
"\n"
|
||||||
|
" black, red, green, blue, yellow, cyan, purple, white,\n"
|
||||||
|
"\n"
|
||||||
|
" Cyan is full intensity blue+green; RGB(0,1,1), plus the following\n"
|
||||||
|
" lower intensity values:\n"
|
||||||
|
"\n"
|
||||||
|
" brown: red+orange: RGB(0.5, 0.125, 0) (dark red+orange)\n"
|
||||||
|
" pink: red+white: RGB(1.0, 0.5, 0.5)\n"
|
||||||
|
" orange: red+yellow: RGB(1.0, 0.5, 0)\n"
|
||||||
|
" gray: black+white: RGB(0.5, 0.5, 0.5)\n"
|
||||||
|
"\n"
|
||||||
|
" The RGB values are selected to make detection of aliasing errors\n"
|
||||||
|
" easy. The names are selected to make the description of errors\n"
|
||||||
|
" easy.\n"
|
||||||
|
"\n"
|
||||||
|
" The PNG is written to stdout, if --8bit is given a 32bpp RGBA sRGB\n"
|
||||||
|
" file is produced, otherwise a 64bpp RGBA linear encoded file is\n"
|
||||||
|
" written.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#endif /* SIMPLIFIED_WRITE && STDIO */
|
||||||
110
contrib/tools/intgamma.sh
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# intgamma.sh
|
||||||
|
#
|
||||||
|
# Last changed in libpng 1.6.0 [February 14, 2013]
|
||||||
|
#
|
||||||
|
# COPYRIGHT: Written by John Cunningham Bowler, 2013.
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
# Shell script to generate png.c 8-bit and 16-bit log tables (see the code in
|
||||||
|
# png.c for details).
|
||||||
|
#
|
||||||
|
# This script uses the "bc" arbitrary precision calculator to calculate 32-bit
|
||||||
|
# fixed point values of logarithms appropriate to finding the log of an 8-bit
|
||||||
|
# (0..255) value and a similar table for the exponent calculation.
|
||||||
|
#
|
||||||
|
# "bc" must be on the path when the script is executed, and the math library
|
||||||
|
# (-lm) must be available
|
||||||
|
#
|
||||||
|
# function to print out a list of numbers as integers; the function truncates
|
||||||
|
# the integers which must be one-per-line
|
||||||
|
function print(){
|
||||||
|
awk 'BEGIN{
|
||||||
|
str = ""
|
||||||
|
}
|
||||||
|
{
|
||||||
|
sub("\\.[0-9]*$", "")
|
||||||
|
if ($0 == "")
|
||||||
|
$0 = "0"
|
||||||
|
|
||||||
|
if (str == "")
|
||||||
|
t = " " $0 "U"
|
||||||
|
else
|
||||||
|
t = str ", " $0 "U"
|
||||||
|
|
||||||
|
if (length(t) >= 80) {
|
||||||
|
print str ","
|
||||||
|
str = " " $0 "U"
|
||||||
|
} else
|
||||||
|
str = t
|
||||||
|
}
|
||||||
|
END{
|
||||||
|
print str
|
||||||
|
}'
|
||||||
|
}
|
||||||
|
#
|
||||||
|
# The logarithm table.
|
||||||
|
cat <<END
|
||||||
|
/* 8-bit log table: png_8bit_l2[128]
|
||||||
|
* This is a table of -log(value/255)/log(2) for 'value' in the range 128 to
|
||||||
|
* 255, so it's the base 2 logarithm of a normalized 8-bit floating point
|
||||||
|
* mantissa. The numbers are 32-bit fractions.
|
||||||
|
*/
|
||||||
|
static const png_uint_32
|
||||||
|
png_8bit_l2[128] =
|
||||||
|
{
|
||||||
|
END
|
||||||
|
#
|
||||||
|
bc -lqws <<END | print
|
||||||
|
f=65536*65536/l(2)
|
||||||
|
for (i=128;i<256;++i) { .5 - l(i/255)*f; }
|
||||||
|
END
|
||||||
|
echo '};'
|
||||||
|
echo
|
||||||
|
#
|
||||||
|
# The exponent table.
|
||||||
|
cat <<END
|
||||||
|
/* The 'exp()' case must invert the above, taking a 20-bit fixed point
|
||||||
|
* logarithmic value and returning a 16 or 8-bit number as appropriate. In
|
||||||
|
* each case only the low 16 bits are relevant - the fraction - since the
|
||||||
|
* integer bits (the top 4) simply determine a shift.
|
||||||
|
*
|
||||||
|
* The worst case is the 16-bit distinction between 65535 and 65534; this
|
||||||
|
* requires perhaps spurious accuracy in the decoding of the logarithm to
|
||||||
|
* distinguish log2(65535/65534.5) - 10^-5 or 17 bits. There is little chance
|
||||||
|
* of getting this accuracy in practice.
|
||||||
|
*
|
||||||
|
* To deal with this the following exp() function works out the exponent of the
|
||||||
|
* frational part of the logarithm by using an accurate 32-bit value from the
|
||||||
|
* top four fractional bits then multiplying in the remaining bits.
|
||||||
|
*/
|
||||||
|
static const png_uint_32
|
||||||
|
png_32bit_exp[16] =
|
||||||
|
{
|
||||||
|
END
|
||||||
|
#
|
||||||
|
bc -lqws <<END | print
|
||||||
|
f=l(2)/16
|
||||||
|
for (i=0;i<16;++i) {
|
||||||
|
x = .5 + e(-i*f)*2^32;
|
||||||
|
if (x >= 2^32) x = 2^32-1;
|
||||||
|
x;
|
||||||
|
}
|
||||||
|
END
|
||||||
|
echo '};'
|
||||||
|
echo
|
||||||
|
#
|
||||||
|
# And the table of adjustment values.
|
||||||
|
cat <<END
|
||||||
|
/* Adjustment table; provided to explain the numbers in the code below. */
|
||||||
|
#if 0
|
||||||
|
END
|
||||||
|
bc -lqws <<END | awk '{ printf "%5d %s\n", 12-NR, $0 }'
|
||||||
|
for (i=11;i>=0;--i){
|
||||||
|
(1 - e(-(2^i)/65536*l(2))) * 2^(32-i)
|
||||||
|
}
|
||||||
|
END
|
||||||
|
echo '#endif'
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
/* makesRGB.c -- build sRGB-to-linear and linear-to-sRGB conversion tables
|
/* makesRGB.c -- build sRGB-to-linear and linear-to-sRGB conversion tables
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.5.7 [(PENDING RELEASE)]
|
* Last changed in libpng 1.6.0 [February 14, 2013]
|
||||||
* Copyright (c) 2011 John Cunningham Bowler
|
|
||||||
*
|
*
|
||||||
* This code is released under the libpng license.
|
* COPYRIGHT: Written by John Cunningham Bowler, 2013.
|
||||||
* For conditions of distribution and use, see the disclaimer
|
* To the extent possible under law, the author has waived all copyright and
|
||||||
* and license in png.h
|
* related or neighboring rights to this work. This work is published from:
|
||||||
|
* United States.
|
||||||
*
|
*
|
||||||
* Make a table to convert 8-bit sRGB encoding values into the closest 16-bit
|
* Make a table to convert 8-bit sRGB encoding values into the closest 16-bit
|
||||||
* linear value.
|
* linear value.
|
||||||
164
contrib/tools/png-fix-itxt.c
Normal file
@@ -0,0 +1,164 @@
|
|||||||
|
|
||||||
|
/* png-fix-itxt version 1.0.0
|
||||||
|
*
|
||||||
|
* Copyright 2015 Glenn Randers-Pehrson
|
||||||
|
* Last changed in libpng 1.6.18 [(PENDING RELEASE)]
|
||||||
|
*
|
||||||
|
* This code is released under the libpng license.
|
||||||
|
* For conditions of distribution and use, see the disclaimer
|
||||||
|
* and license in png.h
|
||||||
|
*
|
||||||
|
* Usage:
|
||||||
|
*
|
||||||
|
* png-fix-itxt.exe < bad.png > good.png
|
||||||
|
*
|
||||||
|
* Fixes a PNG file written with libpng-1.6.0 or 1.6.1 that has one or more
|
||||||
|
* uncompressed iTXt chunks. Assumes that the actual length is greater
|
||||||
|
* than or equal to the value in the length byte, and that the CRC is
|
||||||
|
* correct for the actual length. This program hunts for the CRC and
|
||||||
|
* adjusts the length byte accordingly. It is not an error to process a
|
||||||
|
* PNG file that has no iTXt chunks or one that has valid iTXt chunks;
|
||||||
|
* such files will simply be copied.
|
||||||
|
*
|
||||||
|
* Requires zlib (for crc32 and Z_NULL); build with
|
||||||
|
*
|
||||||
|
* gcc -O -o png-fix-itxt png-fix-itxt.c -lz
|
||||||
|
*
|
||||||
|
* If you need to handle iTXt chunks larger than 500000 kbytes you must
|
||||||
|
* rebuild png-fix-itxt with a larger values of MAX_LENGTH (or a smaller value
|
||||||
|
* if you know you will never encounter such huge iTXt chunks).
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <zlib.h>
|
||||||
|
|
||||||
|
#define MAX_LENGTH 500000
|
||||||
|
|
||||||
|
/* Read one character (inchar), also return octet (c), break if EOF */
|
||||||
|
#define GETBREAK inchar=getchar(); \
|
||||||
|
c=(inchar & 0xffU);\
|
||||||
|
if (inchar != (int) c) break
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
unsigned char buf[MAX_LENGTH];
|
||||||
|
unsigned long crc;
|
||||||
|
unsigned char c;
|
||||||
|
int inchar;
|
||||||
|
|
||||||
|
/* Skip 8-byte signature */
|
||||||
|
for (i=8; i; i--)
|
||||||
|
{
|
||||||
|
GETBREAK;
|
||||||
|
putchar(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inchar == (int) c) /* !EOF */
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
/* Read the length */
|
||||||
|
unsigned long length; /* must be 32 bits! */
|
||||||
|
GETBREAK; buf[0] = c; length = c; length <<= 8;
|
||||||
|
GETBREAK; buf[1] = c; length += c; length <<= 8;
|
||||||
|
GETBREAK; buf[2] = c; length += c; length <<= 8;
|
||||||
|
GETBREAK; buf[3] = c; length += c;
|
||||||
|
|
||||||
|
/* Read the chunkname */
|
||||||
|
GETBREAK; buf[4] = c;
|
||||||
|
GETBREAK; buf[5] = c;
|
||||||
|
GETBREAK; buf[6] = c;
|
||||||
|
GETBREAK; buf[7] = c;
|
||||||
|
|
||||||
|
|
||||||
|
/* The iTXt chunk type expressed as integers is (105, 84, 88, 116) */
|
||||||
|
if (buf[4] == 105 && buf[5] == 84 && buf[6] == 88 && buf[7] == 116)
|
||||||
|
{
|
||||||
|
if (length >= MAX_LENGTH-12)
|
||||||
|
break; /* To do: handle this more gracefully */
|
||||||
|
|
||||||
|
/* Initialize the CRC */
|
||||||
|
crc = crc32(0, Z_NULL, 0);
|
||||||
|
|
||||||
|
/* Copy the data bytes */
|
||||||
|
for (i=8; i < length + 12; i++)
|
||||||
|
{
|
||||||
|
GETBREAK; buf[i] = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inchar != (int) c) /* EOF */
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* Calculate the CRC */
|
||||||
|
crc = crc32(crc, buf+4, (uInt)length+4);
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
/* Check the CRC */
|
||||||
|
if (((crc >> 24) & 0xffU) == buf[length+8] &&
|
||||||
|
((crc >> 16) & 0xffU) == buf[length+9] &&
|
||||||
|
((crc >> 8) & 0xffU) == buf[length+10] &&
|
||||||
|
((crc ) & 0xffU) == buf[length+11])
|
||||||
|
break;
|
||||||
|
|
||||||
|
length++;
|
||||||
|
|
||||||
|
if (length >= MAX_LENGTH-12)
|
||||||
|
break;
|
||||||
|
|
||||||
|
GETBREAK;
|
||||||
|
buf[length+11] = c;
|
||||||
|
|
||||||
|
/* Update the CRC */
|
||||||
|
crc = crc32(crc, buf+7+length, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inchar != (int) c) /* EOF */
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* Update length bytes */
|
||||||
|
buf[0] = (unsigned char)((length >> 24) & 0xffU);
|
||||||
|
buf[1] = (unsigned char)((length >> 16) & 0xffU);
|
||||||
|
buf[2] = (unsigned char)((length >> 8) & 0xffU);
|
||||||
|
buf[3] = (unsigned char)((length ) & 0xffU);
|
||||||
|
|
||||||
|
/* Write the fixed iTXt chunk (length, name, data, crc) */
|
||||||
|
for (i=0; i<length+12; i++)
|
||||||
|
putchar(buf[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (inchar != (int) c) /* EOF */
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* Copy bytes that were already read (length and chunk name) */
|
||||||
|
for (i=0; i<8; i++)
|
||||||
|
putchar(buf[i]);
|
||||||
|
|
||||||
|
/* Copy data bytes and CRC */
|
||||||
|
for (i=8; i< length+12; i++)
|
||||||
|
{
|
||||||
|
GETBREAK;
|
||||||
|
putchar(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inchar != (int) c) /* EOF */
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The IEND chunk type expressed as integers is (73, 69, 78, 68) */
|
||||||
|
if (buf[4] == 73 && buf[5] == 69 && buf[6] == 78 && buf[7] == 68)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inchar != (int) c) /* EOF */
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (buf[4] == 73 && buf[5] == 69 && buf[6] == 78 && buf[7] == 68)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
4045
contrib/tools/pngfix.c
Normal file
@@ -1,12 +1,12 @@
|
|||||||
/*-
|
/*-
|
||||||
* sRGB.h
|
* sRGB.h
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.5.7 [(PENDING RELEASE)]
|
* Last changed in libpng 1.6.0 [February 14, 2013]
|
||||||
* Copyright (c) 2011 John Cunningham Bowler
|
|
||||||
*
|
*
|
||||||
* This code is released under the libpng license.
|
* COPYRIGHT: Written by John Cunningham Bowler, 2013.
|
||||||
* For conditions of distribution and use, see the disclaimer
|
* To the extent possible under law, the author has waived all copyright and
|
||||||
* and license in png.h
|
* related or neighboring rights to this work. This work is published from:
|
||||||
|
* United States.
|
||||||
*
|
*
|
||||||
* Utility file; not actually a header, this contains definitions of sRGB
|
* Utility file; not actually a header, this contains definitions of sRGB
|
||||||
* calculation functions for inclusion in those test programs that need them.
|
* calculation functions for inclusion in those test programs that need them.
|
||||||
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;
|
||||||
|
}
|
||||||
@@ -13,6 +13,7 @@
|
|||||||
#include <commdlg.h>
|
#include <commdlg.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <zlib.h>
|
||||||
|
|
||||||
#include "png.h"
|
#include "png.h"
|
||||||
#include "pngfile.h"
|
#include "pngfile.h"
|
||||||
|
|||||||
@@ -27,6 +27,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
#include <zlib.h>
|
||||||
|
|
||||||
/* application includes */
|
/* application includes */
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
/*===
|
/*===
|
||||||
cexcept.h 2.0.1 (2008-Jul-19-Sat)
|
cexcept.h 2.0.1 (2008-Jul-19-Sat, modified 2015-Jun-03-Mon)
|
||||||
http://www.nicemice.net/cexcept/
|
http://www.nicemice.net/cexcept/
|
||||||
Adam M. Costello
|
Adam M. Costello
|
||||||
http://www.nicemice.net/amc/
|
http://www.nicemice.net/amc/
|
||||||
|
|
||||||
An interface for exception-handling in ANSI C (C89 and subsequent ISO
|
An interface for exception-handling in ANSI C (C89 and subsequent ISO
|
||||||
standards), developed jointly with Cosmin Truta.
|
standards), developed jointly with Cosmin Truta. Revised by John Bowler,
|
||||||
|
June 2015, to declare exception_env and exception_prev "volatile".
|
||||||
|
|
||||||
Copyright (c) 2000-2008 Adam M. Costello and Cosmin Truta.
|
Copyright (c) 2000-2008 Adam M. Costello and Cosmin Truta.
|
||||||
This software may be modified only if its author and version
|
This software may be modified only if its author and version
|
||||||
@@ -210,7 +211,7 @@ struct exception_context { \
|
|||||||
|
|
||||||
#define Try \
|
#define Try \
|
||||||
{ \
|
{ \
|
||||||
jmp_buf *exception__prev, exception__env; \
|
jmp_buf * volatile exception__prev, exception__env; \
|
||||||
exception__prev = the_exception_context->penv; \
|
exception__prev = the_exception_context->penv; \
|
||||||
the_exception_context->penv = &exception__env; \
|
the_exception_context->penv = &exception__env; \
|
||||||
if (setjmp(exception__env) == 0) { \
|
if (setjmp(exception__env) == 0) { \
|
||||||
|
|||||||
630
depcomp
@@ -1,630 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
# depcomp - compile a program generating dependencies as side-effects
|
|
||||||
|
|
||||||
scriptversion=2009-04-28.21; # UTC
|
|
||||||
|
|
||||||
# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free
|
|
||||||
# Software Foundation, Inc.
|
|
||||||
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 2, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
# As a special exception to the GNU General Public License, if you
|
|
||||||
# distribute this file as part of a program that contains a
|
|
||||||
# configuration script generated by Autoconf, you may include it under
|
|
||||||
# the same distribution terms that you use for the rest of that program.
|
|
||||||
|
|
||||||
# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
|
|
||||||
|
|
||||||
case $1 in
|
|
||||||
'')
|
|
||||||
echo "$0: No command. Try \`$0 --help' for more information." 1>&2
|
|
||||||
exit 1;
|
|
||||||
;;
|
|
||||||
-h | --h*)
|
|
||||||
cat <<\EOF
|
|
||||||
Usage: depcomp [--help] [--version] PROGRAM [ARGS]
|
|
||||||
|
|
||||||
Run PROGRAMS ARGS to compile a file, generating dependencies
|
|
||||||
as side-effects.
|
|
||||||
|
|
||||||
Environment variables:
|
|
||||||
depmode Dependency tracking mode.
|
|
||||||
source Source file read by `PROGRAMS ARGS'.
|
|
||||||
object Object file output by `PROGRAMS ARGS'.
|
|
||||||
DEPDIR directory where to store dependencies.
|
|
||||||
depfile Dependency file to output.
|
|
||||||
tmpdepfile Temporary file to use when outputing dependencies.
|
|
||||||
libtool Whether libtool is used (yes/no).
|
|
||||||
|
|
||||||
Report bugs to <bug-automake@gnu.org>.
|
|
||||||
EOF
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
-v | --v*)
|
|
||||||
echo "depcomp $scriptversion"
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if test -z "$depmode" || test -z "$source" || test -z "$object"; then
|
|
||||||
echo "depcomp: Variables source, object and depmode must be set" 1>&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
|
|
||||||
depfile=${depfile-`echo "$object" |
|
|
||||||
sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
|
|
||||||
tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
|
|
||||||
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
|
|
||||||
# Some modes work just like other modes, but use different flags. We
|
|
||||||
# parameterize here, but still list the modes in the big case below,
|
|
||||||
# to make depend.m4 easier to write. Note that we *cannot* use a case
|
|
||||||
# here, because this file can only contain one case statement.
|
|
||||||
if test "$depmode" = hp; then
|
|
||||||
# HP compiler uses -M and no extra arg.
|
|
||||||
gccflag=-M
|
|
||||||
depmode=gcc
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$depmode" = dashXmstdout; then
|
|
||||||
# This is just like dashmstdout with a different argument.
|
|
||||||
dashmflag=-xM
|
|
||||||
depmode=dashmstdout
|
|
||||||
fi
|
|
||||||
|
|
||||||
cygpath_u="cygpath -u -f -"
|
|
||||||
if test "$depmode" = msvcmsys; then
|
|
||||||
# This is just like msvisualcpp but w/o cygpath translation.
|
|
||||||
# Just convert the backslash-escaped backslashes to single forward
|
|
||||||
# slashes to satisfy depend.m4
|
|
||||||
cygpath_u="sed s,\\\\\\\\,/,g"
|
|
||||||
depmode=msvisualcpp
|
|
||||||
fi
|
|
||||||
|
|
||||||
case "$depmode" in
|
|
||||||
gcc3)
|
|
||||||
## gcc 3 implements dependency tracking that does exactly what
|
|
||||||
## we want. Yay! Note: for some reason libtool 1.4 doesn't like
|
|
||||||
## it if -MD -MP comes after the -MF stuff. Hmm.
|
|
||||||
## Unfortunately, FreeBSD c89 acceptance of flags depends upon
|
|
||||||
## the command line argument order; so add the flags where they
|
|
||||||
## appear in depend2.am. Note that the slowdown incurred here
|
|
||||||
## affects only configure: in makefiles, %FASTDEP% shortcuts this.
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case $arg in
|
|
||||||
-c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
|
|
||||||
*) set fnord "$@" "$arg" ;;
|
|
||||||
esac
|
|
||||||
shift # fnord
|
|
||||||
shift # $arg
|
|
||||||
done
|
|
||||||
"$@"
|
|
||||||
stat=$?
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
mv "$tmpdepfile" "$depfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
gcc)
|
|
||||||
## There are various ways to get dependency output from gcc. Here's
|
|
||||||
## why we pick this rather obscure method:
|
|
||||||
## - Don't want to use -MD because we'd like the dependencies to end
|
|
||||||
## up in a subdir. Having to rename by hand is ugly.
|
|
||||||
## (We might end up doing this anyway to support other compilers.)
|
|
||||||
## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
|
|
||||||
## -MM, not -M (despite what the docs say).
|
|
||||||
## - Using -M directly means running the compiler twice (even worse
|
|
||||||
## than renaming).
|
|
||||||
if test -z "$gccflag"; then
|
|
||||||
gccflag=-MD,
|
|
||||||
fi
|
|
||||||
"$@" -Wp,"$gccflag$tmpdepfile"
|
|
||||||
stat=$?
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
rm -f "$depfile"
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
|
|
||||||
## The second -e expression handles DOS-style file names with drive letters.
|
|
||||||
sed -e 's/^[^:]*: / /' \
|
|
||||||
-e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
|
|
||||||
## This next piece of magic avoids the `deleted header file' problem.
|
|
||||||
## The problem is that when a header file which appears in a .P file
|
|
||||||
## is deleted, the dependency causes make to die (because there is
|
|
||||||
## typically no way to rebuild the header). We avoid this by adding
|
|
||||||
## dummy dependencies for each header file. Too bad gcc doesn't do
|
|
||||||
## this for us directly.
|
|
||||||
tr ' ' '
|
|
||||||
' < "$tmpdepfile" |
|
|
||||||
## Some versions of gcc put a space before the `:'. On the theory
|
|
||||||
## that the space means something, we add a space to the output as
|
|
||||||
## well.
|
|
||||||
## Some versions of the HPUX 10.20 sed can't process this invocation
|
|
||||||
## correctly. Breaking it into two sed invocations is a workaround.
|
|
||||||
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
hp)
|
|
||||||
# This case exists only to let depend.m4 do its work. It works by
|
|
||||||
# looking at the text of this script. This case will never be run,
|
|
||||||
# since it is checked for above.
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
sgi)
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
"$@" "-Wp,-MDupdate,$tmpdepfile"
|
|
||||||
else
|
|
||||||
"$@" -MDupdate "$tmpdepfile"
|
|
||||||
fi
|
|
||||||
stat=$?
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
rm -f "$depfile"
|
|
||||||
|
|
||||||
if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
|
|
||||||
# Clip off the initial element (the dependent). Don't try to be
|
|
||||||
# clever and replace this with sed code, as IRIX sed won't handle
|
|
||||||
# lines with more than a fixed number of characters (4096 in
|
|
||||||
# IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
|
|
||||||
# the IRIX cc adds comments like `#:fec' to the end of the
|
|
||||||
# dependency line.
|
|
||||||
tr ' ' '
|
|
||||||
' < "$tmpdepfile" \
|
|
||||||
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
|
|
||||||
tr '
|
|
||||||
' ' ' >> "$depfile"
|
|
||||||
echo >> "$depfile"
|
|
||||||
|
|
||||||
# The second pass generates a dummy entry for each header file.
|
|
||||||
tr ' ' '
|
|
||||||
' < "$tmpdepfile" \
|
|
||||||
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
|
|
||||||
>> "$depfile"
|
|
||||||
else
|
|
||||||
# The sourcefile does not contain any dependencies, so just
|
|
||||||
# store a dummy comment line, to avoid errors with the Makefile
|
|
||||||
# "include basename.Plo" scheme.
|
|
||||||
echo "#dummy" > "$depfile"
|
|
||||||
fi
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
aix)
|
|
||||||
# The C for AIX Compiler uses -M and outputs the dependencies
|
|
||||||
# in a .u file. In older versions, this file always lives in the
|
|
||||||
# current directory. Also, the AIX compiler puts `$object:' at the
|
|
||||||
# start of each line; $object doesn't have directory information.
|
|
||||||
# Version 6 uses the directory in both cases.
|
|
||||||
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
|
||||||
test "x$dir" = "x$object" && dir=
|
|
||||||
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
tmpdepfile1=$dir$base.u
|
|
||||||
tmpdepfile2=$base.u
|
|
||||||
tmpdepfile3=$dir.libs/$base.u
|
|
||||||
"$@" -Wc,-M
|
|
||||||
else
|
|
||||||
tmpdepfile1=$dir$base.u
|
|
||||||
tmpdepfile2=$dir$base.u
|
|
||||||
tmpdepfile3=$dir$base.u
|
|
||||||
"$@" -M
|
|
||||||
fi
|
|
||||||
stat=$?
|
|
||||||
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
|
|
||||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
|
||||||
do
|
|
||||||
test -f "$tmpdepfile" && break
|
|
||||||
done
|
|
||||||
if test -f "$tmpdepfile"; then
|
|
||||||
# Each line is of the form `foo.o: dependent.h'.
|
|
||||||
# Do two passes, one to just change these to
|
|
||||||
# `$object: dependent.h' and one to simply `dependent.h:'.
|
|
||||||
sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
|
|
||||||
# That's a tab and a space in the [].
|
|
||||||
sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
|
|
||||||
else
|
|
||||||
# The sourcefile does not contain any dependencies, so just
|
|
||||||
# store a dummy comment line, to avoid errors with the Makefile
|
|
||||||
# "include basename.Plo" scheme.
|
|
||||||
echo "#dummy" > "$depfile"
|
|
||||||
fi
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
icc)
|
|
||||||
# Intel's C compiler understands `-MD -MF file'. However on
|
|
||||||
# icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
|
|
||||||
# ICC 7.0 will fill foo.d with something like
|
|
||||||
# foo.o: sub/foo.c
|
|
||||||
# foo.o: sub/foo.h
|
|
||||||
# which is wrong. We want:
|
|
||||||
# sub/foo.o: sub/foo.c
|
|
||||||
# sub/foo.o: sub/foo.h
|
|
||||||
# sub/foo.c:
|
|
||||||
# sub/foo.h:
|
|
||||||
# ICC 7.1 will output
|
|
||||||
# foo.o: sub/foo.c sub/foo.h
|
|
||||||
# and will wrap long lines using \ :
|
|
||||||
# foo.o: sub/foo.c ... \
|
|
||||||
# sub/foo.h ... \
|
|
||||||
# ...
|
|
||||||
|
|
||||||
"$@" -MD -MF "$tmpdepfile"
|
|
||||||
stat=$?
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
rm -f "$depfile"
|
|
||||||
# Each line is of the form `foo.o: dependent.h',
|
|
||||||
# or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
|
|
||||||
# Do two passes, one to just change these to
|
|
||||||
# `$object: dependent.h' and one to simply `dependent.h:'.
|
|
||||||
sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
|
|
||||||
# Some versions of the HPUX 10.20 sed can't process this invocation
|
|
||||||
# correctly. Breaking it into two sed invocations is a workaround.
|
|
||||||
sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
|
|
||||||
sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
hp2)
|
|
||||||
# The "hp" stanza above does not work with aCC (C++) and HP's ia64
|
|
||||||
# compilers, which have integrated preprocessors. The correct option
|
|
||||||
# to use with these is +Maked; it writes dependencies to a file named
|
|
||||||
# 'foo.d', which lands next to the object file, wherever that
|
|
||||||
# happens to be.
|
|
||||||
# Much of this is similar to the tru64 case; see comments there.
|
|
||||||
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
|
||||||
test "x$dir" = "x$object" && dir=
|
|
||||||
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
tmpdepfile1=$dir$base.d
|
|
||||||
tmpdepfile2=$dir.libs/$base.d
|
|
||||||
"$@" -Wc,+Maked
|
|
||||||
else
|
|
||||||
tmpdepfile1=$dir$base.d
|
|
||||||
tmpdepfile2=$dir$base.d
|
|
||||||
"$@" +Maked
|
|
||||||
fi
|
|
||||||
stat=$?
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile1" "$tmpdepfile2"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
|
|
||||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
|
|
||||||
do
|
|
||||||
test -f "$tmpdepfile" && break
|
|
||||||
done
|
|
||||||
if test -f "$tmpdepfile"; then
|
|
||||||
sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
|
|
||||||
# Add `dependent.h:' lines.
|
|
||||||
sed -ne '2,${
|
|
||||||
s/^ *//
|
|
||||||
s/ \\*$//
|
|
||||||
s/$/:/
|
|
||||||
p
|
|
||||||
}' "$tmpdepfile" >> "$depfile"
|
|
||||||
else
|
|
||||||
echo "#dummy" > "$depfile"
|
|
||||||
fi
|
|
||||||
rm -f "$tmpdepfile" "$tmpdepfile2"
|
|
||||||
;;
|
|
||||||
|
|
||||||
tru64)
|
|
||||||
# The Tru64 compiler uses -MD to generate dependencies as a side
|
|
||||||
# effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
|
|
||||||
# At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
|
|
||||||
# dependencies in `foo.d' instead, so we check for that too.
|
|
||||||
# Subdirectories are respected.
|
|
||||||
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
|
||||||
test "x$dir" = "x$object" && dir=
|
|
||||||
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
|
||||||
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
# With Tru64 cc, shared objects can also be used to make a
|
|
||||||
# static library. This mechanism is used in libtool 1.4 series to
|
|
||||||
# handle both shared and static libraries in a single compilation.
|
|
||||||
# With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
|
|
||||||
#
|
|
||||||
# With libtool 1.5 this exception was removed, and libtool now
|
|
||||||
# generates 2 separate objects for the 2 libraries. These two
|
|
||||||
# compilations output dependencies in $dir.libs/$base.o.d and
|
|
||||||
# in $dir$base.o.d. We have to check for both files, because
|
|
||||||
# one of the two compilations can be disabled. We should prefer
|
|
||||||
# $dir$base.o.d over $dir.libs/$base.o.d because the latter is
|
|
||||||
# automatically cleaned when .libs/ is deleted, while ignoring
|
|
||||||
# the former would cause a distcleancheck panic.
|
|
||||||
tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4
|
|
||||||
tmpdepfile2=$dir$base.o.d # libtool 1.5
|
|
||||||
tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5
|
|
||||||
tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504
|
|
||||||
"$@" -Wc,-MD
|
|
||||||
else
|
|
||||||
tmpdepfile1=$dir$base.o.d
|
|
||||||
tmpdepfile2=$dir$base.d
|
|
||||||
tmpdepfile3=$dir$base.d
|
|
||||||
tmpdepfile4=$dir$base.d
|
|
||||||
"$@" -MD
|
|
||||||
fi
|
|
||||||
|
|
||||||
stat=$?
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
|
|
||||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
|
|
||||||
do
|
|
||||||
test -f "$tmpdepfile" && break
|
|
||||||
done
|
|
||||||
if test -f "$tmpdepfile"; then
|
|
||||||
sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
|
|
||||||
# That's a tab and a space in the [].
|
|
||||||
sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
|
|
||||||
else
|
|
||||||
echo "#dummy" > "$depfile"
|
|
||||||
fi
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
#nosideeffect)
|
|
||||||
# This comment above is used by automake to tell side-effect
|
|
||||||
# dependency tracking mechanisms from slower ones.
|
|
||||||
|
|
||||||
dashmstdout)
|
|
||||||
# Important note: in order to support this mode, a compiler *must*
|
|
||||||
# always write the preprocessed file to stdout, regardless of -o.
|
|
||||||
"$@" || exit $?
|
|
||||||
|
|
||||||
# Remove the call to Libtool.
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
while test "X$1" != 'X--mode=compile'; do
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Remove `-o $object'.
|
|
||||||
IFS=" "
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case $arg in
|
|
||||||
-o)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
$object)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set fnord "$@" "$arg"
|
|
||||||
shift # fnord
|
|
||||||
shift # $arg
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
test -z "$dashmflag" && dashmflag=-M
|
|
||||||
# Require at least two characters before searching for `:'
|
|
||||||
# in the target name. This is to cope with DOS-style filenames:
|
|
||||||
# a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
|
|
||||||
"$@" $dashmflag |
|
|
||||||
sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
|
|
||||||
rm -f "$depfile"
|
|
||||||
cat < "$tmpdepfile" > "$depfile"
|
|
||||||
tr ' ' '
|
|
||||||
' < "$tmpdepfile" | \
|
|
||||||
## Some versions of the HPUX 10.20 sed can't process this invocation
|
|
||||||
## correctly. Breaking it into two sed invocations is a workaround.
|
|
||||||
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
dashXmstdout)
|
|
||||||
# This case only exists to satisfy depend.m4. It is never actually
|
|
||||||
# run, as this mode is specially recognized in the preamble.
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
makedepend)
|
|
||||||
"$@" || exit $?
|
|
||||||
# Remove any Libtool call
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
while test "X$1" != 'X--mode=compile'; do
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
# X makedepend
|
|
||||||
shift
|
|
||||||
cleared=no eat=no
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case $cleared in
|
|
||||||
no)
|
|
||||||
set ""; shift
|
|
||||||
cleared=yes ;;
|
|
||||||
esac
|
|
||||||
if test $eat = yes; then
|
|
||||||
eat=no
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
case "$arg" in
|
|
||||||
-D*|-I*)
|
|
||||||
set fnord "$@" "$arg"; shift ;;
|
|
||||||
# Strip any option that makedepend may not understand. Remove
|
|
||||||
# the object too, otherwise makedepend will parse it as a source file.
|
|
||||||
-arch)
|
|
||||||
eat=yes ;;
|
|
||||||
-*|$object)
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set fnord "$@" "$arg"; shift ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
obj_suffix=`echo "$object" | sed 's/^.*\././'`
|
|
||||||
touch "$tmpdepfile"
|
|
||||||
${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
|
|
||||||
rm -f "$depfile"
|
|
||||||
cat < "$tmpdepfile" > "$depfile"
|
|
||||||
sed '1,2d' "$tmpdepfile" | tr ' ' '
|
|
||||||
' | \
|
|
||||||
## Some versions of the HPUX 10.20 sed can't process this invocation
|
|
||||||
## correctly. Breaking it into two sed invocations is a workaround.
|
|
||||||
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile" "$tmpdepfile".bak
|
|
||||||
;;
|
|
||||||
|
|
||||||
cpp)
|
|
||||||
# Important note: in order to support this mode, a compiler *must*
|
|
||||||
# always write the preprocessed file to stdout.
|
|
||||||
"$@" || exit $?
|
|
||||||
|
|
||||||
# Remove the call to Libtool.
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
while test "X$1" != 'X--mode=compile'; do
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Remove `-o $object'.
|
|
||||||
IFS=" "
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case $arg in
|
|
||||||
-o)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
$object)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set fnord "$@" "$arg"
|
|
||||||
shift # fnord
|
|
||||||
shift # $arg
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
"$@" -E |
|
|
||||||
sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
|
|
||||||
-e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
|
|
||||||
sed '$ s: \\$::' > "$tmpdepfile"
|
|
||||||
rm -f "$depfile"
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
cat < "$tmpdepfile" >> "$depfile"
|
|
||||||
sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
msvisualcpp)
|
|
||||||
# Important note: in order to support this mode, a compiler *must*
|
|
||||||
# always write the preprocessed file to stdout.
|
|
||||||
"$@" || exit $?
|
|
||||||
|
|
||||||
# Remove the call to Libtool.
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
while test "X$1" != 'X--mode=compile'; do
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
|
|
||||||
IFS=" "
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case "$arg" in
|
|
||||||
-o)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
$object)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
"-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
|
|
||||||
set fnord "$@"
|
|
||||||
shift
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set fnord "$@" "$arg"
|
|
||||||
shift
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
"$@" -E 2>/dev/null |
|
|
||||||
sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
|
|
||||||
rm -f "$depfile"
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
|
|
||||||
echo " " >> "$depfile"
|
|
||||||
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
msvcmsys)
|
|
||||||
# This case exists only to let depend.m4 do its work. It works by
|
|
||||||
# looking at the text of this script. This case will never be run,
|
|
||||||
# since it is checked for above.
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
none)
|
|
||||||
exec "$@"
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
echo "Unknown depmode $depmode" 1>&2
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
|
|
||||||
# Local Variables:
|
|
||||||
# mode: shell-script
|
|
||||||
# sh-indentation: 2
|
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-time-zone: "UTC"
|
|
||||||
# time-stamp-end: "; # UTC"
|
|
||||||
# End:
|
|
||||||
294
example.c
@@ -2,11 +2,13 @@
|
|||||||
#if 0 /* in case someone actually tries to compile this */
|
#if 0 /* in case someone actually tries to compile this */
|
||||||
|
|
||||||
/* example.c - an example of using libpng
|
/* example.c - an example of using libpng
|
||||||
* Last changed in libpng 1.5.6 [November 3, 2011]
|
* Last changed in libpng 1.7.0 [(PENDING RELEASE)]
|
||||||
* This file has been placed in the public domain by the authors.
|
* Maintained 1998-2015 Glenn Randers-Pehrson
|
||||||
* Maintained 1998-2011 Glenn Randers-Pehrson
|
|
||||||
* Maintained 1996, 1997 Andreas Dilger)
|
* Maintained 1996, 1997 Andreas Dilger)
|
||||||
* Written 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* Written 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
|
* To the extent possible under law, the authors have waived
|
||||||
|
* all copyright and related or neighboring rights to this file.
|
||||||
|
* This work is published from: United States.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* This is an example of how to use libpng to read and write PNG files.
|
/* This is an example of how to use libpng to read and write PNG files.
|
||||||
@@ -22,11 +24,192 @@
|
|||||||
* see also the programs in the contrib directory.
|
* see also the programs in the contrib directory.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define _POSIX_SOURCE 1 /* libpng and zlib are POSIX-compliant. You may
|
/* The simple, but restricted, approach to reading a PNG file or data stream
|
||||||
* change this if your application uses non-POSIX
|
* just requires two function calls, as in the following complete program.
|
||||||
* extensions. */
|
* Writing a file just needs one function call, so long as the data has an
|
||||||
|
* appropriate layout.
|
||||||
|
*
|
||||||
|
* The following code reads PNG image data from a file and writes it, in a
|
||||||
|
* potentially new format, to a new file. While this code will compile there is
|
||||||
|
* minimal (insufficient) error checking; for a more realistic version look at
|
||||||
|
* contrib/examples/pngtopng.c
|
||||||
|
*/
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <png.h>
|
||||||
|
#include PNG_ZLIB_HEADER /* this is the header libpng was built with */
|
||||||
|
|
||||||
#include "png.h"
|
int main(int argc, const char **argv)
|
||||||
|
{
|
||||||
|
if (argc == 3)
|
||||||
|
{
|
||||||
|
png_image image; /* The control structure used by libpng */
|
||||||
|
|
||||||
|
/* Initialize the 'png_image' structure. */
|
||||||
|
memset(&image, 0, (sizeof image));
|
||||||
|
image.version = PNG_IMAGE_VERSION;
|
||||||
|
|
||||||
|
/* The first argument is the file to read: */
|
||||||
|
if (png_image_begin_read_from_file(&image, argv[1]) != 0)
|
||||||
|
{
|
||||||
|
png_bytep buffer;
|
||||||
|
|
||||||
|
/* Set the format in which to read the PNG file; this code chooses a
|
||||||
|
* simple sRGB format with a non-associated alpha channel, adequate to
|
||||||
|
* store most images.
|
||||||
|
*/
|
||||||
|
image.format = PNG_FORMAT_RGBA;
|
||||||
|
|
||||||
|
/* Now allocate enough memory to hold the image in this format; the
|
||||||
|
* PNG_IMAGE_SIZE macro uses the information about the image (width,
|
||||||
|
* height and format) stored in 'image'.
|
||||||
|
*/
|
||||||
|
buffer = malloc(PNG_IMAGE_SIZE(image));
|
||||||
|
|
||||||
|
/* If enough memory was available read the image in the desired format
|
||||||
|
* then write the result out to the new file. 'background' is not
|
||||||
|
* necessary when reading the image because the alpha channel is
|
||||||
|
* preserved; if it were to be removed, for example if we requested
|
||||||
|
* PNG_FORMAT_RGB, then either a solid background color would have to
|
||||||
|
* be supplied or the output buffer would have to be initialized to the
|
||||||
|
* actual background of the image.
|
||||||
|
*
|
||||||
|
* The fourth argument to png_image_finish_read is the 'row_stride' -
|
||||||
|
* this is the number of components allocated for the image in each
|
||||||
|
* row. It has to be at least as big as the value returned by
|
||||||
|
* PNG_IMAGE_ROW_STRIDE, but if you just allocate space for the
|
||||||
|
* default, minimum, size using PNG_IMAGE_SIZE as above you can pass
|
||||||
|
* zero.
|
||||||
|
*
|
||||||
|
* The final argument is a pointer to a buffer for the colormap;
|
||||||
|
* colormaps have exactly the same format as a row of image pixels (so
|
||||||
|
* you choose what format to make the colormap by setting
|
||||||
|
* image.format). A colormap is only returned if
|
||||||
|
* PNG_FORMAT_FLAG_COLORMAP is also set in image.format, so in this
|
||||||
|
* case NULL is passed as the final argument. If you do want to force
|
||||||
|
* all images into an index/color-mapped format then you can use:
|
||||||
|
*
|
||||||
|
* PNG_IMAGE_COLORMAP_SIZE(image)
|
||||||
|
*
|
||||||
|
* to find the maximum size of the colormap in bytes.
|
||||||
|
*/
|
||||||
|
if (buffer != NULL &&
|
||||||
|
png_image_finish_read(&image, NULL/*background*/, buffer,
|
||||||
|
0/*row_stride*/, NULL/*colormap*/) != 0)
|
||||||
|
{
|
||||||
|
/* Now write the image out to the second argument. In the write
|
||||||
|
* call 'convert_to_8bit' allows 16-bit data to be squashed down to
|
||||||
|
* 8 bits; this isn't necessary here because the original read was
|
||||||
|
* to the 8-bit format.
|
||||||
|
*/
|
||||||
|
if (png_image_write_to_file(&image, argv[2], 0/*convert_to_8bit*/,
|
||||||
|
buffer, 0/*row_stride*/, NULL/*colormap*/) != 0)
|
||||||
|
{
|
||||||
|
/* The image has been written successfully. */
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Calling png_free_image is optional unless the simplified API was
|
||||||
|
* not run to completion. In this case if there wasn't enough
|
||||||
|
* memory for 'buffer' we didn't complete the read, so we must free
|
||||||
|
* the image:
|
||||||
|
*/
|
||||||
|
if (buffer == NULL)
|
||||||
|
png_free_image(&image);
|
||||||
|
|
||||||
|
else
|
||||||
|
free(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Something went wrong reading or writing the image. libpng stores a
|
||||||
|
* textual message in the 'png_image' structure:
|
||||||
|
*/
|
||||||
|
fprintf(stderr, "pngtopng: error: %s\n", image.message);
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stderr, "pngtopng: usage: pngtopng input-file output-file\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* That's it ;-) Of course you probably want to do more with PNG files than
|
||||||
|
* just converting them all to 32-bit RGBA PNG files; you can do that between
|
||||||
|
* the call to png_image_finish_read and png_image_write_to_file. You can also
|
||||||
|
* ask for the image data to be presented in a number of different formats. You
|
||||||
|
* do this by simply changing the 'format' parameter set before allocating the
|
||||||
|
* buffer.
|
||||||
|
*
|
||||||
|
* The format parameter consists of five flags that define various aspects of
|
||||||
|
* the image, you can simply add these together to get the format or you can use
|
||||||
|
* one of the predefined macros from png.h (as above):
|
||||||
|
*
|
||||||
|
* PNG_FORMAT_FLAG_COLOR: if set the image will have three color components per
|
||||||
|
* pixel (red, green and blue), if not set the image will just have one
|
||||||
|
* luminance (grayscale) component.
|
||||||
|
*
|
||||||
|
* PNG_FORMAT_FLAG_ALPHA: if set each pixel in the image will have an additional
|
||||||
|
* alpha value; a linear value that describes the degree the image pixel
|
||||||
|
* covers (overwrites) the contents of the existing pixel on the display.
|
||||||
|
*
|
||||||
|
* PNG_FORMAT_FLAG_LINEAR: if set the components of each pixel will be returned
|
||||||
|
* as a series of 16-bit linear values, if not set the components will be
|
||||||
|
* returned as a series of 8-bit values encoded according to the 'sRGB'
|
||||||
|
* standard. The 8-bit format is the normal format for images intended for
|
||||||
|
* direct display, because almost all display devices do the inverse of the
|
||||||
|
* sRGB transformation to the data they receive. The 16-bit format is more
|
||||||
|
* common for scientific data and image data that must be further processed;
|
||||||
|
* because it is linear simple math can be done on the component values.
|
||||||
|
* Regardless of the setting of this flag the alpha channel is always linear,
|
||||||
|
* although it will be 8 bits or 16 bits wide as specified by the flag.
|
||||||
|
*
|
||||||
|
* PNG_FORMAT_FLAG_BGR: if set the components of a color pixel will be returned
|
||||||
|
* in the order blue, then green, then red. If not set the pixel components
|
||||||
|
* are in the order red, then green, then blue.
|
||||||
|
*
|
||||||
|
* PNG_FORMAT_FLAG_AFIRST: if set the alpha channel (if present) precedes the
|
||||||
|
* color or grayscale components. If not set the alpha channel follows the
|
||||||
|
* components.
|
||||||
|
*
|
||||||
|
* You do not have to read directly from a file. You can read from memory or,
|
||||||
|
* on systems that support it, from a <stdio.h> FILE*. This is controlled by
|
||||||
|
* the particular png_image_read_from_ function you call at the start. Likewise
|
||||||
|
* on write you can write to a FILE* if your system supports it. Check the
|
||||||
|
* macro PNG_STDIO_SUPPORTED to see if stdio support has been included in your
|
||||||
|
* libpng build.
|
||||||
|
*
|
||||||
|
* If you read 16-bit (PNG_FORMAT_FLAG_LINEAR) data you may need to write it in
|
||||||
|
* the 8-bit format for display. You do this by setting the convert_to_8bit
|
||||||
|
* flag to 'true'.
|
||||||
|
*
|
||||||
|
* Don't repeatedly convert between the 8-bit and 16-bit forms. There is
|
||||||
|
* significant data loss when 16-bit data is converted to the 8-bit encoding and
|
||||||
|
* the current libpng implementation of conversion to 16-bit is also
|
||||||
|
* significantly lossy. The latter will be fixed in the future, but the former
|
||||||
|
* is unavoidable - the 8-bit format just doesn't have enough resolution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* If your program needs more information from the PNG data it reads, or if you
|
||||||
|
* need to do more complex transformations, or minimize transformations, on the
|
||||||
|
* data you read, then you must use one of the several lower level libpng
|
||||||
|
* interfaces.
|
||||||
|
*
|
||||||
|
* All these interfaces require that you do your own error handling - your
|
||||||
|
* program must be able to arrange for control to return to your own code any
|
||||||
|
* time libpng encounters a problem. There are several ways to do this, but the
|
||||||
|
* standard way is to use the ANSI-C (C90) <setjmp.h> interface to establish a
|
||||||
|
* return point within your own code. You must do this if you do not use the
|
||||||
|
* simplified interface (above).
|
||||||
|
*
|
||||||
|
* The first step is to include the header files you need, including the libpng
|
||||||
|
* header file. Include any standard headers and feature test macros your
|
||||||
|
* program requires before including png.h:
|
||||||
|
*/
|
||||||
|
#include <png.h>
|
||||||
|
|
||||||
/* The png_jmpbuf() macro, used in error handling, became available in
|
/* The png_jmpbuf() macro, used in error handling, became available in
|
||||||
* libpng version 1.0.6. If you want to be able to run your code with older
|
* libpng version 1.0.6. If you want to be able to run your code with older
|
||||||
@@ -222,7 +405,7 @@ void read_png(FILE *fp, unsigned int sig_read) /* File is already open */
|
|||||||
/* Expand paletted or RGB images with transparency to full alpha channels
|
/* Expand paletted or RGB images with transparency to full alpha channels
|
||||||
* so the data will be available as RGBA quartets.
|
* so the data will be available as RGBA quartets.
|
||||||
*/
|
*/
|
||||||
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))
|
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS) != 0)
|
||||||
png_set_tRNS_to_alpha(png_ptr);
|
png_set_tRNS_to_alpha(png_ptr);
|
||||||
|
|
||||||
/* Set the background color to draw transparent and alpha images over.
|
/* Set the background color to draw transparent and alpha images over.
|
||||||
@@ -234,7 +417,7 @@ void read_png(FILE *fp, unsigned int sig_read) /* File is already open */
|
|||||||
|
|
||||||
png_color_16 my_background, *image_background;
|
png_color_16 my_background, *image_background;
|
||||||
|
|
||||||
if (png_get_bKGD(png_ptr, info_ptr, &image_background))
|
if (png_get_bKGD(png_ptr, info_ptr, &image_background) != 0)
|
||||||
png_set_background(png_ptr, image_background,
|
png_set_background(png_ptr, image_background,
|
||||||
PNG_BACKGROUND_GAMMA_FILE, 1, 1.0);
|
PNG_BACKGROUND_GAMMA_FILE, 1, 1.0);
|
||||||
else
|
else
|
||||||
@@ -258,9 +441,9 @@ void read_png(FILE *fp, unsigned int sig_read) /* File is already open */
|
|||||||
/* If we don't have another value */
|
/* If we don't have another value */
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
screen_gamma = 2.2; /* A good guess for a PC monitor in a dimly
|
screen_gamma = PNG_DEFAULT_sRGB; /* A good guess for a PC monitor
|
||||||
lit room */
|
in a dimly lit room */
|
||||||
screen_gamma = 1.7 or 1.0; /* A good guess for Mac systems */
|
screen_gamma = PNG_GAMMA_MAC_18 or 1.0; /* Good guesses for Mac systems */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Tell libpng to handle the gamma conversion for you. The final call
|
/* Tell libpng to handle the gamma conversion for you. The final call
|
||||||
@@ -271,12 +454,12 @@ void read_png(FILE *fp, unsigned int sig_read) /* File is already open */
|
|||||||
|
|
||||||
int intent;
|
int intent;
|
||||||
|
|
||||||
if (png_get_sRGB(png_ptr, info_ptr, &intent))
|
if (png_get_sRGB(png_ptr, info_ptr, &intent) != 0)
|
||||||
png_set_gamma(png_ptr, screen_gamma, 0.45455);
|
png_set_gamma(png_ptr, screen_gamma, PNG_DEFAULT_sRGB);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
double image_gamma;
|
double image_gamma;
|
||||||
if (png_get_gAMA(png_ptr, info_ptr, &image_gamma))
|
if (png_get_gAMA(png_ptr, info_ptr, &image_gamma) != 0)
|
||||||
png_set_gamma(png_ptr, screen_gamma, image_gamma);
|
png_set_gamma(png_ptr, screen_gamma, image_gamma);
|
||||||
else
|
else
|
||||||
png_set_gamma(png_ptr, screen_gamma, 0.45455);
|
png_set_gamma(png_ptr, screen_gamma, 0.45455);
|
||||||
@@ -286,7 +469,7 @@ void read_png(FILE *fp, unsigned int sig_read) /* File is already open */
|
|||||||
/* Quantize RGB files down to 8 bit palette or reduce palettes
|
/* Quantize RGB files down to 8 bit palette or reduce palettes
|
||||||
* to the number of colors available on your screen.
|
* to the number of colors available on your screen.
|
||||||
*/
|
*/
|
||||||
if (color_type & PNG_COLOR_MASK_COLOR)
|
if ((color_type & PNG_COLOR_MASK_COLOR) != 0)
|
||||||
{
|
{
|
||||||
int num_palette;
|
int num_palette;
|
||||||
png_colorp palette;
|
png_colorp palette;
|
||||||
@@ -301,7 +484,7 @@ void read_png(FILE *fp, unsigned int sig_read) /* File is already open */
|
|||||||
MAX_SCREEN_COLORS, NULL, 0);
|
MAX_SCREEN_COLORS, NULL, 0);
|
||||||
}
|
}
|
||||||
/* This reduces the image to the palette supplied in the file */
|
/* This reduces the image to the palette supplied in the file */
|
||||||
else if (png_get_PLTE(png_ptr, info_ptr, &palette, &num_palette))
|
else if (png_get_PLTE(png_ptr, info_ptr, &palette, &num_palette) != 0)
|
||||||
{
|
{
|
||||||
png_uint_16p histogram = NULL;
|
png_uint_16p histogram = NULL;
|
||||||
|
|
||||||
@@ -311,7 +494,7 @@ void read_png(FILE *fp, unsigned int sig_read) /* File is already open */
|
|||||||
max_screen_colors, histogram, 0);
|
max_screen_colors, histogram, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* PNG_READ_QUANTIZE_SUPPORTED */
|
#endif /* READ_QUANTIZE */
|
||||||
|
|
||||||
/* Invert monochrome files to have 0 as white and 1 as black */
|
/* Invert monochrome files to have 0 as white and 1 as black */
|
||||||
png_set_invert_mono(png_ptr);
|
png_set_invert_mono(png_ptr);
|
||||||
@@ -320,7 +503,7 @@ void read_png(FILE *fp, unsigned int sig_read) /* File is already open */
|
|||||||
* [0,65535] to the original [0,7] or [0,31], or whatever range the
|
* [0,65535] to the original [0,7] or [0,31], or whatever range the
|
||||||
* colors were originally in:
|
* colors were originally in:
|
||||||
*/
|
*/
|
||||||
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_sBIT))
|
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_sBIT) != 0)
|
||||||
{
|
{
|
||||||
png_color_8p sig_bit_p;
|
png_color_8p sig_bit_p;
|
||||||
|
|
||||||
@@ -329,7 +512,7 @@ void read_png(FILE *fp, unsigned int sig_read) /* File is already open */
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Flip the RGB pixels to BGR (or RGBA to BGRA) */
|
/* Flip the RGB pixels to BGR (or RGBA to BGRA) */
|
||||||
if (color_type & PNG_COLOR_MASK_COLOR)
|
if ((color_type & PNG_COLOR_MASK_COLOR) != 0)
|
||||||
png_set_bgr(png_ptr);
|
png_set_bgr(png_ptr);
|
||||||
|
|
||||||
/* Swap the RGBA or GA data to ARGB or AG (or BGRA to ABGR) */
|
/* Swap the RGBA or GA data to ARGB or AG (or BGRA to ABGR) */
|
||||||
@@ -349,7 +532,7 @@ void read_png(FILE *fp, unsigned int sig_read) /* File is already open */
|
|||||||
number_passes = png_set_interlace_handling(png_ptr);
|
number_passes = png_set_interlace_handling(png_ptr);
|
||||||
#else
|
#else
|
||||||
number_passes = 1;
|
number_passes = 1;
|
||||||
#endif /* PNG_READ_INTERLACING_SUPPORTED */
|
#endif /* READ_INTERLACING */
|
||||||
|
|
||||||
|
|
||||||
/* Optional call to gamma correct and add the background to the palette
|
/* Optional call to gamma correct and add the background to the palette
|
||||||
@@ -548,7 +731,7 @@ row_callback(png_structp png_ptr, png_bytep new_row,
|
|||||||
* png_progressive_combine_row() passing in the new row and the
|
* png_progressive_combine_row() passing in the new row and the
|
||||||
* old row, as demonstrated above. You can call this function for
|
* old row, as demonstrated above. You can call this function for
|
||||||
* NULL rows (it will just return) and for non-interlaced images
|
* NULL rows (it will just return) and for non-interlaced images
|
||||||
* (it just does the png_memcpy for you) if it will make the code
|
* (it just does the memcpy for you) if it will make the code
|
||||||
* easier. Thus, you can just do this for all cases:
|
* easier. Thus, you can just do this for all cases:
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -561,7 +744,7 @@ row_callback(png_structp png_ptr, png_bytep new_row,
|
|||||||
* to pass the current row as new_row, and the function will combine
|
* to pass the current row as new_row, and the function will combine
|
||||||
* the old row and the new row.
|
* the old row and the new row.
|
||||||
*/
|
*/
|
||||||
#endif /* PNG_READ_INTERLACING_SUPPORTED */
|
#endif /* READ_INTERLACING */
|
||||||
}
|
}
|
||||||
|
|
||||||
end_callback(png_structp png_ptr, png_infop info)
|
end_callback(png_structp png_ptr, png_infop info)
|
||||||
@@ -663,7 +846,7 @@ void write_png(char *file_name /* , ... other image information ... */)
|
|||||||
|
|
||||||
/* Set the palette if there is one. REQUIRED for indexed-color images */
|
/* Set the palette if there is one. REQUIRED for indexed-color images */
|
||||||
palette = (png_colorp)png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH
|
palette = (png_colorp)png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH
|
||||||
* png_sizeof(png_color));
|
* (sizeof (png_color)));
|
||||||
/* ... Set palette colors ... */
|
/* ... Set palette colors ... */
|
||||||
png_set_PLTE(png_ptr, info_ptr, palette, PNG_MAX_PALETTE_LENGTH);
|
png_set_PLTE(png_ptr, info_ptr, palette, PNG_MAX_PALETTE_LENGTH);
|
||||||
/* You must not free palette here, because png_set_PLTE only makes a link to
|
/* You must not free palette here, because png_set_PLTE only makes a link to
|
||||||
@@ -694,25 +877,38 @@ void write_png(char *file_name /* , ... other image information ... */)
|
|||||||
png_set_gAMA(png_ptr, info_ptr, gamma);
|
png_set_gAMA(png_ptr, info_ptr, gamma);
|
||||||
|
|
||||||
/* Optionally write comments into the image */
|
/* Optionally write comments into the image */
|
||||||
text_ptr[0].key = "Title";
|
{
|
||||||
text_ptr[0].text = "Mona Lisa";
|
png_text text_ptr[3];
|
||||||
text_ptr[0].compression = PNG_TEXT_COMPRESSION_NONE;
|
|
||||||
text_ptr[0].itxt_length = 0;
|
char key0[]="Title";
|
||||||
text_ptr[0].lang = NULL;
|
char text0[]="Mona Lisa";
|
||||||
text_ptr[0].lang_key = NULL;
|
text_ptr[0].key = key0;
|
||||||
text_ptr[1].key = "Author";
|
text_ptr[0].text = text0;
|
||||||
text_ptr[1].text = "Leonardo DaVinci";
|
text_ptr[0].compression = PNG_TEXT_COMPRESSION_NONE;
|
||||||
text_ptr[1].compression = PNG_TEXT_COMPRESSION_NONE;
|
text_ptr[0].itxt_length = 0;
|
||||||
text_ptr[1].itxt_length = 0;
|
text_ptr[0].lang = NULL;
|
||||||
text_ptr[1].lang = NULL;
|
text_ptr[0].lang_key = NULL;
|
||||||
text_ptr[1].lang_key = NULL;
|
|
||||||
text_ptr[2].key = "Description";
|
char key1[]="Author";
|
||||||
text_ptr[2].text = "<long text>";
|
char text1[]="Leonardo DaVinci";
|
||||||
text_ptr[2].compression = PNG_TEXT_COMPRESSION_zTXt;
|
text_ptr[1].key = key1;
|
||||||
text_ptr[2].itxt_length = 0;
|
text_ptr[1].text = text1;
|
||||||
text_ptr[2].lang = NULL;
|
text_ptr[1].compression = PNG_TEXT_COMPRESSION_NONE;
|
||||||
text_ptr[2].lang_key = NULL;
|
text_ptr[1].itxt_length = 0;
|
||||||
png_set_text(png_ptr, info_ptr, text_ptr, 3);
|
text_ptr[1].lang = NULL;
|
||||||
|
text_ptr[1].lang_key = NULL;
|
||||||
|
|
||||||
|
char key2[]="Description";
|
||||||
|
char text2[]="<long text>";
|
||||||
|
text_ptr[2].key = key2;
|
||||||
|
text_ptr[2].text = text2;
|
||||||
|
text_ptr[2].compression = PNG_TEXT_COMPRESSION_zTXt;
|
||||||
|
text_ptr[2].itxt_length = 0;
|
||||||
|
text_ptr[2].lang = NULL;
|
||||||
|
text_ptr[2].lang_key = NULL;
|
||||||
|
|
||||||
|
png_set_text(write_ptr, write_info_ptr, text_ptr, 3);
|
||||||
|
}
|
||||||
|
|
||||||
/* Other optional chunks like cHRM, bKGD, tRNS, tIME, oFFs, pHYs */
|
/* Other optional chunks like cHRM, bKGD, tRNS, tIME, oFFs, pHYs */
|
||||||
|
|
||||||
@@ -736,7 +932,7 @@ void write_png(char *file_name /* , ... other image information ... */)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* Once we write out the header, the compression type on the text
|
/* Once we write out the header, the compression type on the text
|
||||||
* chunks gets changed to PNG_TEXT_COMPRESSION_NONE_WR or
|
* chunk gets changed to PNG_TEXT_COMPRESSION_NONE_WR or
|
||||||
* PNG_TEXT_COMPRESSION_zTXt_WR, so it doesn't get written out again
|
* PNG_TEXT_COMPRESSION_zTXt_WR, so it doesn't get written out again
|
||||||
* at the end.
|
* at the end.
|
||||||
*/
|
*/
|
||||||
@@ -774,7 +970,7 @@ void write_png(char *file_name /* , ... other image information ... */)
|
|||||||
png_set_packswap(png_ptr);
|
png_set_packswap(png_ptr);
|
||||||
|
|
||||||
/* Turn on interlace handling if you are not using png_write_image() */
|
/* Turn on interlace handling if you are not using png_write_image() */
|
||||||
if (interlacing)
|
if (interlacing != 0)
|
||||||
number_passes = png_set_interlace_handling(png_ptr);
|
number_passes = png_set_interlace_handling(png_ptr);
|
||||||
|
|
||||||
else
|
else
|
||||||
@@ -785,12 +981,16 @@ void write_png(char *file_name /* , ... other image information ... */)
|
|||||||
* use the first method if you aren't handling interlacing yourself.
|
* use the first method if you aren't handling interlacing yourself.
|
||||||
*/
|
*/
|
||||||
png_uint_32 k, height, width;
|
png_uint_32 k, height, width;
|
||||||
png_byte image[height][width*bytes_per_pixel];
|
|
||||||
|
/* In this example, "image" is a one-dimensional array of bytes */
|
||||||
|
png_byte image[height*width*bytes_per_pixel];
|
||||||
|
|
||||||
png_bytep row_pointers[height];
|
png_bytep row_pointers[height];
|
||||||
|
|
||||||
if (height > PNG_UINT_32_MAX/png_sizeof(png_bytep))
|
if (height > PNG_UINT_32_MAX/(sizeof (png_bytep)))
|
||||||
png_error (png_ptr, "Image is too tall to process in memory");
|
png_error (png_ptr, "Image is too tall to process in memory");
|
||||||
|
|
||||||
|
/* Set up pointers into your "image" byte array */
|
||||||
for (k = 0; k < height; k++)
|
for (k = 0; k < height; k++)
|
||||||
row_pointers[k] = image + k*width*bytes_per_pixel;
|
row_pointers[k] = image + k*width*bytes_per_pixel;
|
||||||
|
|
||||||
|
|||||||
520
install-sh
@@ -1,520 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
# install - install a program, script, or datafile
|
|
||||||
|
|
||||||
scriptversion=2009-04-28.21; # UTC
|
|
||||||
|
|
||||||
# This originates from X11R5 (mit/util/scripts/install.sh), which was
|
|
||||||
# later released in X11R6 (xc/config/util/install.sh) with the
|
|
||||||
# following copyright and license.
|
|
||||||
#
|
|
||||||
# Copyright (C) 1994 X Consortium
|
|
||||||
#
|
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
# of this software and associated documentation files (the "Software"), to
|
|
||||||
# deal in the Software without restriction, including without limitation the
|
|
||||||
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
# sell copies of the Software, and to permit persons to whom the Software is
|
|
||||||
# furnished to do so, subject to the following conditions:
|
|
||||||
#
|
|
||||||
# The above copyright notice and this permission notice shall be included in
|
|
||||||
# all copies or substantial portions of the Software.
|
|
||||||
#
|
|
||||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
|
|
||||||
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
#
|
|
||||||
# Except as contained in this notice, the name of the X Consortium shall not
|
|
||||||
# be used in advertising or otherwise to promote the sale, use or other deal-
|
|
||||||
# ings in this Software without prior written authorization from the X Consor-
|
|
||||||
# tium.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# FSF changes to this file are in the public domain.
|
|
||||||
#
|
|
||||||
# Calling this script install-sh is preferred over install.sh, to prevent
|
|
||||||
# `make' implicit rules from creating a file called install from it
|
|
||||||
# when there is no Makefile.
|
|
||||||
#
|
|
||||||
# This script is compatible with the BSD install script, but was written
|
|
||||||
# from scratch.
|
|
||||||
|
|
||||||
nl='
|
|
||||||
'
|
|
||||||
IFS=" "" $nl"
|
|
||||||
|
|
||||||
# set DOITPROG to echo to test this script
|
|
||||||
|
|
||||||
# Don't use :- since 4.3BSD and earlier shells don't like it.
|
|
||||||
doit=${DOITPROG-}
|
|
||||||
if test -z "$doit"; then
|
|
||||||
doit_exec=exec
|
|
||||||
else
|
|
||||||
doit_exec=$doit
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Put in absolute file names if you don't have them in your path;
|
|
||||||
# or use environment vars.
|
|
||||||
|
|
||||||
chgrpprog=${CHGRPPROG-chgrp}
|
|
||||||
chmodprog=${CHMODPROG-chmod}
|
|
||||||
chownprog=${CHOWNPROG-chown}
|
|
||||||
cmpprog=${CMPPROG-cmp}
|
|
||||||
cpprog=${CPPROG-cp}
|
|
||||||
mkdirprog=${MKDIRPROG-mkdir}
|
|
||||||
mvprog=${MVPROG-mv}
|
|
||||||
rmprog=${RMPROG-rm}
|
|
||||||
stripprog=${STRIPPROG-strip}
|
|
||||||
|
|
||||||
posix_glob='?'
|
|
||||||
initialize_posix_glob='
|
|
||||||
test "$posix_glob" != "?" || {
|
|
||||||
if (set -f) 2>/dev/null; then
|
|
||||||
posix_glob=
|
|
||||||
else
|
|
||||||
posix_glob=:
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
'
|
|
||||||
|
|
||||||
posix_mkdir=
|
|
||||||
|
|
||||||
# Desired mode of installed file.
|
|
||||||
mode=0755
|
|
||||||
|
|
||||||
chgrpcmd=
|
|
||||||
chmodcmd=$chmodprog
|
|
||||||
chowncmd=
|
|
||||||
mvcmd=$mvprog
|
|
||||||
rmcmd="$rmprog -f"
|
|
||||||
stripcmd=
|
|
||||||
|
|
||||||
src=
|
|
||||||
dst=
|
|
||||||
dir_arg=
|
|
||||||
dst_arg=
|
|
||||||
|
|
||||||
copy_on_change=false
|
|
||||||
no_target_directory=
|
|
||||||
|
|
||||||
usage="\
|
|
||||||
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
|
|
||||||
or: $0 [OPTION]... SRCFILES... DIRECTORY
|
|
||||||
or: $0 [OPTION]... -t DIRECTORY SRCFILES...
|
|
||||||
or: $0 [OPTION]... -d DIRECTORIES...
|
|
||||||
|
|
||||||
In the 1st form, copy SRCFILE to DSTFILE.
|
|
||||||
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
|
|
||||||
In the 4th, create DIRECTORIES.
|
|
||||||
|
|
||||||
Options:
|
|
||||||
--help display this help and exit.
|
|
||||||
--version display version info and exit.
|
|
||||||
|
|
||||||
-c (ignored)
|
|
||||||
-C install only if different (preserve the last data modification time)
|
|
||||||
-d create directories instead of installing files.
|
|
||||||
-g GROUP $chgrpprog installed files to GROUP.
|
|
||||||
-m MODE $chmodprog installed files to MODE.
|
|
||||||
-o USER $chownprog installed files to USER.
|
|
||||||
-s $stripprog installed files.
|
|
||||||
-t DIRECTORY install into DIRECTORY.
|
|
||||||
-T report an error if DSTFILE is a directory.
|
|
||||||
|
|
||||||
Environment variables override the default commands:
|
|
||||||
CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
|
|
||||||
RMPROG STRIPPROG
|
|
||||||
"
|
|
||||||
|
|
||||||
while test $# -ne 0; do
|
|
||||||
case $1 in
|
|
||||||
-c) ;;
|
|
||||||
|
|
||||||
-C) copy_on_change=true;;
|
|
||||||
|
|
||||||
-d) dir_arg=true;;
|
|
||||||
|
|
||||||
-g) chgrpcmd="$chgrpprog $2"
|
|
||||||
shift;;
|
|
||||||
|
|
||||||
--help) echo "$usage"; exit $?;;
|
|
||||||
|
|
||||||
-m) mode=$2
|
|
||||||
case $mode in
|
|
||||||
*' '* | *' '* | *'
|
|
||||||
'* | *'*'* | *'?'* | *'['*)
|
|
||||||
echo "$0: invalid mode: $mode" >&2
|
|
||||||
exit 1;;
|
|
||||||
esac
|
|
||||||
shift;;
|
|
||||||
|
|
||||||
-o) chowncmd="$chownprog $2"
|
|
||||||
shift;;
|
|
||||||
|
|
||||||
-s) stripcmd=$stripprog;;
|
|
||||||
|
|
||||||
-t) dst_arg=$2
|
|
||||||
shift;;
|
|
||||||
|
|
||||||
-T) no_target_directory=true;;
|
|
||||||
|
|
||||||
--version) echo "$0 $scriptversion"; exit $?;;
|
|
||||||
|
|
||||||
--) shift
|
|
||||||
break;;
|
|
||||||
|
|
||||||
-*) echo "$0: invalid option: $1" >&2
|
|
||||||
exit 1;;
|
|
||||||
|
|
||||||
*) break;;
|
|
||||||
esac
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
|
|
||||||
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
|
|
||||||
# When -d is used, all remaining arguments are directories to create.
|
|
||||||
# When -t is used, the destination is already specified.
|
|
||||||
# Otherwise, the last argument is the destination. Remove it from $@.
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
if test -n "$dst_arg"; then
|
|
||||||
# $@ is not empty: it contains at least $arg.
|
|
||||||
set fnord "$@" "$dst_arg"
|
|
||||||
shift # fnord
|
|
||||||
fi
|
|
||||||
shift # arg
|
|
||||||
dst_arg=$arg
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test $# -eq 0; then
|
|
||||||
if test -z "$dir_arg"; then
|
|
||||||
echo "$0: no input file specified." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
# It's OK to call `install-sh -d' without argument.
|
|
||||||
# This can happen when creating conditional directories.
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -z "$dir_arg"; then
|
|
||||||
trap '(exit $?); exit' 1 2 13 15
|
|
||||||
|
|
||||||
# Set umask so as not to create temps with too-generous modes.
|
|
||||||
# However, 'strip' requires both read and write access to temps.
|
|
||||||
case $mode in
|
|
||||||
# Optimize common cases.
|
|
||||||
*644) cp_umask=133;;
|
|
||||||
*755) cp_umask=22;;
|
|
||||||
|
|
||||||
*[0-7])
|
|
||||||
if test -z "$stripcmd"; then
|
|
||||||
u_plus_rw=
|
|
||||||
else
|
|
||||||
u_plus_rw='% 200'
|
|
||||||
fi
|
|
||||||
cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
|
|
||||||
*)
|
|
||||||
if test -z "$stripcmd"; then
|
|
||||||
u_plus_rw=
|
|
||||||
else
|
|
||||||
u_plus_rw=,u+rw
|
|
||||||
fi
|
|
||||||
cp_umask=$mode$u_plus_rw;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
for src
|
|
||||||
do
|
|
||||||
# Protect names starting with `-'.
|
|
||||||
case $src in
|
|
||||||
-*) src=./$src;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if test -n "$dir_arg"; then
|
|
||||||
dst=$src
|
|
||||||
dstdir=$dst
|
|
||||||
test -d "$dstdir"
|
|
||||||
dstdir_status=$?
|
|
||||||
else
|
|
||||||
|
|
||||||
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
|
|
||||||
# might cause directories to be created, which would be especially bad
|
|
||||||
# if $src (and thus $dsttmp) contains '*'.
|
|
||||||
if test ! -f "$src" && test ! -d "$src"; then
|
|
||||||
echo "$0: $src does not exist." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -z "$dst_arg"; then
|
|
||||||
echo "$0: no destination specified." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
dst=$dst_arg
|
|
||||||
# Protect names starting with `-'.
|
|
||||||
case $dst in
|
|
||||||
-*) dst=./$dst;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# If destination is a directory, append the input filename; won't work
|
|
||||||
# if double slashes aren't ignored.
|
|
||||||
if test -d "$dst"; then
|
|
||||||
if test -n "$no_target_directory"; then
|
|
||||||
echo "$0: $dst_arg: Is a directory" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
dstdir=$dst
|
|
||||||
dst=$dstdir/`basename "$src"`
|
|
||||||
dstdir_status=0
|
|
||||||
else
|
|
||||||
# Prefer dirname, but fall back on a substitute if dirname fails.
|
|
||||||
dstdir=`
|
|
||||||
(dirname "$dst") 2>/dev/null ||
|
|
||||||
expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
|
|
||||||
X"$dst" : 'X\(//\)[^/]' \| \
|
|
||||||
X"$dst" : 'X\(//\)$' \| \
|
|
||||||
X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
|
|
||||||
echo X"$dst" |
|
|
||||||
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/^X\(\/\/\)[^/].*/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/^X\(\/\/\)$/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/^X\(\/\).*/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
s/.*/./; q'
|
|
||||||
`
|
|
||||||
|
|
||||||
test -d "$dstdir"
|
|
||||||
dstdir_status=$?
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
obsolete_mkdir_used=false
|
|
||||||
|
|
||||||
if test $dstdir_status != 0; then
|
|
||||||
case $posix_mkdir in
|
|
||||||
'')
|
|
||||||
# Create intermediate dirs using mode 755 as modified by the umask.
|
|
||||||
# This is like FreeBSD 'install' as of 1997-10-28.
|
|
||||||
umask=`umask`
|
|
||||||
case $stripcmd.$umask in
|
|
||||||
# Optimize common cases.
|
|
||||||
*[2367][2367]) mkdir_umask=$umask;;
|
|
||||||
.*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
|
|
||||||
|
|
||||||
*[0-7])
|
|
||||||
mkdir_umask=`expr $umask + 22 \
|
|
||||||
- $umask % 100 % 40 + $umask % 20 \
|
|
||||||
- $umask % 10 % 4 + $umask % 2
|
|
||||||
`;;
|
|
||||||
*) mkdir_umask=$umask,go-w;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# With -d, create the new directory with the user-specified mode.
|
|
||||||
# Otherwise, rely on $mkdir_umask.
|
|
||||||
if test -n "$dir_arg"; then
|
|
||||||
mkdir_mode=-m$mode
|
|
||||||
else
|
|
||||||
mkdir_mode=
|
|
||||||
fi
|
|
||||||
|
|
||||||
posix_mkdir=false
|
|
||||||
case $umask in
|
|
||||||
*[123567][0-7][0-7])
|
|
||||||
# POSIX mkdir -p sets u+wx bits regardless of umask, which
|
|
||||||
# is incompatible with FreeBSD 'install' when (umask & 300) != 0.
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
|
|
||||||
trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
|
|
||||||
|
|
||||||
if (umask $mkdir_umask &&
|
|
||||||
exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
|
|
||||||
then
|
|
||||||
if test -z "$dir_arg" || {
|
|
||||||
# Check for POSIX incompatibilities with -m.
|
|
||||||
# HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
|
|
||||||
# other-writeable bit of parent directory when it shouldn't.
|
|
||||||
# FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
|
|
||||||
ls_ld_tmpdir=`ls -ld "$tmpdir"`
|
|
||||||
case $ls_ld_tmpdir in
|
|
||||||
d????-?r-*) different_mode=700;;
|
|
||||||
d????-?--*) different_mode=755;;
|
|
||||||
*) false;;
|
|
||||||
esac &&
|
|
||||||
$mkdirprog -m$different_mode -p -- "$tmpdir" && {
|
|
||||||
ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
|
|
||||||
test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
then posix_mkdir=:
|
|
||||||
fi
|
|
||||||
rmdir "$tmpdir/d" "$tmpdir"
|
|
||||||
else
|
|
||||||
# Remove any dirs left behind by ancient mkdir implementations.
|
|
||||||
rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
|
|
||||||
fi
|
|
||||||
trap '' 0;;
|
|
||||||
esac;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if
|
|
||||||
$posix_mkdir && (
|
|
||||||
umask $mkdir_umask &&
|
|
||||||
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
|
|
||||||
)
|
|
||||||
then :
|
|
||||||
else
|
|
||||||
|
|
||||||
# The umask is ridiculous, or mkdir does not conform to POSIX,
|
|
||||||
# or it failed possibly due to a race condition. Create the
|
|
||||||
# directory the slow way, step by step, checking for races as we go.
|
|
||||||
|
|
||||||
case $dstdir in
|
|
||||||
/*) prefix='/';;
|
|
||||||
-*) prefix='./';;
|
|
||||||
*) prefix='';;
|
|
||||||
esac
|
|
||||||
|
|
||||||
eval "$initialize_posix_glob"
|
|
||||||
|
|
||||||
oIFS=$IFS
|
|
||||||
IFS=/
|
|
||||||
$posix_glob set -f
|
|
||||||
set fnord $dstdir
|
|
||||||
shift
|
|
||||||
$posix_glob set +f
|
|
||||||
IFS=$oIFS
|
|
||||||
|
|
||||||
prefixes=
|
|
||||||
|
|
||||||
for d
|
|
||||||
do
|
|
||||||
test -z "$d" && continue
|
|
||||||
|
|
||||||
prefix=$prefix$d
|
|
||||||
if test -d "$prefix"; then
|
|
||||||
prefixes=
|
|
||||||
else
|
|
||||||
if $posix_mkdir; then
|
|
||||||
(umask=$mkdir_umask &&
|
|
||||||
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
|
|
||||||
# Don't fail if two instances are running concurrently.
|
|
||||||
test -d "$prefix" || exit 1
|
|
||||||
else
|
|
||||||
case $prefix in
|
|
||||||
*\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
|
|
||||||
*) qprefix=$prefix;;
|
|
||||||
esac
|
|
||||||
prefixes="$prefixes '$qprefix'"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
prefix=$prefix/
|
|
||||||
done
|
|
||||||
|
|
||||||
if test -n "$prefixes"; then
|
|
||||||
# Don't fail if two instances are running concurrently.
|
|
||||||
(umask $mkdir_umask &&
|
|
||||||
eval "\$doit_exec \$mkdirprog $prefixes") ||
|
|
||||||
test -d "$dstdir" || exit 1
|
|
||||||
obsolete_mkdir_used=true
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -n "$dir_arg"; then
|
|
||||||
{ test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
|
|
||||||
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
|
|
||||||
{ test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
|
|
||||||
test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
|
|
||||||
else
|
|
||||||
|
|
||||||
# Make a couple of temp file names in the proper directory.
|
|
||||||
dsttmp=$dstdir/_inst.$$_
|
|
||||||
rmtmp=$dstdir/_rm.$$_
|
|
||||||
|
|
||||||
# Trap to clean up those temp files at exit.
|
|
||||||
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
|
|
||||||
|
|
||||||
# Copy the file name to the temp name.
|
|
||||||
(umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
|
|
||||||
|
|
||||||
# and set any options; do chmod last to preserve setuid bits.
|
|
||||||
#
|
|
||||||
# If any of these fail, we abort the whole thing. If we want to
|
|
||||||
# ignore errors from any of these, just make sure not to ignore
|
|
||||||
# errors from the above "$doit $cpprog $src $dsttmp" command.
|
|
||||||
#
|
|
||||||
{ test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
|
|
||||||
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
|
|
||||||
{ test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
|
|
||||||
{ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
|
|
||||||
|
|
||||||
# If -C, don't bother to copy if it wouldn't change the file.
|
|
||||||
if $copy_on_change &&
|
|
||||||
old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
|
|
||||||
new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
|
|
||||||
|
|
||||||
eval "$initialize_posix_glob" &&
|
|
||||||
$posix_glob set -f &&
|
|
||||||
set X $old && old=:$2:$4:$5:$6 &&
|
|
||||||
set X $new && new=:$2:$4:$5:$6 &&
|
|
||||||
$posix_glob set +f &&
|
|
||||||
|
|
||||||
test "$old" = "$new" &&
|
|
||||||
$cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
|
|
||||||
then
|
|
||||||
rm -f "$dsttmp"
|
|
||||||
else
|
|
||||||
# Rename the file to the real destination.
|
|
||||||
$doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
|
|
||||||
|
|
||||||
# The rename failed, perhaps because mv can't rename something else
|
|
||||||
# to itself, or perhaps because mv is so ancient that it does not
|
|
||||||
# support -f.
|
|
||||||
{
|
|
||||||
# Now remove or move aside any old file at destination location.
|
|
||||||
# We try this two ways since rm can't unlink itself on some
|
|
||||||
# systems and the destination file might be busy for other
|
|
||||||
# reasons. In this case, the final cleanup might fail but the new
|
|
||||||
# file should still install successfully.
|
|
||||||
{
|
|
||||||
test ! -f "$dst" ||
|
|
||||||
$doit $rmcmd -f "$dst" 2>/dev/null ||
|
|
||||||
{ $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
|
|
||||||
{ $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
|
|
||||||
} ||
|
|
||||||
{ echo "$0: cannot unlink or rename $dst" >&2
|
|
||||||
(exit 1); exit 1
|
|
||||||
}
|
|
||||||
} &&
|
|
||||||
|
|
||||||
# Now rename the file to the real destination.
|
|
||||||
$doit $mvcmd "$dsttmp" "$dst"
|
|
||||||
}
|
|
||||||
fi || exit 1
|
|
||||||
|
|
||||||
trap '' 0
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Local variables:
|
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-time-zone: "UTC"
|
|
||||||
# time-stamp-end: "; # UTC"
|
|
||||||
# End:
|
|
||||||