Compare commits
1663 Commits
v1.4.0beta
...
libpng-1.6
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4df37bfa4f | ||
|
|
c978642c48 | ||
|
|
24afd07ab9 | ||
|
|
c540d8bed7 | ||
|
|
3e5d04df37 | ||
|
|
6e8ba0fab6 | ||
|
|
b3a765066f | ||
|
|
4c7bb07857 | ||
|
|
b8f433417f | ||
|
|
53c60fa94b | ||
|
|
ab56b743c1 | ||
|
|
3455238a4e | ||
|
|
9f0ac8548b | ||
|
|
2fff8078dc | ||
|
|
da7027b6b0 | ||
|
|
9e06534572 | ||
|
|
be040c98f8 | ||
|
|
bd792c020f | ||
|
|
079a724833 | ||
|
|
1301356273 | ||
|
|
78c28fea51 | ||
|
|
45625eceb4 | ||
|
|
e3ae583514 | ||
|
|
eb657ae68f | ||
|
|
f5df058bee | ||
|
|
dd6679dce8 | ||
|
|
9c5a1baea5 | ||
|
|
37b7299b60 | ||
|
|
0b61d10ad4 | ||
|
|
dba54b8888 | ||
|
|
38ef9c9779 | ||
|
|
103b04170d | ||
|
|
e40e37018d | ||
|
|
9eec159ab0 | ||
|
|
414d7b5f7d | ||
|
|
685dff485e | ||
|
|
8a227ff25a | ||
|
|
3e753eb8b2 | ||
|
|
759c903686 | ||
|
|
8c12078e95 | ||
|
|
b91528db20 | ||
|
|
2f1dede991 | ||
|
|
5af0307f11 | ||
|
|
efaaad7447 | ||
|
|
bda94b1005 | ||
|
|
4250328102 | ||
|
|
bb6e0a2db3 | ||
|
|
41633d33c4 | ||
|
|
88cf760b07 | ||
|
|
4ea97d8bc7 | ||
|
|
bef206b0a8 | ||
|
|
b94db2eb34 | ||
|
|
3f7a169c2d | ||
|
|
bc79c250e9 | ||
|
|
3cc9e8ff96 | ||
|
|
95a197397f | ||
|
|
d0479d24a0 | ||
|
|
1fc0171278 | ||
|
|
a8472470a4 | ||
|
|
88ecac68be | ||
|
|
e51ba2eff4 | ||
|
|
a80e864faa | ||
|
|
1d3c990425 | ||
|
|
79f0ba499f | ||
|
|
74e84d0f7d | ||
|
|
4568762d28 | ||
|
|
0740c62700 | ||
|
|
38f49403bd | ||
|
|
8f1150eb75 | ||
|
|
c10930a4fc | ||
|
|
bff81bdddc | ||
|
|
be3977de2c | ||
|
|
67f101e6c9 | ||
|
|
b6f0a641cb | ||
|
|
81dfd007b2 | ||
|
|
1f23775d10 | ||
|
|
84092bbf29 | ||
|
|
1658e602c6 | ||
|
|
83b132f14d | ||
|
|
1f63da349b | ||
|
|
44db02364e | ||
|
|
3f8a2ed600 | ||
|
|
30145f29c5 | ||
|
|
d56af331e1 | ||
|
|
1c6e5f8caa | ||
|
|
27ae9362d8 | ||
|
|
88507b4ef9 | ||
|
|
0f6303301f | ||
|
|
aaf1bb1ae1 | ||
|
|
b5596712fc | ||
|
|
503a49458b | ||
|
|
c912050a7b | ||
|
|
113213416c | ||
|
|
bd757acf26 | ||
|
|
a7f0bcb3a6 | ||
|
|
7976b3c3e3 | ||
|
|
012d36f643 | ||
|
|
68dfa9e526 | ||
|
|
416bb9320f | ||
|
|
f2b8961f58 | ||
|
|
6a3805c25b | ||
|
|
cf247ebffe | ||
|
|
0ea69cdfa9 | ||
|
|
8bf54399a3 | ||
|
|
4da9d314bc | ||
|
|
08b0620202 | ||
|
|
dee5a914fc | ||
|
|
d2d09e5bf9 | ||
|
|
03eafe24ed | ||
|
|
e9a8fb8d07 | ||
|
|
fd8bba4b80 | ||
|
|
bb9adfdad9 | ||
|
|
393d3c8285 | ||
|
|
9450ffb26d | ||
|
|
ed049010b1 | ||
|
|
db9d96840d | ||
|
|
9e9977e153 | ||
|
|
681b731151 | ||
|
|
83a841ab7c | ||
|
|
85c2ec9a69 | ||
|
|
cf644fa901 | ||
|
|
17ad121e93 | ||
|
|
19e4edaf3f | ||
|
|
e1540e3b4c | ||
|
|
063eb1b497 | ||
|
|
fecdd46639 | ||
|
|
0e036921aa | ||
|
|
e827fa24a0 | ||
|
|
34ac3691cb | ||
|
|
236e105170 | ||
|
|
5b1df53a82 | ||
|
|
940b37b197 | ||
|
|
0441ff62e7 | ||
|
|
de723276e5 | ||
|
|
2464dbfe4c | ||
|
|
b3721757a0 | ||
|
|
cc93d89e43 | ||
|
|
8f381901e3 | ||
|
|
15a80443de | ||
|
|
6f8f004fe1 | ||
|
|
873f16fe2f | ||
|
|
7ae451f527 | ||
|
|
391459424e | ||
|
|
53ae7dc514 | ||
|
|
cd6a3ef31f | ||
|
|
209d3eb5c6 | ||
|
|
d42dc54df5 | ||
|
|
877afaf17e | ||
|
|
8c49ddcf56 | ||
|
|
5680f5d6f2 | ||
|
|
324402044f | ||
|
|
685d79e27a | ||
|
|
52083f9152 | ||
|
|
7191f6e9e6 | ||
|
|
4dcbf24d82 | ||
|
|
492e67163e | ||
|
|
5881b11629 | ||
|
|
847e9efb66 | ||
|
|
db56fa18c2 | ||
|
|
bc8e40d611 | ||
|
|
2b87a54d07 | ||
|
|
b23afad4a1 | ||
|
|
f5d7f438e5 | ||
|
|
b4ec1f8451 | ||
|
|
f5f1206778 | ||
|
|
497e7319f4 | ||
|
|
d5dd93f5d1 | ||
|
|
7f9a49aa65 | ||
|
|
573c9d434f | ||
|
|
56a1a66656 | ||
|
|
d992e05da8 | ||
|
|
870beb5279 | ||
|
|
b0d97356ce | ||
|
|
04d4e38ac2 | ||
|
|
67a46d17d8 | ||
|
|
bbc29a858d | ||
|
|
3948b94700 | ||
|
|
746bc7d883 | ||
|
|
f260f6d156 | ||
|
|
18dd07e3e6 | ||
|
|
0486b17fbd | ||
|
|
aa22442a9c | ||
|
|
4a43182924 | ||
|
|
810b6e51e4 | ||
|
|
88610994da | ||
|
|
1b9b970598 | ||
|
|
43f0311b57 | ||
|
|
421f95deb5 | ||
|
|
f96251291d | ||
|
|
cafa0eebb9 | ||
|
|
afd6cecb76 | ||
|
|
61dbc4c608 | ||
|
|
bea86bba24 | ||
|
|
7fc85a3f46 | ||
|
|
bb8d4f76f4 | ||
|
|
b79c98e57c | ||
|
|
4cf2465c71 | ||
|
|
4ea93e69bc | ||
|
|
ff141eb21e | ||
|
|
122bec17f2 | ||
|
|
9afb90f885 | ||
|
|
34b7d62488 | ||
|
|
3f2b5a6670 | ||
|
|
294d0b8408 | ||
|
|
62c6fbbd29 | ||
|
|
0c7ac064d3 | ||
|
|
db67cba8d4 | ||
|
|
2aa6c96e5d | ||
|
|
2fd3434fa4 | ||
|
|
2c0833e265 | ||
|
|
127b08a265 | ||
|
|
0f42908c0a | ||
|
|
f18a28cc13 | ||
|
|
56d6bc2e88 | ||
|
|
61946e0f56 | ||
|
|
49f9c24910 | ||
|
|
c62fda06a3 | ||
|
|
cd62215d61 | ||
|
|
ac09cd0fec | ||
|
|
529045cf26 | ||
|
|
7b1da52549 | ||
|
|
34d20f482f | ||
|
|
399430dac2 | ||
|
|
3f677d1c65 | ||
|
|
809355b4aa | ||
|
|
7fd71746d0 | ||
|
|
0ee3465fba | ||
|
|
a793120405 | ||
|
|
9bdba4e630 | ||
|
|
a74b70871c | ||
|
|
0d50d6562c | ||
|
|
453fbf942c | ||
|
|
6e1c74b39b | ||
|
|
fdc2d5f38f | ||
|
|
67a289ffa9 | ||
|
|
bf15ac7e86 | ||
|
|
7ef0c46488 | ||
|
|
8d9e494dfb | ||
|
|
0794df4062 | ||
|
|
7a69beda7b | ||
|
|
e4413a735b | ||
|
|
7fdb594e73 | ||
|
|
f1736a636b | ||
|
|
3b4c60f26b | ||
|
|
5c55ccdf4f | ||
|
|
5ec05b3d7c | ||
|
|
70eb0720a0 | ||
|
|
9bb775fc8c | ||
|
|
a8715cabd1 | ||
|
|
364acf40aa | ||
|
|
b44cd59ad9 | ||
|
|
e2d8e11407 | ||
|
|
43c07e1b48 | ||
|
|
2e0c5f0dff | ||
|
|
3a83aa328d | ||
|
|
5087805e7c | ||
|
|
4e6e2166a5 | ||
|
|
1affc5622b | ||
|
|
cd1cd2dafc | ||
|
|
caa3f296df | ||
|
|
2286a7cef4 | ||
|
|
3c8b422b0a | ||
|
|
0645b62528 | ||
|
|
0281dee877 | ||
|
|
e55b25a962 | ||
|
|
14638c1f20 | ||
|
|
59ae38984f | ||
|
|
1f24cb74f2 | ||
|
|
1cbfa24a93 | ||
|
|
8c87dc88d6 | ||
|
|
f3728100d9 | ||
|
|
e15b537825 | ||
|
|
e57f094fd6 | ||
|
|
4ea113b7f0 | ||
|
|
871b1d0fab | ||
|
|
f3af706c2a | ||
|
|
96cf4bde0e | ||
|
|
1118d6d985 | ||
|
|
e444514a94 | ||
|
|
efda7376c8 | ||
|
|
ccec786ca7 | ||
|
|
2621be1bdb | ||
|
|
45bb4530fd | ||
|
|
a97fc46e43 | ||
|
|
3fa1893804 | ||
|
|
f8a8ead5cb | ||
|
|
6df55cece7 | ||
|
|
09a5ca72ac | ||
|
|
0cc3e9e38c | ||
|
|
adb9613699 | ||
|
|
c0a0d4a6d2 | ||
|
|
2bad851ab3 | ||
|
|
f2350f3987 | ||
|
|
b4ef7c4af2 | ||
|
|
9e8fd50d76 | ||
|
|
ea3288f1c5 | ||
|
|
cc074dcaa6 | ||
|
|
3b8e7e869d | ||
|
|
765d145ec4 | ||
|
|
c9b11ff0d4 | ||
|
|
23a101e06d | ||
|
|
b724c812ec | ||
|
|
0695fcd834 | ||
|
|
42835d3d19 | ||
|
|
2d99978f67 | ||
|
|
9d2e875826 | ||
|
|
681de8c8dc | ||
|
|
c53778ff53 | ||
|
|
44db2cfb15 | ||
|
|
6db8e4dd11 | ||
|
|
88c5a2a068 | ||
|
|
bf9f74b657 | ||
|
|
0d270082d2 | ||
|
|
d000fb89c0 | ||
|
|
9fabbedcf3 | ||
|
|
d7dc03e371 | ||
|
|
b8d0534e9d | ||
|
|
f88ac51a2e | ||
|
|
bbac5e692f | ||
|
|
a4081f2990 | ||
|
|
1f8e81738a | ||
|
|
9002f5b1f0 | ||
|
|
f5a83fb2b3 | ||
|
|
154de9398a | ||
|
|
777044a856 | ||
|
|
fe5c8b9755 | ||
|
|
8d391c6cea | ||
|
|
32d6a74293 | ||
|
|
806477742a | ||
|
|
29890b0439 | ||
|
|
9f860f59d9 | ||
|
|
f8aa57e791 | ||
|
|
4567935fe4 | ||
|
|
2414bd99d8 | ||
|
|
1f76e62d6c | ||
|
|
e208108dfc | ||
|
|
590c8b0987 | ||
|
|
c5c8b542fb | ||
|
|
91a7ad9d2b | ||
|
|
9dd2bfafe5 | ||
|
|
ba35f1e4c1 | ||
|
|
5851280929 | ||
|
|
1c6e22a360 | ||
|
|
37109a9f5b | ||
|
|
a70216aa60 | ||
|
|
9477ecdfa6 | ||
|
|
408652acaf | ||
|
|
744f041adf | ||
|
|
86c739e8bc | ||
|
|
00634fdac8 | ||
|
|
79ee877fb4 | ||
|
|
e9d616321a | ||
|
|
24639a63ce | ||
|
|
5362c9d5e5 | ||
|
|
b6bfd40da2 | ||
|
|
a1d32d08e1 | ||
|
|
350cbf14df | ||
|
|
7bde6e23bb | ||
|
|
5d9dc4563f | ||
|
|
aa41547a4d | ||
|
|
8c3d4f387a | ||
|
|
6e265d137c | ||
|
|
7b26920d9b | ||
|
|
785a8b1505 | ||
|
|
6cf32b460f | ||
|
|
f758d6c813 | ||
|
|
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 | ||
|
|
12fb29f951 | ||
|
|
8500b7720b | ||
|
|
e7ad104ac3 | ||
|
|
3b1f03084e | ||
|
|
680da02ade | ||
|
|
8e83631361 | ||
|
|
8501129c17 | ||
|
|
3706d730d1 | ||
|
|
925a60278e | ||
|
|
29fca795b9 | ||
|
|
bd2fa5def6 | ||
|
|
36251d3f76 | ||
|
|
d92c1fcd55 | ||
|
|
4af7710f94 | ||
|
|
7e97c182a8 | ||
|
|
e0bcbfd0fd | ||
|
|
17878c6e65 | ||
|
|
7006dc4c6a | ||
|
|
c4253c4683 | ||
|
|
4fa96a42f7 | ||
|
|
c2d8399581 | ||
|
|
18c5cfafeb | ||
|
|
36f5884359 | ||
|
|
e7acc6ac3d | ||
|
|
76b0459fdd | ||
|
|
ae41dc55a2 | ||
|
|
45bb9a62ba | ||
|
|
89c2f84287 | ||
|
|
ed9f84475d | ||
|
|
1eb188932b | ||
|
|
8596468e51 | ||
|
|
c32de8c64d | ||
|
|
6d8e090419 | ||
|
|
816e687de8 | ||
|
|
0a521d3785 | ||
|
|
d3feb52955 | ||
|
|
65f3ac192b | ||
|
|
4be12aa1e3 | ||
|
|
84b0da9c94 | ||
|
|
e6fb691c49 | ||
|
|
d4973837b2 | ||
|
|
dd81915d5b | ||
|
|
3615d03e05 | ||
|
|
e0a6c06bfd | ||
|
|
efc4b69767 | ||
|
|
7875d534cb | ||
|
|
92a1d46c8d | ||
|
|
7de02e722f | ||
|
|
61bd4f76ad | ||
|
|
8b67ee5d3d | ||
|
|
fc45f68623 | ||
|
|
a004e23a4c | ||
|
|
88bcdc269b | ||
|
|
aad7c828b2 | ||
|
|
5a9aca17df | ||
|
|
55e85c24b4 | ||
|
|
fcc0263191 | ||
|
|
1d8b75550f | ||
|
|
aff44028ba | ||
|
|
6d7705eedf | ||
|
|
d3a94802d8 | ||
|
|
2b7d730e27 | ||
|
|
bc6726bc04 | ||
|
|
1876366b17 | ||
|
|
c94b996af8 | ||
|
|
0e9f8ced1e | ||
|
|
7342fcaf92 | ||
|
|
92ef313c77 | ||
|
|
cb75699dff | ||
|
|
122a525c83 | ||
|
|
5e823c1fd5 | ||
|
|
8db19980fa | ||
|
|
ef02d563a3 | ||
|
|
b2068640d1 | ||
|
|
93254f66fc | ||
|
|
52093f1776 | ||
|
|
0654d63196 | ||
|
|
4e8aa822dc | ||
|
|
1c42276a39 | ||
|
|
c9e27d026d | ||
|
|
e7db181e5d | ||
|
|
f5c5e53bf5 | ||
|
|
ecb3ad035a | ||
|
|
fb5b3ac013 | ||
|
|
5b84901c55 | ||
|
|
57cbcf6b8f | ||
|
|
07772cba07 | ||
|
|
5c1905caae | ||
|
|
d58251b47e | ||
|
|
d3dcb463d6 | ||
|
|
3dbfd300ff | ||
|
|
ff36991ca2 | ||
|
|
5b3b54e3f6 | ||
|
|
ba55c0770b | ||
|
|
4e68aa7e40 | ||
|
|
76b62317b5 | ||
|
|
4dd0dc6399 | ||
|
|
8be28e3eb6 | ||
|
|
ac8375d000 | ||
|
|
65c0339b5c | ||
|
|
4daae30174 | ||
|
|
d5bc89ef11 | ||
|
|
fa7d7934f6 | ||
|
|
a92a212925 | ||
|
|
435cf87469 | ||
|
|
e51916c0f9 | ||
|
|
997b193f63 | ||
|
|
e29c4b9b93 | ||
|
|
8e25a61277 | ||
|
|
f573ff7792 | ||
|
|
1a16735ce7 | ||
|
|
d02d6a1c7d | ||
|
|
968c231cc8 | ||
|
|
bb5cb1476b | ||
|
|
115020d985 | ||
|
|
3e2263abf2 | ||
|
|
d71f09df4d | ||
|
|
0a456b5d16 | ||
|
|
d3261115a8 | ||
|
|
673a1166fe | ||
|
|
853afe631c | ||
|
|
fe85bafedf | ||
|
|
751561218f | ||
|
|
f0c19e6455 | ||
|
|
ccff383d44 | ||
|
|
f3f7e14727 | ||
|
|
3c2ae60f46 | ||
|
|
95ba417c82 | ||
|
|
b6e4d58e4b | ||
|
|
ef43c17bfe | ||
|
|
ad8b7b71b4 | ||
|
|
83bd94f1f4 | ||
|
|
63071acbd9 | ||
|
|
44271398bd | ||
|
|
90cd362a87 | ||
|
|
b293334e7a | ||
|
|
4ae297867d | ||
|
|
ec3ff78f70 | ||
|
|
6d62ef108a | ||
|
|
b6874f8062 | ||
|
|
8b8aacde83 | ||
|
|
bbd17bd7c4 | ||
|
|
b5cebba675 | ||
|
|
736f40f459 | ||
|
|
0c03fc6f75 | ||
|
|
e61e403d20 | ||
|
|
9d824eb166 | ||
|
|
75d5bfda5b | ||
|
|
9b979b177b | ||
|
|
7b9796539d | ||
|
|
0bc79772c8 | ||
|
|
a45ffbefb9 | ||
|
|
99ffac0838 | ||
|
|
6c98897a64 | ||
|
|
b17c75b222 | ||
|
|
d4e1ddb631 | ||
|
|
aab2aa196d | ||
|
|
03d6b482b5 | ||
|
|
4dcce66295 | ||
|
|
7a28724e6b | ||
|
|
a5bcab7854 | ||
|
|
0a007b743e | ||
|
|
e9ef47f69e | ||
|
|
0532aca928 | ||
|
|
5a77e672e1 | ||
|
|
c2891d0011 | ||
|
|
25e0f55586 | ||
|
|
ce775cc851 | ||
|
|
d0797f5b53 | ||
|
|
a5e5547679 | ||
|
|
4164c6f949 | ||
|
|
4b2237a6a4 | ||
|
|
cb47e20509 | ||
|
|
d3a0b23c1b | ||
|
|
ab38979670 | ||
|
|
628b632419 | ||
|
|
d404b6d488 | ||
|
|
38404a5996 | ||
|
|
05fc4ccd30 | ||
|
|
78bb9dafe1 | ||
|
|
4fca25504e | ||
|
|
9daf91ed5c | ||
|
|
fcd7c13ffd | ||
|
|
5bcd0a8c14 | ||
|
|
8d261262d9 | ||
|
|
c4a8214b77 | ||
|
|
4e47be74e9 | ||
|
|
314ef3e72b | ||
|
|
aee83b43d6 | ||
|
|
9a1e2232ba | ||
|
|
6da2f2d92a | ||
|
|
24145c8869 | ||
|
|
e6a8060a71 | ||
|
|
98f053edbd | ||
|
|
581d29d4c9 | ||
|
|
66b942ce16 | ||
|
|
86cf9b2e89 | ||
|
|
fb29e51dbd | ||
|
|
ab63dd0892 | ||
|
|
a7428d443c | ||
|
|
857dbbe7cc | ||
|
|
3fb7c07ea5 | ||
|
|
60d7c022e5 | ||
|
|
850769f787 | ||
|
|
5f0b9276ec | ||
|
|
733b131545 | ||
|
|
ef217b76a3 | ||
|
|
b0791f75ad | ||
|
|
039ad872fe | ||
|
|
903c64dce8 | ||
|
|
8f4edd07be | ||
|
|
be720edba7 | ||
|
|
140504b11a | ||
|
|
cd3b0cc4d9 | ||
|
|
06a9684cfa | ||
|
|
45599ad00f | ||
|
|
677819fe66 | ||
|
|
2232baa41b | ||
|
|
7dffa41643 | ||
|
|
550bab03fb | ||
|
|
413138a5ca | ||
|
|
74945f2f04 | ||
|
|
97039baa88 | ||
|
|
fd73d04515 | ||
|
|
141d9e3c20 | ||
|
|
0cb906d804 | ||
|
|
b704036531 | ||
|
|
6f55ee2ec5 | ||
|
|
6a1dc2329a | ||
|
|
59a6c379dd | ||
|
|
d2f0bc2d13 | ||
|
|
b011fe1c12 | ||
|
|
0eadc27cd6 | ||
|
|
700c55036c | ||
|
|
b2bee3374c | ||
|
|
cc2770850a | ||
|
|
fb27873021 | ||
|
|
590fb8c481 | ||
|
|
4e8d7ec5fc | ||
|
|
254a513fd1 | ||
|
|
ab1a573768 | ||
|
|
38a9d2763c | ||
|
|
07e1d34a84 | ||
|
|
36edbb5eee | ||
|
|
3fceee058f | ||
|
|
0640cc3d3a | ||
|
|
3f68453d4a | ||
|
|
0a048923ae | ||
|
|
5441e18988 | ||
|
|
db0ed3e62d | ||
|
|
8a7ec52c8b | ||
|
|
66e1b3abba | ||
|
|
cd116fa248 | ||
|
|
c261077788 | ||
|
|
55fbff358a | ||
|
|
1921e6db90 | ||
|
|
bb4f77cd95 | ||
|
|
5ca62c9f35 | ||
|
|
1591a4c9dc | ||
|
|
c36074e85a | ||
|
|
73904f52b4 | ||
|
|
0e128dfa2f | ||
|
|
9994f25733 | ||
|
|
593fc04096 | ||
|
|
cb0b29631f | ||
|
|
ed4d32baa4 | ||
|
|
d83530f45d | ||
|
|
cb3f42123f | ||
|
|
36fa2a0abd | ||
|
|
2d3fc1ca3b | ||
|
|
f70c7d02e9 | ||
|
|
d768d103cf | ||
|
|
44e26d4149 | ||
|
|
96cec0e1a3 | ||
|
|
a9b34191ae | ||
|
|
e9eeb743cb | ||
|
|
8ba34667a1 | ||
|
|
87952f0623 | ||
|
|
d12c02f020 | ||
|
|
f3d737dad1 | ||
|
|
492ef9c964 | ||
|
|
c7822514cc | ||
|
|
d273ad2d0f | ||
|
|
af855e415d | ||
|
|
6ee0edf880 | ||
|
|
00015a81dd | ||
|
|
e1018a5bbb | ||
|
|
c5bef946b1 | ||
|
|
c559bb58ed | ||
|
|
4753906826 | ||
|
|
88b77cc6f3 | ||
|
|
b3b7168077 | ||
|
|
1384c048e4 | ||
|
|
24fde6e00f | ||
|
|
33ced44f9e | ||
|
|
e6dc85bb0b | ||
|
|
20786be695 | ||
|
|
99778e17af | ||
|
|
cf78aee1c4 | ||
|
|
6cd31bbfce | ||
|
|
4bc9f8472c | ||
|
|
4a12f4a22a | ||
|
|
a1f9426399 | ||
|
|
9f1cd70774 | ||
|
|
d2795b7909 | ||
|
|
b75b24103d | ||
|
|
cb1aee2506 | ||
|
|
8d4ce1fed5 | ||
|
|
7abc130a81 | ||
|
|
5adc5a2ff8 | ||
|
|
b302c4721a | ||
|
|
537c146082 | ||
|
|
b6743ea08e | ||
|
|
61365b6d15 | ||
|
|
1b491cbda0 | ||
|
|
8abcf141fa | ||
|
|
b8e314072f | ||
|
|
6785856858 | ||
|
|
e99107b1aa | ||
|
|
f30f0e04e3 | ||
|
|
c3b3240a03 | ||
|
|
65a24d0638 | ||
|
|
a45f47c225 | ||
|
|
c683100e31 | ||
|
|
ec8296ab81 | ||
|
|
bdb0130aea | ||
|
|
5975f31ff0 | ||
|
|
205483d592 | ||
|
|
3bb8683a79 | ||
|
|
bef60dc624 | ||
|
|
8eb8833b74 | ||
|
|
b0525f83e1 | ||
|
|
ee1369b853 | ||
|
|
ea0c7b699e | ||
|
|
f83783115f | ||
|
|
ed8aab4d85 | ||
|
|
6bdea98992 | ||
|
|
4a392c74cf | ||
|
|
1ecd786d95 | ||
|
|
1345cbeea8 | ||
|
|
ab23d34dd9 | ||
|
|
907333884f | ||
|
|
6b3d50b2cd | ||
|
|
dcc3505c7b | ||
|
|
0d00d83ef0 | ||
|
|
47dc5f7b54 | ||
|
|
f2598a8b60 | ||
|
|
80de04e560 | ||
|
|
77fd083041 | ||
|
|
22b9a84314 | ||
|
|
f27592a0cd | ||
|
|
3f2339b551 | ||
|
|
eceff8b3c3 | ||
|
|
f3dd1cc51e | ||
|
|
d32a671dff | ||
|
|
ffc9e9503d | ||
|
|
38734eeb45 | ||
|
|
41b1ffdf36 | ||
|
|
eb7d7955e5 | ||
|
|
4411742328 | ||
|
|
7c969f347f | ||
|
|
d08b6bdbf7 | ||
|
|
0b5b4b456c | ||
|
|
1faed9c234 | ||
|
|
59010e53f4 | ||
|
|
cd11345693 | ||
|
|
9616ad9828 | ||
|
|
8ea598b1d1 | ||
|
|
93215674db | ||
|
|
67703b11fe | ||
|
|
a3791aabaa | ||
|
|
cad6798a8c | ||
|
|
c85f5f6db0 | ||
|
|
c36bb79352 | ||
|
|
63d059ab0b | ||
|
|
3aa94d69fb | ||
|
|
4d56296443 | ||
|
|
9b872f4cf9 | ||
|
|
5432c01ffd | ||
|
|
9c69360e97 | ||
|
|
6a6d79fc00 | ||
|
|
c83d421d9e | ||
|
|
2438825d77 | ||
|
|
a257f80d95 | ||
|
|
973c493e1b | ||
|
|
58bd925acc | ||
|
|
8625b394b5 | ||
|
|
47a007a945 | ||
|
|
3d3aae1697 | ||
|
|
2506e53400 | ||
|
|
25d2d47f86 | ||
|
|
4c0eaee5c6 | ||
|
|
cbbe9a5c01 | ||
|
|
7ccc2daf09 | ||
|
|
ef123cc005 | ||
|
|
254670338e | ||
|
|
bf3293a3cb | ||
|
|
4e7c47fb73 | ||
|
|
afea7d19e0 | ||
|
|
fca50dfab3 | ||
|
|
4e2e14addf | ||
|
|
0e15da5b94 | ||
|
|
2774238722 | ||
|
|
0012e9cd54 | ||
|
|
8d0bc0f026 | ||
|
|
81ce889435 | ||
|
|
135d17ce3e | ||
|
|
9962b84659 | ||
|
|
b0b058b767 | ||
|
|
f21a0d0eee | ||
|
|
d52cd11ed2 | ||
|
|
3bd489d315 | ||
|
|
cbabd9c7e1 | ||
|
|
f19abd6725 | ||
|
|
0a5c9c02fa | ||
|
|
155ce40218 | ||
|
|
71a10f2ca1 | ||
|
|
a861ed971e | ||
|
|
bb98bcba91 | ||
|
|
adaffe7761 | ||
|
|
cf7cce6da5 | ||
|
|
aa23159209 | ||
|
|
c63409b078 | ||
|
|
eac893b60b | ||
|
|
a63dbedead | ||
|
|
5c5db5a55f | ||
|
|
7bc25013f0 | ||
|
|
b86b4928d6 | ||
|
|
2cb633b915 | ||
|
|
47457a01f7 | ||
|
|
77c3bf17ca | ||
|
|
168a433352 | ||
|
|
1408c2afeb | ||
|
|
c9ae31c23a | ||
|
|
2ca8490a32 | ||
|
|
2368a92b2d | ||
|
|
498d19243c | ||
|
|
27bf8986f9 | ||
|
|
e03dd5bd64 | ||
|
|
5acd8fe9cb | ||
|
|
e2062f9fa0 | ||
|
|
9f45c8e6e1 | ||
|
|
00879b155a | ||
|
|
366eb49f99 | ||
|
|
4a5a1ec0b4 | ||
|
|
f3c51e4a28 | ||
|
|
b764c60a12 | ||
|
|
62e956e1dd | ||
|
|
d3edb3f27c | ||
|
|
e15a96b333 | ||
|
|
3200e1e088 | ||
|
|
033155ca21 | ||
|
|
e8edb5a809 | ||
|
|
4e230b087e | ||
|
|
a96117f52c | ||
|
|
fff1093227 | ||
|
|
9d23b40c24 | ||
|
|
5c92dec542 | ||
|
|
9dd1cdff66 | ||
|
|
20788d3b90 | ||
|
|
512cbf8ade | ||
|
|
59fa3e920c | ||
|
|
f5ea1b7095 | ||
|
|
64b863cd2a | ||
|
|
a7d604e681 | ||
|
|
977f6eba3d | ||
|
|
8f8061adba | ||
|
|
8409b8f6db | ||
|
|
f2e2833f28 | ||
|
|
332594dd06 | ||
|
|
7de3260017 | ||
|
|
e06092a24e | ||
|
|
57731529dc | ||
|
|
9830f98ff9 | ||
|
|
5aff745c15 | ||
|
|
3af77feaa3 | ||
|
|
fd20a5ae9b | ||
|
|
d3b76572c7 | ||
|
|
6e97410f66 | ||
|
|
b2888db940 | ||
|
|
56a739bf4e | ||
|
|
8f6628ed9f | ||
|
|
660c6e4d70 | ||
|
|
4c93a7cb6f | ||
|
|
9a462393e4 | ||
|
|
138142583e | ||
|
|
571db950d1 | ||
|
|
15c9be10b3 | ||
|
|
d5e3590df7 | ||
|
|
b54498edea | ||
|
|
ba851ccd9f | ||
|
|
6f1af78401 | ||
|
|
798b1613ab | ||
|
|
9fa9ebebc0 | ||
|
|
6735058024 | ||
|
|
9f044c17fa | ||
|
|
d02f246887 | ||
|
|
f1cf90238b | ||
|
|
845b74e6d4 | ||
|
|
e24196eeeb | ||
|
|
234e543afb | ||
|
|
49a56e7688 | ||
|
|
5f59c87604 | ||
|
|
23d3970929 | ||
|
|
27df3a44eb | ||
|
|
a451725242 | ||
|
|
d546f4399f | ||
|
|
38ef3a592c | ||
|
|
caed8f30ee | ||
|
|
2fe7f06a55 | ||
|
|
5b40b01319 | ||
|
|
b93e0326d2 | ||
|
|
2776d5e9e6 | ||
|
|
c3ed437d9e | ||
|
|
b3edc73afa | ||
|
|
105c416007 | ||
|
|
a581556b17 | ||
|
|
d801b3882c | ||
|
|
ed3dfbd25a | ||
|
|
ccadcae40b | ||
|
|
33893095b5 | ||
|
|
5c5f593ffb | ||
|
|
62333ba0cb | ||
|
|
c508081afc | ||
|
|
71c0dd6c4a | ||
|
|
63495a4ba4 | ||
|
|
475074dfb5 | ||
|
|
557b256b32 | ||
|
|
48854aec52 | ||
|
|
f3abb2c352 | ||
|
|
88910f5b9d | ||
|
|
a60f8a9c1f | ||
|
|
10973a581f | ||
|
|
a655407f1b | ||
|
|
a9b4f16b04 | ||
|
|
6612114f86 | ||
|
|
66676016f6 | ||
|
|
e5900f1bc9 | ||
|
|
85497d7a4b | ||
|
|
5393915bf6 | ||
|
|
f197d6d0f6 | ||
|
|
4fa1816cf6 | ||
|
|
1c91ab2586 | ||
|
|
f0eda4e8d7 | ||
|
|
a0de64f3c3 | ||
|
|
7e1fabe2f7 | ||
|
|
79b2d64a67 | ||
|
|
e34f80e5aa | ||
|
|
bc363eca41 | ||
|
|
d233287325 | ||
|
|
c127057f7d | ||
|
|
9a75d99438 | ||
|
|
e9c395a3bf | ||
|
|
4f5b846bb4 | ||
|
|
79bdad205f | ||
|
|
94b582e45e | ||
|
|
1b49a71df4 | ||
|
|
209eee579a | ||
|
|
83b4fc4af4 | ||
|
|
b0876110ca | ||
|
|
110c9367bd | ||
|
|
bab8df881a | ||
|
|
e89d33ab3d | ||
|
|
0c3fea306a | ||
|
|
a2218a4b6d | ||
|
|
4f8e7e5f41 | ||
|
|
e197cded79 | ||
|
|
bcb3aac3c5 | ||
|
|
9a5c1c180f | ||
|
|
39515c9ee0 | ||
|
|
8ca1700976 | ||
|
|
fded04fbf6 | ||
|
|
9c69091c9d | ||
|
|
4554a54a6c | ||
|
|
8c69d7bc63 | ||
|
|
0c57414490 | ||
|
|
2f70282295 | ||
|
|
55f71781d8 | ||
|
|
925d23b32a | ||
|
|
4e4876104d | ||
|
|
0717029581 | ||
|
|
a774c5de84 | ||
|
|
a041ae4cde | ||
|
|
7d3e6732fb | ||
|
|
07d9fc9478 | ||
|
|
be6f0c2c50 | ||
|
|
a7119547e2 | ||
|
|
c97cf70bc7 | ||
|
|
4f108d8af6 | ||
|
|
f45a345adb | ||
|
|
54872297d3 | ||
|
|
8c66786419 | ||
|
|
15333cd28d | ||
|
|
b5b38edf30 | ||
|
|
9b362b1e4f | ||
|
|
4befef0c18 | ||
|
|
438b3caedb | ||
|
|
9b780b8add | ||
|
|
0f21161e51 | ||
|
|
db712a93b4 | ||
|
|
f18a0ed39b | ||
|
|
92ac4fc237 | ||
|
|
21af4cc914 | ||
|
|
949d46c7ba | ||
|
|
921d91576a | ||
|
|
8c037305e4 | ||
|
|
a7866f7b95 | ||
|
|
b5a53da717 | ||
|
|
c08cae1c22 | ||
|
|
4aa2cd69ae | ||
|
|
3b5d695583 | ||
|
|
67439c4701 | ||
|
|
a313751258 | ||
|
|
11966d9c55 | ||
|
|
ea2f7e07d7 | ||
|
|
e600c51355 | ||
|
|
21b4b339d9 | ||
|
|
7de0534490 | ||
|
|
70c8d32f2e | ||
|
|
08c2e81ac2 | ||
|
|
2a718a3f53 | ||
|
|
363f96e717 | ||
|
|
9f65059a5b | ||
|
|
b757b1b5ee | ||
|
|
a85264b1fc | ||
|
|
ad18363852 | ||
|
|
836fe66e24 | ||
|
|
d4028b4373 | ||
|
|
d3a726db0d | ||
|
|
3e71719502 | ||
|
|
2c700f970c | ||
|
|
77396b63f9 | ||
|
|
21c1f06ef9 | ||
|
|
3df324d845 | ||
|
|
c27291d4e3 | ||
|
|
bdabd8f75b | ||
|
|
48dc6ebf5c | ||
|
|
4009a76e97 | ||
|
|
459432a1b8 | ||
|
|
33d8c2a1dd | ||
|
|
4eb18e9ca2 | ||
|
|
dd80757941 | ||
|
|
b4e6997999 | ||
|
|
53c7502663 | ||
|
|
1e7d7d3cbf | ||
|
|
7b81e2e747 | ||
|
|
f3d53796af | ||
|
|
0fb715a904 | ||
|
|
233357ef0e | ||
|
|
b9109e8254 | ||
|
|
6679d7c0b1 | ||
|
|
dbe0c9d8c7 | ||
|
|
f01459fd40 | ||
|
|
11a5687b72 | ||
|
|
6c47e84d2e | ||
|
|
2be8b64af2 | ||
|
|
a7a76a674f | ||
|
|
29034c5076 | ||
|
|
31aee0d0c0 | ||
|
|
d7aa6aa916 | ||
|
|
915bab5fc7 | ||
|
|
5fd46fb8f7 | ||
|
|
c182d55fc5 | ||
|
|
11a6f58528 | ||
|
|
d9d4cecaad | ||
|
|
f1202087f8 | ||
|
|
39a8bb71d3 | ||
|
|
0ee51445f6 | ||
|
|
8f9de7acbd | ||
|
|
aa4e359f62 | ||
|
|
289500ab8d | ||
|
|
73e28ef13d | ||
|
|
6cac43c974 | ||
|
|
82980f31d9 | ||
|
|
a691ca0f85 | ||
|
|
a42edec9ef | ||
|
|
a272d8fe3d | ||
|
|
a81c59a960 | ||
|
|
4db344230d | ||
|
|
821b7106b2 | ||
|
|
ef3831a1fe | ||
|
|
5feb87cd0e | ||
|
|
57d9617964 | ||
|
|
78d55454aa | ||
|
|
5b3d554e1e | ||
|
|
53c07f5909 | ||
|
|
537c1a5747 | ||
|
|
f24daf23a5 | ||
|
|
198d836483 | ||
|
|
d05f3728de | ||
|
|
2b8bef1d15 | ||
|
|
98914f74bf | ||
|
|
aa3143cf6f | ||
|
|
1f1becf87f | ||
|
|
259f12628e | ||
|
|
b621794ed5 | ||
|
|
a0b0d8b9db | ||
|
|
f10fa3c9f4 | ||
|
|
4a4de1899a | ||
|
|
cf2fd3b6ca | ||
|
|
1ce8133282 | ||
|
|
5905484c75 | ||
|
|
cb096a4f05 | ||
|
|
b7e1abe25c | ||
|
|
d24a6b5fd0 | ||
|
|
e3e8f6bf02 | ||
|
|
cd74549840 | ||
|
|
34713ce23c | ||
|
|
bb317fb0b2 | ||
|
|
deec549d9f | ||
|
|
d026f9cce6 | ||
|
|
cd01d222fb | ||
|
|
9c5beb56e3 | ||
|
|
810c2e6077 | ||
|
|
d35b878b5e | ||
|
|
5a36a3379b | ||
|
|
1ebd001fb4 | ||
|
|
18b897da9c | ||
|
|
d3bb6bb5c1 | ||
|
|
25ea204b1b | ||
|
|
7b52087998 | ||
|
|
b56e0d06f9 | ||
|
|
304a1a1754 | ||
|
|
9ee577c7f5 | ||
|
|
c3d73f4da9 | ||
|
|
1ff571914c | ||
|
|
40f7bcc3c0 | ||
|
|
9e023307b9 | ||
|
|
8b1b1219e5 | ||
|
|
5623f781bc | ||
|
|
7efdbaf320 | ||
|
|
98eb24c726 | ||
|
|
8bdfb47d8c | ||
|
|
aecef098f9 | ||
|
|
8c065ddbe6 | ||
|
|
6ff9ec81c5 | ||
|
|
9d976c0ef1 | ||
|
|
8fc3604418 | ||
|
|
bb6d66e8ef | ||
|
|
114f675bd7 | ||
|
|
c9cd65ad7a | ||
|
|
8027fed7d1 | ||
|
|
f90165b452 | ||
|
|
5e69cd2c14 | ||
|
|
5eb5cce173 | ||
|
|
725314432d | ||
|
|
98b4f0032b | ||
|
|
294e380438 | ||
|
|
862cb20ea6 | ||
|
|
3cd7cffd0c | ||
|
|
0f0a19e9ce | ||
|
|
6098807252 | ||
|
|
54ac9a918e | ||
|
|
f136155383 | ||
|
|
c2fa196d14 | ||
|
|
3e42a99cf5 | ||
|
|
92a3ef4a14 | ||
|
|
946c3f985f | ||
|
|
dd78d526d0 | ||
|
|
9ba962665d | ||
|
|
844a3c050c | ||
|
|
b07e8568ee | ||
|
|
b2eacd3e1f | ||
|
|
7e597910fd | ||
|
|
4c8f7269ff | ||
|
|
8069aeb88e | ||
|
|
c551c0dbb3 | ||
|
|
b92e2f7335 | ||
|
|
42928551cf | ||
|
|
53198fb8b1 | ||
|
|
4a215541e7 | ||
|
|
d00bbb29b8 | ||
|
|
2bc7abfaca | ||
|
|
882340c959 | ||
|
|
c44253fa0c | ||
|
|
d7da8bb121 | ||
|
|
1a0e1d27e4 | ||
|
|
a528fba7aa | ||
|
|
eae8e36ec4 | ||
|
|
69dd5f56f8 | ||
|
|
300c8aea4d | ||
|
|
d0e35cdb53 | ||
|
|
526a6ad5f6 | ||
|
|
2f7cbabfda | ||
|
|
c6fecfbaa5 | ||
|
|
632a84eff7 | ||
|
|
31f92b0ffa | ||
|
|
f70645c592 | ||
|
|
dc6182a307 | ||
|
|
f2c99bd5dc | ||
|
|
afa999d446 | ||
|
|
3919f23a69 | ||
|
|
c957b6b0a4 | ||
|
|
86f88ddd53 | ||
|
|
c17c957f95 | ||
|
|
c3cd22b404 | ||
|
|
b709c4aedc | ||
|
|
aaf377c874 | ||
|
|
e4c706af54 | ||
|
|
6f6a91a131 | ||
|
|
e8b1aa0c5a | ||
|
|
d4df36c7f0 | ||
|
|
a565f0e234 | ||
|
|
72cda2db72 | ||
|
|
16908a1d78 | ||
|
|
da30135c4c | ||
|
|
45624d6c2c | ||
|
|
4e763f1b30 | ||
|
|
7fb32a8621 | ||
|
|
3ea36758ef | ||
|
|
262d0ff047 | ||
|
|
65a223794a | ||
|
|
6c2e919c7e | ||
|
|
d259e6c570 | ||
|
|
4531ded5c1 | ||
|
|
95ca51b6e2 | ||
|
|
a24fc2e1d3 | ||
|
|
69e238b098 | ||
|
|
64af5394f5 | ||
|
|
1beadafcc7 | ||
|
|
81dab093fc | ||
|
|
6a9e480512 | ||
|
|
f98726ae98 | ||
|
|
946199e8e4 | ||
|
|
cce6521a9f | ||
|
|
63ee896ab5 | ||
|
|
9e966cadbd | ||
|
|
7a5be53631 | ||
|
|
6e283234c9 | ||
|
|
288ea702f2 | ||
|
|
ee4eb9a910 | ||
|
|
9d51afcacb | ||
|
|
389c1f20ad | ||
|
|
4748a3346e | ||
|
|
9b0956fed1 | ||
|
|
7d1f5914e5 | ||
|
|
2f84504413 | ||
|
|
42f93fb706 | ||
|
|
f97953181a | ||
|
|
3f506b788e | ||
|
|
db5f4307ca | ||
|
|
b9a78bedee | ||
|
|
f0cdbe7e03 | ||
|
|
42c4ebbea6 | ||
|
|
f1eb918dc8 | ||
|
|
3c6df196b5 | ||
|
|
0014f3de55 | ||
|
|
e00ed36d71 | ||
|
|
c40df89cef | ||
|
|
e3f3c4ea0b | ||
|
|
67a83db98d | ||
|
|
a0e0c6c8e7 | ||
|
|
a58818a079 | ||
|
|
e69b55d9ac | ||
|
|
a515d3066e | ||
|
|
45af819322 | ||
|
|
f81b50bf9d | ||
|
|
e52c7ac7a3 | ||
|
|
5ce838be40 | ||
|
|
a687af1e72 | ||
|
|
70529c3b40 | ||
|
|
dbcfb7151f | ||
|
|
6ba9088de9 | ||
|
|
7520224a42 | ||
|
|
296f64a43e | ||
|
|
d44e05a363 | ||
|
|
5265c3889c | ||
|
|
62ca98ef5e | ||
|
|
094340d287 | ||
|
|
addb84b1bc | ||
|
|
ffa8924330 | ||
|
|
0452bbcf84 | ||
|
|
7a59e1eae8 | ||
|
|
3da965ce4b | ||
|
|
f633e33632 | ||
|
|
914a7e3d4f | ||
|
|
d84af669dc | ||
|
|
451fd6c439 | ||
|
|
316152fe73 | ||
|
|
03f9b02953 | ||
|
|
ce96c3e6b7 | ||
|
|
133840ba4b | ||
|
|
e4b9fc28de | ||
|
|
5876b850b2 | ||
|
|
4cfdb3c095 | ||
|
|
b2154ccb2b | ||
|
|
5a2015e146 | ||
|
|
d23f2b2845 | ||
|
|
9d172423df | ||
|
|
ec29c6507b | ||
|
|
768429bbc1 | ||
|
|
2a087220dd | ||
|
|
bbd20f0a74 | ||
|
|
eae2cf0add | ||
|
|
ae3a70351c | ||
|
|
52f4f257c9 | ||
|
|
931400bd04 | ||
|
|
1e6ed7364b | ||
|
|
4a72ebfafa | ||
|
|
f4ea22480a | ||
|
|
eddc5af8f5 | ||
|
|
edcd6e14c6 | ||
|
|
311c8476f8 | ||
|
|
e5403da657 | ||
|
|
a7eda24870 | ||
|
|
bda72552bf | ||
|
|
a02188ae94 | ||
|
|
5b7d8ff306 | ||
|
|
cd7d63a805 | ||
|
|
9d27a1becf | ||
|
|
c00408a4e5 | ||
|
|
bb0f557859 | ||
|
|
ac18f8a706 | ||
|
|
a2aebb551e | ||
|
|
354bdb0d58 | ||
|
|
8e3389e574 | ||
|
|
0dfd8d379b | ||
|
|
3c38651e8c | ||
|
|
22ad8f0e7a | ||
|
|
76a64f4491 | ||
|
|
5741bac1c6 | ||
|
|
8590d46785 | ||
|
|
71cff967a9 | ||
|
|
b612eee957 | ||
|
|
28d4aae5b9 | ||
|
|
11313ba8e7 | ||
|
|
d708cb8360 | ||
|
|
78c419c698 | ||
|
|
3f2b6a67d1 | ||
|
|
9ef984d168 | ||
|
|
fa557347ba | ||
|
|
1c6959cfbe | ||
|
|
be199c1304 | ||
|
|
51633b7bd7 | ||
|
|
0acc99fdcd | ||
|
|
f210a05c37 | ||
|
|
9d57241790 | ||
|
|
30ec56c8d3 | ||
|
|
ce00e7de36 | ||
|
|
4e1e199da8 | ||
|
|
7336dd4a97 | ||
|
|
03c1bf96b2 | ||
|
|
ef07ed3bf8 | ||
|
|
197c2f3244 | ||
|
|
bdbade92a7 | ||
|
|
b0dd0ad7af | ||
|
|
95a15f7a83 | ||
|
|
fd10753fd8 | ||
|
|
d88da23cbd | ||
|
|
d5513a7490 | ||
|
|
3d7e15f353 | ||
|
|
ec3f949874 | ||
|
|
884297323d | ||
|
|
015289e21d | ||
|
|
17ca34034b | ||
|
|
44db6e39c3 | ||
|
|
013d1d68c0 | ||
|
|
69b0bc089a | ||
|
|
0dd4a43f49 | ||
|
|
727d3d7463 | ||
|
|
c2fb9ec3fa | ||
|
|
9a4ed98618 | ||
|
|
58c4f6b355 | ||
|
|
d29033f264 | ||
|
|
047c34b734 | ||
|
|
649f741e71 | ||
|
|
d740c8425e | ||
|
|
9038c3bc48 | ||
|
|
74b5acc35d | ||
|
|
45b8761bc8 | ||
|
|
cef4f14470 | ||
|
|
53651229b5 | ||
|
|
555126e06f | ||
|
|
163fd0a3e8 | ||
|
|
ef9c0e9b19 | ||
|
|
65d235a5db | ||
|
|
0cb46e200c | ||
|
|
3ce2146941 | ||
|
|
33023522ba | ||
|
|
d6ea40a7f0 | ||
|
|
99106deaa2 | ||
|
|
34a2ebdc4f | ||
|
|
418783e760 | ||
|
|
07def6f68b | ||
|
|
8f5846f86d | ||
|
|
f298db9762 | ||
|
|
ef29a5e827 | ||
|
|
8fe28948ca | ||
|
|
ee35abbcd0 | ||
|
|
e108e19daf | ||
|
|
733da8cc46 |
643
ANNOUNCE
@@ -1,592 +1,93 @@
|
|||||||
|
|
||||||
Libpng 1.4.0beta87 - October 30, 2009
|
Libpng 1.6.10 - March 6, 2014
|
||||||
|
|
||||||
This is not intended to be a public release. It will be replaced
|
This is a public release of libpng, intended for use in production codes.
|
||||||
within a few weeks by a public version or by another test version.
|
|
||||||
|
|
||||||
Files available for download:
|
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.4.0beta87.tar.xz (LZMA-compressed, recommended)
|
libpng-1.6.10.tar.xz (LZMA-compressed, recommended)
|
||||||
1.4.0beta87.tar.gz
|
libpng-1.6.10.tar.gz
|
||||||
1.4.0beta87.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
|
||||||
|
|
||||||
lp140b87.zip
|
lpng1610.7z (LZMA-compressed, recommended)
|
||||||
lp140b87.7z
|
lpng1610.zip
|
||||||
|
|
||||||
Other information:
|
Other information:
|
||||||
|
|
||||||
1.4.0beta87-README.txt
|
libpng-1.6.10-README.txt
|
||||||
1.4.0beta87-LICENSE.txt
|
libpng-1.6.10-LICENSE.txt
|
||||||
|
libpng-1.6.10-*.asc (armored detached GPG signatures)
|
||||||
Changes since the last public release (1.2.10):
|
|
||||||
|
Changes since the last public release (1.6.9):
|
||||||
version 1.2.10beta1 [April 15, 2006]
|
Backported changes from libpng-1.7.0beta30 and beta31:
|
||||||
Renamed "config.h" to "png_conf.h" and revised Makefile.am to add
|
Fixed a large number of instances where PNGCBAPI was omitted from
|
||||||
-DPNG_BUILDING_LIBPNG to compile directive, and modified pngconf.h
|
function definitions.
|
||||||
to include png_conf.h only when PNG_BUILDING_LIBPNG is defined.
|
Added pngimage test program for png_read_png() and png_write_png()
|
||||||
|
with two new test scripts.
|
||||||
version 1.2.10beta2 [April 15, 2006]
|
Removed dependence on !PNG_READ_EXPAND_SUPPORTED for calling
|
||||||
Manually updated Makefile.in and configure. Changed png_conf.h.in
|
png_set_packing() in png_read_png().
|
||||||
back to config.h.
|
Fixed combination of ~alpha with shift. On read invert alpha, processing
|
||||||
|
occurred after shift processing, which causes the final values to be
|
||||||
version 1.2.10beta3 [April 15, 2006]
|
outside the range that should be produced by the shift. Reversing the
|
||||||
Change png_conf.h back to config.h in pngconf.h.
|
order on read makes the two transforms work together correctly and mirrors
|
||||||
|
the order used on write.
|
||||||
version 1.2.10beta4 [April 16, 2006]
|
Do not read invalid sBIT chunks. Previously libpng only checked sBIT
|
||||||
Change PNG_BUILDING_LIBPNG to PNG_CONFIGURE_LIBPNG in config/Makefile*.
|
values on write, so a malicious PNG writer could therefore cause
|
||||||
|
the read code to return an invalid sBIT chunk, which might lead to
|
||||||
version 1.2.10beta5 [April 16, 2006]
|
application errors or crashes. Such chunks are now skipped (with
|
||||||
Added a configure check for compiling assembler code in pnggccrd.c
|
chunk_benign_error).
|
||||||
|
Make png_read_png() and png_write_png() prototypes in png.h depend
|
||||||
version 1.2.10beta6 [April 17, 2006]
|
upon PNG_READ_SUPPORTED and PNG_WRITE_SUPPORTED.
|
||||||
Revised the configure check for pnggccrd.c
|
Support builds with unsupported PNG_TRANSFORM_* values. All of the
|
||||||
Moved -DPNG_CONFIGURE_LIBPNG into @LIBPNG_DEFINES@
|
PNG_TRANSFORM_* values are always defined in png.h and, because they
|
||||||
Added @LIBPNG_DEFINES@ to arguments when building libpng.sym
|
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
|
||||||
version 1.2.10beta7 [April 18, 2006]
|
detection in png_read_image() and png_write_image() to do a
|
||||||
Change "exec_prefix=$prefix" to "exec_prefix=$(prefix)" in makefiles.
|
png_app_error() if the app requests something that cannot be done
|
||||||
|
and it adds corresponding code to pngimage.c to handle such options
|
||||||
version 1.2.10rc1 [April 19, 2006]
|
by not attempting to test them.
|
||||||
Ensure pngconf.h doesn't define both PNG_USE_PNGGCCRD and PNG_USE_PNGVCRD
|
Moved redefines of png_error(), png_warning(), png_chunk_error(),
|
||||||
Fixed "LN_FS" typo in makefile.sco and makefile.solaris.
|
and png_chunk_warning() from pngpriv.h to png.h to make them visible
|
||||||
|
to libpng-calling applications.
|
||||||
version 1.2.10rc2 [April 19, 2006]
|
Moved OS dependent code from arm/arm_init.c, to allow the included
|
||||||
Added a backslash between -DPNG_CONFIGURE_LIBPNG and -DPNG_NO_ASSEMBLER_CODE
|
implementation of the ARM NEON discovery function to be set at
|
||||||
in configure.ac
|
build-time and provide sample implementations from the current code in the
|
||||||
Made the configure warning about versioned symbols less arrogant.
|
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
|
||||||
version 1.2.10rc3 [April 20, 2006]
|
is in contrib/arm-neon/linux-auxv.c. The new code avoids POSIX and Linux
|
||||||
Added a note in libpng.txt that png_set_sig_bytes(8) can be used when
|
dependencies apart from opening /proc/cpuinfo and is C90 compliant.
|
||||||
writing an embedded PNG without the 8-byte signature.
|
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.
|
||||||
version 1.4.0beta1 [April 20, 2006]
|
This improves the performance of png_read_end(png_ptr, NULL) and makes
|
||||||
Enabled iTXt support (changes png_struct, thus requires so-number change).
|
it more robust against future programming errors.
|
||||||
Cleaned up PNG_ASSEMBLER_CODE_SUPPORTED vs PNG_MMX_CODE_SUPPORTED
|
Check for __has_extension before using it in pngconf.h, to
|
||||||
Eliminated PNG_1_0_X and PNG_1_2_X macros.
|
support older Clang versions (Jeremy Sequoia).
|
||||||
Removed deprecated functions png_read_init, png_write_init, png_info_init,
|
Treat CRC error handling with png_set_crc_action(), instead of with
|
||||||
png_permit_empty_plte, png_set_gray_1_2_4_to_8, and removed the
|
png_set_benign_errors(), which has been the case since libpng-1.6.0beta18.
|
||||||
deprecated macro PNG_MAX_UINT.
|
Use a user warning handler in contrib/gregbook/readpng2.c instead of default,
|
||||||
Moved "PNG_INTERNAL" parts of png.h and pngconf.h into pngintrn.h
|
so warnings will be put on stderr even if libpng has CONSOLE_IO disabled.
|
||||||
Removed many WIN32_WCE #ifdefs (Cosmin).
|
Added png_ptr->process_mode = PNG_READ_IDAT_MODE in png_push_read_chunk
|
||||||
Reduced dependency on C-runtime library when on Windows (Simon-Pierre)
|
after recognizing the IDAT chunk, which avoids an infinite loop while
|
||||||
Replaced sprintf() with png_sprintf() (Simon-Pierre)
|
reading a datastream whose first IDAT chunk is of zero-length.
|
||||||
|
This fixes CERT VU#684412 and CVE-2014-0333.
|
||||||
version 1.4.0beta2 [April 20, 2006]
|
Don't recognize known sRGB profiles as sRGB if they have been hacked,
|
||||||
Revised makefiles to avoid making links to libpng.so.*
|
but don't reject them and don't issue a copyright violation warning.
|
||||||
Moved some leftover MMX-related defines from pngconf.h to pngintrn.h
|
Moved some documentation from png.h to libpng.3 and libpng-manual.txt
|
||||||
Updated scripts/pngos2.def, pngw32.def, and projects/wince/png32ce.def
|
Minor editing of contrib/arm-neon/README and contrib/examples/*.c
|
||||||
Updated scripts/pngw32.def to comment out MMX functions.
|
Fixed typos in the manual and in scripts/pnglibconf.dfa (CFLAGS -> CPPFLAGS
|
||||||
|
and PNG_USR_CONFIG -> PNG_USER_CONFIG).
|
||||||
version 1.2.11beta1 [May 31, 2006]
|
Un-deprecated png_data_freer().
|
||||||
scripts/libpng.pc.in contained "configure" style version info and would
|
|
||||||
not work with makefiles.
|
|
||||||
The shared-library makefiles were linking to libpng.so.0 instead of
|
|
||||||
libpng.so.3 compatibility as the library.
|
|
||||||
|
|
||||||
version 1.4.0beta3 [May 10, 2006]
|
|
||||||
Updated scripts/pngw32.def to comment out MMX functions.
|
|
||||||
Added PNG_NO_GET_INT_32 and PNG_NO_SAVE_INT_32 macros.
|
|
||||||
Revised pngconf.h and added pngconf.h.in so makefiles and configure can
|
|
||||||
pass defines to libpng and applications.
|
|
||||||
|
|
||||||
version 1.4.0beta4 [May 11, 2006]
|
|
||||||
Revised configure.ac, Makefile.am, and many of the makefiles to write
|
|
||||||
their defines in pngconf.h.
|
|
||||||
|
|
||||||
version 1.4.0beta5 [May 15, 2006]
|
|
||||||
Added a missing semicolon in Makefile.am and Makefile.in
|
|
||||||
Deleted extraneous square brackets from configure.ac
|
|
||||||
|
|
||||||
version 1.2.11beta2 [June 2, 2006]
|
|
||||||
Increased sprintf buffer from 50 to 52 chars in pngrutil.c to avoid
|
|
||||||
buffer overflow.
|
|
||||||
Fixed bug in example.c (png_set_palette_rgb -> png_set_palette_to_rgb))
|
|
||||||
|
|
||||||
version 1.4.0beta6 [June 2, 2006]
|
|
||||||
Changed sonum from 0 to 1.
|
|
||||||
Removed unused prototype for png_check_sig() from png.h
|
|
||||||
|
|
||||||
version 1.2.11beta3 [June 5, 2006]
|
|
||||||
Prepended "#! /bin/sh" to ltmail.sh and contrib/pngminus/*.sh (Cosmin).
|
|
||||||
Removed the accidental leftover Makefile.in~ (Cosmin).
|
|
||||||
Avoided potential buffer overflow and optimized buffer in
|
|
||||||
png_write_sCAL(), png_write_sCAL_s() (Cosmin).
|
|
||||||
Removed the include directories and libraries from CFLAGS and LDFLAGS
|
|
||||||
in scripts/makefile.gcc (Nelson A. de Oliveira, Cosmin).
|
|
||||||
|
|
||||||
version 1.2.11beta4 [June 6, 2006]
|
|
||||||
Allow zero-length IDAT chunks after the entire zlib datastream, but not
|
|
||||||
after another intervening chunk type.
|
|
||||||
|
|
||||||
version 1.2.11rc2 [June 14, 2006]
|
|
||||||
Added prototypes for PNG_INCH_CONVERSIONS functions to png.h
|
|
||||||
Revised INSTALL and autogen.sh
|
|
||||||
Fixed typo in several makefiles (-W1 should be -Wl)
|
|
||||||
|
|
||||||
version 1.2.11rc3 [June 15, 2006]
|
|
||||||
Added one zero element to png_gamma_shift[] array in pngrtran.c to avoid
|
|
||||||
reading out of bounds.
|
|
||||||
|
|
||||||
version 1.4.0beta7 [June 16, 2006]
|
|
||||||
Exported png_write_sig (Cosmin).
|
|
||||||
Optimized buffer in png_handle_cHRM() (Cosmin).
|
|
||||||
Set pHYs = 2835 x 2835 pixels per meter, and added
|
|
||||||
sCAL = 0.352778e-3 x 0.352778e-3 meters, in pngtest.png (Cosmin).
|
|
||||||
Added png_set_benign_errors(), png_benign_error(), png_chunk_benign_error().
|
|
||||||
Added typedef for png_int_32 and png_uint_32 on 64-bit systems.
|
|
||||||
|
|
||||||
version 1.4.0beta8 [June 21, 2006]
|
|
||||||
Added demonstration of user chunk support in pngtest.c, to support the
|
|
||||||
public sTER chunk and a private vpAg chunk.
|
|
||||||
|
|
||||||
version 1.4.0beta9 [July 3, 2006]
|
|
||||||
Removed ordinals from scripts/pngw32.def and removed png_info_int and
|
|
||||||
png_set_gray_1_2_4_to_8 entries.
|
|
||||||
Inline call of png_get_uint_32() in png_get_uint_31().
|
|
||||||
Use png_get_uint_31() to get vpAg width and height in pngtest.c
|
|
||||||
Removed WINCE and Netware projects.
|
|
||||||
Removed standalone Y2KINFO file.
|
|
||||||
|
|
||||||
version 1.4.0beta10 [July 12, 2006]
|
|
||||||
Added "all: pngconf.h.in pngconf.h" target to Makefile.am
|
|
||||||
|
|
||||||
version 1.4.0beta11 [August 19, 2006]
|
|
||||||
Removed AC_FUNC_MALLOC from configure.ac.
|
|
||||||
Added a warning when writing iCCP profile with mismatched profile length.
|
|
||||||
Patched pnggccrd.c to assemble on x86_64 platforms.
|
|
||||||
Moved chunk header reading into a separate function png_read_chunk_header()
|
|
||||||
in pngrutil.c. The chunk header (len+sig) is now serialized in a single
|
|
||||||
operation (Cosmin).
|
|
||||||
Implemented support for I/O states. Added png_ptr member io_state, and
|
|
||||||
functions png_get_io_chunk_name() and png_get_io_state() in pngget.c
|
|
||||||
(Cosmin).
|
|
||||||
Added png_get_io_chunk_name and png_get_io_state to scripts/*.def (Cosmin).
|
|
||||||
Renamed scripts/pngw32.* to scripts/pngwin.* (Cosmin).
|
|
||||||
Removed the include directories and libraries from CFLAGS and LDFLAGS
|
|
||||||
in scripts/makefile.gcc (Cosmin).
|
|
||||||
Used png_save_uint_32() to set vpAg width and height in pngtest.c (Cosmin).
|
|
||||||
Cast to proper type when getting/setting vpAg units in pngtest.c (Cosmin).
|
|
||||||
Added pngintrn.h to the Visual C++ projects (Cosmin).
|
|
||||||
Removed scripts/list (Cosmin).
|
|
||||||
Updated copyright year in scripts/pngwin.def (Cosmin).
|
|
||||||
Removed PNG_TYPECAST_NULL and used standard NULL consistently (Cosmin).
|
|
||||||
Disallowed the user to redefine png_size_t, and enforced a consistent use
|
|
||||||
of png_size_t across libpng (Cosmin).
|
|
||||||
Changed the type of png_ptr->rowbytes, PNG_ROWBYTES() and friends
|
|
||||||
to png_size_t (Cosmin).
|
|
||||||
Removed png_convert_size() and replaced png_sizeof with sizeof (Cosmin).
|
|
||||||
Removed some unnecessary type casts (Cosmin).
|
|
||||||
Changed prototype of png_get_compression_buffer_size() and
|
|
||||||
png_set_compression_buffer_size() to work with png_size_t instead of
|
|
||||||
png_uint_32 (Cosmin).
|
|
||||||
Removed png_memcpy_check() and png_memset_check() (Cosmin).
|
|
||||||
Fixed a typo (png_byte --> png_bytep) in libpng.3 and libpng.txt (Cosmin).
|
|
||||||
Clarified that png_zalloc() does not clear the allocated memory,
|
|
||||||
and png_zalloc() and png_zfree() cannot be PNGAPI (Cosmin).
|
|
||||||
Renamed png_mem_size_t to png_alloc_size_t, fixed its definition in
|
|
||||||
pngconf.h, and used it in all memory allocation functions (Cosmin).
|
|
||||||
Renamed pngintrn.h to pngpriv.h, added a comment at the top of the file
|
|
||||||
mentioning that the symbols declared in that file are private, and
|
|
||||||
updated the scripts and the Visual C++ projects accordingly (Cosmin).
|
|
||||||
Removed circular references between pngconf.h and pngconf.h.in in
|
|
||||||
scripts/makefile.vc*win32 (Cosmin).
|
|
||||||
Removing trailing '.' from the warning and error messages (Cosmin).
|
|
||||||
Added pngdefs.h that is built by makefile or configure, instead of
|
|
||||||
pngconf.h.in (Glenn).
|
|
||||||
Detect and fix attempt to write wrong iCCP profile length.
|
|
||||||
|
|
||||||
version 1.4.0beta12 [October 19, 2006]
|
|
||||||
Changed "logical" to "bitwise" in the documentation.
|
|
||||||
Work around Intel-Mac compiler bug by setting PNG_NO_MMX_CODE in pngconf.h
|
|
||||||
Add a typecast to stifle compiler warning in pngrutil.c
|
|
||||||
|
|
||||||
version 1.4.0beta13 [November 10, 2006]
|
|
||||||
Fix potential buffer overflow in sPLT chunk handler.
|
|
||||||
Fix Makefile.am to not try to link to noexistent files.
|
|
||||||
|
|
||||||
version 1.4.0beta14 [November 15, 2006]
|
|
||||||
Check all exported functions for NULL png_ptr.
|
|
||||||
|
|
||||||
version 1.4.0beta15 [November 17, 2006]
|
|
||||||
Relocated two misplaced tests for NULL png_ptr.
|
|
||||||
Built Makefile.in with automake-1.9.6 instead of 1.9.2.
|
|
||||||
Build configure with autoconf-2.60 instead of 2.59.
|
|
||||||
Add "install: all" in Makefile.am so "configure; make install" will work.
|
|
||||||
|
|
||||||
version 1.4.0beta16 [November 17, 2006]
|
|
||||||
Added a typecast in png_zalloc().
|
|
||||||
|
|
||||||
version 1.4.0beta17 [December 4, 2006]
|
|
||||||
Changed "new_key[79] = '\0';" to "(*new_key)[79] = '\0';" in pngwutil.c
|
|
||||||
|
|
||||||
version 1.4.0beta18 [December 7, 2006]
|
|
||||||
Added scripts/CMakeLists.txt
|
|
||||||
|
|
||||||
version 1.4.0beta19 [May 16, 2007]
|
|
||||||
Revised scripts/CMakeLists.txt
|
|
||||||
Rebuilt configure and Makefile.in with newer tools.
|
|
||||||
Added "png_ptr->num_trans=0" before error return in png_handle_tRNS,
|
|
||||||
to eliminate a vulnerability (CVE-2007-2554, CERT VU#684664)
|
|
||||||
|
|
||||||
version 1.4.0beta20 [July 9, 2008]
|
|
||||||
Moved several PNG_HAVE_* macros from pngpriv.h to png.h because applications
|
|
||||||
calling set_unknown_chunk_location() need them.
|
|
||||||
Moved several macro definitions from pngpriv.h to pngconf.h
|
|
||||||
Added png_ptr->unknown_chunk to hold working unknown chunk data, so it
|
|
||||||
can be free'ed in case of error. Revised unknown chunk handling in
|
|
||||||
pngrutil.c and pngpread.c to use this structure.
|
|
||||||
Merge with changes to the 1.2.X branch, as of 1.2.19beta10.
|
|
||||||
Revised makefile.mingw
|
|
||||||
Prefer PNG_USE_PNGVCRD when _MSC_VER is defined in pngconf.h
|
|
||||||
|
|
||||||
version 1.4.0beta21 [July 21, 2008]
|
|
||||||
Moved local array "chunkdata" from pngrutil.c to the png_struct, so
|
|
||||||
it will be freed by png_read_destroy() in case of a read error (Kurt
|
|
||||||
Christensen).
|
|
||||||
|
|
||||||
version 1.4.0beta22 [July 21, 2008]
|
|
||||||
Change "purpose" and "buffer" to png_ptr->chunkdata to avoid memory leaking.
|
|
||||||
|
|
||||||
version 1.4.0beta23 [July 22, 2008]
|
|
||||||
Change "chunkdata = NULL" to "png_ptr->chunkdata = NULL" several places in
|
|
||||||
png_decompress_chunk().
|
|
||||||
|
|
||||||
version 1.4.0beta24 [July 25, 2008]
|
|
||||||
Change all remaining "chunkdata" to "png_ptr->chunkdata" in
|
|
||||||
png_decompress_chunk(), and remove "chunkdata" from parameter list.
|
|
||||||
Put a call to png_check_chunk_name() in png_read_chunk_header().
|
|
||||||
Revised png_check_chunk_name() to reject a name with a lowercase 3rd byte.
|
|
||||||
Removed two calls to png_check_chunk_name() occuring later in the process.
|
|
||||||
Define PNG_NO_ERROR_NUMBERS by default in pngconf.h
|
|
||||||
|
|
||||||
version 1.4.0beta25 [July 30, 2008]
|
|
||||||
Added a call to png_check_chunk_name() in pngpread.c
|
|
||||||
Reverted png_check_chunk_name() to accept a name with a lowercase 3rd byte.
|
|
||||||
Added png_push_have_buffer() function to pngpread.c
|
|
||||||
Eliminated PNG_BIG_ENDIAN_SUPPORTED and associated png_get_* macros.
|
|
||||||
Made inline expansion of png_get_*() optional with PNG_USE_READ_MACROS.
|
|
||||||
Eliminated all PNG_USELESS_TESTS and PNG_CORRECT_PALETTE_SUPPORTED code.
|
|
||||||
Synced contrib directory and configure files with libpng-1.2.30beta06.
|
|
||||||
Eliminated no-longer-used pngdefs.h (but it's still built in the makefiles)
|
|
||||||
Relocated a misplaced "#endif /* PNG_NO_WRITE_FILTER */" in pngwutil.c
|
|
||||||
|
|
||||||
version 1.4.0beta26 [August 4, 2008]
|
|
||||||
Removed png_push_have_buffer() function in pngpread.c. It increased the
|
|
||||||
compiled library size slightly.
|
|
||||||
Changed "-Wall" to "-W -Wall" in the CFLAGS in all makefiles (Cosmin Truta)
|
|
||||||
Declared png_ptr "volatile" in pngread.c and pngwrite.c to avoid warnings.
|
|
||||||
Updated contrib/visupng/cexcept.h to version 2.0.1
|
|
||||||
Added PNG_LITERAL_CHARACTER macros for #, [, and ].
|
|
||||||
|
|
||||||
version 1.4.0beta27 [August 5, 2008]
|
|
||||||
Revised usage of PNG_LITERAL_SHARP in pngerror.c.
|
|
||||||
Moved newline character from individual png_debug messages into the
|
|
||||||
png_debug macros.
|
|
||||||
Allow user to #define their own png_debug, png_debug1, and png_debug2.
|
|
||||||
|
|
||||||
version 1.4.0beta28 [August 5, 2008]
|
|
||||||
Revised usage of PNG_LITERAL_SHARP in pngerror.c.
|
|
||||||
Added PNG_STRING_NEWLINE macro
|
|
||||||
|
|
||||||
version 1.4.0beta29 [August 9, 2008]
|
|
||||||
Revised usage of PNG_STRING_NEWLINE to work on non-ISO compilers.
|
|
||||||
Added PNG_STRING_COPYRIGHT macro.
|
|
||||||
Added non-ISO versions of png_debug macros.
|
|
||||||
|
|
||||||
version 1.4.0beta30 [August 14, 2008]
|
|
||||||
Added premultiplied alpha feature (Volker Wiendl).
|
|
||||||
|
|
||||||
version 1.4.0beta31 [August 18, 2008]
|
|
||||||
Moved png_set_premultiply_alpha from pngtrans.c to pngrtran.c
|
|
||||||
Removed extra crc check at the end of png_handle_cHRM(). Bug introduced
|
|
||||||
in libpng-1.4.0beta20.
|
|
||||||
|
|
||||||
version 1.4.0beta32 [August 19, 2008]
|
|
||||||
Added PNG_WRITE_FLUSH_SUPPORTED block around new png_flush() call.
|
|
||||||
Revised PNG_NO_STDIO version of png_write_flush()
|
|
||||||
|
|
||||||
version 1.4.0beta33 [August 20, 2008]
|
|
||||||
Added png_set_chunk_cache_max() to limit the total number of sPLT,
|
|
||||||
text, and unknown chunks that can be stored.
|
|
||||||
|
|
||||||
version 1.4.0beta34 [September 6, 2008]
|
|
||||||
Shortened tIME_string to 29 bytes in pngtest.c
|
|
||||||
Fixed off-by-one error introduced in png_push_read_zTXt() function in
|
|
||||||
libpng-1.2.30beta04/pngpread.c (Harald van Dijk)
|
|
||||||
|
|
||||||
version 1.4.0beta35 [October 6, 2008]
|
|
||||||
Changed "trans_values" to "trans_color".
|
|
||||||
Change png_set_gray_1_2_4_to_8() to png_set_expand_gray_1_2_4_to_8()
|
|
||||||
in example.c (debian bug report)
|
|
||||||
|
|
||||||
version 1.4.0beta36 [October 25, 2008]
|
|
||||||
Sync with tEXt vulnerability fix in libpng-1.2.33rc02.
|
|
||||||
|
|
||||||
version 1.4.0beta37 [November 13, 2008]
|
|
||||||
Added png_check_cHRM in png.c and moved checking from pngget.c, pngrutil.c,
|
|
||||||
and pngwrite.c
|
|
||||||
|
|
||||||
version 1.4.0beta38 [November 22, 2008]
|
|
||||||
Added check for zero-area RGB cHRM triange in png_check_cHRM() and
|
|
||||||
png_check_cHRM_fixed().
|
|
||||||
|
|
||||||
version 1.4.0beta39 [November 23, 2008]
|
|
||||||
Revised png_warning() to write its message on standard output by default
|
|
||||||
when warning_fn is NULL.
|
|
||||||
|
|
||||||
version 1.4.0beta40 [November 24, 2008]
|
|
||||||
Eliminated png_check_cHRM(). Instead, always use png_check_cHRM_fixed().
|
|
||||||
In png_check_cHRM_fixed(), ensure white_y is > 0, and removed redundant
|
|
||||||
check for all-zero coordinates that is detected by the triangle check.
|
|
||||||
|
|
||||||
version 1.4.0beta41 [November 26, 2008]
|
|
||||||
Fixed string vs pointer-to-string error in png_check_keyword().
|
|
||||||
Rearranged test expressions in png_check_cHRM_fixed() to avoid internal
|
|
||||||
overflows.
|
|
||||||
Added PNG_NO_CHECK_cHRM conditional.
|
|
||||||
|
|
||||||
version 1.4.0beta42, 43 [December 1, 2008]
|
|
||||||
Merge png_debug with version 1.2.34beta04.
|
|
||||||
|
|
||||||
version 1.4.0beta44 [December 6, 2008]
|
|
||||||
Removed redundant check for key==NULL before calling png_check_keyword()
|
|
||||||
to ensure that new_key gets initialized and removed extra warning
|
|
||||||
(Merge with version 1.2.34beta05 -- Arvan Pritchard).
|
|
||||||
|
|
||||||
version 1.4.0beta45 [December 9, 2008]
|
|
||||||
In png_write_png(), respect the placement of the filler bytes in an earlier
|
|
||||||
call to png_set_filler() (Jim Barry).
|
|
||||||
|
|
||||||
version 1.4.0beta46 [December 10, 2008]
|
|
||||||
Undid previous change and added PNG_TRANSFORM_STRIP_FILLER_BEFORE and
|
|
||||||
PNG_TRANSFORM_STRIP_FILLER_AFTER conditionals and deprecated
|
|
||||||
PNG_TRANSFORM_STRIP_FILLER (Jim Barry).
|
|
||||||
|
|
||||||
version 1.4.0beta47 [December 15, 2008]
|
|
||||||
Turned off PNG_READ_DITHER_SUPPORTED by default.
|
|
||||||
|
|
||||||
version 1.4.0beta48 [February 14, 2009]
|
|
||||||
Added new exported function png_calloc().
|
|
||||||
Combined several instances of png_malloc(); png_memset() into png_calloc().
|
|
||||||
Removed prototype for png_freeptr() that was added in libpng-1.4.0beta24
|
|
||||||
|
|
||||||
version 1.4.0beta49 [February 28, 2009]
|
|
||||||
Added png_fileno() macro to pngconf.h, used in pngwio.c
|
|
||||||
Corrected order of #ifdef's in png_debug definition in png.h
|
|
||||||
Fixed bug introduced in libpng-1.4.0beta48 with the memset arguments
|
|
||||||
for pcal_params.
|
|
||||||
Fixed order of #ifdef directives in the png_debug defines in png.h
|
|
||||||
(bug introduced in libpng-1.2.34/1.4.0beta29).
|
|
||||||
Revised comments in png_set_read_fn() and png_set_write_fn().
|
|
||||||
|
|
||||||
version 1.4.0beta50 [March 18, 2009]
|
|
||||||
Use png_calloc() instead of png_malloc() to allocate big_row_buf when
|
|
||||||
reading an interlaced file, to avoid a possible UMR.
|
|
||||||
Undid recent revision of PNG_NO_STDIO version of png_write_flush(). Users
|
|
||||||
having trouble with fflush() can build with PNG_NO_WRITE_FLUSH defined
|
|
||||||
or supply their own flush_fn() replacement.
|
|
||||||
Revised libpng*.txt and png.h documentation about use of png_write_flush()
|
|
||||||
and png_set_write_fn().
|
|
||||||
Removed fflush() from pngtest.c.
|
|
||||||
Added "#define PNG_NO_WRITE_FLUSH" to contrib/pngminim/encoder/pngusr.h
|
|
||||||
|
|
||||||
version 1.4.0beta51 [March 21, 2009]
|
|
||||||
Removed new png_fileno() macro from pngconf.h .
|
|
||||||
|
|
||||||
version 1.4.0beta52 [March 27, 2009]
|
|
||||||
Relocated png_do_chop() ahead of building gamma tables in pngrtran.c
|
|
||||||
This avoids building 16-bit gamma tables unnecessarily.
|
|
||||||
Removed fflush() from pngtest.c.
|
|
||||||
Added "#define PNG_NO_WRITE_FLUSH" to contrib/pngminim/encoder/pngusr.h
|
|
||||||
Added a section on differences between 1.0.x and 1.2.x to libpng.3/libpng.txt
|
|
||||||
|
|
||||||
version 1.4.0beta53 [April 1, 2009]
|
|
||||||
Removed some remaining MMX macros from pngpriv.h
|
|
||||||
Fixed potential memory leak of "new_name" in png_write_iCCP() (Ralph Giles)
|
|
||||||
|
|
||||||
version 1.4.0beta54 [April 13, 2009]
|
|
||||||
Added "ifndef PNG_SKIP_SETJMP_CHECK" block in pngconf.h to allow
|
|
||||||
application code writers to bypass the check for multiple inclusion
|
|
||||||
of setjmp.h when they know that it is safe to ignore the situation.
|
|
||||||
Eliminated internal use of setjmp() in pngread.c and pngwrite.c
|
|
||||||
Reordered ancillary chunks in pngtest.png to be the same as what
|
|
||||||
pngtest now produces, and made some cosmetic changes to pngtest output.
|
|
||||||
Eliminated deprecated png_read_init_3() and png_write_init_3() functions.
|
|
||||||
|
|
||||||
version 1.4.0beta55 [April 15, 2009]
|
|
||||||
Simplified error handling in pngread.c and pngwrite.c by putting
|
|
||||||
the new png_read_cleanup() and png_write_cleanup() functions inline.
|
|
||||||
|
|
||||||
version 1.4.0beta56 [April 25, 2009]
|
|
||||||
Renamed "user_chunk_data" to "my_user_chunk_data" in pngtest.c to suppress
|
|
||||||
"shadowed declaration" warning from gcc-4.3.3.
|
|
||||||
Renamed "gamma" to "png_gamma" in pngset.c to avoid "shadowed declaration"
|
|
||||||
warning about a global "gamma" variable in math.h on some platforms.
|
|
||||||
|
|
||||||
version 1.4.0beta57 [May 2, 2009]
|
|
||||||
Removed prototype for png_freeptr() that was added in libpng-1.4.0beta24
|
|
||||||
but was never defined (again).
|
|
||||||
Rebuilt configure scripts with autoconf-2.63 instead of 2.62
|
|
||||||
Removed pngprefs.h and MMX from makefiles
|
|
||||||
|
|
||||||
version 1.4.0beta58 [May 14, 2009]
|
|
||||||
Changed pngw32.def to pngwin.def in makefile.mingw (typo was intruduced
|
|
||||||
in beta57).
|
|
||||||
Clarified usage of sig_bit versus sig_bit_p in example.c (Vincent Torri)
|
|
||||||
|
|
||||||
version 1.4.0beta59 [May 15, 2009]
|
|
||||||
Reformated sources in libpng style (3-space intentation, comment format)
|
|
||||||
Fixed typo in libpng docs (PNG_FILTER_AVE should be PNG_FILTER_AVG)
|
|
||||||
Added sections about the git repository and our coding style to the
|
|
||||||
documentation
|
|
||||||
Relocated misplaced #endif in pngwrite.c, sCAL chunk handler.
|
|
||||||
|
|
||||||
version 1.4.0beta60 [May 19, 2009]
|
|
||||||
Conditionally compile png_read_finish_row() which is not used by
|
|
||||||
progressive readers.
|
|
||||||
Added contrib/pngminim/preader to demonstrate building minimal progressive
|
|
||||||
decoder, based on contrib/gregbook with embedded libpng and zlib.
|
|
||||||
|
|
||||||
version 1.4.0beta61 [May 20, 2009]
|
|
||||||
In contrib/pngminim/*, renamed "makefile.std" to "makefile", since there
|
|
||||||
is only one makefile in those directories, and revised the README files
|
|
||||||
accordingly.
|
|
||||||
More reformatting of comments, mostly to capitalize sentences.
|
|
||||||
|
|
||||||
version 1.4.0beta62 [June 2, 2009]
|
|
||||||
Added "#define PNG_NO_WRITE_SWAP" to contrib/pngminim/encoder/pngusr.h
|
|
||||||
and "define PNG_NO_READ_SWAP" to decoder/pngusr.h and preader/pngusr.h
|
|
||||||
Reformatted several remaining "else statement" into two lines.
|
|
||||||
Added a section to the libpng documentation about using png_get_io_ptr()
|
|
||||||
in configure scripts to detect the presence of libpng.
|
|
||||||
|
|
||||||
version 1.4.0beta63 [June 15, 2009]
|
|
||||||
Revised libpng*.txt and libpng.3 to mention calling png_set_IHDR()
|
|
||||||
multiple times and to specify the sample order in the tRNS chunk,
|
|
||||||
because the ISO PNG specification has a typo in the tRNS table.
|
|
||||||
Changed several PNG_UNKNOWN_CHUNK_SUPPORTED to
|
|
||||||
PNG_HANDLE_AS_UNKNOWN_SUPPORTED, to make the png_set_keep mechanism
|
|
||||||
available for ignoring known chunks even when not saving unknown chunks.
|
|
||||||
Adopted preference for consistent use of "#ifdef" and "#ifndef" versus
|
|
||||||
"#if defined()" and "if !defined()" where possible.
|
|
||||||
|
|
||||||
version 1.4.0beta64 [June 24, 2009]
|
|
||||||
Eliminated PNG_LEGACY_SUPPORTED code.
|
|
||||||
Moved the various unknown chunk macro definitions outside of the
|
|
||||||
PNG_READ|WRITE_ANCILLARY_CHUNK_SUPPORTED blocks.
|
|
||||||
|
|
||||||
version 1.4.0beta65 [June 26, 2009]
|
|
||||||
Added a reference to the libpng license in each file.
|
|
||||||
|
|
||||||
version 1.4.0beta66 [June 27, 2009]
|
|
||||||
Refer to the libpng license instead of the libpng license in each file.
|
|
||||||
|
|
||||||
version 1.4.0beta67 [July 6, 2009]
|
|
||||||
Relocated INVERT_ALPHA within png_read_png() and png_write_png().
|
|
||||||
Added high-level API transform PNG_TRANSFORM_GRAY_TO_RGB.
|
|
||||||
Added an "xcode" project to the projects directory (Alam Arias).
|
|
||||||
|
|
||||||
version 1.4.0beta68 [July 19, 2009]
|
|
||||||
Avoid some tests in filter selection in pngwutil.c
|
|
||||||
|
|
||||||
version 1.4.0beta69 [July 25, 2009]
|
|
||||||
Simplified the new filter-selection test. This runs faster in the
|
|
||||||
common "PNG_ALL_FILTERS" and PNG_FILTER_NONE cases.
|
|
||||||
Removed extraneous declaration from the new call to png_read_gray_to_rgb()
|
|
||||||
(bug introduced in libpng-1.4.0beta67).
|
|
||||||
Fixed up xcode project (Alam Arias)
|
|
||||||
|
|
||||||
version 1.4.0beta70 [July 27, 2009]
|
|
||||||
Avoid a possible NULL dereference in debug build, in png_set_text_2().
|
|
||||||
(bug introduced in libpng-0.95, discovered by Evan Rouault)
|
|
||||||
|
|
||||||
version 1.4.0beta71 [July 29, 2009]
|
|
||||||
Rebuilt configure scripts with autoconf-2.64.
|
|
||||||
Added a prototype for png_64bit_product() in png.c
|
|
||||||
|
|
||||||
version 1.4.0beta72 [August 1, 2009]
|
|
||||||
Replaced *.tar.lzma with *.tar.xz in distribution. Get the xz codec
|
|
||||||
from <http://tukaani.org/xz>.
|
|
||||||
|
|
||||||
version 1.4.0beta73 [August 1, 2009]
|
|
||||||
Reject attempt to write iCCP chunk with negative embedded profile length
|
|
||||||
(JD Chen)
|
|
||||||
|
|
||||||
version 1.4.0beta74 [August 8, 2009]
|
|
||||||
Changed png_ptr and info_ptr member "trans" to "trans_alpha".
|
|
||||||
|
|
||||||
version 1.4.0beta75 [August 21, 2009]
|
|
||||||
Removed an extra png_debug() recently added to png_write_find_filter().
|
|
||||||
Fixed incorrect #ifdef in pngset.c regarding unknown chunk support.
|
|
||||||
|
|
||||||
version 1.4.0beta76 [August 22, 2009]
|
|
||||||
Moved an incorrectly located test in png_read_row() in pngread.c
|
|
||||||
|
|
||||||
version 1.4.0beta77 [August 27, 2009]
|
|
||||||
Removed lpXYZ.tar.bz2 (with CRLF), KNOWNBUG, libpng-x.y.z-KNOWNBUG.txt,
|
|
||||||
and the "noconfig" files from the distribution.
|
|
||||||
Moved CMakeLists.txt from scripts into the main libpng directory.
|
|
||||||
Various bugfixes and improvements to CMakeLists.txt (Philip Lowman)
|
|
||||||
|
|
||||||
version 1.4.0beta78 [August 31, 2009]
|
|
||||||
Converted all PNG_NO_* tests to PNG_*_SUPPORTED everywhere except pngconf.h
|
|
||||||
Eliminated PNG_NO_FREE_ME and PNG_FREE_ME_SUPPORTED macros.
|
|
||||||
Use png_malloc plus a loop instead of png_calloc() to initialize
|
|
||||||
row_pointers in png_read_png().
|
|
||||||
|
|
||||||
version 1.4.0beta79 [September 1, 2009]
|
|
||||||
Eliminated PNG_GLOBAL_ARRAYS and PNG_LOCAL_ARRAYS; always use local arrays.
|
|
||||||
Eliminated PNG_CALLOC_SUPPORTED macro and always provide png_calloc().
|
|
||||||
|
|
||||||
version 1.4.0beta80 [September 17, 2009]
|
|
||||||
Removed scripts/libpng.icc
|
|
||||||
Changed typecast of filler from png_byte to png_uint_16 in png_set_filler().
|
|
||||||
(Dennis Gustafsson)
|
|
||||||
Fixed typo introduced in beta78 in pngtest.c ("#if def " should be "#ifdef ")
|
|
||||||
|
|
||||||
version 1.4.0beta81 [September 23, 2009]
|
|
||||||
Eliminated unused PNG_FLAG_FREE_* defines from pngpriv.h
|
|
||||||
Expanded TAB characters in pngrtran.c
|
|
||||||
Removed PNG_CONST from all "PNG_CONST PNG_CHNK" declarations to avoid
|
|
||||||
compiler complaints about doubly declaring things "const".
|
|
||||||
Changed all "#if [!]defined(X)" to "if[n]def X" where possible.
|
|
||||||
Eliminated unused png_ptr->row_buf_size
|
|
||||||
|
|
||||||
version 1.4.0beta82 [September 25, 2009]
|
|
||||||
Moved redundant IHDR checking into new png_check_IHDR() in png.c
|
|
||||||
and report all errors found in the IHDR data.
|
|
||||||
Eliminated useless call to png_check_cHRM() from pngset.c
|
|
||||||
|
|
||||||
version 1.4.0beta83 [September 25, 2009]
|
|
||||||
Revised png_check_IHDR() to eliminate bogus complaint about filter_type.
|
|
||||||
|
|
||||||
version 1.4.0beta84 [September 30, 2009]
|
|
||||||
Fixed some inconsistent indentation in pngconf.h
|
|
||||||
Revised png_check_IHDR() to add a test for width variable less than 32-bit.
|
|
||||||
|
|
||||||
version 1.4.0beta85 [October 1, 2009]
|
|
||||||
Revised png_check_IHDR() again, to check info_ptr members instead of
|
|
||||||
the contents of the returned parameters.
|
|
||||||
|
|
||||||
version 1.4.0beta86 [October 9, 2009]
|
|
||||||
Updated the "xcode" project (Alam Arias).
|
|
||||||
Eliminated a shadowed declaration of "pp" in png_handle_sPLT().
|
|
||||||
|
|
||||||
version 1.4.0rc01 [October 19, 2009]
|
|
||||||
Trivial cosmetic changes.
|
|
||||||
|
|
||||||
version 1.4.0beta87 [October 30, 2009]
|
|
||||||
Moved version 1.4.0 back into beta.
|
|
||||||
|
|
||||||
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
|
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
|
||||||
|
#endif
|
||||||
|
|||||||
409
CMakeLists.txt
@@ -1,36 +1,41 @@
|
|||||||
project(PNG C)
|
# CMakeLists.txt
|
||||||
cmake_minimum_required(VERSION 2.4.3)
|
|
||||||
|
|
||||||
# Copyright (C) 2007 Glenn Randers-Pehrson
|
# Copyright (C) 2007-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
|
||||||
# and license in png.h
|
# and license in png.h
|
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 2.4.4)
|
||||||
|
set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true)
|
||||||
|
|
||||||
|
set(CMAKE_CONFIGURATION_TYPES "Release;Debug;MinSizeRel;RelWithDebInfo")
|
||||||
|
|
||||||
|
project(libpng C)
|
||||||
|
enable_testing()
|
||||||
|
|
||||||
set(PNGLIB_MAJOR 1)
|
set(PNGLIB_MAJOR 1)
|
||||||
set(PNGLIB_MINOR 4)
|
set(PNGLIB_MINOR 6)
|
||||||
set(PNGLIB_RELEASE 0)
|
set(PNGLIB_RELEASE 10)
|
||||||
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})
|
||||||
|
|
||||||
set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true)
|
|
||||||
|
|
||||||
# needed packages
|
# needed packages
|
||||||
find_package(ZLIB REQUIRED)
|
find_package(ZLIB REQUIRED)
|
||||||
include_directories(${ZLIB_INCLUDE_DIR})
|
include_directories(${ZLIB_INCLUDE_DIR})
|
||||||
|
|
||||||
if(NOT WIN32)
|
if(NOT WIN32)
|
||||||
find_library(M_LIBRARY
|
find_library(M_LIBRARY
|
||||||
NAMES m
|
NAMES m
|
||||||
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 library '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
|
||||||
set(M_LIBRARY "")
|
set(M_LIBRARY "")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# COMMAND LINE OPTIONS
|
# COMMAND LINE OPTIONS
|
||||||
@@ -45,38 +50,11 @@ else()
|
|||||||
option(PNG_STATIC "Build static lib" ON)
|
option(PNG_STATIC "Build static lib" ON)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(MINGW)
|
option(PNG_TESTS "Build libpng tests" YES)
|
||||||
option(PNG_TESTS "Build pngtest" NO)
|
|
||||||
else(MINGW)
|
|
||||||
option(PNG_TESTS "Build pngtest" YES)
|
|
||||||
endif(MINGW)
|
|
||||||
|
|
||||||
option(PNG_NO_CONSOLE_IO "FIXME" YES)
|
# Many more configuration options could be added here
|
||||||
option(PNG_NO_STDIO "FIXME" YES)
|
|
||||||
option(PNG_DEBUG "Build with debug output" NO)
|
option(PNG_DEBUG "Build with debug output" NO)
|
||||||
option(PNGARG "FIXME" YES)
|
option(PNGARG "Disable ANSI-C prototypes" NO)
|
||||||
#TODO:
|
|
||||||
# PNG_CONSOLE_IO_SUPPORTED
|
|
||||||
|
|
||||||
# maybe needs improving, but currently I don't know when we can enable what :)
|
|
||||||
set(png_asm_tmp "OFF")
|
|
||||||
if(NOT WIN32)
|
|
||||||
find_program(uname_executable NAMES uname PATHS /bin /usr/bin /usr/local/bin)
|
|
||||||
if(uname_executable)
|
|
||||||
EXEC_PROGRAM(${uname_executable} ARGS --machine OUTPUT_VARIABLE uname_output)
|
|
||||||
if("uname_output" MATCHES "^.*i[1-9]86.*$")
|
|
||||||
set(png_asm_tmp "ON")
|
|
||||||
else("uname_output" MATCHES "^.*i[1-9]86.*$")
|
|
||||||
set(png_asm_tmp "OFF")
|
|
||||||
endif("uname_output" MATCHES "^.*i[1-9]86.*$")
|
|
||||||
endif(uname_executable)
|
|
||||||
else()
|
|
||||||
# this env var is normally only set on win64
|
|
||||||
SET(TEXT "ProgramFiles(x86)")
|
|
||||||
if("$ENV{${TEXT}}" STREQUAL "")
|
|
||||||
set(png_asm_tmp "ON")
|
|
||||||
endif("$ENV{${TEXT}}" STREQUAL "")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# SET LIBNAME
|
# SET LIBNAME
|
||||||
set(PNG_LIB_NAME png${PNGLIB_MAJOR}${PNGLIB_MINOR})
|
set(PNG_LIB_NAME png${PNGLIB_MAJOR}${PNGLIB_MINOR})
|
||||||
@@ -84,164 +62,299 @@ set(PNG_LIB_NAME png${PNGLIB_MAJOR}${PNGLIB_MINOR})
|
|||||||
# to distinguish between debug and release lib
|
# to distinguish between debug and release lib
|
||||||
set(CMAKE_DEBUG_POSTFIX "d")
|
set(CMAKE_DEBUG_POSTFIX "d")
|
||||||
|
|
||||||
|
# Use the prebuilt pnglibconf.h file from the scripts folder
|
||||||
|
# TODO: fix this by building with awk; without this no cmake build can be
|
||||||
|
# configured directly (to do so indirectly use your local awk to build a
|
||||||
|
# pnglibconf.h in the build directory.)
|
||||||
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.h.prebuilt
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h)
|
||||||
|
include_directories(${CMAKE_CURRENT_BINARY_DIR})
|
||||||
|
|
||||||
# OUR SOURCES
|
# OUR SOURCES
|
||||||
|
set(libpng_public_hdrs
|
||||||
|
png.h
|
||||||
|
pngconf.h
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h
|
||||||
|
)
|
||||||
set(libpng_sources
|
set(libpng_sources
|
||||||
png.h
|
${libpng_public_hdrs}
|
||||||
pngconf.h
|
pngdebug.h
|
||||||
pngpriv.h
|
pnginfo.h
|
||||||
png.c
|
pngpriv.h
|
||||||
pngerror.c
|
pngstruct.h
|
||||||
pngget.c
|
png.c
|
||||||
pngmem.c
|
pngerror.c
|
||||||
pngpread.c
|
pngget.c
|
||||||
pngread.c
|
pngmem.c
|
||||||
pngrio.c
|
pngpread.c
|
||||||
pngrtran.c
|
pngread.c
|
||||||
pngrutil.c
|
pngrio.c
|
||||||
pngset.c
|
pngrtran.c
|
||||||
pngtrans.c
|
pngrutil.c
|
||||||
pngwio.c
|
pngset.c
|
||||||
pngwrite.c
|
pngtrans.c
|
||||||
pngwtran.c
|
pngwio.c
|
||||||
pngwutil.c
|
pngwrite.c
|
||||||
|
pngwtran.c
|
||||||
|
pngwutil.c
|
||||||
)
|
)
|
||||||
set(pngtest_sources
|
set(pngtest_sources
|
||||||
pngtest.c
|
pngtest.c
|
||||||
|
)
|
||||||
|
set(pngvalid_sources
|
||||||
|
contrib/libtests/pngvalid.c
|
||||||
|
)
|
||||||
|
set(pngstest_sources
|
||||||
|
contrib/libtests/pngstest.c
|
||||||
)
|
)
|
||||||
# SOME NEEDED DEFINITIONS
|
# SOME NEEDED DEFINITIONS
|
||||||
|
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
add_definitions(-DPNG_NO_MODULEDEF -D_CRT_SECURE_NO_DEPRECATE)
|
add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
|
||||||
endif(MSVC)
|
endif(MSVC)
|
||||||
|
|
||||||
if(PNG_SHARED OR NOT MSVC)
|
|
||||||
#if building msvc static this has NOT do be defined
|
|
||||||
add_definitions(-DZLIB_DLL)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(PNG_CONSOLE_IO_SUPPORTED)
|
|
||||||
add_definitions(-DPNG_CONSOLE_IO_SUPPORTED)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(PNG_NO_CONSOLE_IO)
|
|
||||||
add_definitions(-DPNG_NO_CONSOLE_IO)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(PNG_NO_STDIO)
|
|
||||||
add_definitions(-DPNG_NO_STDIO)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(PNG_DEBUG)
|
if(PNG_DEBUG)
|
||||||
add_definitions(-DPNG_DEBUG)
|
add_definitions(-DPNG_DEBUG)
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT M_LIBRARY AND NOT WIN32)
|
|
||||||
add_definitions(-DPNG_NO_FLOATING_POINT_SUPPORTED)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# NOW BUILD OUR TARGET
|
# NOW BUILD OUR TARGET
|
||||||
include_directories(${PNG_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})
|
||||||
if(MSVC)
|
set(PNG_LIB_TARGETS ${PNG_LIB_NAME})
|
||||||
# msvc does not append 'lib' - do it here to have consistent name
|
if(MSVC)
|
||||||
set_target_properties(${PNG_LIB_NAME} PROPERTIES PREFIX "lib")
|
# msvc does not append 'lib' - do it here to have consistent name
|
||||||
endif()
|
set_target_properties(${PNG_LIB_NAME} PROPERTIES PREFIX "lib")
|
||||||
target_link_libraries(${PNG_LIB_NAME} ${ZLIB_LIBRARY} ${M_LIBRARY})
|
set_target_properties(${PNG_LIB_NAME} PROPERTIES IMPORT_PREFIX "lib")
|
||||||
|
endif()
|
||||||
|
target_link_libraries(${PNG_LIB_NAME} ${ZLIB_LIBRARY} ${M_LIBRARY})
|
||||||
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})
|
||||||
if(MSVC)
|
list(APPEND PNG_LIB_TARGETS ${PNG_LIB_NAME_STATIC})
|
||||||
# msvc does not append 'lib' - do it here to have consistent name
|
if(MSVC)
|
||||||
set_target_properties(${PNG_LIB_NAME_STATIC} PROPERTIES PREFIX "lib")
|
# msvc does not append 'lib' - do it here to have consistent name
|
||||||
endif()
|
set_target_properties(${PNG_LIB_NAME_STATIC} PROPERTIES PREFIX "lib")
|
||||||
|
endif()
|
||||||
|
target_link_libraries(${PNG_LIB_NAME_STATIC} ${ZLIB_LIBRARY} ${M_LIBRARY})
|
||||||
endif()
|
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")
|
||||||
|
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()
|
||||||
|
|
||||||
if(PNG_TESTS AND PNG_SHARED)
|
if(PNG_TESTS AND PNG_SHARED)
|
||||||
# does not work with msvc due to png_lib_ver issue
|
# does not work with msvc due to png_lib_ver issue
|
||||||
add_executable(pngtest ${pngtest_sources})
|
add_executable(pngtest ${pngtest_sources})
|
||||||
target_link_libraries(pngtest ${PNG_LIB_NAME})
|
target_link_libraries(pngtest ${PNG_LIB_NAME})
|
||||||
# add_test(pngtest ${PNG_SOURCE_DIR}/pngtest.png)
|
add_test(pngtest ./pngtest ${CMAKE_CURRENT_SOURCE_DIR}/pngtest.png)
|
||||||
|
#
|
||||||
|
add_executable(pngvalid ${pngvalid_sources})
|
||||||
|
target_link_libraries(pngvalid ${PNG_LIB_NAME})
|
||||||
|
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
|
||||||
|
IF(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
|
||||||
|
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY "lib")
|
||||||
|
ENDIF(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
|
||||||
|
|
||||||
|
# Set a variable with CMake code which:
|
||||||
|
# Creates a symlink from src to dest (if possible) or alternatively
|
||||||
|
# copies if different.
|
||||||
|
macro(CREATE_SYMLINK SRC_FILE DEST_FILE)
|
||||||
|
FILE(REMOVE ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE})
|
||||||
|
if(WIN32 AND NOT CYGWIN AND NOT MSYS)
|
||||||
|
ADD_CUSTOM_COMMAND(
|
||||||
|
OUTPUT ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE} ${CMAKE_CURRENT_BINARY_DIR}/${DEST_FILE}
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${SRC_FILE}" ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE}
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${SRC_FILE}" ${CMAKE_CURRENT_BINARY_DIR}/${DEST_FILE}
|
||||||
|
DEPENDS ${PNG_LIB_TARGETS}
|
||||||
|
)
|
||||||
|
ADD_CUSTOM_TARGET(${DEST_FILE}_COPY ALL DEPENDS ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE})
|
||||||
|
else(WIN32 AND NOT CYGWIN AND NOT MSYS)
|
||||||
|
get_filename_component(LINK_TARGET "${SRC_FILE}" NAME)
|
||||||
|
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()
|
||||||
|
|
||||||
|
# libpng is a library so default to 'lib'
|
||||||
|
if(NOT DEFINED CMAKE_INSTALL_LIBDIR)
|
||||||
|
set(CMAKE_INSTALL_LIBDIR lib)
|
||||||
|
endif(NOT DEFINED CMAKE_INSTALL_LIBDIR)
|
||||||
|
|
||||||
# CREATE PKGCONFIG FILES
|
# CREATE PKGCONFIG FILES
|
||||||
# we use the same files like ./configure, so we have to set its vars
|
# we use the same files like ./configure, so we have to set its vars
|
||||||
set(prefix ${CMAKE_INSTALL_PREFIX})
|
# Only do this on Windows for Cygwin - the files don't make much sense outside
|
||||||
set(exec_prefix ${CMAKE_INSTALL_PREFIX})
|
# a UNIX look alike
|
||||||
set(libdir ${CMAKE_INSTALL_PREFIX}/lib)
|
if(NOT WIN32 OR CYGWIN OR MINGW)
|
||||||
set(includedir ${CMAKE_INSTALL_PREFIX}/include)
|
set(prefix ${CMAKE_INSTALL_PREFIX})
|
||||||
|
set(exec_prefix ${CMAKE_INSTALL_PREFIX})
|
||||||
|
set(libdir ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR})
|
||||||
|
set(includedir ${CMAKE_INSTALL_PREFIX}/include)
|
||||||
|
set(LIBS "-lz -lm")
|
||||||
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng.pc.in
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc @ONLY)
|
||||||
|
CREATE_SYMLINK(${PNGLIB_NAME}.pc libpng.pc)
|
||||||
|
|
||||||
configure_file(${PNG_SOURCE_DIR}/scripts/libpng.pc.in
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng-config.in
|
||||||
${PNG_BINARY_DIR}/libpng.pc)
|
${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config @ONLY)
|
||||||
configure_file(${PNG_SOURCE_DIR}/scripts/libpng-config.in
|
CREATE_SYMLINK(${PNGLIB_NAME}-config libpng-config)
|
||||||
${PNG_BINARY_DIR}/libpng-config)
|
endif(NOT WIN32 OR CYGWIN OR MINGW)
|
||||||
configure_file(${PNG_SOURCE_DIR}/scripts/libpng.pc.in
|
|
||||||
${PNG_BINARY_DIR}/${PNGLIB_NAME}.pc)
|
|
||||||
configure_file(${PNG_SOURCE_DIR}/scripts/libpng-config.in
|
|
||||||
${PNG_BINARY_DIR}/${PNGLIB_NAME}-config)
|
|
||||||
|
|
||||||
# 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 14.${PNGLIB_RELEASE}.1.4.0beta87
|
# VERSION 16.${PNGLIB_RELEASE}.1.6.10
|
||||||
VERSION 14.${PNGLIB_RELEASE}.0
|
VERSION 16.${PNGLIB_RELEASE}.0
|
||||||
SOVERSION 14
|
SOVERSION 16
|
||||||
CLEAN_DIRECT_OUTPUT 1)
|
CLEAN_DIRECT_OUTPUT 1)
|
||||||
endif()
|
endif()
|
||||||
if(PNG_STATIC)
|
if(PNG_STATIC)
|
||||||
if(NOT WIN32)
|
# MSVC doesn't use a different file extension for shared vs. static
|
||||||
# that's uncool on win32 - it overwrites our static import lib...
|
# libs. We are able to change OUTPUT_NAME to remove the _static
|
||||||
|
# for all other platforms.
|
||||||
|
if(NOT MSVC)
|
||||||
set_target_properties(${PNG_LIB_NAME_STATIC} PROPERTIES
|
set_target_properties(${PNG_LIB_NAME_STATIC} PROPERTIES
|
||||||
OUTPUT_NAME ${PNG_LIB_NAME}
|
OUTPUT_NAME ${PNG_LIB_NAME}
|
||||||
CLEAN_DIRECT_OUTPUT 1)
|
CLEAN_DIRECT_OUTPUT 1)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# If CMake > 2.4.x, we set a variable used below to export
|
||||||
|
# targets to an export file.
|
||||||
|
# TODO: Use VERSION_GREATER after our cmake_minimum_required >= 2.6.2
|
||||||
|
if(CMAKE_MAJOR_VERSION GREATER 1 AND CMAKE_MINOR_VERSION GREATER 4)
|
||||||
|
set(PNG_EXPORT_RULE EXPORT libpng)
|
||||||
|
elseif(CMAKE_MAJOR_VERSION GREATER 2) # future proof
|
||||||
|
set(PNG_EXPORT_RULE EXPORT libpng)
|
||||||
|
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}
|
||||||
RUNTIME DESTINATION bin
|
RUNTIME DESTINATION bin
|
||||||
LIBRARY DESTINATION lib
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
ARCHIVE DESTINATION lib)
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
endif()
|
|
||||||
if(PNG_STATIC)
|
if(PNG_SHARED)
|
||||||
install(TARGETS ${PNG_LIB_NAME_STATIC}
|
# Create a symlink for libpng.dll.a => libpng16.dll.a on Cygwin
|
||||||
LIBRARY DESTINATION lib
|
if(CYGWIN OR MINGW)
|
||||||
ARCHIVE DESTINATION lib)
|
get_target_property(BUILD_TARGET_LOCATION ${PNG_LIB_NAME} LOCATION_${CMAKE_BUILD_TYPE})
|
||||||
endif()
|
CREATE_SYMLINK(${BUILD_TARGET_LOCATION} libpng${CMAKE_IMPORT_LIBRARY_SUFFIX})
|
||||||
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_IMPORT_LIBRARY_SUFFIX}
|
||||||
|
DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
|
endif(CYGWIN OR MINGW)
|
||||||
|
|
||||||
|
if(NOT WIN32)
|
||||||
|
get_target_property(BUILD_TARGET_LOCATION ${PNG_LIB_NAME} LOCATION_${CMAKE_BUILD_TYPE})
|
||||||
|
CREATE_SYMLINK(${BUILD_TARGET_LOCATION} libpng${CMAKE_SHARED_LIBRARY_SUFFIX})
|
||||||
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_SHARED_LIBRARY_SUFFIX}
|
||||||
|
DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
|
endif(NOT WIN32)
|
||||||
|
endif(PNG_SHARED)
|
||||||
|
|
||||||
|
if(PNG_STATIC)
|
||||||
|
if(NOT WIN32 OR CYGWIN OR MINGW)
|
||||||
|
get_target_property(BUILD_TARGET_LOCATION ${PNG_LIB_NAME_STATIC} LOCATION_${CMAKE_BUILD_TYPE})
|
||||||
|
CREATE_SYMLINK(${BUILD_TARGET_LOCATION} libpng${CMAKE_STATIC_LIBRARY_SUFFIX})
|
||||||
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_STATIC_LIBRARY_SUFFIX}
|
||||||
|
DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
|
endif(NOT WIN32 OR CYGWIN OR MINGW)
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL )
|
if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL )
|
||||||
install(FILES png.h pngconf.h pngpriv.h DESTINATION include)
|
install(FILES ${libpng_public_hdrs} DESTINATION include)
|
||||||
install(FILES png.h pngconf.h pngpriv.h 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 WIN32 OR CYGWIN OR MINGW)
|
||||||
|
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config DESTINATION bin)
|
||||||
|
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config
|
||||||
|
DESTINATION bin)
|
||||||
|
endif(NOT WIN32 OR CYGWIN OR MINGW)
|
||||||
|
endif()
|
||||||
|
|
||||||
if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL )
|
if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL )
|
||||||
install(FILES libpng.3 libpngpf.3 DESTINATION man/man3)
|
# Install man pages
|
||||||
install(FILES png.5 DESTINATION man/man5)
|
if(NOT PNG_MAN_DIR)
|
||||||
install(FILES ${PNG_BINARY_DIR}/libpng.pc DESTINATION lib/pkgconfig)
|
set(PNG_MAN_DIR "share/man")
|
||||||
install(FILES ${PNG_BINARY_DIR}/libpng-config DESTINATION bin)
|
endif()
|
||||||
install(FILES ${PNG_BINARY_DIR}/${PNGLIB_NAME}.pc DESTINATION lib/pkgconfig)
|
install(FILES libpng.3 libpngpf.3 DESTINATION ${PNG_MAN_DIR}/man3)
|
||||||
install(FILES ${PNG_BINARY_DIR}/${PNGLIB_NAME}-config DESTINATION bin)
|
install(FILES png.5 DESTINATION ${PNG_MAN_DIR}/man5)
|
||||||
|
# Install pkg-config files
|
||||||
|
if(NOT WIN32 OR CYGWIN OR MINGW)
|
||||||
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng.pc
|
||||||
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|
||||||
|
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config
|
||||||
|
DESTINATION bin)
|
||||||
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc
|
||||||
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|
||||||
|
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config
|
||||||
|
DESTINATION bin)
|
||||||
|
endif(NOT WIN32 OR CYGWIN OR MINGW)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# what's with libpng.txt and all the extra files?
|
# On versions of CMake that support it, create an export file CMake
|
||||||
|
# users can include() to import our targets
|
||||||
|
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)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# what's with libpng-$VER%.txt and all the extra files?
|
||||||
|
|
||||||
# UNINSTALL
|
# UNINSTALL
|
||||||
# do we need this?
|
# do we need this?
|
||||||
|
|
||||||
|
|
||||||
# DIST
|
# DIST
|
||||||
# do we need this?
|
# do we need this?
|
||||||
|
|
||||||
|
|||||||
170
INSTALL
@@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
Installing libpng version 1.4.0beta87 - October 30, 2009
|
Installing libpng
|
||||||
|
|
||||||
On Unix/Linux and similar systems, you can simply type
|
On Unix/Linux and similar systems, you can simply type
|
||||||
|
|
||||||
@@ -9,14 +9,20 @@ On Unix/Linux and similar systems, you can simply type
|
|||||||
|
|
||||||
and ignore the rest of this document.
|
and ignore the rest of this document.
|
||||||
|
|
||||||
If configure does not work on your system and you have a reasonably
|
If configure does not work on your system, or if you have a need to
|
||||||
up-to-date set of tools, running ./autogen.sh before running ./configure
|
change configure.ac or Makefile.am, and you have a reasonably
|
||||||
may fix the problem. You can also run the individual commands in
|
up-to-date set of tools, running ./autogen.sh in a git clone before
|
||||||
autogen.sh with the --force option, if supported by your version of
|
running ./configure may fix the problem. To be really sure that you
|
||||||
the tools. If you run 'libtoolize --force', though, this will replace
|
aren't using any of the included pre-built scripts, you can do this:
|
||||||
the distributed, patched, version of ltmain.sh with an unpatched version
|
|
||||||
and your shared library builds may fail to produce libraries with the
|
./configure --enable-maintainer-mode
|
||||||
correct version numbers.
|
make maintainer-clean
|
||||||
|
./autogen.sh --maintainer --clean
|
||||||
|
./autogen.sh --maintainer
|
||||||
|
./configure [--prefix=/path] [other options]
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
make check
|
||||||
|
|
||||||
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
|
||||||
@@ -25,6 +31,9 @@ Instead, you can use one of the custom-built makefiles in the
|
|||||||
make test
|
make test
|
||||||
make install
|
make install
|
||||||
|
|
||||||
|
The files that are presently available in the scripts directory
|
||||||
|
are listed and described in scripts/README.txt.
|
||||||
|
|
||||||
Or you can use one of the "projects" in the "projects" directory.
|
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
|
||||||
@@ -32,19 +41,33 @@ 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. zlib can be placed in another directory,
|
||||||
at the same level as libpng.
|
at the same level as libpng.
|
||||||
|
|
||||||
|
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".
|
||||||
|
|
||||||
If you want to use "cmake" (see www.cmake.org), type
|
If you want to use "cmake" (see www.cmake.org), type
|
||||||
|
|
||||||
cmake . -DCMAKE_INSTALL_PREFIX=/path
|
cmake . -DCMAKE_INSTALL_PREFIX=/path
|
||||||
make
|
make
|
||||||
make install
|
make install
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
You can rename the directories that you downloaded (they
|
You can rename the directories that you downloaded (they
|
||||||
might be called "libpng-1.4.0beta87" or "lpng109" and "zlib-1.2.1"
|
might be called "libpng-x.y.z" or "libpngNN" and "zlib-1.2.7"
|
||||||
or "zlib121") so that you have directories called "zlib" and "libpng".
|
or "zlib127") so that you have directories called "zlib" and "libpng".
|
||||||
|
|
||||||
Your directory structure should look like this:
|
Your directory structure should look like this:
|
||||||
|
|
||||||
@@ -54,17 +77,26 @@ Your directory structure should look like this:
|
|||||||
README
|
README
|
||||||
*.h
|
*.h
|
||||||
*.c
|
*.c
|
||||||
|
CMakeLists.txt => "cmake" script
|
||||||
|
configuration files:
|
||||||
|
configure.ac, configure, Makefile.am, Makefile.in,
|
||||||
|
autogen.sh, config.guess, ltmain.sh, missing, libpng.pc.in,
|
||||||
|
libpng-config.in, aclocal.m4, config.h.in, config.sub,
|
||||||
|
depcomp, install-sh, mkinstalldirs, test-pngtest.sh
|
||||||
contrib
|
contrib
|
||||||
gregbook
|
gregbook
|
||||||
|
libtests
|
||||||
|
pngminim
|
||||||
pngminus
|
pngminus
|
||||||
pngsuite
|
pngsuite
|
||||||
visupng
|
visupng
|
||||||
projects
|
projects
|
||||||
beos
|
visualc71
|
||||||
c5builder (Borland)
|
vstudio
|
||||||
visualc6 (msvc)
|
|
||||||
scripts
|
scripts
|
||||||
makefile.*
|
makefile.*
|
||||||
|
*.def (module definition files)
|
||||||
|
etc.
|
||||||
pngtest.png
|
pngtest.png
|
||||||
etc.
|
etc.
|
||||||
zlib
|
zlib
|
||||||
@@ -79,82 +111,13 @@ 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.
|
||||||
|
|
||||||
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 directory and follow the instructions in
|
libpng projects\visualc6 or visualc71 directory and follow the instructions
|
||||||
projects\visualc6\README.txt.
|
in README.txt.
|
||||||
|
|
||||||
You can build libpng for beos as instructed in projects\beos.
|
Otherwise enter the zlib directory and follow the instructions in zlib/README,
|
||||||
|
|
||||||
Else 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.
|
||||||
|
|
||||||
The files that are presently available in the scripts directory
|
|
||||||
include
|
|
||||||
|
|
||||||
CMakeLists.txt => "cmake" script
|
|
||||||
makefile.std => Generic UNIX makefile (cc, creates static libpng.a)
|
|
||||||
makefile.elf => Linux/ELF makefile symbol versioning,
|
|
||||||
gcc, creates libpng14.so.14.1.4.0beta87)
|
|
||||||
makefile.linux => Linux/ELF makefile
|
|
||||||
(gcc, creates libpng14.so.14.1.4.0beta87)
|
|
||||||
makefile.gcmmx => Linux/ELF makefile
|
|
||||||
(gcc, creates libpng14.so.14.1.4.0beta87,
|
|
||||||
uses assembler code tuned for Intel MMX platform)
|
|
||||||
makefile.nommx => Linux/ELF makefile
|
|
||||||
(gcc, creates libpng14.so.14.1.4.0beta87
|
|
||||||
does not use Intel MMX assembler code)
|
|
||||||
makefile.gcc => Generic makefile (gcc, creates static libpng.a)
|
|
||||||
makefile.knr => Archaic UNIX Makefile that converts files with
|
|
||||||
ansi2knr (Requires ansi2knr.c from
|
|
||||||
ftp://ftp.cs.wisc.edu/ghost)
|
|
||||||
makefile.aix => AIX/gcc makefile
|
|
||||||
makefile.cygwin => Cygwin/gcc makefile
|
|
||||||
makefile.darwin => Darwin makefile, can use on MacosX
|
|
||||||
makefile.dec => DEC Alpha UNIX makefile
|
|
||||||
makefile.freebsd => FreeBSD makefile
|
|
||||||
makefile.hpgcc => HPUX makefile using gcc
|
|
||||||
makefile.hpux => HPUX (10.20 and 11.00) makefile
|
|
||||||
makefile.hp64 => HPUX (10.20 and 11.00) makefile, 64-bit
|
|
||||||
makefile.ibmc => IBM C/C++ version 3.x for Win32 and OS/2 (static)
|
|
||||||
makefile.intel => Intel C/C++ version 4.0 and later
|
|
||||||
makefile.netbsd => NetBSD/cc makefile, uses PNGGCCRD, makes libpng.so.
|
|
||||||
makefile.ne14bsd => NetBSD/cc makefile, uses PNGGCCRD,
|
|
||||||
makes libpng14.so
|
|
||||||
makefile.openbsd => OpenBSD makefile
|
|
||||||
makefile.sgi => Silicon Graphics IRIX makefile (cc, creates static lib)
|
|
||||||
makefile.sggcc => Silicon Graphics (gcc,
|
|
||||||
creates libpng14.so.14.1.4.0beta87)
|
|
||||||
makefile.sunos => Sun makefile
|
|
||||||
makefile.solaris => Solaris 2.X makefile (gcc,
|
|
||||||
creates libpng14.so.14.1.4.0beta87)
|
|
||||||
makefile.so9 => Solaris 9 makefile (gcc,
|
|
||||||
creates libpng14.so.14.1.4.0beta87)
|
|
||||||
makefile.32sunu => Sun Ultra 32-bit makefile
|
|
||||||
makefile.64sunu => Sun Ultra 64-bit makefile
|
|
||||||
makefile.sco => For SCO OSr5 ELF and Unixware 7 with Native cc
|
|
||||||
makefile.mips => MIPS makefile
|
|
||||||
makefile.acorn => Acorn makefile
|
|
||||||
makefile.amiga => Amiga makefile
|
|
||||||
smakefile.ppc => AMIGA smakefile for SAS C V6.58/7.00 PPC compiler
|
|
||||||
(Requires SCOPTIONS, copied from scripts/SCOPTIONS.ppc)
|
|
||||||
makefile.atari => Atari makefile
|
|
||||||
makefile.beos => BEOS makefile for X86
|
|
||||||
makefile.bor => Borland makefile (uses bcc)
|
|
||||||
makefile.bc32 => 32-bit Borland C++ (all modules compiled in C mode)
|
|
||||||
makefile.tc3 => Turbo C 3.0 makefile
|
|
||||||
makefile.dj2 => DJGPP 2 makefile
|
|
||||||
makefile.msc => Microsoft C makefile
|
|
||||||
makefile.vcawin32 => makefile for Microsoft Visual C++ 5.0 and later (uses
|
|
||||||
assembler code tuned for Intel MMX platform)
|
|
||||||
makefile.vcwin32 => makefile for Microsoft Visual C++ 4.0 and later (does
|
|
||||||
not use assembler code)
|
|
||||||
makefile.os2 => OS/2 Makefile (gcc and emx, requires pngos2.def)
|
|
||||||
pngos2.def => OS/2 module definition file used by makefile.os2
|
|
||||||
makefile.watcom => Watcom 10a+ Makefile, 32-bit flat memory model
|
|
||||||
makevms.com => VMS build script
|
|
||||||
descrip.mms => VMS makefile for MMS or MMK
|
|
||||||
SCOPTIONS.ppc => Used with smakefile.ppc
|
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
@@ -164,7 +127,7 @@ scripts directory into this directory, for example
|
|||||||
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.
|
||||||
|
|
||||||
Then read pngconf.h to see if you want to make any configuration
|
Then read pnglibconf.dfa to see if you want to make any configuration
|
||||||
changes.
|
changes.
|
||||||
|
|
||||||
Then just run "make" which will create the libpng library in
|
Then just run "make" which will create the libpng library in
|
||||||
@@ -182,37 +145,26 @@ 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".
|
||||||
|
|
||||||
If you encounter a compiler error message complaining about the
|
Further information can be found in the README and libpng-manual.txt
|
||||||
lines
|
|
||||||
__png.h__ already includes setjmp.h;
|
|
||||||
__dont__ include it again.;
|
|
||||||
This means you have compiled another module that includes setjmp.h,
|
|
||||||
which is hazardous because the two modules might not include exactly
|
|
||||||
the same setjmp.h. If you are sure that you know what you are doing
|
|
||||||
and that they are exactly the same, then you can comment out or
|
|
||||||
delete the two lines. Better yet, use the cexcept interface
|
|
||||||
instead, as demonstrated in contrib/visupng of the libpng distribution.
|
|
||||||
|
|
||||||
Further information can be found in the README and libpng.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.
|
||||||
|
|
||||||
|
|
||||||
Using the ./configure script -- 16 December 2002.
|
Using the ./configure script -- 16 December 2002.
|
||||||
=================================================
|
=================================================
|
||||||
|
|
||||||
|
|
||||||
The ./configure script should work compatibly with what scripts/makefile.*
|
The ./configure script should work compatibly with what scripts/makefile.*
|
||||||
did, however there are some options you need to add to configure explicitly,
|
did, however there are some options you might need to add to configure
|
||||||
which previously was done semi-automatically (if you didn't edit
|
explicitly, which previously was done semi-automatically (if you didn't edit
|
||||||
scripts/makefile.* yourself, that is)
|
scripts/makefile.* yourself, that is)
|
||||||
|
|
||||||
|
|
||||||
CFLAGS="-Wall -O -funroll-loops \
|
CFLAGS="-Wall -O -funroll-loops \
|
||||||
-malign-loops=2 -malign-functions=2" ./configure --prefix=/usr/include \
|
-malign-loops=2 -malign-functions=2" ./configure --prefix=/usr/include \
|
||||||
--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/png12, or whatever.
|
/usr/include/libpng%NN%, or whatever.
|
||||||
|
|
||||||
|
If you find that the configure script is out-of-date or is not supporting
|
||||||
|
your platform properly, try running autogen.sh to regenerate "configure",
|
||||||
|
"Makefile.in", and the other configuration files. Then try configure again.
|
||||||
|
|
||||||
|
|||||||
6
LICENSE
@@ -10,8 +10,8 @@ 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.4.0beta87, October 30, 2009, are
|
libpng versions 1.2.6, August 15, 2004, through 1.6.10, March 6, 2014, are
|
||||||
Copyright (c) 2004, 2006-2007 Glenn Randers-Pehrson, and are
|
Copyright (c) 2004, 2006-2014 Glenn Randers-Pehrson, and are
|
||||||
distributed according to the same disclaimer and license as libpng-1.2.5
|
distributed according to the same disclaimer and license as libpng-1.2.5
|
||||||
with the following individual added to the list of Contributing Authors
|
with the following individual added to the list of Contributing Authors
|
||||||
|
|
||||||
@@ -108,4 +108,4 @@ certification mark of the Open Source Initiative.
|
|||||||
|
|
||||||
Glenn Randers-Pehrson
|
Glenn Randers-Pehrson
|
||||||
glennrp at users.sourceforge.net
|
glennrp at users.sourceforge.net
|
||||||
October 30, 2009
|
March 6, 2014
|
||||||
|
|||||||
416
Makefile.am
@@ -1,153 +1,367 @@
|
|||||||
# Makefile.am:
|
# Makefile.am:
|
||||||
# Source file for Makefile.in (and hence Makefile)
|
# Source file for Makefile.in (and hence Makefile)
|
||||||
#
|
#
|
||||||
# Makefile.am need only be changed on a major version number
|
|
||||||
# change (e.g. libpng12 --> libpng13). In that case seach
|
|
||||||
# this file for every instance of the old base name (libpng12)
|
|
||||||
# and change to the new one (libpng13), then change the
|
|
||||||
# -version-number settings below so that the new values have
|
|
||||||
# the correct major part (first field).
|
|
||||||
|
|
||||||
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
|
||||||
AUTOMAKE_OPTIONS = foreign
|
|
||||||
|
|
||||||
# test programs - run on make check, make distcheck
|
# test programs - run on make check, make distcheck
|
||||||
check_PROGRAMS= pngtest
|
check_PROGRAMS= pngtest pngunknown pngstest pngvalid pngimage
|
||||||
|
|
||||||
|
# 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 = libpng14.la
|
pngtest_LDADD = libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@.la
|
||||||
TESTS = test-pngtest.sh
|
|
||||||
TESTS_ENVIRONMENT= srcdir=$(srcdir)
|
pngvalid_SOURCES = contrib/libtests/pngvalid.c
|
||||||
|
pngvalid_LDADD = libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@.la
|
||||||
|
|
||||||
|
pngstest_SOURCES = contrib/libtests/pngstest.c
|
||||||
|
pngstest_LDADD = libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@.la
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
# generate the -config scripts if required
|
# generate the -config scripts if required
|
||||||
binconfigs= libpng14-config
|
binconfigs= libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@-config
|
||||||
EXTRA_SCRIPTS= libpng-config libpng14-config
|
EXTRA_SCRIPTS= libpng-config libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@-config
|
||||||
bin_SCRIPTS= @binconfigs@
|
bin_SCRIPTS= @binconfigs@
|
||||||
|
|
||||||
# rules to build libpng, only build the old library on request
|
# rules to build libpng, only build the old library on request
|
||||||
lib_LTLIBRARIES=libpng14.la @compatlib@
|
lib_LTLIBRARIES=libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@.la
|
||||||
EXTRA_LTLIBRARIES= libpng.la
|
# EXTRA_LTLIBRARIES= libpng.la
|
||||||
libpng14_la_SOURCES = png.c pngset.c pngget.c pngrutil.c pngtrans.c pngwutil.c \
|
libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_SOURCES = png.c pngerror.c\
|
||||||
pngread.c pngrio.c pngwio.c pngwrite.c pngrtran.c \
|
pngget.c pngmem.c pngpread.c pngread.c pngrio.c pngrtran.c pngrutil.c\
|
||||||
pngwtran.c pngmem.c pngerror.c pngpread.c \
|
pngset.c pngtrans.c pngwio.c pngwrite.c pngwtran.c pngwutil.c\
|
||||||
png.h pngconf.h
|
png.h pngconf.h pngdebug.h pnginfo.h pngpriv.h pngstruct.h pngusr.dfa
|
||||||
libpng_la_SOURCES = $(libpng14_la_SOURCES)
|
|
||||||
|
|
||||||
libpng_la_CPPFLAGS = @LIBPNG_DEFINES@
|
if PNG_ARM_NEON
|
||||||
libpng14_la_CPPFLAGS = @LIBPNG_DEFINES@
|
libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_SOURCES += arm/arm_init.c\
|
||||||
|
arm/filter_neon.S arm/filter_neon_intrinsics.c
|
||||||
|
endif
|
||||||
|
|
||||||
# MAJOR UPGRADE: the version-number settings below must be changed.
|
nodist_libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_SOURCES = pnglibconf.h
|
||||||
libpng14_la_LDFLAGS = -no-undefined -export-dynamic \
|
|
||||||
-version-number 14:@PNGLIB_RELEASE@:14
|
libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_LDFLAGS = -no-undefined -export-dynamic \
|
||||||
# -rpath is needed as automake doesn't know the directory
|
-version-number @PNGLIB_MAJOR@@PNGLIB_MINOR@:@PNGLIB_RELEASE@:0
|
||||||
libpng_la_LDFLAGS = -rpath '$(libdir)' -no-undefined -export-dynamic \
|
|
||||||
-version-number 14:@PNGLIB_RELEASE@:14
|
|
||||||
|
|
||||||
if HAVE_LD_VERSION_SCRIPT
|
if HAVE_LD_VERSION_SCRIPT
|
||||||
# Versioned symbols and restricted exports
|
# Versioned symbols and restricted exports
|
||||||
libpng14_la_LDFLAGS += -Wl,--version-script=libpng.vers
|
if HAVE_SOLARIS_LD
|
||||||
libpng14_la_DEPENDENCIES = libpng.vers
|
libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_LDFLAGS += -Wl,-M -Wl,libpng.vers
|
||||||
else
|
else
|
||||||
# Only restricted exports when possible
|
libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_LDFLAGS += -Wl,--version-script=libpng.vers
|
||||||
libpng14_la_LDFLAGS += -export-symbols libpng.sym
|
|
||||||
libpng14_la_DEPENDENCIES = libpng.sym
|
|
||||||
endif
|
endif
|
||||||
libpng_la_DEPENDENCIES = $(libpng14_la_DEPENDENCIES)
|
|
||||||
|
|
||||||
# Avoid depending upon Character Ranges.
|
libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_DEPENDENCIES = libpng.vers
|
||||||
AN = '_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
|
else
|
||||||
|
# Only restricted exports when possible
|
||||||
|
libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_LDFLAGS += -export-symbols libpng.sym
|
||||||
|
libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_DEPENDENCIES = libpng.sym
|
||||||
|
endif
|
||||||
|
|
||||||
#distribute headers in /usr/include/libpng/*
|
#distribute headers in /usr/include/libpng/*
|
||||||
pkgincludedir= $(includedir)/$(PNGLIB_BASENAME)
|
pkgincludedir= $(includedir)/$(PNGLIB_BASENAME)
|
||||||
pkginclude_HEADERS= png.h pngconf.h
|
pkginclude_HEADERS= png.h pngconf.h
|
||||||
|
nodist_pkginclude_HEADERS= pnglibconf.h
|
||||||
|
|
||||||
# pkg-config stuff, note that libpng.pc is always required in order
|
# pkg-config stuff, note that libpng.pc is always required in order
|
||||||
# to get the correct library
|
# to get the correct library
|
||||||
pkgconfigdir = @pkgconfigdir@
|
pkgconfigdir = @pkgconfigdir@
|
||||||
pkgconfig_DATA = libpng14.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 KNOWNBUG LICENSE README TODO Y2KINFO \
|
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}/projects/cbuilder5/* \
|
${srcdir}/contrib ${srcdir}/projects ${srcdir}/scripts \
|
||||||
${srcdir}/projects/beos/* \
|
$(TESTS) $(XFAIL_TESTS) tests/pngstest \
|
||||||
${srcdir}/projects/visualc6/* \
|
CMakeLists.txt example.c libpng-manual.txt
|
||||||
${srcdir}/projects/visualc71/* \
|
|
||||||
${srcdir}/projects/wince.txt \
|
|
||||||
${srcdir}/projects/netware.txt \
|
|
||||||
${srcdir}/scripts/* \
|
|
||||||
${srcdir}/contrib/gregbook/* \
|
|
||||||
${srcdir}/contrib/pngminus/* \
|
|
||||||
${srcdir}/contrib/pngsuite/* \
|
|
||||||
${srcdir}/contrib/visupng/* \
|
|
||||||
$(TESTS) \
|
|
||||||
example.c libpng-1.4.0beta87.txt pngvcrd.c
|
|
||||||
|
|
||||||
CLEANFILES= pngout.png libpng14.pc libpng14-config libpng.vers \
|
SCRIPT_CLEANFILES=scripts/*.out scripts/*.chk scripts/pnglibconf.dfn
|
||||||
libpng.sym
|
|
||||||
|
CLEANFILES= *.tf? pngout.png libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@.pc \
|
||||||
|
libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@-config libpng.vers libpng.sym \
|
||||||
|
check.new pnglibconf.* pngprefix.h symbols.new pngtest-log.txt \
|
||||||
|
$(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
|
||||||
|
|
||||||
|
# PNG_COPTS give extra options for the C compiler to be used on all compilation
|
||||||
|
# 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 - the C preprocessor - but on Solaris and maybe
|
||||||
|
# other operating systems (NeXT?) the C preprocessor selected by configure
|
||||||
|
# checks input tokens for validity - effectively it performs part of the ANSI-C
|
||||||
|
# parsing - and therefore fails with the .df files. configure.ac has special
|
||||||
|
# checks for this and sets DFNCPP appropriately.
|
||||||
|
DFNCPP = @DFNCPP@
|
||||||
|
|
||||||
|
SUFFIXES = .chk .dfn .out
|
||||||
|
|
||||||
$(PNGLIB_BASENAME).pc: libpng.pc
|
$(PNGLIB_BASENAME).pc: libpng.pc
|
||||||
cp libpng.pc $@
|
cp libpng.pc $@
|
||||||
|
|
||||||
$(PNGLIB_BASENAME)-config: libpng-config
|
$(PNGLIB_BASENAME)-config: libpng-config
|
||||||
cp libpng-config $@
|
cp libpng-config $@
|
||||||
|
|
||||||
libpng.sym: png.h pngconf.h
|
scripts/sym.out scripts/vers.out: png.h pngconf.h pnglibconf.h
|
||||||
rm -f $@ $@.new
|
scripts/prefix.out: png.h pngconf.h pnglibconf.out
|
||||||
$(CPP) @LIBPNG_DEFINES@ $(CPPFLAGS) -DPNG_BUILDSYMS $(srcdir)/png.h | \
|
scripts/symbols.out: png.h pngconf.h $(srcdir)/scripts/pnglibconf.h.prebuilt
|
||||||
$(SED) -n -e \
|
scripts/intprefix.out: pnglibconf.h
|
||||||
's|^.*PNG_FUNCTION_EXPORT[ ]*\([$(AN)]*\).*$$|$(SYMBOL_PREFIX)\1|p' \
|
|
||||||
-e 's|^.*PNG_DATA_EXPORT[ ]*\([$(AN)]*\).*$$|$(SYMBOL_PREFIX)\1|p' \
|
|
||||||
>$@.new
|
|
||||||
mv $@.new $@
|
|
||||||
|
|
||||||
libpng.vers: libpng.sym
|
libpng.sym: scripts/sym.out
|
||||||
rm -f $@ $@.new
|
rm -f $@
|
||||||
echo PNG@PNGLIB_MAJOR@@PNGLIB_MINOR@_0 '{global:' > $@.new
|
cp $? $@
|
||||||
$(SED) s/$$/\;/ libpng.sym >> $@.new
|
libpng.vers: scripts/vers.out
|
||||||
echo 'local: *; };' >> $@.new
|
rm -f $@
|
||||||
mv $@.new $@
|
cp $? $@
|
||||||
|
|
||||||
test: check
|
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
|
||||||
|
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 $@
|
||||||
|
|
||||||
# install the .../include headers as links to the new ones
|
pngprefix.h: scripts/intprefix.out
|
||||||
install-data-hook:
|
rm -f pngprefix.tf1
|
||||||
cd $(DESTDIR)$(includedir); rm -f png.h pngconf.h
|
$(AWK) '{print "#define", $$1, "@PNG_PREFIX@" $$1}' $? >pngprefix.tf1
|
||||||
cd $(DESTDIR)$(includedir); $(LN_S) $(PNGLIB_BASENAME)/png.h png.h
|
mv pngprefix.tf1 $@
|
||||||
cd $(DESTDIR)$(includedir); $(LN_S) $(PNGLIB_BASENAME)/pngconf.h \
|
else
|
||||||
pngconf.h
|
pnglibconf.h: pnglibconf.out
|
||||||
cd $(DESTDIR)$(pkgconfigdir); rm -f libpng.pc
|
rm -f $@
|
||||||
cd $(DESTDIR)$(pkgconfigdir); $(LN_S) $(PNGLIB_BASENAME).pc libpng.pc
|
cp $? $@
|
||||||
|
|
||||||
# do evil things to libpng to cause libpng14 to be used
|
pngprefix.h: # is empty
|
||||||
install-exec-hook:
|
:>$@
|
||||||
cd $(DESTDIR)$(bindir); rm -f libpng-config
|
endif
|
||||||
cd $(DESTDIR)$(bindir); $(LN_S) $(PNGLIB_BASENAME)-config libpng-config
|
|
||||||
@set -x;\
|
$(srcdir)/scripts/pnglibconf.h.prebuilt:
|
||||||
cd $(DESTDIR)$(libdir);\
|
@echo "Attempting to build $@" >&2
|
||||||
for ext in a la so sl dylib; do\
|
@echo "This is a machine generated file, but if you want to make" >&2
|
||||||
rm -f libpng.$$ext;\
|
@echo "a new one simply make 'scripts/pnglibconf.out', copy that" >&2
|
||||||
if test -f $(PNGLIB_BASENAME).$$ext; then\
|
@echo "AND set PNG_ZLIB_VERNUM to 0 (you MUST do this)" >&2
|
||||||
$(LN_S) $(PNGLIB_BASENAME).$$ext libpng.$$ext;\
|
@exit 1
|
||||||
fi;\
|
|
||||||
|
# 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
|
||||||
|
# 'make test' is the first thing the user does.) Only files which include
|
||||||
|
# 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
|
||||||
|
# be built with PNG_USE_READ_MACROS; this prevents the read macros from
|
||||||
|
# interfering with the symbol file format.
|
||||||
|
SYMBOL_CFLAGS = -DPNGLIB_LIBNAME='PNG@PNGLIB_MAJOR@@PNGLIB_MINOR@_0'\
|
||||||
|
-DPNGLIB_VERSION='@PNGLIB_VERSION@'\
|
||||||
|
-DSYMBOL_PREFIX='$(SYMBOL_PREFIX)'\
|
||||||
|
-DPNG_NO_USE_READ_MACROS -DPNG_BUILDING_SYMBOL_TABLE
|
||||||
|
|
||||||
|
if DO_PNG_PREFIX
|
||||||
|
SYMBOL_CFLAGS += -DPNG_PREFIX='@PNG_PREFIX@'
|
||||||
|
endif
|
||||||
|
|
||||||
|
.dfn.out:
|
||||||
|
rm -f $@ $*.c $*.tf[12]
|
||||||
|
test -d scripts || mkdir scripts || test -d scripts
|
||||||
|
echo '#include "$<"' >$*.c
|
||||||
|
$(DFNCPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES)\
|
||||||
|
$(CPPFLAGS) $(SYMBOL_CFLAGS) $*.c > $*.tf1
|
||||||
|
$(AWK) -f "${srcdir}/scripts/dfn.awk" out="$*.tf2" $*.tf1 1>&2
|
||||||
|
rm -f $*.c $*.tf1
|
||||||
|
mv $*.tf2 $@
|
||||||
|
|
||||||
|
# The .dfn file for pnglibconf.h is machine generated
|
||||||
|
pnglibconf.dfn: 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}/pngusr.dfa $(DFA_XTRA) 1>&2
|
||||||
|
$(AWK) -f ${srcdir}/scripts/options.awk out=$*.tf5 $*.tf4 1>&2
|
||||||
|
rm $*.tf4
|
||||||
|
mv $*.tf5 $@
|
||||||
|
|
||||||
|
# Symbol checks (.def and .out files should match)
|
||||||
|
scripts/symbols.chk: scripts/checksym.awk scripts/symbols.def scripts/symbols.out
|
||||||
|
|
||||||
|
.out.chk:
|
||||||
|
rm -f $@ $*.new
|
||||||
|
$(AWK) -f ${srcdir}/scripts/checksym.awk ${srcdir}/scripts/${*F}.def\
|
||||||
|
of="$*.new" $< >&2
|
||||||
|
mv $*.new $@
|
||||||
|
|
||||||
|
# used on demand to regenerate the standard header, CPPFLAGS should
|
||||||
|
# be empty - no non-standard defines
|
||||||
|
scripts/pnglibconf.dfn: scripts/pnglibconf.dfa scripts/options.awk pngconf.h
|
||||||
|
rm -f $@ pnglibconf.tf[67]
|
||||||
|
test -z "$(CPPFLAGS)"
|
||||||
|
echo "com @PNGLIB_VERSION@ STANDARD API DEFINITION" |\
|
||||||
|
$(AWK) -f ${srcdir}/scripts/options.awk out=pnglibconf.tf6\
|
||||||
|
logunsupported=1 version=search ${srcdir}/pngconf.h -\
|
||||||
|
${srcdir}/scripts/pnglibconf.dfa 1>&2
|
||||||
|
$(AWK) -f ${srcdir}/scripts/options.awk out=pnglibconf.tf7\
|
||||||
|
pnglibconf.tf6 1>&2
|
||||||
|
rm pnglibconf.tf6
|
||||||
|
mv pnglibconf.tf7 $@
|
||||||
|
|
||||||
|
$(libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_OBJECTS): png.h pngconf.h \
|
||||||
|
pnglibconf.h pngpriv.h pngdebug.h pnginfo.h pngstruct.h pngprefix.h
|
||||||
|
|
||||||
|
test: check-am
|
||||||
|
|
||||||
|
# Extra checks
|
||||||
|
check: scripts/symbols.chk
|
||||||
|
|
||||||
|
# Don't distribute the generated script files
|
||||||
|
dist-hook:
|
||||||
|
cd '$(top_distdir)'; rm -f $(SCRIPT_CLEANFILES)
|
||||||
|
|
||||||
|
# Make links between installed files with release-specific names and the generic
|
||||||
|
# file names. If this install rule is run the generic names will be deleted and
|
||||||
|
# recreated - this has obvious issues for systems with multiple installations.
|
||||||
|
|
||||||
|
install-header-links:
|
||||||
|
@set -ex; cd '$(DESTDIR)$(includedir)'; for f in $(HEADERS); do \
|
||||||
|
rm -f "$$f"; $(LN_S) "$(PNGLIB_BASENAME)/$$f" "$$f"; done
|
||||||
|
|
||||||
|
uninstall-header-links:
|
||||||
|
cd '$(DESTDIR)$(includedir)'; rm -f $(HEADERS)
|
||||||
|
|
||||||
|
install-libpng-pc:
|
||||||
|
@set -ex; cd '$(DESTDIR)$(pkgconfigdir)'; rm -f libpng.pc; \
|
||||||
|
$(LN_S) '$(PNGLIB_BASENAME).pc' libpng.pc
|
||||||
|
|
||||||
|
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
|
@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
|
|
||||||
@if test -n "@compatlib@"; then\
|
install-libpng-config:
|
||||||
set -x;\
|
@set -ex; cd '$(DESTDIR)$(bindir)'; rm -f libpng-config; \
|
||||||
cd $(DESTDIR)$(libdir);\
|
$(LN_S) '$(PNGLIB_BASENAME)-config' libpng-config
|
||||||
for ext in a la so sl dylib; do\
|
|
||||||
rm -f libpng.$$ext;\
|
uninstall-libpng-config:
|
||||||
done;\
|
rm -f '$(DESTDIR)$(bindir)/libpng-config'
|
||||||
fi
|
|
||||||
|
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)
|
||||||
|
|||||||
1409
Makefile.in
146
README
@@ -1,11 +1,11 @@
|
|||||||
README for libpng version 1.4.0beta87 - October 30, 2009 (shared library 14.0)
|
README for libpng version 1.6.10 - March 6, 2014 (shared library 16.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
|
||||||
@@ -54,11 +54,11 @@ to set different actions based on whether the CRC error occurred in a
|
|||||||
critical or an ancillary chunk.
|
critical or an ancillary chunk.
|
||||||
|
|
||||||
The changes made to the library, and bugs fixed are based on discussions
|
The changes made to the library, and bugs fixed are based on discussions
|
||||||
on the PNG-implement mailing list
|
on the PNG-implement mailing list and not on material submitted
|
||||||
and not on material submitted privately to Guy, Andreas, or Glenn. They will
|
privately to Guy, Andreas, or Glenn. They will forward any good
|
||||||
forward any good suggestions to the list.
|
suggestions to the list.
|
||||||
|
|
||||||
For a detailed description on using libpng, read libpng.txt. For
|
For a detailed description on using libpng, read libpng-manual.txt. For
|
||||||
examples of libpng in a program, see example.c and pngtest.c. For usage
|
examples of libpng in a program, see example.c and pngtest.c. For usage
|
||||||
information and restrictions (what little they are) on libpng, see
|
information and restrictions (what little they are) on libpng, see
|
||||||
png.h. For a description on using zlib (the compression library used by
|
png.h. For a description on using zlib (the compression library used by
|
||||||
@@ -77,17 +77,15 @@ 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.
|
|
||||||
|
|
||||||
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,
|
||||||
@@ -101,31 +99,29 @@ Finally, if you get any warning messages when compiling libpng
|
|||||||
fix. Please mention "libpng" somewhere in the subject line. Thanks.
|
fix. Please mention "libpng" somewhere in the subject line. Thanks.
|
||||||
|
|
||||||
This release was created and will be supported by myself (of course
|
This release was created and will be supported by myself (of course
|
||||||
based in a large way on Guy's and Andreas' earlier work), and the PNG group.
|
based in a large way on Guy's and Andreas' earlier work), and the PNG
|
||||||
|
development group.
|
||||||
|
|
||||||
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
|
Send comments/corrections/commendations to png-mng-implement at
|
||||||
(subscription required; visit
|
lists.sourceforge.net (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
|
||||||
|
|
||||||
You can't reach Guy, the original libpng author, at the addresses
|
You can't reach Guy, the original libpng author, at the addresses
|
||||||
given in previous versions of this document. He and Andreas will read mail
|
given in previous versions of this document. He and Andreas will
|
||||||
addressed to the png-implement list, however.
|
read mail addressed to the png-implement list, however.
|
||||||
|
|
||||||
Please do not send general questions about PNG. Send them to
|
Please do not send general questions about PNG. Send them to
|
||||||
the (png-list at ccrc.wustl.edu, subscription required, write to
|
png-mng-misc at lists.sf.net (subscription required; visit
|
||||||
majordomo at ccrc.wustl.edu with "subscribe png-list" in your message).
|
https://lists.sourceforge.net/lists/listinfo/png-mng-misc to
|
||||||
On the other hand,
|
subscribe). If you have a question about something
|
||||||
please do not send libpng questions to that address, send them to me
|
|
||||||
or to the png-implement list. I'll
|
|
||||||
get them in the end anyway. If you have a question about something
|
|
||||||
in the PNG specification that is related to using libpng, send it
|
in the PNG specification that is related to using libpng, send it
|
||||||
to me. Send me any questions that start with "I was using libpng,
|
to me. Send me any questions that start with "I was using libpng,
|
||||||
and ...". If in doubt, send questions to me. I'll bounce them
|
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 nine years now, and it is official and
|
been discussing PNG for nineteen 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.
|
||||||
@@ -140,14 +136,17 @@ Files in this distribution:
|
|||||||
TODO => Things not implemented in the current library
|
TODO => Things not implemented in the current library
|
||||||
Y2KINFO => Statement of Y2K compliance
|
Y2KINFO => Statement of Y2K compliance
|
||||||
example.c => Example code for using libpng functions
|
example.c => Example code for using libpng functions
|
||||||
libpng.3 => manual page for libpng (includes libpng.txt)
|
libpng.3 => manual page for libpng (includes libpng-manual.txt)
|
||||||
libpng.txt => Description of libpng and its functions
|
libpng-manual.txt => Description of libpng and its functions
|
||||||
libpngpf.3 => manual page for libpng's private functions
|
libpngpf.3 => manual page for libpng's private functions
|
||||||
png.5 => manual page for the PNG format
|
png.5 => manual page for the PNG format
|
||||||
png.c => Basic interface functions common to library
|
png.c => Basic interface functions common to library
|
||||||
png.h => Library function and interface declarations
|
png.h => Library function and interface declarations (public)
|
||||||
pngconf.h => System specific library configuration
|
pngpriv.h => Library function and interface declarations (private)
|
||||||
pngasmrd.h => Header file for assembler-coded functions
|
pngconf.h => System specific library configuration (public)
|
||||||
|
pngstruct.h => png_struct declaration (private)
|
||||||
|
pnginfo.h => png_info struct declaration (private)
|
||||||
|
pngdebug.h => debugging macros (private)
|
||||||
pngerror.c => Error/warning message I/O functions
|
pngerror.c => Error/warning message I/O functions
|
||||||
pngget.c => Functions for retrieving info from struct
|
pngget.c => Functions for retrieving info from struct
|
||||||
pngmem.c => Memory handling functions
|
pngmem.c => Memory handling functions
|
||||||
@@ -166,85 +165,32 @@ 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
|
||||||
|
pngminus => Simple pnm2png and png2pnm programs
|
||||||
|
pngsuite => Test images
|
||||||
|
tools => Various tools
|
||||||
visupng => Contains a MSVC workspace for VisualPng
|
visupng => Contains a MSVC workspace for VisualPng
|
||||||
projects => Contains project files and workspaces for building DLL
|
projects => Contains project files and workspaces for
|
||||||
beos => Contains a Beos workspace for building libpng
|
building a DLL
|
||||||
c5builder => Contains a Borland workspace for building libpng
|
owatcom => Contains a WATCOM project for building libpng
|
||||||
and zlib
|
visualc71 => Contains a Microsoft Visual C++ (MSVC)
|
||||||
visualc6 => Contains a Microsoft Visual C++ (MSVC) workspace
|
workspace for building libpng and zlib
|
||||||
for building libpng and zlib
|
vstudio => Contains a Microsoft Visual C++ (MSVC)
|
||||||
|
workspace for building libpng and zlib
|
||||||
scripts => Directory containing scripts for building libpng:
|
scripts => Directory containing scripts for building libpng:
|
||||||
descrip.mms => VMS makefile for MMS or MMK
|
(see scripts/README.txt for the list of scripts)
|
||||||
makefile.std => Generic UNIX makefile (cc, creates static libpng.a)
|
|
||||||
makefile.elf => Linux/ELF makefile symbol versioning,
|
|
||||||
gcc, creates libpng14.so.14.1.4.0beta87)
|
|
||||||
makefile.linux => Linux/ELF makefile
|
|
||||||
(gcc, creates libpng14.so.14.1.4.0beta87)
|
|
||||||
makefile.gcmmx => Linux/ELF makefile
|
|
||||||
(gcc, creates libpng14.so.14.1.4.0beta87,
|
|
||||||
uses assembler code tuned for Intel MMX platform)
|
|
||||||
makefile.gcc => Generic makefile (gcc, creates static libpng.a)
|
|
||||||
makefile.knr => Archaic UNIX Makefile that converts files with
|
|
||||||
ansi2knr (Requires ansi2knr.c from
|
|
||||||
ftp://ftp.cs.wisc.edu/ghost)
|
|
||||||
makefile.aix => AIX makefile
|
|
||||||
makefile.cygwin => Cygwin/gcc makefile
|
|
||||||
makefile.darwin => Darwin makefile
|
|
||||||
makefile.dec => DEC Alpha UNIX makefile
|
|
||||||
makefile.freebsd => FreeBSD makefile
|
|
||||||
makefile.hpgcc => HPUX makefile using gcc
|
|
||||||
makefile.hpux => HPUX (10.20 and 11.00) makefile
|
|
||||||
makefile.hp64 => HPUX (10.20 and 11.00) makefile, 64 bit
|
|
||||||
makefile.ibmc => IBM C/C++ version 3.x for Win32 and OS/2 (static)
|
|
||||||
makefile.intel => Intel C/C++ version 4.0 and later
|
|
||||||
makefile.netbsd => NetBSD/cc makefile, PNGGCCRD, makes libpng.so.
|
|
||||||
makefile.ne14bsd => NetBSD/cc makefile, PNGGCCRD, makes libpng14.so
|
|
||||||
makefile.openbsd => OpenBSD makefile
|
|
||||||
makefile.sgi => Silicon Graphics IRIX (cc, creates static lib)
|
|
||||||
makefile.sggcc => Silicon Graphics
|
|
||||||
(gcc, creates libpng14.so.14.1.4.0beta87)
|
|
||||||
makefile.sunos => Sun makefile
|
|
||||||
makefile.solaris => Solaris 2.X makefile
|
|
||||||
(gcc, creates libpng14.so.14.1.4.0beta87)
|
|
||||||
makefile.so9 => Solaris 9 makefile
|
|
||||||
(gcc, creates libpng14.so.14.1.4.0beta87)
|
|
||||||
makefile.32sunu => Sun Ultra 32-bit makefile
|
|
||||||
makefile.64sunu => Sun Ultra 64-bit makefile
|
|
||||||
makefile.sco => For SCO OSr5 ELF and Unixware 7 with Native cc
|
|
||||||
makefile.mips => MIPS makefile
|
|
||||||
makefile.acorn => Acorn makefile
|
|
||||||
makefile.amiga => Amiga makefile
|
|
||||||
smakefile.ppc => AMIGA smakefile for SAS C V6.58/7.00 PPC
|
|
||||||
compiler (Requires SCOPTIONS, copied from
|
|
||||||
scripts/SCOPTIONS.ppc)
|
|
||||||
makefile.atari => Atari makefile
|
|
||||||
makefile.beos => BEOS makefile for X86
|
|
||||||
makefile.bor => Borland makefile (uses bcc)
|
|
||||||
makefile.bc32 => 32-bit Borland C++ (all modules compiled in C mode)
|
|
||||||
makefile.tc3 => Turbo C 3.0 makefile
|
|
||||||
makefile.dj2 => DJGPP 2 makefile
|
|
||||||
makefile.msc => Microsoft C makefile
|
|
||||||
makefile.vcawin32=> makefile for Microsoft Visual C++ 5.0 and
|
|
||||||
later (uses assembler code tuned for Intel MMX
|
|
||||||
platform)
|
|
||||||
makefile.vcwin32 => makefile for Microsoft Visual C++ 4.0 and
|
|
||||||
later (does not use assembler code)
|
|
||||||
makefile.os2 => OS/2 Makefile (gcc and emx, requires pngos2.def)
|
|
||||||
pngos2.def => OS/2 module definition file used by makefile.os2
|
|
||||||
makefile.watcom => Watcom 10a+ Makefile, 32-bit flat memory model
|
|
||||||
makevms.com => VMS build script
|
|
||||||
SCOPTIONS.ppc => Used with smakefile.ppc
|
|
||||||
|
|
||||||
Good luck, and happy coding.
|
Good luck, and happy coding.
|
||||||
|
|
||||||
-Glenn Randers-Pehrson (current maintainer)
|
-Glenn Randers-Pehrson (current maintainer, since 1998)
|
||||||
Internet: glennrp at users.sourceforge.net
|
Internet: glennrp at users.sourceforge.net
|
||||||
|
|
||||||
-Andreas Eric Dilger (former maintainer, 1996-1997)
|
-Andreas Eric Dilger (former maintainer, 1996-1997)
|
||||||
|
|||||||
9
TODO
@@ -2,30 +2,27 @@
|
|||||||
TODO - list of things to do for libpng:
|
TODO - list of things to do for libpng:
|
||||||
|
|
||||||
Final bug fixes.
|
Final bug fixes.
|
||||||
Improve API by hiding the png_struct and png_info structs.
|
|
||||||
Finish work on the no-floating-point version (including gamma compensation)
|
|
||||||
Better C++ wrapper/full C++ implementation?
|
Better C++ wrapper/full C++ implementation?
|
||||||
Fix problem with C++ and EXTERN "C".
|
Fix problem with C++ and EXTERN "C".
|
||||||
cHRM transformation.
|
cHRM transformation.
|
||||||
Improve setjmp/longjmp usage or remove it in favor of returning error codes.
|
Remove setjmp/longjmp usage in favor of returning error codes.
|
||||||
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
|
||||||
(counting huffman bits/precompression? filter inertia? filter costs?).
|
(counting huffman bits/precompression? filter inertia? filter costs?).
|
||||||
Histogram creation.
|
Histogram creation.
|
||||||
Text conversion between different code pages (Latin-1 -> Mac and DOS).
|
Text conversion between different code pages (Latin-1 -> Mac and DOS).
|
||||||
Build gamma tables using fixed point (and do away with floating point entirely).
|
|
||||||
Avoid building gamma tables whenever possible.
|
Avoid building gamma tables whenever possible.
|
||||||
Use greater precision when changing to linear gamma for compositing against
|
Use greater precision when changing to linear gamma for compositing against
|
||||||
background and doing rgb-to-gray transformation.
|
background and doing rgb-to-gray transformation.
|
||||||
Investigate pre-incremented loop counters and other loop constructions.
|
Investigate pre-incremented loop counters and other loop constructions.
|
||||||
Add interpolated method of handling interlacing.
|
Add interpolated method of handling interlacing.
|
||||||
Provide for conditional compilation of 16-bit support (except for the
|
|
||||||
initial stripping down to 8-bits when reading a 16-bit PNG datastream).
|
|
||||||
Switch to the simpler zlib (zlib/libpng) license if legally possible.
|
Switch to the simpler zlib (zlib/libpng) license if legally possible.
|
||||||
|
Extend pngvalid.c to validate more of the libpng transformations.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|||||||
8864
aclocal.m4
vendored
133
arm/arm_init.c
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
|
||||||
|
/* arm_init.c - NEON optimised filter functions
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
/* Below, after checking __linux__, various non-C90 POSIX 1003.1 functions are
|
||||||
|
* called.
|
||||||
|
*/
|
||||||
|
#define _POSIX_SOURCE 1
|
||||||
|
|
||||||
|
#include "../pngpriv.h"
|
||||||
|
|
||||||
|
#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
|
||||||
|
* presense of the required support, therefore run-time detectioon 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 /* PNG_READ_SUPPORTED */
|
||||||
246
arm/filter_neon.S
Normal file
@@ -0,0 +1,246 @@
|
|||||||
|
|
||||||
|
/* filter_neon.S - NEON optimised filter functions
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013 Glenn Randers-Pehrson
|
||||||
|
* Written by Mans Rullgard, 2011.
|
||||||
|
* Last changed in libpng 1.6.8 [December 19, 2013]
|
||||||
|
*
|
||||||
|
* This code is released under the libpng license.
|
||||||
|
* For conditions of distribution and use, see the disclaimer
|
||||||
|
* and license in png.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* This is required to get the symbol renames, which are #defines, and also
|
||||||
|
* includes the definition (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__)
|
||||||
|
.section .note.GNU-stack,"",%progbits /* mark stack as non-executable */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* 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 */
|
||||||
|
|
||||||
|
#ifdef PNG_READ_SUPPORTED
|
||||||
|
#if PNG_ARM_NEON_OPT > 0
|
||||||
|
|
||||||
|
#ifdef __ELF__
|
||||||
|
# define ELF
|
||||||
|
#else
|
||||||
|
# define ELF @
|
||||||
|
#endif
|
||||||
|
|
||||||
|
.arch armv7-a
|
||||||
|
.fpu neon
|
||||||
|
|
||||||
|
.macro func name, export=0
|
||||||
|
.macro endfunc
|
||||||
|
ELF .size \name, . - \name
|
||||||
|
.endfunc
|
||||||
|
.purgem endfunc
|
||||||
|
.endm
|
||||||
|
.text
|
||||||
|
.if \export
|
||||||
|
.global \name
|
||||||
|
.endif
|
||||||
|
ELF .type \name, STT_FUNC
|
||||||
|
.func \name
|
||||||
|
\name:
|
||||||
|
.endm
|
||||||
|
|
||||||
|
func png_read_filter_row_sub4_neon, export=1
|
||||||
|
ldr r3, [r0, #4] @ rowbytes
|
||||||
|
vmov.i8 d3, #0
|
||||||
|
1:
|
||||||
|
vld4.32 {d4[],d5[],d6[],d7[]}, [r1,:128]
|
||||||
|
vadd.u8 d0, d3, d4
|
||||||
|
vadd.u8 d1, d0, d5
|
||||||
|
vadd.u8 d2, d1, d6
|
||||||
|
vadd.u8 d3, d2, d7
|
||||||
|
vst4.32 {d0[0],d1[0],d2[0],d3[0]},[r1,:128]!
|
||||||
|
subs r3, r3, #16
|
||||||
|
bgt 1b
|
||||||
|
|
||||||
|
bx lr
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
func png_read_filter_row_sub3_neon, export=1
|
||||||
|
ldr r3, [r0, #4] @ rowbytes
|
||||||
|
vmov.i8 d3, #0
|
||||||
|
mov r0, r1
|
||||||
|
mov r2, #3
|
||||||
|
mov r12, #12
|
||||||
|
vld1.8 {q11}, [r0], r12
|
||||||
|
1:
|
||||||
|
vext.8 d5, d22, d23, #3
|
||||||
|
vadd.u8 d0, d3, d22
|
||||||
|
vext.8 d6, d22, d23, #6
|
||||||
|
vadd.u8 d1, d0, d5
|
||||||
|
vext.8 d7, d23, d23, #1
|
||||||
|
vld1.8 {q11}, [r0], r12
|
||||||
|
vst1.32 {d0[0]}, [r1,:32], r2
|
||||||
|
vadd.u8 d2, d1, d6
|
||||||
|
vst1.32 {d1[0]}, [r1], r2
|
||||||
|
vadd.u8 d3, d2, d7
|
||||||
|
vst1.32 {d2[0]}, [r1], r2
|
||||||
|
vst1.32 {d3[0]}, [r1], r2
|
||||||
|
subs r3, r3, #12
|
||||||
|
bgt 1b
|
||||||
|
|
||||||
|
bx lr
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
func png_read_filter_row_up_neon, export=1
|
||||||
|
ldr r3, [r0, #4] @ rowbytes
|
||||||
|
1:
|
||||||
|
vld1.8 {q0}, [r1,:128]
|
||||||
|
vld1.8 {q1}, [r2,:128]!
|
||||||
|
vadd.u8 q0, q0, q1
|
||||||
|
vst1.8 {q0}, [r1,:128]!
|
||||||
|
subs r3, r3, #16
|
||||||
|
bgt 1b
|
||||||
|
|
||||||
|
bx lr
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
func png_read_filter_row_avg4_neon, export=1
|
||||||
|
ldr r12, [r0, #4] @ rowbytes
|
||||||
|
vmov.i8 d3, #0
|
||||||
|
1:
|
||||||
|
vld4.32 {d4[],d5[],d6[],d7[]}, [r1,:128]
|
||||||
|
vld4.32 {d16[],d17[],d18[],d19[]},[r2,:128]!
|
||||||
|
vhadd.u8 d0, d3, d16
|
||||||
|
vadd.u8 d0, d0, d4
|
||||||
|
vhadd.u8 d1, d0, d17
|
||||||
|
vadd.u8 d1, d1, d5
|
||||||
|
vhadd.u8 d2, d1, d18
|
||||||
|
vadd.u8 d2, d2, d6
|
||||||
|
vhadd.u8 d3, d2, d19
|
||||||
|
vadd.u8 d3, d3, d7
|
||||||
|
vst4.32 {d0[0],d1[0],d2[0],d3[0]},[r1,:128]!
|
||||||
|
subs r12, r12, #16
|
||||||
|
bgt 1b
|
||||||
|
|
||||||
|
bx lr
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
func png_read_filter_row_avg3_neon, export=1
|
||||||
|
push {r4,lr}
|
||||||
|
ldr r12, [r0, #4] @ rowbytes
|
||||||
|
vmov.i8 d3, #0
|
||||||
|
mov r0, r1
|
||||||
|
mov r4, #3
|
||||||
|
mov lr, #12
|
||||||
|
vld1.8 {q11}, [r0], lr
|
||||||
|
1:
|
||||||
|
vld1.8 {q10}, [r2], lr
|
||||||
|
vext.8 d5, d22, d23, #3
|
||||||
|
vhadd.u8 d0, d3, d20
|
||||||
|
vext.8 d17, d20, d21, #3
|
||||||
|
vadd.u8 d0, d0, d22
|
||||||
|
vext.8 d6, d22, d23, #6
|
||||||
|
vhadd.u8 d1, d0, d17
|
||||||
|
vext.8 d18, d20, d21, #6
|
||||||
|
vadd.u8 d1, d1, d5
|
||||||
|
vext.8 d7, d23, d23, #1
|
||||||
|
vld1.8 {q11}, [r0], lr
|
||||||
|
vst1.32 {d0[0]}, [r1,:32], r4
|
||||||
|
vhadd.u8 d2, d1, d18
|
||||||
|
vst1.32 {d1[0]}, [r1], r4
|
||||||
|
vext.8 d19, d21, d21, #1
|
||||||
|
vadd.u8 d2, d2, d6
|
||||||
|
vhadd.u8 d3, d2, d19
|
||||||
|
vst1.32 {d2[0]}, [r1], r4
|
||||||
|
vadd.u8 d3, d3, d7
|
||||||
|
vst1.32 {d3[0]}, [r1], r4
|
||||||
|
subs r12, r12, #12
|
||||||
|
bgt 1b
|
||||||
|
|
||||||
|
pop {r4,pc}
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
.macro paeth rx, ra, rb, rc
|
||||||
|
vaddl.u8 q12, \ra, \rb @ a + b
|
||||||
|
vaddl.u8 q15, \rc, \rc @ 2*c
|
||||||
|
vabdl.u8 q13, \rb, \rc @ pa
|
||||||
|
vabdl.u8 q14, \ra, \rc @ pb
|
||||||
|
vabd.u16 q15, q12, q15 @ pc
|
||||||
|
vcle.u16 q12, q13, q14 @ pa <= pb
|
||||||
|
vcle.u16 q13, q13, q15 @ pa <= pc
|
||||||
|
vcle.u16 q14, q14, q15 @ pb <= pc
|
||||||
|
vand q12, q12, q13 @ pa <= pb && pa <= pc
|
||||||
|
vmovn.u16 d28, q14
|
||||||
|
vmovn.u16 \rx, q12
|
||||||
|
vbsl d28, \rb, \rc
|
||||||
|
vbsl \rx, \ra, d28
|
||||||
|
.endm
|
||||||
|
|
||||||
|
func png_read_filter_row_paeth4_neon, export=1
|
||||||
|
ldr r12, [r0, #4] @ rowbytes
|
||||||
|
vmov.i8 d3, #0
|
||||||
|
vmov.i8 d20, #0
|
||||||
|
1:
|
||||||
|
vld4.32 {d4[],d5[],d6[],d7[]}, [r1,:128]
|
||||||
|
vld4.32 {d16[],d17[],d18[],d19[]},[r2,:128]!
|
||||||
|
paeth d0, d3, d16, d20
|
||||||
|
vadd.u8 d0, d0, d4
|
||||||
|
paeth d1, d0, d17, d16
|
||||||
|
vadd.u8 d1, d1, d5
|
||||||
|
paeth d2, d1, d18, d17
|
||||||
|
vadd.u8 d2, d2, d6
|
||||||
|
paeth d3, d2, d19, d18
|
||||||
|
vmov d20, d19
|
||||||
|
vadd.u8 d3, d3, d7
|
||||||
|
vst4.32 {d0[0],d1[0],d2[0],d3[0]},[r1,:128]!
|
||||||
|
subs r12, r12, #16
|
||||||
|
bgt 1b
|
||||||
|
|
||||||
|
bx lr
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
func png_read_filter_row_paeth3_neon, export=1
|
||||||
|
push {r4,lr}
|
||||||
|
ldr r12, [r0, #4] @ rowbytes
|
||||||
|
vmov.i8 d3, #0
|
||||||
|
vmov.i8 d4, #0
|
||||||
|
mov r0, r1
|
||||||
|
mov r4, #3
|
||||||
|
mov lr, #12
|
||||||
|
vld1.8 {q11}, [r0], lr
|
||||||
|
1:
|
||||||
|
vld1.8 {q10}, [r2], lr
|
||||||
|
paeth d0, d3, d20, d4
|
||||||
|
vext.8 d5, d22, d23, #3
|
||||||
|
vadd.u8 d0, d0, d22
|
||||||
|
vext.8 d17, d20, d21, #3
|
||||||
|
paeth d1, d0, d17, d20
|
||||||
|
vst1.32 {d0[0]}, [r1,:32], r4
|
||||||
|
vext.8 d6, d22, d23, #6
|
||||||
|
vadd.u8 d1, d1, d5
|
||||||
|
vext.8 d18, d20, d21, #6
|
||||||
|
paeth d2, d1, d18, d17
|
||||||
|
vext.8 d7, d23, d23, #1
|
||||||
|
vld1.8 {q11}, [r0], lr
|
||||||
|
vst1.32 {d1[0]}, [r1], r4
|
||||||
|
vadd.u8 d2, d2, d6
|
||||||
|
vext.8 d19, d21, d21, #1
|
||||||
|
paeth d3, d2, d19, d18
|
||||||
|
vst1.32 {d2[0]}, [r1], r4
|
||||||
|
vmov d4, d19
|
||||||
|
vadd.u8 d3, d3, d7
|
||||||
|
vst1.32 {d3[0]}, [r1], r4
|
||||||
|
subs r12, r12, #12
|
||||||
|
bgt 1b
|
||||||
|
|
||||||
|
pop {r4,pc}
|
||||||
|
endfunc
|
||||||
|
#endif /* PNG_ARM_NEON_OPT > 0 */
|
||||||
|
#endif /* PNG_READ_SUPPORTED */
|
||||||
|
#endif /* PNG_ARM_NEON_IMPLEMENTATION == 2 (assembler) */
|
||||||
372
arm/filter_neon_intrinsics.c
Normal file
@@ -0,0 +1,372 @@
|
|||||||
|
|
||||||
|
/* filter_neon_intrinsics.c - NEON optimised filter functions
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013 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.8 [December 19, 2013]
|
||||||
|
*
|
||||||
|
* 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"
|
||||||
|
|
||||||
|
/* 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)
|
||||||
|
|
||||||
|
#ifdef PNG_READ_SUPPORTED
|
||||||
|
#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_READ_SUPPORTED */
|
||||||
|
#endif /* PNG_ARM_NEON_IMPLEMENTATION == 1 (intrinsics) */
|
||||||
245
autogen.sh
@@ -1,25 +1,224 @@
|
|||||||
#! /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.
|
||||||
touch Makefile.am configure.ac
|
#
|
||||||
{
|
# The first time this is run on a GIT checkout the only files that exist are
|
||||||
echo "running libtoolize" >&2
|
# configure.ac and Makefile.am; all of the autotools support scripts are
|
||||||
libtoolize --force --copy --automake
|
# missing. They are instantiated with autoreconf --force --install.
|
||||||
} && {
|
#
|
||||||
echo "running aclocal" >&2
|
# For regular ("tarball") distributions all the files should exist. We do not
|
||||||
aclocal
|
# want them to be updated *under any circumstances*. It should never be
|
||||||
} && {
|
# necessary to run autogen.sh because ./configure --enable-maintainer-mode says
|
||||||
echo "running autoheader [ignore the warnings]" >&2
|
# what to do if Makefile.am or configure.ac are changed.
|
||||||
autoheader
|
#
|
||||||
} && {
|
# It is *probably* OK to update the files on a GIT checkout, because they have
|
||||||
echo "running automake" >&2
|
# come from the local tools, but leave that to the user who is assumed to know
|
||||||
automake --force-missing --foreign -a -c
|
# whether it is ok or required.
|
||||||
} && {
|
#
|
||||||
echo "running autoconf" >&2
|
# This script is intended to work without arguments, there are, however, hidden
|
||||||
autoconf
|
# 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
|
||||||
echo "autogen complete" >&2 ||
|
# options. For this reason the options are *NOT* documented in the help; this
|
||||||
echo "ERROR: autogen.sh failed, autogen is incomplete" >&2
|
# is deliberate; UTSL.
|
||||||
|
#
|
||||||
|
clean=
|
||||||
|
maintainer=
|
||||||
|
while test $# -gt 0
|
||||||
|
do
|
||||||
|
case "$1" in
|
||||||
|
--maintainer)
|
||||||
|
maintainer=1;;
|
||||||
|
|
||||||
|
--clean)
|
||||||
|
clean=1;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
exec >&2
|
||||||
|
echo "$0: usage: ./autogen.sh"
|
||||||
|
if test -d .git
|
||||||
|
then
|
||||||
|
echo " ./autogen.sh generates the configure script and"
|
||||||
|
echo " Makefile.in, or refreshes them after changes to Makefile.am"
|
||||||
|
echo " or configure.ac. You may prefer to just run autoreconf."
|
||||||
|
elif test -z "$maintainer"
|
||||||
|
then
|
||||||
|
echo " DO NOT RUN THIS SCRIPT."
|
||||||
|
echo " If you need to change Makefile.am or configure.ac then you"
|
||||||
|
echo " also need to run ./configure --enable-maintainer-mode and"
|
||||||
|
echo " use the appropriate autotools, *NOT* this script, to update"
|
||||||
|
echo " everything, please check the documentation of autoreconf."
|
||||||
|
echo " WARNING: libpng is intentionally generated with a known,"
|
||||||
|
echo " fixed, set of autotools. It is known *NOT* to work with"
|
||||||
|
echo " the collection of autotools distributed on highly reputable"
|
||||||
|
echo " operating systems."
|
||||||
|
echo " Remember: autotools is GNU software, you are expected to"
|
||||||
|
echo " pay for support."
|
||||||
|
else
|
||||||
|
echo " You have run autogen.sh with --maintainer enabled and you"
|
||||||
|
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.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
|
||||||
|
|||||||
1542
config.guess
vendored
83
config.h.in
@@ -1,83 +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 <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 version of this package. */
|
|
||||||
#undef PACKAGE_VERSION
|
|
||||||
|
|
||||||
/* 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 `unsigned int' if <sys/types.h> does not define. */
|
|
||||||
#undef size_t
|
|
||||||
1677
config.sub
vendored
294
configure.ac
@@ -14,57 +14,154 @@ 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.4.0beta87], [png-mng-implement@lists.sourceforge.net])
|
AC_INIT([libpng],[1.6.10],[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.4.0beta87
|
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.6.10
|
||||||
PNGLIB_MAJOR=1
|
PNGLIB_MAJOR=1
|
||||||
PNGLIB_MINOR=4
|
PNGLIB_MINOR=6
|
||||||
PNGLIB_RELEASE=0
|
PNGLIB_RELEASE=10
|
||||||
|
|
||||||
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_PROG_CC
|
AC_PROG_CC
|
||||||
AC_PROG_LD
|
AM_PROG_AS
|
||||||
|
LT_PATH_LD
|
||||||
AC_PROG_CPP
|
AC_PROG_CPP
|
||||||
AC_CHECK_TOOL(SED, sed, :)
|
AC_PROG_AWK
|
||||||
AC_LIBTOOL_WIN32_DLL
|
|
||||||
AC_PROG_INSTALL
|
AC_PROG_INSTALL
|
||||||
AC_PROG_LN_S
|
AC_PROG_LN_S
|
||||||
AC_PROG_MAKE_SET
|
AC_PROG_MAKE_SET
|
||||||
AC_PROG_LIBTOOL
|
|
||||||
|
dnl libtool/libtoolize; version 2.4.2 is the tested version, this or any
|
||||||
|
dnl compatible later version may be used
|
||||||
|
LT_INIT([win32-dll])
|
||||||
|
LT_PREREQ([2.4.2])
|
||||||
|
|
||||||
|
# Some awks crash when confronted with pnglibconf.dfa, do a test run now
|
||||||
|
# to make sure this doesn't happen
|
||||||
|
AC_MSG_CHECKING([that AWK works])
|
||||||
|
if ${AWK} -f ${srcdir}/scripts/options.awk out="/dev/null" version=search\
|
||||||
|
${srcdir}/pngconf.h ${srcdir}/scripts/pnglibconf.dfa\
|
||||||
|
${srcdir}/pngusr.dfa 1>&2
|
||||||
|
then
|
||||||
|
AC_MSG_RESULT([ok])
|
||||||
|
else
|
||||||
|
AC_MSG_FAILURE([failed], 1)
|
||||||
|
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"
|
||||||
|
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])
|
|
||||||
|
|
||||||
# Checks for typedefs, structures, and compiler characteristics.
|
# Checks for typedefs, structures, and compiler characteristics.
|
||||||
AC_C_CONST
|
AC_C_CONST
|
||||||
AC_TYPE_SIZE_T
|
AC_TYPE_SIZE_T
|
||||||
AC_STRUCT_TM
|
AC_STRUCT_TM
|
||||||
|
AC_C_RESTRICT
|
||||||
|
|
||||||
# Checks for library functions.
|
# Checks for library functions.
|
||||||
AC_FUNC_STRTOD
|
AC_FUNC_STRTOD
|
||||||
AC_CHECK_FUNCS([memset], , AC_ERROR([memset not found in libc]))
|
AC_CHECK_FUNCS([memset], , AC_MSG_ERROR(memset not found in libc))
|
||||||
AC_CHECK_FUNCS([pow], , AC_CHECK_LIB(m, pow, , AC_ERROR([cannot find pow])) )
|
AC_CHECK_FUNCS([pow], , AC_CHECK_LIB(m, pow, , AC_MSG_ERROR(cannot find pow)) )
|
||||||
AC_CHECK_LIB(z, zlibVersion, , AC_ERROR([zlib not installed]))
|
AC_ARG_WITH(zlib-prefix,
|
||||||
|
AS_HELP_STRING([[[--with-zlib-prefix]]],
|
||||||
|
[prefix that may have been used in installed zlib]),
|
||||||
|
[ZPREFIX=${withval}],
|
||||||
|
[ZPREFIX='z_'])
|
||||||
|
AC_CHECK_LIB(z, zlibVersion, ,
|
||||||
|
AC_CHECK_LIB(z, ${ZPREFIX}zlibVersion, , AC_MSG_ERROR(zlib not installed)))
|
||||||
|
|
||||||
LIBPNG_DEFINES=-DPNG_CONFIGURE_LIBPNG
|
# The following is for pngvalid, to ensure it catches FP errors even on
|
||||||
LIBPNG_DEFINES=$LIBPNG_DEFINES
|
# platforms that don't enable FP exceptions, the function appears in the math
|
||||||
AC_SUBST(LIBPNG_DEFINES)
|
# library (typically), it's not an error if it is not found.
|
||||||
|
AC_CHECK_LIB([m], [feenableexcept])
|
||||||
|
AC_CHECK_FUNCS([feenableexcept])
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([if using Solaris linker])
|
||||||
|
SLD=`$LD --version 2>&1 | grep Solaris`
|
||||||
|
if test "$SLD"; then
|
||||||
|
have_solaris_ld=yes
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
else
|
||||||
|
have_solaris_ld=no
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
fi
|
||||||
|
AM_CONDITIONAL(HAVE_SOLARIS_LD, test "$have_solaris_ld" = "yes")
|
||||||
|
|
||||||
AC_MSG_CHECKING([if libraries can be versioned])
|
AC_MSG_CHECKING([if libraries can be versioned])
|
||||||
GLD=`$LD --help < /dev/null 2>/dev/null | grep version-script`
|
# Special case for PE/COFF platforms: ld reports
|
||||||
|
# support for version-script, but doesn't actually
|
||||||
|
# DO anything with it.
|
||||||
|
case $host in
|
||||||
|
*cygwin* | *mingw32* | *interix* )
|
||||||
|
have_ld_version_script=no
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
;;
|
||||||
|
* )
|
||||||
|
|
||||||
|
if test "$have_solaris_ld" = "yes"; then
|
||||||
|
GLD=`$LD --help < /dev/null 2>&1 | grep 'M mapfile'`
|
||||||
|
else
|
||||||
|
GLD=`$LD --help < /dev/null 2>/dev/null | grep version-script`
|
||||||
|
fi
|
||||||
|
|
||||||
if test "$GLD"; then
|
if test "$GLD"; then
|
||||||
have_ld_version_script=yes
|
have_ld_version_script=yes
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
@@ -73,14 +170,17 @@ else
|
|||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
AC_MSG_WARN(*** You have not enabled versioned symbols.)
|
AC_MSG_WARN(*** You have not enabled versioned symbols.)
|
||||||
fi
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
AM_CONDITIONAL(HAVE_LD_VERSION_SCRIPT, test "$have_ld_version_script" = "yes")
|
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 \
|
| ${CPP-${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
|
||||||
@@ -94,45 +194,131 @@ 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])
|
||||||
|
|
||||||
# Allow the old version number library, libpng.so, to be removed from
|
# Support for prefixes to the API function names; this will generate defines
|
||||||
# the build
|
# at the start of the build to rename exported library functions
|
||||||
AC_ARG_WITH(libpng-compat,
|
AC_ARG_WITH(libpng-prefix,
|
||||||
AC_HELP_STRING([--with-libpng-compat],
|
AS_HELP_STRING([[[--with-libpng-prefix]]],
|
||||||
[Generate the obsolete libpng.so library @<:@default=yes@:>@]),
|
[prefix libpng exported function (API) names with the given value]),
|
||||||
[if test "${withval}" = no; then
|
[if test "${withval:-no}" != "no"; then
|
||||||
compatlib=
|
AC_SUBST([PNG_PREFIX], [${withval}])
|
||||||
AC_MSG_NOTICE([libpng.so will not be built])
|
fi])
|
||||||
else
|
AM_CONDITIONAL([DO_PNG_PREFIX], [test "${with_libpng_prefix:-no}" != "no"])
|
||||||
compatlib=libpng.la
|
|
||||||
fi],
|
# Control over what links are made for installed files. Versioned files are
|
||||||
[compatlib=libpng.la])
|
# always installed, when the following options are turned on corresponding
|
||||||
AC_SUBST([compatlib])
|
# 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],
|
||||||
|
AS_HELP_STRING([[[--enable-arm-neon]]],
|
||||||
|
[Enable ARM NEON optimizations: =no/off, check, api, yes/on:]
|
||||||
|
[no/off: disable the optimizations; check: use internal checking code]
|
||||||
|
[(deprecated and poorly supported); api: disable by default, enable by]
|
||||||
|
[a call to png_set_option; yes/on: turn on unconditionally.]
|
||||||
|
[If not specified: determined by the compiler.]),
|
||||||
|
[case "$enableval" in
|
||||||
|
no|off)
|
||||||
|
# disable the default enabling on __ARM_NEON__ systems:
|
||||||
|
AC_DEFINE([PNG_ARM_NEON_OPT], [0],
|
||||||
|
[Disable ARM Neon optimizations])
|
||||||
|
# Prevent inclusion of the assembler files below:
|
||||||
|
enable_arm_neon=no;;
|
||||||
|
check)
|
||||||
|
AC_DEFINE([PNG_ARM_NEON_CHECK_SUPPORTED], [],
|
||||||
|
[Check for ARM Neon support at run-time]);;
|
||||||
|
api)
|
||||||
|
AC_DEFINE([PNG_ARM_NEON_API_SUPPORTED], [],
|
||||||
|
[Turn on ARM Neon optimizations at run-time]);;
|
||||||
|
yes|on)
|
||||||
|
AC_DEFINE([PNG_ARM_NEON_OPT], [2],
|
||||||
|
[Enable ARM Neon optimizations])
|
||||||
|
AC_MSG_WARN([--enable-arm-neon: please specify 'check' or 'api', if]
|
||||||
|
[you want the optimizations unconditionally pass -mfpu=neon]
|
||||||
|
[to the compiler.]);;
|
||||||
|
*)
|
||||||
|
AC_MSG_ERROR([--enable-arm-neon=${enable_arm_neon}: invalid value])
|
||||||
|
esac])
|
||||||
|
|
||||||
|
# Add ARM specific files to all builds where the host_cpu is arm ('arm*') or
|
||||||
|
# where ARM optimizations were explicitly requested (this allows a fallback if a
|
||||||
|
# future host CPU does not match 'arm*')
|
||||||
|
|
||||||
|
AM_CONDITIONAL([PNG_ARM_NEON],
|
||||||
|
[test "$enable_arm_neon" != 'no' &&
|
||||||
|
case "$host_cpu" in
|
||||||
|
arm*) :;;
|
||||||
|
*) 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:scripts/libpng.pc-configure.in])
|
AC_CONFIG_FILES([Makefile libpng.pc:libpng.pc.in])
|
||||||
AC_CONFIG_FILES([libpng-config:scripts/libpng-config.in],
|
AC_CONFIG_FILES([libpng-config:libpng-config.in],
|
||||||
[chmod +x libpng-config])
|
[chmod +x libpng-config])
|
||||||
|
|
||||||
AC_OUTPUT
|
AC_OUTPUT
|
||||||
|
|||||||
4
contrib/README.txt
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
|
||||||
|
This "contrib" directory contains contributions which are not necessarily under
|
||||||
|
the libpng license, although all are open source. They are not part of
|
||||||
|
libpng proper and are not used for building the library.
|
||||||
83
contrib/arm-neon/README
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
OPERATING SYSTEM SPECIFIC ARM NEON DETECTION
|
||||||
|
--------------------------------------------
|
||||||
|
|
||||||
|
Detection of the ability to exexcute 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;
|
||||||
|
}
|
||||||
159
contrib/arm-neon/linux.c
Normal file
@@ -0,0 +1,159 @@
|
|||||||
|
/* contrib/arm-neon/linux.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: 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 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)");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
png_warning(png_ptr, "/proc/cpuinfo open failed");
|
||||||
|
|
||||||
|
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>
|
||||||
180
contrib/examples/iccfrompng.c
Normal file
@@ -0,0 +1,180 @@
|
|||||||
|
/*- 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>
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
368
contrib/examples/pngpixel.c
Normal file
@@ -0,0 +1,368 @@
|
|||||||
|
/*- 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"
|
||||||
|
|
||||||
|
/* 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;
|
||||||
|
}
|
||||||
92
contrib/examples/pngtopng.c
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
/*- 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"
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
GNU GENERAL PUBLIC LICENSE
|
||||||
Version 2, June 1991
|
Version 2, June 1991
|
||||||
|
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
of this license document, but changing it is not allowed.
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
Preamble
|
Preamble
|
||||||
|
|
||||||
The licenses for most software are designed to take away your
|
The licenses for most software are designed to take away your
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
@@ -56,7 +56,7 @@ patent must be licensed for everyone's free use or not licensed at all.
|
|||||||
The precise terms and conditions for copying, distribution and
|
The precise terms and conditions for copying, distribution and
|
||||||
modification follow.
|
modification follow.
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
GNU GENERAL PUBLIC LICENSE
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
0. This License applies to any program or other work which contains
|
0. This License applies to any program or other work which contains
|
||||||
@@ -255,7 +255,7 @@ make exceptions for this. Our decision will be guided by the two goals
|
|||||||
of preserving the free status of all derivatives of our free software and
|
of preserving the free status of all derivatives of our free software and
|
||||||
of promoting the sharing and reuse of software generally.
|
of promoting the sharing and reuse of software generally.
|
||||||
|
|
||||||
NO WARRANTY
|
NO WARRANTY
|
||||||
|
|
||||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||||
@@ -277,9 +277,9 @@ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
|||||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||||
POSSIBILITY OF SUCH DAMAGES.
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
If you develop a new program, and you want it to be of the greatest
|
||||||
possible use to the public, the best way to achieve this is to make it
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
|||||||
@@ -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/libpng14
|
PNGINC = -I/usr/local/include/libpng16
|
||||||
PNGLIB = -L/usr/local/lib -lpng14 # dynamically linked against libpng
|
PNGLIB = -L/usr/local/lib -lpng16 # dynamically linked against libpng
|
||||||
#PNGLIB = /usr/local/lib/libpng14.a # statically linked against libpng
|
#PNGLIB = /usr/local/lib/libpng16.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/libpng14
|
#PNGINC = -I/usr/local/include/libpng16
|
||||||
#PNGLIBd = -L$(PNGDIR) -lpng14 # dynamically linked, installed libpng
|
#PNGLIBd = -L$(PNGDIR) -lpng16 # dynamically linked, installed libpng
|
||||||
#PNGLIBs = $(PNGDIR)/libpng14.a # statically linked, installed libpng
|
#PNGLIBs = $(PNGDIR)/libpng16.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) -lpng14 # dynamically linked
|
PNGLIBd = -Wl,-rpath,$(PNGDIR) -L$(PNGDIR) -lpng16 # 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 --------------------------------------------------------------
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
# "c:\windows\command.com /e:4096" as the program command line and set the
|
# "c:\windows\command.com /e:4096" as the program command line and set the
|
||||||
# working directory to this directory. Then double-click to open the new
|
# working directory to this directory. Then double-click to open the new
|
||||||
# DOS-prompt window with a bigger environment and retry the commands above.
|
# DOS-prompt window with a bigger environment and retry the commands above.
|
||||||
#
|
#
|
||||||
# This makefile assumes libpng and zlib have already been built or downloaded
|
# This makefile assumes libpng and zlib have already been built or downloaded
|
||||||
# and are in subdirectories at the same level as the current subdirectory
|
# and are in subdirectories at the same level as the current subdirectory
|
||||||
# (as indicated by the PNGPATH and ZPATH macros below). Edit as appropriate.
|
# (as indicated by the PNGPATH and ZPATH macros below). Edit as appropriate.
|
||||||
@@ -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 --------------------------------------------------------------
|
||||||
|
|||||||
@@ -63,9 +63,9 @@ BUILD INSTRUCTIONS
|
|||||||
|
|
||||||
- Prerequisites (in order of compilation):
|
- Prerequisites (in order of compilation):
|
||||||
|
|
||||||
- zlib http://zlib.net/
|
- zlib http://zlib.net/
|
||||||
- libpng http://www.libpng.org/pub/png/libpng.html
|
- libpng http://www.libpng.org/pub/png/libpng.html
|
||||||
- pngbook http://www.libpng.org/pub/png/book/sources.html
|
- pngbook http://www.libpng.org/pub/png/book/sources.html
|
||||||
|
|
||||||
The pngbook demo programs are explicitly designed to demonstrate proper
|
The pngbook demo programs are explicitly designed to demonstrate proper
|
||||||
coding techniques for using the libpng reference library. As a result,
|
coding techniques for using the libpng reference library. As a result,
|
||||||
@@ -104,7 +104,7 @@ BUILD INSTRUCTIONS
|
|||||||
unpacked the source code.
|
unpacked the source code.
|
||||||
|
|
||||||
For MSVC, set up the necessary environment variables by invoking
|
For MSVC, set up the necessary environment variables by invoking
|
||||||
|
|
||||||
%devstudio%\vc\bin\vcvars32.bat
|
%devstudio%\vc\bin\vcvars32.bat
|
||||||
|
|
||||||
where where %devstudio% is the installation directory for MSVC /
|
where where %devstudio% is the installation directory for MSVC /
|
||||||
@@ -165,19 +165,19 @@ RUNNING THE PROGRAMS: (VERY) BRIEF INTRO
|
|||||||
rpng is a simple PNG viewer that can display transparent PNGs with a
|
rpng is a simple PNG viewer that can display transparent PNGs with a
|
||||||
specified background color; for example,
|
specified background color; for example,
|
||||||
|
|
||||||
rpng -bgcolor #ff0000 toucan.png
|
rpng -bgcolor \#ff0000 toucan.png
|
||||||
|
|
||||||
would display the image with a red background. rpng2 is a progressive
|
would display the image with a red background. rpng2 is a progressive
|
||||||
viewer that simulates a web browser in some respects; it can display
|
viewer that simulates a web browser in some respects; it can display
|
||||||
images against either a background color or a dynamically generated
|
images against either a background color or a dynamically generated
|
||||||
background image. For example:
|
background image. For example:
|
||||||
|
|
||||||
rpng2 -bgpat 16 toucan.png
|
rpng2 -bgpat 16 toucan.png
|
||||||
|
|
||||||
wpng is a purely command-line image converter from binary PBMPLUS/NetPBM
|
wpng is a purely command-line image converter from binary PBMPLUS/NetPBM
|
||||||
format (.pgm or .ppm) to PNG; for example,
|
format (.pgm or .ppm) to PNG; for example,
|
||||||
|
|
||||||
wpng -time < toucan-notrans.ppm > toucan-notrans.png
|
wpng -time < toucan-notrans.ppm > toucan-notrans.png
|
||||||
|
|
||||||
would convert the specified PPM file (using redirection) to PNG, auto-
|
would convert the specified PPM file (using redirection) to PNG, auto-
|
||||||
matically setting the PNG modification-time chunk.
|
matically setting the PNG modification-time chunk.
|
||||||
|
|||||||
@@ -20,13 +20,13 @@ $ if zpath .eqs. ""
|
|||||||
$ then
|
$ then
|
||||||
$ write sys$output "zlib include not found. Exiting..."
|
$ write sys$output "zlib include not found. Exiting..."
|
||||||
$ exit 2
|
$ exit 2
|
||||||
$ endif
|
$ endif
|
||||||
$!
|
$!
|
||||||
$ if pngpath .eqs. ""
|
$ if pngpath .eqs. ""
|
||||||
$ then
|
$ then
|
||||||
$ write sys$output "libpng include not found. Exiting..."
|
$ write sys$output "libpng include not found. Exiting..."
|
||||||
$ exit 2
|
$ exit 2
|
||||||
$ endif
|
$ endif
|
||||||
$!
|
$!
|
||||||
$! Look for the compiler used.
|
$! Look for the compiler used.
|
||||||
$!
|
$!
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
@@ -229,8 +234,14 @@ uch *readpng_get_image(double display_exponent, int *pChannels, ulg *pRowbytes)
|
|||||||
png_set_expand(png_ptr);
|
png_set_expand(png_ptr);
|
||||||
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))
|
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))
|
||||||
png_set_expand(png_ptr);
|
png_set_expand(png_ptr);
|
||||||
|
#ifdef PNG_READ_16_TO_8_SUPPORTED
|
||||||
if (bit_depth == 16)
|
if (bit_depth == 16)
|
||||||
|
# ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
|
||||||
|
png_set_scale_16(png_ptr);
|
||||||
|
# else
|
||||||
png_set_strip_16(png_ptr);
|
png_set_strip_16(png_ptr);
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
if (color_type == PNG_COLOR_TYPE_GRAY ||
|
if (color_type == PNG_COLOR_TYPE_GRAY ||
|
||||||
color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
|
color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
|
||||||
png_set_gray_to_rgb(png_ptr);
|
png_set_gray_to_rgb(png_ptr);
|
||||||
@@ -263,7 +274,8 @@ uch *readpng_get_image(double display_exponent, int *pChannels, ulg *pRowbytes)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
Trace((stderr, "readpng_get_image: channels = %d, rowbytes = %ld, height = %ld\n", *pChannels, rowbytes, height));
|
Trace((stderr, "readpng_get_image: channels = %d, rowbytes = %ld, height = %ld\n",
|
||||||
|
*pChannels, rowbytes, height));
|
||||||
|
|
||||||
|
|
||||||
/* set the individual row_pointers to point at the correct offsets */
|
/* set the individual row_pointers to point at the correct offsets */
|
||||||
|
|||||||
@@ -55,8 +55,10 @@
|
|||||||
|
|
||||||
|
|
||||||
#include <stdlib.h> /* for exit() prototype */
|
#include <stdlib.h> /* for exit() prototype */
|
||||||
|
#include <setjmp.h>
|
||||||
|
|
||||||
#include "png.h" /* libpng header; includes zlib.h and setjmp.h */
|
#include <zlib.h>
|
||||||
|
#include "png.h" /* libpng header from the local directory */
|
||||||
#include "readpng2.h" /* typedefs, common macros, public prototypes */
|
#include "readpng2.h" /* typedefs, common macros, public prototypes */
|
||||||
|
|
||||||
|
|
||||||
@@ -67,90 +69,17 @@ 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);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void readpng2_version_info(void)
|
void readpng2_version_info(void)
|
||||||
{
|
{
|
||||||
#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && \
|
fprintf(stderr, " Compiled with libpng %s; using libpng %s\n",
|
||||||
(defined(__i386__) || defined(_M_IX86) || defined(__x86_64__)) && \
|
PNG_LIBPNG_VER_STRING, png_libpng_ver);
|
||||||
defined(PNG_LIBPNG_VER) && (PNG_LIBPNG_VER >= 10200)
|
|
||||||
/*
|
|
||||||
* WARNING: This preprocessor approach means that the following code
|
|
||||||
* cannot be used with a libpng DLL older than 1.2.0--the
|
|
||||||
* compiled-in symbols for the new functions will not exist.
|
|
||||||
* (Could use dlopen() and dlsym() on Unix and corresponding
|
|
||||||
* calls for Windows, but not portable...)
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
int mmxsupport = png_mmx_support();
|
|
||||||
if (mmxsupport < 0)
|
|
||||||
fprintf(stderr, " Compiled with libpng %s; using libpng %s "
|
|
||||||
"without MMX support.\n", PNG_LIBPNG_VER_STRING, png_libpng_ver);
|
|
||||||
else {
|
|
||||||
int compilerID;
|
|
||||||
png_uint_32 mmx_mask = png_get_mmx_flagmask(
|
|
||||||
PNG_SELECT_READ | PNG_SELECT_WRITE, &compilerID);
|
|
||||||
|
|
||||||
fprintf(stderr, " Compiled with libpng %s; using libpng %s "
|
fprintf(stderr, " and with zlib %s; using zlib %s.\n",
|
||||||
"with MMX support\n (%s version).", PNG_LIBPNG_VER_STRING,
|
|
||||||
png_libpng_ver, compilerID == 1? "MSVC++" :
|
|
||||||
(compilerID == 2? "GNU C" : "unknown"));
|
|
||||||
fprintf(stderr, " Processor (x86%s) %s MMX instructions.\n",
|
|
||||||
#if defined(__x86_64__)
|
|
||||||
"_64",
|
|
||||||
#else
|
|
||||||
"",
|
|
||||||
#endif
|
|
||||||
mmxsupport? "supports" : "does not support");
|
|
||||||
if (mmxsupport > 0) {
|
|
||||||
int num_optims = 0;
|
|
||||||
|
|
||||||
fprintf(stderr,
|
|
||||||
" Potential MMX optimizations supported by libpng:\n");
|
|
||||||
if (mmx_mask & PNG_ASM_FLAG_MMX_READ_FILTER_SUB)
|
|
||||||
++num_optims;
|
|
||||||
if (mmx_mask & PNG_ASM_FLAG_MMX_READ_FILTER_UP)
|
|
||||||
++num_optims;
|
|
||||||
if (mmx_mask & PNG_ASM_FLAG_MMX_READ_FILTER_AVG)
|
|
||||||
++num_optims;
|
|
||||||
if (mmx_mask & PNG_ASM_FLAG_MMX_READ_FILTER_PAETH)
|
|
||||||
++num_optims;
|
|
||||||
if (num_optims)
|
|
||||||
fprintf(stderr,
|
|
||||||
" decoding %s row filters (reading)\n",
|
|
||||||
(num_optims == 4)? "all non-trivial" : "some");
|
|
||||||
if (mmx_mask & PNG_ASM_FLAG_MMX_READ_COMBINE_ROW) {
|
|
||||||
fprintf(stderr, " combining rows (reading)\n");
|
|
||||||
++num_optims;
|
|
||||||
}
|
|
||||||
if (mmx_mask & PNG_ASM_FLAG_MMX_READ_INTERLACE) {
|
|
||||||
fprintf(stderr,
|
|
||||||
" expanding interlacing (reading)\n");
|
|
||||||
++num_optims;
|
|
||||||
}
|
|
||||||
mmx_mask &= ~( PNG_ASM_FLAG_MMX_READ_COMBINE_ROW \
|
|
||||||
| PNG_ASM_FLAG_MMX_READ_INTERLACE \
|
|
||||||
| PNG_ASM_FLAG_MMX_READ_FILTER_SUB \
|
|
||||||
| PNG_ASM_FLAG_MMX_READ_FILTER_UP \
|
|
||||||
| PNG_ASM_FLAG_MMX_READ_FILTER_AVG \
|
|
||||||
| PNG_ASM_FLAG_MMX_READ_FILTER_PAETH );
|
|
||||||
if (mmx_mask) {
|
|
||||||
fprintf(stderr, " other (unknown)\n");
|
|
||||||
++num_optims;
|
|
||||||
}
|
|
||||||
if (num_optims == 0)
|
|
||||||
fprintf(stderr, " (none)\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
fprintf(stderr, " Compiled with libpng %s; using libpng %s "
|
|
||||||
"without MMX support.\n", PNG_LIBPNG_VER_STRING, png_libpng_ver);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
fprintf(stderr, " Compiled with zlib %s; using zlib %s.\n",
|
|
||||||
ZLIB_VERSION, zlib_version);
|
ZLIB_VERSION, zlib_version);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -159,7 +88,7 @@ void readpng2_version_info(void)
|
|||||||
|
|
||||||
int readpng2_check_sig(uch *sig, int num)
|
int readpng2_check_sig(uch *sig, int num)
|
||||||
{
|
{
|
||||||
return (!png_sig_cmp(sig, 0, num));
|
return !png_sig_cmp(sig, 0, num);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -176,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 */
|
||||||
|
|
||||||
@@ -203,36 +132,30 @@ int readpng2_init(mainprog_info *mainprog_ptr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED
|
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
|
||||||
/* prepare the reader to ignore all recognized chunks whose data won't be
|
/* prepare the reader to ignore all recognized chunks whose data won't be
|
||||||
* 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_UNKNOWN_CHUNKS_SUPPORTED */
|
#endif /* PNG_HANDLE_AS_UNKNOWN_SUPPORTED */
|
||||||
|
|
||||||
|
|
||||||
/* instead of doing png_init_io() here, now we set up our callback
|
/* instead of doing png_init_io() here, now we set up our callback
|
||||||
@@ -242,96 +165,6 @@ int readpng2_init(mainprog_info *mainprog_ptr)
|
|||||||
readpng2_info_callback, readpng2_row_callback, readpng2_end_callback);
|
readpng2_info_callback, readpng2_row_callback, readpng2_end_callback);
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* may as well enable or disable MMX routines here, if supported;
|
|
||||||
*
|
|
||||||
* to enable all: mask = png_get_mmx_flagmask (
|
|
||||||
* PNG_SELECT_READ | PNG_SELECT_WRITE, &compilerID);
|
|
||||||
* flags = png_get_asm_flags (png_ptr);
|
|
||||||
* flags |= mask;
|
|
||||||
* png_set_asm_flags (png_ptr, flags);
|
|
||||||
*
|
|
||||||
* to disable all: mask = png_get_mmx_flagmask (
|
|
||||||
* PNG_SELECT_READ | PNG_SELECT_WRITE, &compilerID);
|
|
||||||
* flags = png_get_asm_flags (png_ptr);
|
|
||||||
* flags &= ~mask;
|
|
||||||
* png_set_asm_flags (png_ptr, flags);
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if (defined(__i386__) || defined(_M_IX86) || defined(__x86_64__)) && \
|
|
||||||
defined(PNG_LIBPNG_VER) && (PNG_LIBPNG_VER >= 10200)
|
|
||||||
/*
|
|
||||||
* WARNING: This preprocessor approach means that the following code
|
|
||||||
* cannot be used with a libpng DLL older than 1.2.0--the
|
|
||||||
* compiled-in symbols for the new functions will not exist.
|
|
||||||
* (Could use dlopen() and dlsym() on Unix and corresponding
|
|
||||||
* calls for Windows, but not portable...)
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
#ifdef PNG_ASSEMBLER_CODE_SUPPORTED
|
|
||||||
png_uint_32 mmx_disable_mask = 0;
|
|
||||||
png_uint_32 asm_flags, mmx_mask;
|
|
||||||
int compilerID;
|
|
||||||
|
|
||||||
if (mainprog_ptr->nommxfilters)
|
|
||||||
mmx_disable_mask |= ( PNG_ASM_FLAG_MMX_READ_FILTER_SUB \
|
|
||||||
| PNG_ASM_FLAG_MMX_READ_FILTER_UP \
|
|
||||||
| PNG_ASM_FLAG_MMX_READ_FILTER_AVG \
|
|
||||||
| PNG_ASM_FLAG_MMX_READ_FILTER_PAETH );
|
|
||||||
if (mainprog_ptr->nommxcombine)
|
|
||||||
mmx_disable_mask |= PNG_ASM_FLAG_MMX_READ_COMBINE_ROW;
|
|
||||||
if (mainprog_ptr->nommxinterlace)
|
|
||||||
mmx_disable_mask |= PNG_ASM_FLAG_MMX_READ_INTERLACE;
|
|
||||||
asm_flags = png_get_asm_flags(png_ptr);
|
|
||||||
png_set_asm_flags(png_ptr, asm_flags & ~mmx_disable_mask);
|
|
||||||
|
|
||||||
|
|
||||||
/* Now query libpng's asm settings, just for yuks. Note that this
|
|
||||||
* differs from the querying of its *potential* MMX capabilities
|
|
||||||
* in readpng2_version_info(); this is true runtime verification. */
|
|
||||||
|
|
||||||
asm_flags = png_get_asm_flags(png_ptr);
|
|
||||||
mmx_mask = png_get_mmx_flagmask(PNG_SELECT_READ | PNG_SELECT_WRITE,
|
|
||||||
&compilerID);
|
|
||||||
if (asm_flags & PNG_ASM_FLAG_MMX_SUPPORT_COMPILED)
|
|
||||||
fprintf(stderr,
|
|
||||||
" MMX support (%s version) is compiled into libpng\n",
|
|
||||||
compilerID == 1? "MSVC++" :
|
|
||||||
(compilerID == 2? "GNU C" : "unknown"));
|
|
||||||
else
|
|
||||||
fprintf(stderr, " MMX support is not compiled into libpng\n");
|
|
||||||
fprintf(stderr, " MMX instructions are %ssupported by CPU\n",
|
|
||||||
(asm_flags & PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU)? "" : "not ");
|
|
||||||
fprintf(stderr, " MMX read support for combining rows is %sabled\n",
|
|
||||||
(asm_flags & PNG_ASM_FLAG_MMX_READ_COMBINE_ROW)? "en" : "dis");
|
|
||||||
fprintf(stderr,
|
|
||||||
" MMX read support for expanding interlacing is %sabled\n",
|
|
||||||
(asm_flags & PNG_ASM_FLAG_MMX_READ_INTERLACE)? "en" : "dis");
|
|
||||||
fprintf(stderr, " MMX read support for \"sub\" filter is %sabled\n",
|
|
||||||
(asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_SUB)? "en" : "dis");
|
|
||||||
fprintf(stderr, " MMX read support for \"up\" filter is %sabled\n",
|
|
||||||
(asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_UP)? "en" : "dis");
|
|
||||||
fprintf(stderr, " MMX read support for \"avg\" filter is %sabled\n",
|
|
||||||
(asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_AVG)? "en" : "dis");
|
|
||||||
fprintf(stderr, " MMX read support for \"Paeth\" filter is %sabled\n",
|
|
||||||
(asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_PAETH)? "en" : "dis");
|
|
||||||
asm_flags &= (mmx_mask & ~( PNG_ASM_FLAG_MMX_READ_COMBINE_ROW \
|
|
||||||
| PNG_ASM_FLAG_MMX_READ_INTERLACE \
|
|
||||||
| PNG_ASM_FLAG_MMX_READ_FILTER_SUB \
|
|
||||||
| PNG_ASM_FLAG_MMX_READ_FILTER_UP \
|
|
||||||
| PNG_ASM_FLAG_MMX_READ_FILTER_AVG \
|
|
||||||
| PNG_ASM_FLAG_MMX_READ_FILTER_PAETH ));
|
|
||||||
if (asm_flags)
|
|
||||||
fprintf(stderr,
|
|
||||||
" additional MMX support is also enabled (0x%02lx)\n",
|
|
||||||
asm_flags);
|
|
||||||
#else /* !PNG_ASSEMBLER_CODE_SUPPORTED */
|
|
||||||
fprintf(stderr, " MMX querying is disabled in libpng.\n");
|
|
||||||
#endif /* ?PNG_ASSEMBLER_CODE_SUPPORTED */
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* make sure we save our pointers for use in readpng2_decode_data() */
|
/* make sure we save our pointers for use in readpng2_decode_data() */
|
||||||
|
|
||||||
mainprog_ptr->png_ptr = png_ptr;
|
mainprog_ptr->png_ptr = png_ptr;
|
||||||
@@ -379,7 +212,12 @@ static void readpng2_info_callback(png_structp png_ptr, png_infop info_ptr)
|
|||||||
{
|
{
|
||||||
mainprog_info *mainprog_ptr;
|
mainprog_info *mainprog_ptr;
|
||||||
int color_type, bit_depth;
|
int color_type, bit_depth;
|
||||||
|
png_uint_32 width, height;
|
||||||
|
#ifdef PNG_FLOATING_POINT_SUPPORTED
|
||||||
double gamma;
|
double gamma;
|
||||||
|
#else
|
||||||
|
png_fixed_point gamma;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* setjmp() doesn't make sense here, because we'd either have to exit(),
|
/* setjmp() doesn't make sense here, because we'd either have to exit(),
|
||||||
@@ -414,8 +252,10 @@ static void readpng2_info_callback(png_structp png_ptr, png_infop info_ptr)
|
|||||||
|
|
||||||
/* this is just like in the non-progressive case */
|
/* this is just like in the non-progressive case */
|
||||||
|
|
||||||
png_get_IHDR(png_ptr, info_ptr, &mainprog_ptr->width,
|
png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type,
|
||||||
&mainprog_ptr->height, &bit_depth, &color_type, NULL, NULL, NULL);
|
NULL, NULL, NULL);
|
||||||
|
mainprog_ptr->width = (ulg)width;
|
||||||
|
mainprog_ptr->height = (ulg)height;
|
||||||
|
|
||||||
|
|
||||||
/* since we know we've read all of the PNG file's "header" (i.e., up
|
/* since we know we've read all of the PNG file's "header" (i.e., up
|
||||||
@@ -466,8 +306,14 @@ static void readpng2_info_callback(png_structp png_ptr, png_infop info_ptr)
|
|||||||
png_set_expand(png_ptr);
|
png_set_expand(png_ptr);
|
||||||
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))
|
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))
|
||||||
png_set_expand(png_ptr);
|
png_set_expand(png_ptr);
|
||||||
|
#ifdef PNG_READ_16_TO_8_SUPPORTED
|
||||||
if (bit_depth == 16)
|
if (bit_depth == 16)
|
||||||
|
# ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
|
||||||
|
png_set_scale_16(png_ptr);
|
||||||
|
# else
|
||||||
png_set_strip_16(png_ptr);
|
png_set_strip_16(png_ptr);
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
if (color_type == PNG_COLOR_TYPE_GRAY ||
|
if (color_type == PNG_COLOR_TYPE_GRAY ||
|
||||||
color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
|
color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
|
||||||
png_set_gray_to_rgb(png_ptr);
|
png_set_gray_to_rgb(png_ptr);
|
||||||
@@ -488,11 +334,19 @@ static void readpng2_info_callback(png_structp png_ptr, png_infop info_ptr)
|
|||||||
* "gamma" value for the entire display system, i.e., the product of
|
* "gamma" value for the entire display system, i.e., the product of
|
||||||
* LUT_exponent and CRT_exponent. */
|
* LUT_exponent and CRT_exponent. */
|
||||||
|
|
||||||
|
#ifdef PNG_FLOATING_POINT_SUPPORTED
|
||||||
if (png_get_gAMA(png_ptr, info_ptr, &gamma))
|
if (png_get_gAMA(png_ptr, info_ptr, &gamma))
|
||||||
png_set_gamma(png_ptr, mainprog_ptr->display_exponent, gamma);
|
png_set_gamma(png_ptr, mainprog_ptr->display_exponent, gamma);
|
||||||
else
|
else
|
||||||
png_set_gamma(png_ptr, mainprog_ptr->display_exponent, 0.45455);
|
png_set_gamma(png_ptr, mainprog_ptr->display_exponent, 0.45455);
|
||||||
|
#else
|
||||||
|
if (png_get_gAMA_fixed(png_ptr, info_ptr, &gamma))
|
||||||
|
png_set_gamma_fixed(png_ptr,
|
||||||
|
(png_fixed_point)(100000*mainprog_ptr->display_exponent+.5), gamma);
|
||||||
|
else
|
||||||
|
png_set_gamma_fixed(png_ptr,
|
||||||
|
(png_fixed_point)(100000*mainprog_ptr->display_exponent+.5), 45455);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* we'll let libpng expand interlaced images, too */
|
/* we'll let libpng expand interlaced images, too */
|
||||||
|
|
||||||
@@ -614,7 +468,11 @@ 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
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)
|
||||||
@@ -641,5 +499,12 @@ static void readpng2_error_handler(png_structp png_ptr, png_const_charp msg)
|
|||||||
exit(99);
|
exit(99);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Now we have our data structure we can use the information in it
|
||||||
|
* to return control to our own higher level code (all the points
|
||||||
|
* where 'setjmp' is called in this file.) This will work with other
|
||||||
|
* error handling mechanisms as well - libpng always calls png_error
|
||||||
|
* when it can proceed no further, thus, so long as the error handler
|
||||||
|
* is intercepted, application code can do its own error recovery.
|
||||||
|
*/
|
||||||
longjmp(mainprog_ptr->jmpbuf, 1);
|
longjmp(mainprog_ptr->jmpbuf, 1);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -96,11 +96,6 @@ typedef struct _mainprog_info {
|
|||||||
int rowbytes;
|
int rowbytes;
|
||||||
int channels;
|
int channels;
|
||||||
int need_bgcolor;
|
int need_bgcolor;
|
||||||
#if (defined(__i386__) || defined(_M_IX86) || defined(__x86_64__))
|
|
||||||
int nommxfilters;
|
|
||||||
int nommxcombine;
|
|
||||||
int nommxinterlace;
|
|
||||||
#endif
|
|
||||||
int state;
|
int state;
|
||||||
uch bg_red;
|
uch bg_red;
|
||||||
uch bg_green;
|
uch bg_green;
|
||||||
|
|||||||
@@ -85,7 +85,33 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
#ifdef __CYGWIN__
|
||||||
|
/* getch replacement. Turns out, we don't really need this,
|
||||||
|
* but leave it here if we ever enable any of the uses of
|
||||||
|
* _getch in the main code
|
||||||
|
*/
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <termio.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
int repl_getch( void )
|
||||||
|
{
|
||||||
|
char ch;
|
||||||
|
int fd = fileno(stdin);
|
||||||
|
struct termio old_tty, new_tty;
|
||||||
|
|
||||||
|
ioctl(fd, TCGETA, &old_tty);
|
||||||
|
new_tty = old_tty;
|
||||||
|
new_tty.c_lflag &= ~(ICANON | ECHO | ISIG);
|
||||||
|
ioctl(fd, TCSETA, &new_tty);
|
||||||
|
fread(&ch, 1, sizeof(ch), stdin);
|
||||||
|
ioctl(fd, TCSETA, &old_tty);
|
||||||
|
|
||||||
|
return ch;
|
||||||
|
}
|
||||||
|
#define _getch repl_getch
|
||||||
|
#else
|
||||||
#include <conio.h> /* only for _getch() */
|
#include <conio.h> /* only for _getch() */
|
||||||
|
#endif
|
||||||
|
|
||||||
/* #define DEBUG : this enables the Trace() macros */
|
/* #define DEBUG : this enables the Trace() macros */
|
||||||
|
|
||||||
@@ -153,7 +179,7 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, PSTR cmd, int showmode)
|
|||||||
|
|
||||||
filename = (char *)NULL;
|
filename = (char *)NULL;
|
||||||
|
|
||||||
|
#ifndef __CYGWIN__
|
||||||
/* First reenable console output, which normally goes to the bit bucket
|
/* First reenable console output, which normally goes to the bit bucket
|
||||||
* for windowed apps. Closing the console window will terminate the
|
* for windowed apps. Closing the console window will terminate the
|
||||||
* app. Thanks to David.Geldreich@realviz.com for supplying the magical
|
* app. Thanks to David.Geldreich@realviz.com for supplying the magical
|
||||||
@@ -162,6 +188,7 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, PSTR cmd, int showmode)
|
|||||||
AllocConsole();
|
AllocConsole();
|
||||||
freopen("CONOUT$", "a", stderr);
|
freopen("CONOUT$", "a", stderr);
|
||||||
freopen("CONOUT$", "a", stdout);
|
freopen("CONOUT$", "a", stdout);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Next set the default value for our display-system exponent, i.e.,
|
/* Next set the default value for our display-system exponent, i.e.,
|
||||||
@@ -279,7 +306,9 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, PSTR cmd, int showmode)
|
|||||||
/* print usage screen if any errors up to this point */
|
/* print usage screen if any errors up to this point */
|
||||||
|
|
||||||
if (error) {
|
if (error) {
|
||||||
|
#ifndef __CYGWIN__
|
||||||
int ch;
|
int ch;
|
||||||
|
#endif
|
||||||
|
|
||||||
fprintf(stderr, "\n%s %s: %s\n\n", PROGNAME, VERSION, appname);
|
fprintf(stderr, "\n%s %s: %s\n\n", PROGNAME, VERSION, appname);
|
||||||
readpng_version_info();
|
readpng_version_info();
|
||||||
@@ -293,11 +322,15 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, PSTR cmd, int showmode)
|
|||||||
"\t\t (e.g., ``#ff7700'' for orange: same as HTML colors);\n"
|
"\t\t (e.g., ``#ff7700'' for orange: same as HTML colors);\n"
|
||||||
"\t\t used with transparent images\n"
|
"\t\t used with transparent images\n"
|
||||||
"\nPress Q, Esc or mouse button 1 after image is displayed to quit.\n"
|
"\nPress Q, Esc or mouse button 1 after image is displayed to quit.\n"
|
||||||
|
#ifndef __CYGWIN__
|
||||||
"Press Q or Esc to quit this usage screen.\n"
|
"Press Q or Esc to quit this usage screen.\n"
|
||||||
|
#endif
|
||||||
"\n", PROGNAME, default_display_exponent);
|
"\n", PROGNAME, default_display_exponent);
|
||||||
|
#ifndef __CYGWIN__
|
||||||
do
|
do
|
||||||
ch = _getch();
|
ch = _getch();
|
||||||
while (ch != 'q' && ch != 'Q' && ch != 0x1B);
|
while (ch != 'q' && ch != 'Q' && ch != 0x1B);
|
||||||
|
#endif
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -333,18 +366,24 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, PSTR cmd, int showmode)
|
|||||||
|
|
||||||
|
|
||||||
if (error) {
|
if (error) {
|
||||||
|
#ifndef __CYGWIN__
|
||||||
int ch;
|
int ch;
|
||||||
|
#endif
|
||||||
|
|
||||||
fprintf(stderr, PROGNAME ": aborting.\n");
|
fprintf(stderr, PROGNAME ": aborting.\n");
|
||||||
|
#ifndef __CYGWIN__
|
||||||
do
|
do
|
||||||
ch = _getch();
|
ch = _getch();
|
||||||
while (ch != 'q' && ch != 'Q' && ch != 0x1B);
|
while (ch != 'q' && ch != 'Q' && ch != 0x1B);
|
||||||
|
#endif
|
||||||
exit(2);
|
exit(2);
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "\n%s %s: %s\n", PROGNAME, VERSION, appname);
|
fprintf(stderr, "\n%s %s: %s\n", PROGNAME, VERSION, appname);
|
||||||
|
#ifndef __CYGWIN__
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"\n [console window: closing this window will terminate %s]\n\n",
|
"\n [console window: closing this window will terminate %s]\n\n",
|
||||||
PROGNAME);
|
PROGNAME);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -417,7 +456,12 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, PSTR cmd, int showmode)
|
|||||||
/* wait for the user to tell us when to quit */
|
/* wait for the user to tell us when to quit */
|
||||||
|
|
||||||
printf(
|
printf(
|
||||||
"Done. Press Q, Esc or mouse button 1 (within image window) to quit.\n");
|
#ifndef __CYGWIN__
|
||||||
|
"Done. Press Q, Esc or mouse button 1 (within image window) to quit.\n"
|
||||||
|
#else
|
||||||
|
"Done. Press mouse button 1 (within image window) to quit.\n"
|
||||||
|
#endif
|
||||||
|
);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
|
|
||||||
while (GetMessage(&msg, NULL, 0, 0)) {
|
while (GetMessage(&msg, NULL, 0, 0)) {
|
||||||
|
|||||||
@@ -81,8 +81,8 @@
|
|||||||
#define PROGNAME "rpng-x"
|
#define PROGNAME "rpng-x"
|
||||||
#define LONGNAME "Simple PNG Viewer for X"
|
#define LONGNAME "Simple PNG Viewer for X"
|
||||||
#define VERSION "2.01 of 16 March 2008"
|
#define VERSION "2.01 of 16 March 2008"
|
||||||
#define RESNAME "rpng" /* our X resource application name */
|
#define RESNAME "rpng" /* our X resource application name */
|
||||||
#define RESCLASS "Rpng" /* our X resource class name */
|
#define RESCLASS "Rpng" /* our X resource class name */
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -252,8 +252,8 @@ int main(int argc, char **argv)
|
|||||||
else {
|
else {
|
||||||
bgstr = *argv;
|
bgstr = *argv;
|
||||||
if (strlen(bgstr) != 7 || bgstr[0] != '#')
|
if (strlen(bgstr) != 7 || bgstr[0] != '#')
|
||||||
++error;
|
++error;
|
||||||
else
|
else
|
||||||
have_bg = TRUE;
|
have_bg = TRUE;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -32,6 +32,7 @@
|
|||||||
- 2.01: fixed 64-bit typo in readpng2.c
|
- 2.01: fixed 64-bit typo in readpng2.c
|
||||||
- 2.02: fixed improper display of usage screen on PNG error(s); fixed
|
- 2.02: fixed improper display of usage screen on PNG error(s); fixed
|
||||||
unexpected-EOF and file-read-error cases
|
unexpected-EOF and file-read-error cases
|
||||||
|
- 2.03: removed runtime MMX-enabling/disabling and obsolete -mmx* options
|
||||||
|
|
||||||
---------------------------------------------------------------------------
|
---------------------------------------------------------------------------
|
||||||
|
|
||||||
@@ -95,7 +96,33 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <math.h> /* only for PvdM background code */
|
#include <math.h> /* only for PvdM background code */
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
#ifdef __CYGWIN__
|
||||||
|
/* getch replacement. Turns out, we don't really need this,
|
||||||
|
* but leave it here if we ever enable any of the uses of
|
||||||
|
* _getch in the main code
|
||||||
|
*/
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <termio.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
int repl_getch( void )
|
||||||
|
{
|
||||||
|
char ch;
|
||||||
|
int fd = fileno(stdin);
|
||||||
|
struct termio old_tty, new_tty;
|
||||||
|
|
||||||
|
ioctl(fd, TCGETA, &old_tty);
|
||||||
|
new_tty = old_tty;
|
||||||
|
new_tty.c_lflag &= ~(ICANON | ECHO | ISIG);
|
||||||
|
ioctl(fd, TCSETA, &new_tty);
|
||||||
|
fread(&ch, 1, sizeof(ch), stdin);
|
||||||
|
ioctl(fd, TCSETA, &old_tty);
|
||||||
|
|
||||||
|
return ch;
|
||||||
|
}
|
||||||
|
#define _getch repl_getch
|
||||||
|
#else
|
||||||
#include <conio.h> /* only for _getch() */
|
#include <conio.h> /* only for _getch() */
|
||||||
|
#endif
|
||||||
|
|
||||||
/* all for PvdM background code: */
|
/* all for PvdM background code: */
|
||||||
#ifndef PI
|
#ifndef PI
|
||||||
@@ -269,7 +296,7 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, PSTR cmd, int showmode)
|
|||||||
filename = (char *)NULL;
|
filename = (char *)NULL;
|
||||||
memset(&rpng2_info, 0, sizeof(mainprog_info));
|
memset(&rpng2_info, 0, sizeof(mainprog_info));
|
||||||
|
|
||||||
|
#ifndef __CYGWIN__
|
||||||
/* Next reenable console output, which normally goes to the bit bucket
|
/* Next reenable console output, which normally goes to the bit bucket
|
||||||
* for windowed apps. Closing the console window will terminate the
|
* for windowed apps. Closing the console window will terminate the
|
||||||
* app. Thanks to David.Geldreich@realviz.com for supplying the magical
|
* app. Thanks to David.Geldreich@realviz.com for supplying the magical
|
||||||
@@ -278,7 +305,7 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, PSTR cmd, int showmode)
|
|||||||
AllocConsole();
|
AllocConsole();
|
||||||
freopen("CONOUT$", "a", stderr);
|
freopen("CONOUT$", "a", stderr);
|
||||||
freopen("CONOUT$", "a", stdout);
|
freopen("CONOUT$", "a", stdout);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Set the default value for our display-system exponent, i.e., the
|
/* Set the default value for our display-system exponent, i.e., the
|
||||||
* product of the CRT exponent and the exponent corresponding to
|
* product of the CRT exponent and the exponent corresponding to
|
||||||
@@ -395,18 +422,6 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, PSTR cmd, int showmode)
|
|||||||
}
|
}
|
||||||
} else if (!strncmp(*argv, "-timing", 2)) {
|
} else if (!strncmp(*argv, "-timing", 2)) {
|
||||||
timing = TRUE;
|
timing = TRUE;
|
||||||
#if (defined(__i386__) || defined(_M_IX86) || defined(__x86_64__))
|
|
||||||
} else if (!strncmp(*argv, "-nommxfilters", 7)) {
|
|
||||||
rpng2_info.nommxfilters = TRUE;
|
|
||||||
} else if (!strncmp(*argv, "-nommxcombine", 7)) {
|
|
||||||
rpng2_info.nommxcombine = TRUE;
|
|
||||||
} else if (!strncmp(*argv, "-nommxinterlace", 7)) {
|
|
||||||
rpng2_info.nommxinterlace = TRUE;
|
|
||||||
} else if (!strcmp(*argv, "-nommx")) {
|
|
||||||
rpng2_info.nommxfilters = TRUE;
|
|
||||||
rpng2_info.nommxcombine = TRUE;
|
|
||||||
rpng2_info.nommxinterlace = TRUE;
|
|
||||||
#endif
|
|
||||||
} else {
|
} else {
|
||||||
if (**argv != '-') {
|
if (**argv != '-') {
|
||||||
filename = *argv;
|
filename = *argv;
|
||||||
@@ -424,15 +439,14 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, PSTR cmd, int showmode)
|
|||||||
/* print usage screen if any errors up to this point */
|
/* print usage screen if any errors up to this point */
|
||||||
|
|
||||||
if (error) {
|
if (error) {
|
||||||
|
#ifndef __CYGWIN__
|
||||||
int ch;
|
int ch;
|
||||||
|
#endif
|
||||||
|
|
||||||
fprintf(stderr, "\n%s %s: %s\n\n", PROGNAME, VERSION, appname);
|
fprintf(stderr, "\n%s %s: %s\n\n", PROGNAME, VERSION, appname);
|
||||||
readpng2_version_info();
|
readpng2_version_info();
|
||||||
fprintf(stderr, "\n"
|
fprintf(stderr, "\n"
|
||||||
"Usage: %s [-gamma exp] [-bgcolor bg | -bgpat pat] [-timing]\n"
|
"Usage: %s [-gamma exp] [-bgcolor bg | -bgpat pat] [-timing]\n"
|
||||||
#if (defined(__i386__) || defined(_M_IX86) || defined(__x86_64__))
|
|
||||||
" %*s [[-nommxfilters] [-nommxcombine] [-nommxinterlace] | -nommx]\n"
|
|
||||||
#endif
|
|
||||||
" %*s file.png\n\n"
|
" %*s file.png\n\n"
|
||||||
" exp \ttransfer-function exponent (``gamma'') of the display\n"
|
" exp \ttransfer-function exponent (``gamma'') of the display\n"
|
||||||
"\t\t system in floating-point format (e.g., ``%.1f''); equal\n"
|
"\t\t system in floating-point format (e.g., ``%.1f''); equal\n"
|
||||||
@@ -445,21 +459,24 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, PSTR cmd, int showmode)
|
|||||||
"\t\t transparent images; overrides -bgcolor option\n"
|
"\t\t transparent images; overrides -bgcolor option\n"
|
||||||
" -timing\tenables delay for every block read, to simulate modem\n"
|
" -timing\tenables delay for every block read, to simulate modem\n"
|
||||||
"\t\t download of image (~36 Kbps)\n"
|
"\t\t download of image (~36 Kbps)\n"
|
||||||
#if (defined(__i386__) || defined(_M_IX86) || defined(__x86_64__))
|
|
||||||
" -nommx*\tdisable optimized MMX routines for decoding row filters,\n"
|
|
||||||
"\t\t combining rows, and expanding interlacing, respectively\n"
|
|
||||||
#endif
|
|
||||||
"\nPress Q, Esc or mouse button 1 after image is displayed to quit.\n"
|
"\nPress Q, Esc or mouse button 1 after image is displayed to quit.\n"
|
||||||
|
#ifndef __CYGWIN__
|
||||||
"Press Q or Esc to quit this usage screen. ",
|
"Press Q or Esc to quit this usage screen. ",
|
||||||
|
#else
|
||||||
|
,
|
||||||
|
#endif
|
||||||
PROGNAME,
|
PROGNAME,
|
||||||
#if (defined(__i386__) || defined(_M_IX86) || defined(__x86_64__))
|
#if (defined(__i386__) || defined(_M_IX86) || defined(__x86_64__)) && \
|
||||||
|
!(defined(__CYGWIN__) || defined(__MINGW32__))
|
||||||
(int)strlen(PROGNAME), " ",
|
(int)strlen(PROGNAME), " ",
|
||||||
#endif
|
#endif
|
||||||
(int)strlen(PROGNAME), " ", default_display_exponent, num_bgpat);
|
(int)strlen(PROGNAME), " ", default_display_exponent, num_bgpat);
|
||||||
fflush(stderr);
|
fflush(stderr);
|
||||||
|
#ifndef __CYGWIN__
|
||||||
do
|
do
|
||||||
ch = _getch();
|
ch = _getch();
|
||||||
while (ch != 'q' && ch != 'Q' && ch != 0x1B);
|
while (ch != 'q' && ch != 'Q' && ch != 0x1B);
|
||||||
|
#endif
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -496,18 +513,24 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, PSTR cmd, int showmode)
|
|||||||
|
|
||||||
|
|
||||||
if (error) {
|
if (error) {
|
||||||
|
#ifndef __CYGWIN__
|
||||||
int ch;
|
int ch;
|
||||||
|
#endif
|
||||||
|
|
||||||
fprintf(stderr, PROGNAME ": aborting.\n");
|
fprintf(stderr, PROGNAME ": aborting.\n");
|
||||||
|
#ifndef __CYGWIN__
|
||||||
do
|
do
|
||||||
ch = _getch();
|
ch = _getch();
|
||||||
while (ch != 'q' && ch != 'Q' && ch != 0x1B);
|
while (ch != 'q' && ch != 'Q' && ch != 0x1B);
|
||||||
|
#endif
|
||||||
exit(2);
|
exit(2);
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "\n%s %s: %s\n", PROGNAME, VERSION, appname);
|
fprintf(stderr, "\n%s %s: %s\n", PROGNAME, VERSION, appname);
|
||||||
|
#ifndef __CYGWIN__
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"\n [console window: closing this window will terminate %s]\n\n",
|
"\n [console window: closing this window will terminate %s]\n\n",
|
||||||
PROGNAME);
|
PROGNAME);
|
||||||
|
#endif
|
||||||
fflush(stderr);
|
fflush(stderr);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -567,7 +590,7 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, PSTR cmd, int showmode)
|
|||||||
"(unexpectedly) while reading PNG image file\n");
|
"(unexpectedly) while reading PNG image file\n");
|
||||||
exit(3);
|
exit(3);
|
||||||
} else /* if (error) */ {
|
} else /* if (error) */ {
|
||||||
// will print error message below
|
/* will print error message below */
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1150,7 +1173,12 @@ static void rpng2_win_finish_display()
|
|||||||
|
|
||||||
rpng2_info.state = kDone;
|
rpng2_info.state = kDone;
|
||||||
printf(
|
printf(
|
||||||
"Done. Press Q, Esc or mouse button 1 (within image window) to quit.\n");
|
#ifndef __CYGWIN__
|
||||||
|
"Done. Press Q, Esc or mouse button 1 (within image window) to quit.\n"
|
||||||
|
#else
|
||||||
|
"Done. Press mouse button 1 (within image window) to quit.\n"
|
||||||
|
#endif
|
||||||
|
);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -40,6 +40,7 @@
|
|||||||
- 2.02: fixed improper display of usage screen on PNG error(s); fixed
|
- 2.02: fixed improper display of usage screen on PNG error(s); fixed
|
||||||
unexpected-EOF and file-read-error cases; fixed Trace() cut-and-
|
unexpected-EOF and file-read-error cases; fixed Trace() cut-and-
|
||||||
paste bugs
|
paste bugs
|
||||||
|
- 2.03: deleted runtime MMX-enabling/disabling and obsolete -mmx* options
|
||||||
|
|
||||||
---------------------------------------------------------------------------
|
---------------------------------------------------------------------------
|
||||||
|
|
||||||
@@ -94,9 +95,9 @@
|
|||||||
|
|
||||||
#define PROGNAME "rpng2-x"
|
#define PROGNAME "rpng2-x"
|
||||||
#define LONGNAME "Progressive PNG Viewer for X"
|
#define LONGNAME "Progressive PNG Viewer for X"
|
||||||
#define VERSION "2.02 of 16 March 2008"
|
#define VERSION "2.03 of 25 February 2010"
|
||||||
#define RESNAME "rpng2" /* our X resource application name */
|
#define RESNAME "rpng2" /* our X resource application name */
|
||||||
#define RESCLASS "Rpng" /* our X resource class name */
|
#define RESCLASS "Rpng" /* our X resource class name */
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -131,7 +132,7 @@
|
|||||||
(e.type == KeyPress && /* v--- or 1 for shifted keys */ \
|
(e.type == KeyPress && /* v--- or 1 for shifted keys */ \
|
||||||
((k = XLookupKeysym(&e.xkey, 0)) == XK_q || k == XK_Escape)))
|
((k = XLookupKeysym(&e.xkey, 0)) == XK_q || k == XK_Escape)))
|
||||||
|
|
||||||
#define NO_24BIT_MASKS /* undef case not fully written--only for redisplay() */
|
#define NO_24BIT_MASKS /* undef case not fully written--only for redisplay() */
|
||||||
|
|
||||||
#define rgb1_max bg_freq
|
#define rgb1_max bg_freq
|
||||||
#define rgb1_min bg_gray
|
#define rgb1_min bg_gray
|
||||||
@@ -301,7 +302,7 @@ int main(int argc, char **argv)
|
|||||||
int have_bg = FALSE;
|
int have_bg = FALSE;
|
||||||
#ifdef FEATURE_LOOP
|
#ifdef FEATURE_LOOP
|
||||||
int loop = FALSE;
|
int loop = FALSE;
|
||||||
long loop_interval = -1; /* seconds (100,000 max) */
|
long loop_interval = -1; /* seconds (100,000 max) */
|
||||||
#endif
|
#endif
|
||||||
double LUT_exponent; /* just the lookup table */
|
double LUT_exponent; /* just the lookup table */
|
||||||
double CRT_exponent = 2.2; /* just the monitor */
|
double CRT_exponent = 2.2; /* just the monitor */
|
||||||
@@ -434,18 +435,6 @@ int main(int argc, char **argv)
|
|||||||
else if (loop_interval > 100000) /* bit more than one day */
|
else if (loop_interval > 100000) /* bit more than one day */
|
||||||
loop_interval = 100000;
|
loop_interval = 100000;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
#if (defined(__i386__) || defined(_M_IX86) || defined(__x86_64__))
|
|
||||||
} else if (!strncmp(*argv, "-nommxfilters", 7)) {
|
|
||||||
rpng2_info.nommxfilters = TRUE;
|
|
||||||
} else if (!strncmp(*argv, "-nommxcombine", 7)) {
|
|
||||||
rpng2_info.nommxcombine = TRUE;
|
|
||||||
} else if (!strncmp(*argv, "-nommxinterlace", 7)) {
|
|
||||||
rpng2_info.nommxinterlace = TRUE;
|
|
||||||
} else if (!strcmp(*argv, "-nommx")) {
|
|
||||||
rpng2_info.nommxfilters = TRUE;
|
|
||||||
rpng2_info.nommxcombine = TRUE;
|
|
||||||
rpng2_info.nommxinterlace = TRUE;
|
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
if (**argv != '-') {
|
if (**argv != '-') {
|
||||||
@@ -468,9 +457,6 @@ int main(int argc, char **argv)
|
|||||||
readpng2_version_info();
|
readpng2_version_info();
|
||||||
fprintf(stderr, "\n"
|
fprintf(stderr, "\n"
|
||||||
"Usage: %s [-display xdpy] [-gamma exp] [-bgcolor bg | -bgpat pat]\n"
|
"Usage: %s [-display xdpy] [-gamma exp] [-bgcolor bg | -bgpat pat]\n"
|
||||||
#if (defined(__i386__) || defined(_M_IX86) || defined(__x86_64__))
|
|
||||||
" %*s [[-nommxfilters] [-nommxcombine] [-nommxinterlace] | -nommx]\n"
|
|
||||||
#endif
|
|
||||||
#ifdef FEATURE_LOOP
|
#ifdef FEATURE_LOOP
|
||||||
" %*s [-usleep dur | -timing] [-pause] [-loop [sec]] file.png\n\n"
|
" %*s [-usleep dur | -timing] [-pause] [-loop [sec]] file.png\n\n"
|
||||||
#else
|
#else
|
||||||
@@ -490,10 +476,6 @@ int main(int argc, char **argv)
|
|||||||
" -loop\tloops through background images after initial display\n"
|
" -loop\tloops through background images after initial display\n"
|
||||||
"\t\t is complete (depends on -bgpat)\n"
|
"\t\t is complete (depends on -bgpat)\n"
|
||||||
" sec \tseconds to display each background image (default = 2)\n"
|
" sec \tseconds to display each background image (default = 2)\n"
|
||||||
#endif
|
|
||||||
#if (defined(__i386__) || defined(_M_IX86) || defined(__x86_64__))
|
|
||||||
" -nommx*\tdisable optimized MMX routines for decoding row filters,\n"
|
|
||||||
"\t\t combining rows, and expanding interlacing, respectively\n"
|
|
||||||
#endif
|
#endif
|
||||||
" dur \tduration in microseconds to wait after displaying each\n"
|
" dur \tduration in microseconds to wait after displaying each\n"
|
||||||
"\t\t row (for demo purposes)\n"
|
"\t\t row (for demo purposes)\n"
|
||||||
@@ -503,9 +485,6 @@ int main(int argc, char **argv)
|
|||||||
"\nPress Q, Esc or mouse button 1 (within image window, after image\n"
|
"\nPress Q, Esc or mouse button 1 (within image window, after image\n"
|
||||||
"is displayed) to quit.\n"
|
"is displayed) to quit.\n"
|
||||||
"\n", PROGNAME,
|
"\n", PROGNAME,
|
||||||
#if (defined(__i386__) || defined(_M_IX86) || defined(__x86_64__))
|
|
||||||
(int)strlen(PROGNAME), " ",
|
|
||||||
#endif
|
|
||||||
(int)strlen(PROGNAME), " ", default_display_exponent, num_bgpat-1);
|
(int)strlen(PROGNAME), " ", default_display_exponent, num_bgpat-1);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
@@ -612,7 +591,7 @@ int main(int argc, char **argv)
|
|||||||
"(unexpectedly) while reading PNG image file\n");
|
"(unexpectedly) while reading PNG image file\n");
|
||||||
exit(3);
|
exit(3);
|
||||||
} else /* if (error) */ {
|
} else /* if (error) */ {
|
||||||
// will print error message below
|
/* will print error message below */
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -802,8 +781,9 @@ static void rpng2_x_init(void)
|
|||||||
if (rpng2_x_create_window()) {
|
if (rpng2_x_create_window()) {
|
||||||
|
|
||||||
/* GRR TEMPORARY HACK: this is fundamentally no different from cases
|
/* GRR TEMPORARY HACK: this is fundamentally no different from cases
|
||||||
* above; libpng should longjmp() back to us when png_ptr goes away.
|
* above; libpng should call our error handler to longjmp() back to us
|
||||||
* If we/it segfault instead, seems like a libpng bug... */
|
* when png_ptr goes away. If we/it segfault instead, seems like a
|
||||||
|
* libpng bug... */
|
||||||
|
|
||||||
/* we're here via libpng callback, so if window fails, clean and bail */
|
/* we're here via libpng callback, so if window fails, clean and bail */
|
||||||
readpng2_cleanup(&rpng2_info);
|
readpng2_cleanup(&rpng2_info);
|
||||||
@@ -1297,7 +1277,7 @@ static int rpng2_x_load_bg_image(void)
|
|||||||
for (row = 0; row < rpng2_info.height; ++row) {
|
for (row = 0; row < rpng2_info.height; ++row) {
|
||||||
src = bg_data + row*bg_rowbytes;
|
src = bg_data + row*bg_rowbytes;
|
||||||
dest = ximage->data + row*ximage_rowbytes;
|
dest = ximage->data + row*ximage_rowbytes;
|
||||||
if (bpp == 32) { /* slightly optimized version */
|
if (bpp == 32) { /* slightly optimized version */
|
||||||
for (i = rpng2_info.width; i > 0; --i) {
|
for (i = rpng2_info.width; i > 0; --i) {
|
||||||
red = *src++;
|
red = *src++;
|
||||||
green = *src++;
|
green = *src++;
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|
||||||
|
|
||||||
@@ -104,7 +105,8 @@ int writepng_init(mainprog_info *mainprog_ptr)
|
|||||||
/* setjmp() must be called in every function that calls a PNG-writing
|
/* setjmp() must be called in every function that calls a PNG-writing
|
||||||
* libpng function, unless an alternate error handler was installed--
|
* libpng function, unless an alternate error handler was installed--
|
||||||
* but compatible error handlers must either use longjmp() themselves
|
* but compatible error handlers must either use longjmp() themselves
|
||||||
* (as in this program) or exit immediately, so here we go: */
|
* (as in this program) or some other method to return control to
|
||||||
|
* application code, so here we go: */
|
||||||
|
|
||||||
if (setjmp(mainprog_ptr->jmpbuf)) {
|
if (setjmp(mainprog_ptr->jmpbuf)) {
|
||||||
png_destroy_write_struct(&png_ptr, &info_ptr);
|
png_destroy_write_struct(&png_ptr, &info_ptr);
|
||||||
@@ -388,5 +390,12 @@ static void writepng_error_handler(png_structp png_ptr, png_const_charp msg)
|
|||||||
exit(99);
|
exit(99);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Now we have our data structure we can use the information in it
|
||||||
|
* to return control to our own higher level code (all the points
|
||||||
|
* where 'setjmp' is called in this file.) This will work with other
|
||||||
|
* error handling mechanisms as well - libpng always calls png_error
|
||||||
|
* when it can proceed no further, thus, so long as the error handler
|
||||||
|
* is intercepted, application code can do its own error recovery.
|
||||||
|
*/
|
||||||
longjmp(mainprog_ptr->jmpbuf, 1);
|
longjmp(mainprog_ptr->jmpbuf, 1);
|
||||||
}
|
}
|
||||||
|
|||||||
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
1618
contrib/libtests/pngimage.c
Normal file
3807
contrib/libtests/pngstest.c
Normal file
1245
contrib/libtests/pngunknown.c
Normal file
10579
contrib/libtests/pngvalid.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;
|
||||||
|
}
|
||||||
303
contrib/libtests/timepng.c
Normal file
@@ -0,0 +1,303 @@
|
|||||||
|
/* timepng.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.
|
||||||
|
*/
|
||||||
|
#define _POSIX_C_SOURCE 199309L /* for clock_gettime */
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <time.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_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;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int mytime(struct timespec *t)
|
||||||
|
{
|
||||||
|
/* Do the timing using clock_gettime and the per-process timer. */
|
||||||
|
if (!clock_gettime(CLOCK_PROCESS_CPUTIME_ID, t))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
perror("CLOCK_PROCESS_CPUTIME_ID");
|
||||||
|
fprintf(stderr, "timepng: could not get the time\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int perform_one_test(FILE *fp, int nfiles)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
struct timespec before, after;
|
||||||
|
|
||||||
|
/* Clear out all errors: */
|
||||||
|
rewind(fp);
|
||||||
|
|
||||||
|
if (mytime(&before))
|
||||||
|
{
|
||||||
|
for (i=0; i<nfiles; ++i)
|
||||||
|
{
|
||||||
|
if (read_png(fp))
|
||||||
|
{
|
||||||
|
if (ferror(fp))
|
||||||
|
{
|
||||||
|
perror("temporary file");
|
||||||
|
fprintf(stderr, "file %d: error reading PNG data\n", i);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
perror("temporary file");
|
||||||
|
fprintf(stderr, "file %d: error from libpng\n", i);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (mytime(&after))
|
||||||
|
{
|
||||||
|
/* Work out the time difference and print it - this is the only output,
|
||||||
|
* so flush it immediately.
|
||||||
|
*/
|
||||||
|
unsigned long s = after.tv_sec - before.tv_sec;
|
||||||
|
long ns = after.tv_nsec - before.tv_nsec;
|
||||||
|
|
||||||
|
if (ns < 0)
|
||||||
|
{
|
||||||
|
--s;
|
||||||
|
ns += 1000000000;
|
||||||
|
|
||||||
|
if (ns < 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "timepng: bad clock from kernel\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("%lu.%.9ld\n", s, ns);
|
||||||
|
fflush(stdout);
|
||||||
|
if (ferror(stdout))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "timepng: error writing output\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Successful return */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int add_one_file(FILE *fp, char *name)
|
||||||
|
{
|
||||||
|
FILE *ip = fopen(name, "rb");
|
||||||
|
|
||||||
|
if (ip != NULL)
|
||||||
|
{
|
||||||
|
int ch;
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
ch = getc(ip);
|
||||||
|
if (ch == EOF) break;
|
||||||
|
putc(ch, fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ferror(ip))
|
||||||
|
{
|
||||||
|
perror(name);
|
||||||
|
fprintf(stderr, "%s: read error\n", name);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
(void)fclose(ip);
|
||||||
|
|
||||||
|
if (ferror(fp))
|
||||||
|
{
|
||||||
|
perror("temporary file");
|
||||||
|
fprintf(stderr, "temporary file write error\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
perror(name);
|
||||||
|
fprintf(stderr, "%s: open failed\n", name);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int ok = 0;
|
||||||
|
FILE *fp = tmpfile();
|
||||||
|
|
||||||
|
if (fp != NULL)
|
||||||
|
{
|
||||||
|
int err = 0;
|
||||||
|
int nfiles = 0;
|
||||||
|
|
||||||
|
if (argc > 1)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i=1; i<argc; ++i)
|
||||||
|
{
|
||||||
|
if (add_one_file(fp, argv[i]))
|
||||||
|
++nfiles;
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
err = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
char filename[FILENAME_MAX+1];
|
||||||
|
|
||||||
|
while (fgets(filename, FILENAME_MAX+1, stdin))
|
||||||
|
{
|
||||||
|
size_t len = strlen(filename);
|
||||||
|
|
||||||
|
if (filename[len-1] == '\n')
|
||||||
|
{
|
||||||
|
filename[len-1] = 0;
|
||||||
|
if (add_one_file(fp, filename))
|
||||||
|
++nfiles;
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
err = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, "timepng: truncated file name ...%s\n",
|
||||||
|
filename+len-32);
|
||||||
|
err = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ferror(stdin))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "timepng: stdin: read error\n");
|
||||||
|
err = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!err)
|
||||||
|
{
|
||||||
|
if (nfiles > 0)
|
||||||
|
ok = perform_one_test(fp, nfiles);
|
||||||
|
|
||||||
|
else
|
||||||
|
fprintf(stderr, "usage: timepng {files} or ls files | timepng\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
(void)fclose(fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
fprintf(stderr, "timepng: could not open temporary file\n");
|
||||||
|
|
||||||
|
/* Exit code 0 on success. */
|
||||||
|
return ok == 0;
|
||||||
|
}
|
||||||
5
contrib/pngminim/README
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
|
||||||
|
This demonstrates the use of PNG_USER_CONFIG, pngusr.h and pngusr.dfa
|
||||||
|
to build minimal decoder, encoder, and progressive reader applications.
|
||||||
|
|
||||||
|
See the individual README and pngusr.dfa files for more explanation.
|
||||||
@@ -1,9 +1,10 @@
|
|||||||
This demonstrates the use of PNG_USER_CONFIG and pngusr.h
|
This demonstrates the use of PNG_USER_CONFIG, pngusr.h and pngusr.dfa
|
||||||
|
|
||||||
To build a minimal read-only decoder with embedded libpng and zlib, run
|
The makefile builds a minimal read-only decoder with embedded libpng
|
||||||
|
and zlib.
|
||||||
|
|
||||||
gather.sh # to collect needed files from pngminus, libpng, and zlib
|
Specify the location of the zlib source (1.2.1 or later) as ZLIBSRC
|
||||||
make
|
on the make command line.
|
||||||
|
|
||||||
If you prefer to use the shared libraries, go to contrib/pngminus
|
If you prefer to use the shared libraries, go to contrib/pngminus
|
||||||
and build the png2pnm application there.
|
and build the png2pnm application there.
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
cp ../../pngminus/png2pnm.c pngm2pnm.c
|
|
||||||
cp ../../../*.h .
|
|
||||||
cp ../../../*.c .
|
|
||||||
rm example.c pnggccrd.c pngvcrd.c pngtest.c pngpread.c pngw*.c
|
|
||||||
# change the following 2 lines if zlib is somewhere else
|
|
||||||
cp ../../../../zlib/*.h .
|
|
||||||
cp ../../../../zlib/*.c .
|
|
||||||
rm minigzip.c example.c compress.c deflate.c
|
|
||||||
@@ -5,28 +5,84 @@
|
|||||||
CC=gcc
|
CC=gcc
|
||||||
LD=$(CC)
|
LD=$(CC)
|
||||||
|
|
||||||
RM=rm -f
|
# If awk fails try
|
||||||
|
# make AWK=nawk
|
||||||
|
|
||||||
CFLAGS=-DPNG_USER_CONFIG -DNO_GZCOMPRESS -DNO_GZIP \
|
# If cpp fails try
|
||||||
-DdeflateParams\(a,b,c\)=Z_OK -I. -O1
|
# make CPP=/lib/cpp
|
||||||
|
|
||||||
|
RM=rm -f
|
||||||
|
COPY=cp
|
||||||
|
|
||||||
|
CPPFLAGS=-I. -DPNG_USER_CONFIG -DNO_GZCOMPRESS -DZ_SOLO -DNO_GZIP
|
||||||
|
CFLAGS=-O1 -Wall
|
||||||
|
|
||||||
C=.c
|
C=.c
|
||||||
O=.o
|
O=.o
|
||||||
L=.a
|
L=.a
|
||||||
E=
|
E=
|
||||||
|
|
||||||
ZOBJS = adler32$(O) crc32$(O) gzio$(O) \
|
# Where to find the source code:
|
||||||
infback$(O) inffast$(O) inflate$(O) inftrees$(O) \
|
PNGSRC =../../..
|
||||||
trees$(O) uncompr$(O) zutil$(O)
|
ZLIBSRC=$(PNGSRC)/../zlib
|
||||||
|
PROGSRC=$(PNGSRC)/contrib/pngminus
|
||||||
|
|
||||||
OBJS = pngm2pnm$(O) png$(O) pngerror$(O) pngget$(O) pngmem$(O) \
|
# Zlib (minimal inflate requirements - crc32 is used by libpng)
|
||||||
|
# zutil can be eliminated if you provide your own zcalloc and zcfree
|
||||||
|
ZSRCS = adler32$(C) crc32$(C) \
|
||||||
|
inffast$(C) inflate$(C) inftrees$(C) \
|
||||||
|
zutil$(C)
|
||||||
|
|
||||||
|
# Standard headers
|
||||||
|
ZH = zlib.h crc32.h inffast.h inffixed.h \
|
||||||
|
inflate.h inftrees.h zutil.h
|
||||||
|
|
||||||
|
# Machine generated headers
|
||||||
|
ZCONF = zconf.h
|
||||||
|
|
||||||
|
# Headers callers use
|
||||||
|
ZINC = zlib.h $(ZCONF)
|
||||||
|
|
||||||
|
# Headers the Zlib source uses
|
||||||
|
ZHDRS = $(ZH) $(ZCONF)
|
||||||
|
|
||||||
|
ZOBJS = adler32$(O) crc32$(O) \
|
||||||
|
inffast$(O) inflate$(O) inftrees$(O) \
|
||||||
|
zutil$(O)
|
||||||
|
|
||||||
|
# libpng
|
||||||
|
PNGSRCS=png$(C) pngerror$(C) pngget$(C) pngmem$(C) \
|
||||||
|
pngread$(C) pngrio$(C) pngrtran$(C) pngrutil$(C) \
|
||||||
|
pngset$(C) pngtrans$(C)
|
||||||
|
|
||||||
|
# Standard headers
|
||||||
|
PNGH =png.h pngconf.h pngdebug.h pnginfo.h pngpriv.h pngstruct.h
|
||||||
|
|
||||||
|
# Machine generated headers
|
||||||
|
PNGCONF=pnglibconf.h
|
||||||
|
|
||||||
|
# Headers callers use
|
||||||
|
PNGINC= png.h pngconf.h pngusr.h $(PNGCONF)
|
||||||
|
|
||||||
|
# Headers the PNG library uses
|
||||||
|
PNGHDRS=$(PNGH) $(PNGCONF) pngusr.h
|
||||||
|
|
||||||
|
PNGOBJS=png$(O) pngerror$(O) pngget$(O) pngmem$(O) \
|
||||||
pngread$(O) pngrio$(O) pngrtran$(O) pngrutil$(O) \
|
pngread$(O) pngrio$(O) pngrtran$(O) pngrutil$(O) \
|
||||||
pngset$(O) pngtrans$(O) $(ZOBJS)
|
pngset$(O) pngtrans$(O)
|
||||||
|
|
||||||
|
PROGSRCS= pngm2pnm$(C)
|
||||||
|
PROGHDRS=
|
||||||
|
PROGDOCS=
|
||||||
|
PROGOBJS= pngm2pnm$(O)
|
||||||
|
|
||||||
|
OBJS = $(PROGOBJS) $(PNGOBJS) $(ZOBJS)
|
||||||
|
|
||||||
# implicit make rules -------------------------------------------------------
|
# implicit make rules -------------------------------------------------------
|
||||||
|
|
||||||
.c$(O): png.h pngconf.h pngusr.h zlib.h
|
# note: dependencies do not work on implicit rule lines
|
||||||
$(CC) -c $(CFLAGS) $<
|
.c$(O):
|
||||||
|
$(CC) -c $(CPPFLAGS) $(CFLAGS) $<
|
||||||
|
|
||||||
# dependencies
|
# dependencies
|
||||||
|
|
||||||
@@ -34,11 +90,62 @@ all: pngm2pnm$(E)
|
|||||||
|
|
||||||
pngm2pnm$(E): $(OBJS)
|
pngm2pnm$(E): $(OBJS)
|
||||||
$(LD) -o pngm2pnm$(E) $(OBJS)
|
$(LD) -o pngm2pnm$(E) $(OBJS)
|
||||||
strip pngm2pnm$(E)
|
|
||||||
|
# The DFA_XTRA setting turns all libpng options off then
|
||||||
|
# turns on those required for this minimal build.
|
||||||
|
# The CPP_FLAGS setting causes pngusr.h to be included in
|
||||||
|
# both the build of pnglibconf.h and, subsequently, when
|
||||||
|
# building libpng itself.
|
||||||
|
$(PNGCONF): $(PNGSRC)/scripts/pnglibconf.mak $(ZH)\
|
||||||
|
$(PNGSRC)/scripts/pnglibconf.dfa \
|
||||||
|
$(PNGSRC)/scripts/options.awk pngusr.h pngusr.dfa
|
||||||
|
$(RM) pnglibconf.h pnglibconf.dfn
|
||||||
|
$(MAKE) -f $(PNGSRC)/scripts/pnglibconf.mak $(MAKEFLAGS)\
|
||||||
|
srcdir=$(PNGSRC) CPPFLAGS="-DPNG_USER_CONFIG -I."\
|
||||||
|
DFA_XTRA="pngusr.dfa" $@
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
$(MAKE) -f $(PNGSRC)/scripts/pnglibconf.mak $(MAKEFLAGS)\
|
||||||
|
srcdir=$(PNGSRC) clean
|
||||||
$(RM) pngm2pnm$(O)
|
$(RM) pngm2pnm$(O)
|
||||||
$(RM) pngm2pnm$(E)
|
$(RM) pngm2pnm$(E)
|
||||||
$(RM) $(OBJS)
|
$(RM) $(OBJS)
|
||||||
|
|
||||||
|
# distclean also removes the copied source and headers
|
||||||
|
distclean: clean
|
||||||
|
$(RM) -r scripts # historical reasons
|
||||||
|
$(RM) $(PNGSRCS) $(PNGH)
|
||||||
|
$(RM) $(ZSRCS) $(ZH) $(ZCONF)
|
||||||
|
$(RM) $(PROGSRCS) $(PROGHDRS) $(PROGDOCS)
|
||||||
|
|
||||||
|
# Header file dependencies:
|
||||||
|
$(PROGOBJS): $(PROGHDRS) $(PNGINC) $(ZINC)
|
||||||
|
$(PNGOBJS): $(PNGHDRS) $(ZINC)
|
||||||
|
$(ZOBJS): $(ZHDRS)
|
||||||
|
|
||||||
|
# Gather the source code from the respective directories
|
||||||
|
$(PNGSRCS) $(PNGH): $(PNGSRC)/$@
|
||||||
|
$(RM) $@
|
||||||
|
$(COPY) $(PNGSRC)/$@ $@
|
||||||
|
|
||||||
|
# No dependency on the ZLIBSRC target so that it only needs
|
||||||
|
# to be specified once.
|
||||||
|
$(ZSRCS) $(ZH):
|
||||||
|
$(RM) $@
|
||||||
|
$(COPY) $(ZLIBSRC)/$@ $@
|
||||||
|
|
||||||
|
# The unconfigured zconf.h varies in name according to the
|
||||||
|
# zlib release
|
||||||
|
$(ZCONF):
|
||||||
|
$(RM) $@
|
||||||
|
@for f in zconf.h.in zconf.in.h zconf.h; do\
|
||||||
|
test -r $(ZLIBSRC)/$$f &&\
|
||||||
|
echo $(COPY) $(ZLIBSRC)/$$f $@ &&\
|
||||||
|
$(COPY) $(ZLIBSRC)/$$f $@ && exit 0;\
|
||||||
|
done; echo copy: $(ZLIBSRC)/zconf.h not found; exit 1
|
||||||
|
|
||||||
|
pngm2pnm.c: $(PROGSRC)/png2pnm.c
|
||||||
|
$(RM) $@
|
||||||
|
$(COPY) $(PROGSRC)/png2pnm.c $@
|
||||||
|
|
||||||
# End of makefile for pngm2pnm
|
# End of makefile for pngm2pnm
|
||||||
|
|||||||
40
contrib/pngminim/decoder/pngusr.dfa
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
# pngminim/decoder/pngusr.dfa
|
||||||
|
#
|
||||||
|
# Copyright (c) 2010-2013 Glenn Randers-Pehrson
|
||||||
|
#
|
||||||
|
# This code is released under the libpng license.
|
||||||
|
# For conditions of distribution and use, see the disclaimer
|
||||||
|
# and license in png.h
|
||||||
|
|
||||||
|
# First all the build options off:
|
||||||
|
|
||||||
|
everything = off
|
||||||
|
|
||||||
|
# All that is required is some read code. This example switches
|
||||||
|
# on the sequential read code (see ../preader for a progressive
|
||||||
|
# read example).
|
||||||
|
|
||||||
|
option SEQUENTIAL_READ on
|
||||||
|
|
||||||
|
# You must choose fixed or floating point arithmetic:
|
||||||
|
# option FLOATING_POINT on
|
||||||
|
|
||||||
|
option FIXED_POINT on
|
||||||
|
|
||||||
|
# You must chose the internal fixed point implementation or to
|
||||||
|
# use the system floating point. The latter is considerably
|
||||||
|
# smaller (by about 1kbyte on an x86 system):
|
||||||
|
# option FLOATING_ARITHMETIC on
|
||||||
|
|
||||||
|
option FLOATING_ARITHMETIC off
|
||||||
|
|
||||||
|
# Your program will probably need other options. The example
|
||||||
|
# program here, pngm2pnm, requires the following. Take a look
|
||||||
|
# at pnglibconf.h to find out the full set of what has to be
|
||||||
|
# enabled to make the following work.
|
||||||
|
|
||||||
|
option SETJMP on
|
||||||
|
option STDIO on
|
||||||
|
option READ_EXPAND 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, 2009 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
|
||||||
@@ -12,62 +12,12 @@
|
|||||||
#ifndef MINRDPNGCONF_H
|
#ifndef MINRDPNGCONF_H
|
||||||
#define MINRDPNGCONF_H
|
#define MINRDPNGCONF_H
|
||||||
|
|
||||||
#ifdef NJET
|
/* To include pngusr.h set -DPNG_USER_CONFIG in CPPFLAGS */
|
||||||
/* No 16-bit support beyond reading with strip_16 */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define PNG_NO_WARNINGS
|
/* List options to turn off features of the build that do not
|
||||||
#define png_warning(s1,s2) ""
|
* affect the API (so are not recorded in pnglibconf.h)
|
||||||
#define png_chunk_warning(s1,s2) ""
|
*/
|
||||||
#define PNG_NO_ERROR_TEXT
|
|
||||||
#define png_error(s1,s2) png_err(s1)
|
|
||||||
#define png_chunk_error(s1,s2) png_err(s1)
|
|
||||||
|
|
||||||
#define PNG_NO_READ_GAMMA
|
#define PNG_ALIGN_TYPE PNG_ALIGN_NONE
|
||||||
#define PNG_NO_READ_BACKGROUND
|
|
||||||
#define PNG_NO_READ_DITHER
|
|
||||||
#define PNG_NO_READ_INVERT
|
|
||||||
#define PNG_NO_READ_SHIFT
|
|
||||||
#define PNG_NO_READ_PACK
|
|
||||||
#define PNG_NO_READ_PACKSWAP
|
|
||||||
#define PNG_NO_READ_FILLER
|
|
||||||
#define PNG_NO_READ_SWAP
|
|
||||||
#define PNG_NO_READ_SWAP_ALPHA
|
|
||||||
#define PNG_NO_READ_INVERT_ALPHA
|
|
||||||
#define PNG_NO_READ_RGB_TO_GRAY
|
|
||||||
#define PNG_NO_READ_USER_TRANSFORM
|
|
||||||
#define PNG_NO_READ_bKGD
|
|
||||||
#define PNG_NO_READ_cHRM
|
|
||||||
#define PNG_NO_READ_gAMA
|
|
||||||
#define PNG_NO_READ_hIST
|
|
||||||
#define PNG_NO_READ_iCCP
|
|
||||||
#define PNG_NO_READ_pCAL
|
|
||||||
#define PNG_NO_READ_pHYs
|
|
||||||
#define PNG_NO_READ_sBIT
|
|
||||||
#define PNG_NO_READ_sCAL
|
|
||||||
#define PNG_NO_READ_sPLT
|
|
||||||
#define PNG_NO_READ_sRGB
|
|
||||||
#define PNG_NO_READ_TEXT
|
|
||||||
#define PNG_NO_READ_tIME
|
|
||||||
#define PNG_NO_READ_UNKNOWN_CHUNKS
|
|
||||||
#define PNG_NO_READ_USER_CHUNKS
|
|
||||||
#define PNG_NO_READ_EMPTY_PLTE
|
|
||||||
#define PNG_NO_READ_OPT_PLTE
|
|
||||||
#define PNG_NO_READ_STRIP_ALPHA
|
|
||||||
#define PNG_NO_READ_oFFs
|
|
||||||
|
|
||||||
#define PNG_NO_WRITE_SUPPORTED
|
|
||||||
|
|
||||||
#define PNG_NO_INFO_IMAGE
|
|
||||||
#define PNG_NO_USER_MEM
|
|
||||||
#define PNG_NO_FIXED_POINT_SUPPORTED
|
|
||||||
#define PNG_NO_MNG_FEATURES
|
|
||||||
#define PNG_NO_USER_TRANSFORM_PTR
|
|
||||||
#define PNG_NO_HANDLE_AS_UNKNOWN
|
|
||||||
#define PNG_NO_CONSOLE_IO
|
|
||||||
#define PNG_NO_ZALLOC_ZERO
|
|
||||||
#define PNG_NO_ERROR_NUMBERS
|
|
||||||
#define PNG_NO_EASY_ACCESS
|
|
||||||
#define PNG_NO_PROGRESSIVE_READ
|
|
||||||
|
|
||||||
#endif /* MINRDPNGCONF_H */
|
#endif /* MINRDPNGCONF_H */
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
This demonstrates the use of PNG_USER_CONFIG and pngusr.h
|
This demonstrates the use of PNG_USER_CONFIG and pngusr.h
|
||||||
|
|
||||||
To build a minimal write-only decoder with embedded libpng and zlib, run
|
The makefile builds a minimal write-only encoder with embedded libpng
|
||||||
|
and zlib.
|
||||||
|
|
||||||
|
Specify the location of the zlib source (1.2.1 or later) as ZLIBSRC
|
||||||
|
on the make command line.
|
||||||
|
|
||||||
gather.sh # to collect needed files from pngminus, libpng, and zlib
|
|
||||||
make
|
|
||||||
|
|
||||||
If you prefer to use the shared libraries, go to contrib/pngminus
|
If you prefer to use the shared libraries, go to contrib/pngminus
|
||||||
and build the pnm2png application there.
|
and build the pnm2png application there.
|
||||||
|
|||||||
@@ -1,27 +0,0 @@
|
|||||||
#include "zlib.h"
|
|
||||||
|
|
||||||
int ZEXPORT inflate(strm, flush)
|
|
||||||
z_streamp strm;
|
|
||||||
int flush;
|
|
||||||
{ return Z_OK ; }
|
|
||||||
|
|
||||||
int ZEXPORT inflateReset(strm)
|
|
||||||
z_streamp strm;
|
|
||||||
{ return Z_OK ; }
|
|
||||||
|
|
||||||
int ZEXPORT inflateEnd(strm)
|
|
||||||
z_streamp strm;
|
|
||||||
{ return Z_STREAM_ERROR ; }
|
|
||||||
|
|
||||||
int ZEXPORT inflateInit_(strm, version, stream_size)
|
|
||||||
z_streamp strm;
|
|
||||||
const char *version;
|
|
||||||
int stream_size;
|
|
||||||
{ return Z_OK ; }
|
|
||||||
|
|
||||||
int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size)
|
|
||||||
z_streamp strm;
|
|
||||||
int windowBits;
|
|
||||||
const char *version;
|
|
||||||
int stream_size;
|
|
||||||
{ return Z_STREAM_ERROR ; }
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
cp ../../pngminus/pnm2png.c pnm2pngm.c
|
|
||||||
cp ../../../*.h .
|
|
||||||
cp ../../../*.c .
|
|
||||||
rm example.c pnggccrd.c pngvcrd.c pngtest.c pngr*.c pngpread.c
|
|
||||||
# Change the next 2 lines if zlib is somewhere else.
|
|
||||||
cp ../../../../zlib/*.h .
|
|
||||||
cp ../../../../zlib/*.c .
|
|
||||||
rm inf*.[ch]
|
|
||||||
rm minigzip.c example.c
|
|
||||||
@@ -5,27 +5,83 @@
|
|||||||
CC=gcc
|
CC=gcc
|
||||||
LD=$(CC)
|
LD=$(CC)
|
||||||
|
|
||||||
RM=rm -f
|
# If awk fails try
|
||||||
|
# make AWK=nawk
|
||||||
|
|
||||||
CFLAGS=-DPNG_USER_CONFIG -DNO_GZIP -I. -O1
|
# If cpp fails try
|
||||||
|
# make CPP=/lib/cpp
|
||||||
|
|
||||||
|
RM=rm -f
|
||||||
|
COPY=cp
|
||||||
|
|
||||||
|
CPPFLAGS=-I. -DPNG_USER_CONFIG -DNO_GZCOMPRESS -DZ_SOLO -DNO_GZIP
|
||||||
|
CFLAGS=-O1 -Wall
|
||||||
|
|
||||||
C=.c
|
C=.c
|
||||||
O=.o
|
O=.o
|
||||||
L=.a
|
L=.a
|
||||||
E=
|
E=
|
||||||
|
|
||||||
ZOBJS = adler32$(O) compress$(O) crc32$(O) deflate$(O) gzio$(O) \
|
# Where to find the source code:
|
||||||
dummy_inflate$(O) \
|
PNGSRC =../../..
|
||||||
trees$(O) uncompr$(O) zutil$(O)
|
ZLIBSRC=$(PNGSRC)/../zlib
|
||||||
|
PROGSRC=$(PNGSRC)/contrib/pngminus
|
||||||
|
|
||||||
OBJS = pnm2pngm$(O) png$(O) pngerror$(O) pngget$(O) pngmem$(O) \
|
# Zlib
|
||||||
|
ZSRCS = adler32$(C) compress$(C) crc32$(C) deflate$(C) \
|
||||||
|
trees$(C) zutil$(C)
|
||||||
|
|
||||||
|
# Standard headers
|
||||||
|
#ZH = zlib.h crc32.h deflate.h trees.h zutil.h
|
||||||
|
ZH = zlib.h crc32.h deflate.h trees.h zutil.h
|
||||||
|
|
||||||
|
# Machine generated headers
|
||||||
|
ZCONF = zconf.h
|
||||||
|
|
||||||
|
# Headers callers use
|
||||||
|
ZINC = zlib.h $(ZCONF)
|
||||||
|
|
||||||
|
# Headers the Zlib source uses
|
||||||
|
ZHDRS = $(ZH) $(ZCONF)
|
||||||
|
|
||||||
|
# compress is not required; it is needed to link the zlib
|
||||||
|
# code because deflate defines an unused API function deflateBound
|
||||||
|
# which itself calls compressBound from compress.
|
||||||
|
ZOBJS = adler32$(O) compress$(O) crc32$(O) deflate$(O) \
|
||||||
|
trees$(O) zutil$(O)
|
||||||
|
|
||||||
|
# libpng
|
||||||
|
PNGSRCS=png$(C) pngerror$(C) pngget$(C) pngmem$(C) \
|
||||||
|
pngset$(C) pngtrans$(C) pngwio$(C) pngwrite$(C) \
|
||||||
|
pngwtran$(C) pngwutil$(C)
|
||||||
|
|
||||||
|
# Standard headers
|
||||||
|
PNGH =png.h pngconf.h pngdebug.h pnginfo.h pngpriv.h pngstruct.h
|
||||||
|
|
||||||
|
# Machine generated headers
|
||||||
|
PNGCONF=pnglibconf.h
|
||||||
|
|
||||||
|
# Headers callers use
|
||||||
|
PNGINC= png.h pngconf.h pngusr.h $(PNGCONF)
|
||||||
|
|
||||||
|
# Headers the PNG library uses
|
||||||
|
PNGHDRS=$(PNGH) $(PNGCONF) pngusr.h
|
||||||
|
|
||||||
|
PNGOBJS=png$(O) pngerror$(O) pngget$(O) pngmem$(O) \
|
||||||
pngset$(O) pngtrans$(O) pngwio$(O) pngwrite$(O) \
|
pngset$(O) pngtrans$(O) pngwio$(O) pngwrite$(O) \
|
||||||
pngwtran$(O) pngwutil$(O) $(ZOBJS)
|
pngwtran$(O) pngwutil$(O)
|
||||||
|
|
||||||
|
PROGSRCS= pnm2pngm$(C)
|
||||||
|
PROGHDRS=
|
||||||
|
PROGDOCS=
|
||||||
|
PROGOBJS= pnm2pngm$(O)
|
||||||
|
|
||||||
|
OBJS = $(PROGOBJS) $(PNGOBJS) $(ZOBJS)
|
||||||
|
|
||||||
# implicit make rules -------------------------------------------------------
|
# implicit make rules -------------------------------------------------------
|
||||||
|
|
||||||
.c$(O): png.h pngconf.h pngusr.h zlib.h
|
.c$(O):
|
||||||
$(CC) -c $(CFLAGS) $<
|
$(CC) -c $(CPPFLAGS) $(CFLAGS) $<
|
||||||
|
|
||||||
# dependencies
|
# dependencies
|
||||||
|
|
||||||
@@ -33,11 +89,62 @@ all: pnm2pngm$(E)
|
|||||||
|
|
||||||
pnm2pngm$(E): $(OBJS)
|
pnm2pngm$(E): $(OBJS)
|
||||||
$(LD) -o pnm2pngm$(E) $(OBJS)
|
$(LD) -o pnm2pngm$(E) $(OBJS)
|
||||||
strip pnm2pngm$(E)
|
|
||||||
|
# The DFA_XTRA setting turns all libpng options off then
|
||||||
|
# turns on those required for this minimal build.
|
||||||
|
# The CPP_FLAGS setting causes pngusr.h to be included in
|
||||||
|
# both the build of pnglibconf.h and, subsequently, when
|
||||||
|
# building libpng itself.
|
||||||
|
$(PNGCONF): $(PNGSRC)/scripts/pnglibconf.mak $(ZH)\
|
||||||
|
$(PNGSRC)/scripts/pnglibconf.dfa \
|
||||||
|
$(PNGSRC)/scripts/options.awk pngusr.h pngusr.dfa
|
||||||
|
$(RM) pnglibconf.h pnglibconf.dfn
|
||||||
|
$(MAKE) -f $(PNGSRC)/scripts/pnglibconf.mak $(MAKEFLAGS)\
|
||||||
|
srcdir=$(PNGSRC) CPPFLAGS="-DPNG_USER_CONFIG -I."\
|
||||||
|
DFA_XTRA="pngusr.dfa" $@
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
$(MAKE) -f $(PNGSRC)/scripts/pnglibconf.mak $(MAKEFLAGS)\
|
||||||
|
srcdir=$(PNGSRC) clean
|
||||||
$(RM) pnm2pngm$(O)
|
$(RM) pnm2pngm$(O)
|
||||||
$(RM) pnm2pngm$(E)
|
$(RM) pnm2pngm$(E)
|
||||||
$(RM) $(OBJS)
|
$(RM) $(OBJS)
|
||||||
|
|
||||||
|
# distclean also removes the copied source and headers
|
||||||
|
distclean: clean
|
||||||
|
$(RM) -r scripts # historical reasons
|
||||||
|
$(RM) $(PNGSRCS) $(PNGH)
|
||||||
|
$(RM) $(ZSRCS) $(ZH) $(ZCONF)
|
||||||
|
$(RM) $(PROGSRCS) $(PROGHDRS) $(PROGDOCS)
|
||||||
|
|
||||||
|
# Header file dependencies:
|
||||||
|
$(PROGOBJS): $(PROGHDRS) $(PNGINC) $(ZINC)
|
||||||
|
$(PNGOBJS): $(PNGHDRS) $(ZINC)
|
||||||
|
$(ZOBJS): $(ZHDRS)
|
||||||
|
|
||||||
|
# Gather the source code from the respective directories
|
||||||
|
$(PNGSRCS) $(PNGH): $(PNGSRC)/$@
|
||||||
|
$(RM) $@
|
||||||
|
$(COPY) $(PNGSRC)/$@ $@
|
||||||
|
|
||||||
|
# No dependency on the ZLIBSRC target so that it only needs
|
||||||
|
# to be specified once.
|
||||||
|
$(ZSRCS) $(ZH):
|
||||||
|
$(RM) $@
|
||||||
|
$(COPY) $(ZLIBSRC)/$@ $@
|
||||||
|
|
||||||
|
# The unconfigured zconf.h varies in name according to the
|
||||||
|
# zlib release
|
||||||
|
$(ZCONF):
|
||||||
|
$(RM) $@
|
||||||
|
@for f in zconf.h.in zconf.in.h zconf.h; do\
|
||||||
|
test -r $(ZLIBSRC)/$$f &&\
|
||||||
|
echo $(COPY) $(ZLIBSRC)/$$f $@ &&\
|
||||||
|
$(COPY) $(ZLIBSRC)/$$f $@ && exit 0;\
|
||||||
|
done; echo copy: $(ZLIBSRC)/zconf.h not found; exit 1
|
||||||
|
|
||||||
|
pnm2pngm.c: $(PROGSRC)/pnm2png.c
|
||||||
|
$(RM) $@
|
||||||
|
$(COPY) $(PROGSRC)/pnm2png.c $@
|
||||||
|
|
||||||
# End of makefile for pnm2pngm
|
# End of makefile for pnm2pngm
|
||||||
|
|||||||
39
contrib/pngminim/encoder/pngusr.dfa
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
# pngminim/encoder/pngusr.dfa
|
||||||
|
#
|
||||||
|
# Copyright (c) 2010-2013 Glenn Randers-Pehrson
|
||||||
|
#
|
||||||
|
# This code is released under the libpng license.
|
||||||
|
# For conditions of distribution and use, see the disclaimer
|
||||||
|
# and license in png.h
|
||||||
|
|
||||||
|
# First all the build options off:
|
||||||
|
|
||||||
|
everything = off
|
||||||
|
|
||||||
|
# Switch on the write code - this makes a minimalist encoder
|
||||||
|
|
||||||
|
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:
|
||||||
|
# option FLOATING_POINT on
|
||||||
|
|
||||||
|
option FIXED_POINT on
|
||||||
|
|
||||||
|
# You must chose the internal fixed point implementation or to
|
||||||
|
# use the system floating point. The latter is considerably
|
||||||
|
# smaller (by about 1kbyte on an x86 system):
|
||||||
|
# option FLOATING_ARITHMETIC on
|
||||||
|
|
||||||
|
option FLOATING_ARITHMETIC off
|
||||||
|
|
||||||
|
# Your program will probably need other options. The example
|
||||||
|
# program here, pnm2pngm, requires the following. Take a look
|
||||||
|
# at pnglibconf.h to find out the full set of what has to be
|
||||||
|
# enabled to make the following work.
|
||||||
|
|
||||||
|
option SETJMP on
|
||||||
|
option STDIO 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, 2009 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
|
||||||
@@ -12,60 +12,12 @@
|
|||||||
#ifndef MINWRPNGCONF_H
|
#ifndef MINWRPNGCONF_H
|
||||||
#define MINWRPNGCONF_H
|
#define MINWRPNGCONF_H
|
||||||
|
|
||||||
#define PNG_NO_READ_SUPPORTED
|
/* To include pngusr.h set -DPNG_USER_CONFIG in CPPFLAGS */
|
||||||
|
|
||||||
#define PNG_NO_WARNINGS
|
/* List options to turn off features of the build that do not
|
||||||
#define png_warning(s1,s2) ""
|
* affect the API (so are not recorded in pnglibconf.h)
|
||||||
#define png_chunk_warning(s1,s2) ""
|
*/
|
||||||
#define PNG_NO_ERROR_TEXT
|
|
||||||
#define png_error(s1,s2) png_err(s1)
|
|
||||||
#define png_chunk_error(s1,s2) png_err(s1)
|
|
||||||
|
|
||||||
#define PNG_NO_WRITE_BACKGROUND
|
#define PNG_ALIGN_TYPE PNG_ALIGN_NONE
|
||||||
#define PNG_NO_WRITE_GAMMA
|
|
||||||
#define PNG_NO_WRITE_DITHER
|
|
||||||
#define PNG_NO_WRITE_INVERT
|
|
||||||
#define PNG_NO_WRITE_SHIFT
|
|
||||||
#define PNG_NO_WRITE_PACK
|
|
||||||
#define PNG_NO_WRITE_PACKSWAP
|
|
||||||
#define PNG_NO_WRITE_FILLER
|
|
||||||
#define PNG_NO_WRITE_SWAP
|
|
||||||
#define PNG_NO_WRITE_SWAP_ALPHA
|
|
||||||
#define PNG_NO_WRITE_INVERT_ALPHA
|
|
||||||
#define PNG_NO_WRITE_RGB_TO_GRAY
|
|
||||||
#define PNG_NO_WRITE_USER_TRANSFORM
|
|
||||||
#define PNG_NO_WRITE_bKGD
|
|
||||||
#define PNG_NO_WRITE_cHRM
|
|
||||||
#define PNG_NO_WRITE_gAMA
|
|
||||||
#define PNG_NO_WRITE_hIST
|
|
||||||
#define PNG_NO_WRITE_iCCP
|
|
||||||
#define PNG_NO_WRITE_oFFs
|
|
||||||
#define PNG_NO_WRITE_pCAL
|
|
||||||
#define PNG_NO_WRITE_pHYs
|
|
||||||
#define PNG_NO_WRITE_sBIT
|
|
||||||
#define PNG_NO_WRITE_sCAL
|
|
||||||
#define PNG_NO_WRITE_sPLT
|
|
||||||
#define PNG_NO_WRITE_sRGB
|
|
||||||
#define PNG_NO_WRITE_TEXT
|
|
||||||
#define PNG_NO_WRITE_tIME
|
|
||||||
#define PNG_NO_WRITE_UNKNOWN_CHUNKS
|
|
||||||
#define PNG_NO_WRITE_USER_CHUNKS
|
|
||||||
#define PNG_NO_WRITE_EMPTY_PLTE
|
|
||||||
#define PNG_NO_WRITE_OPT_PLTE
|
|
||||||
#define PNG_NO_WRITE_FILTER
|
|
||||||
#define PNG_NO_WRITE_WEIGHTED_FILTER
|
|
||||||
#define PNG_NO_WRITE_INTERLACING_SUPPORTED
|
|
||||||
#define PNG_NO_WRITE_FLUSH
|
|
||||||
|
|
||||||
#define PNG_NO_INFO_IMAGE
|
|
||||||
#define PNG_NO_USER_MEM
|
|
||||||
#define PNG_NO_FIXED_POINT_SUPPORTED
|
|
||||||
#define PNG_NO_MNG_FEATURES
|
|
||||||
#define PNG_NO_USER_TRANSFORM_PTR
|
|
||||||
#define PNG_NO_HANDLE_AS_UNKNOWN
|
|
||||||
#define PNG_NO_CONSOLE_IO
|
|
||||||
#define PNG_NO_ZALLOC_ZERO
|
|
||||||
#define PNG_NO_ERROR_NUMBERS
|
|
||||||
#define PNG_NO_EASY_ACCESS
|
|
||||||
|
|
||||||
#endif /* MINWRPNGCONF_H */
|
#endif /* MINWRPNGCONF_H */
|
||||||
|
|||||||
@@ -1,14 +1,15 @@
|
|||||||
This demonstrates the use of PNG_USER_CONFIG and pngusr.h
|
This demonstrates the use of PNG_USER_CONFIG and pngusr.h
|
||||||
|
|
||||||
To build a minimal read-only progressive decoder embedded libpng and
|
The makefile builds a minimal read-only progressive decoder with
|
||||||
zlib and with your system's X library, run
|
embedded libpng, zlib and your system's X library.
|
||||||
|
|
||||||
gather.sh # to collect needed files from gregbook, libpng, and zlib
|
Specify the location of the zlib source (1.2.1 or later) as ZLIBSRC
|
||||||
|
on the make command line.
|
||||||
|
|
||||||
Edit makefile if required, to find your X library and include files,
|
Edit makefile if required, to find your X library and include files,
|
||||||
then
|
then
|
||||||
|
|
||||||
make
|
make ZLIBSRC=directory
|
||||||
|
|
||||||
If you prefer to use the shared libraries, go to contrib/gregbook
|
If you prefer to use the shared libraries, go to contrib/gregbook
|
||||||
and build the rpng2-x application there.
|
and build the rpng2-x application there.
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
cp ../../gregbook/rpng2-x.c ../../gregbook/readpng2.[ch] .
|
|
||||||
cp ../../gregbook/COPYING ../../gregbook/LICENSE .
|
|
||||||
cp ../../../*.h .
|
|
||||||
cp ../../../*.c .
|
|
||||||
rm example.c pnggccrd.c pngvcrd.c pngtest.c pngw*.c
|
|
||||||
# change the following 2 lines if zlib is somewhere else
|
|
||||||
cp ../../../../zlib/*.h .
|
|
||||||
cp ../../../../zlib/*.c .
|
|
||||||
rm minigzip.c example.c compress.c deflate.c
|
|
||||||
@@ -5,7 +5,14 @@
|
|||||||
CC=gcc
|
CC=gcc
|
||||||
LD=$(CC)
|
LD=$(CC)
|
||||||
|
|
||||||
|
# If awk fails try
|
||||||
|
# make AWK=nawk
|
||||||
|
|
||||||
|
# If cpp fails try
|
||||||
|
# make CPP=/lib/cpp
|
||||||
|
|
||||||
RM=rm -f
|
RM=rm -f
|
||||||
|
COPY=cp
|
||||||
|
|
||||||
#XINC = -I/usr/include # old-style, stock X distributions
|
#XINC = -I/usr/include # old-style, stock X distributions
|
||||||
#XLIB = -L/usr/lib/X11 -lX11 # (including SGI IRIX)
|
#XLIB = -L/usr/lib/X11 -lX11 # (including SGI IRIX)
|
||||||
@@ -23,38 +30,137 @@ 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 \
|
CPPFLAGS=-I. $(XINC) -DPNG_USER_CONFIG -DNO_GZCOMPRESS -DZ_SOLO -DNO_GZIP
|
||||||
-DdeflateParams\(a,b,c\)=Z_OK -I. $(XINC) -O1
|
CFLAGS=-O1 -Wall
|
||||||
|
|
||||||
C=.c
|
C=.c
|
||||||
O=.o
|
O=.o
|
||||||
L=.a
|
L=.a
|
||||||
E=
|
E=
|
||||||
|
|
||||||
ZOBJS = adler32$(O) crc32$(O) gzio$(O) \
|
# Where to find the source code:
|
||||||
infback$(O) inffast$(O) inflate$(O) inftrees$(O) \
|
PNGSRC =../../..
|
||||||
trees$(O) uncompr$(O) zutil$(O)
|
ZLIBSRC=$(PNGSRC)/../zlib
|
||||||
|
PROGSRC=$(PNGSRC)/contrib/gregbook
|
||||||
|
|
||||||
OBJS = rpng2-x$(O) readpng2$(O) png$(O) pngerror$(O) pngget$(O) pngmem$(O) \
|
# Zlib (minimal inflate requirements - crc32 is used by libpng)
|
||||||
|
# zutil can be eliminated if you provide your own zcalloc and zcfree
|
||||||
|
ZSRCS = adler32$(C) crc32$(C) \
|
||||||
|
inffast$(C) inflate$(C) inftrees$(C) \
|
||||||
|
zutil$(C)
|
||||||
|
|
||||||
|
# Standard headers
|
||||||
|
ZH = zlib.h crc32.h inffast.h inffixed.h \
|
||||||
|
inflate.h inftrees.h zutil.h
|
||||||
|
|
||||||
|
# Machine generated headers
|
||||||
|
ZCONF = zconf.h
|
||||||
|
|
||||||
|
# Headers callers use
|
||||||
|
ZINC = zlib.h $(ZCONF)
|
||||||
|
|
||||||
|
# Headers the Zlib source uses
|
||||||
|
ZHDRS = $(ZH) $(ZCONF)
|
||||||
|
|
||||||
|
ZOBJS = adler32$(O) crc32$(O) \
|
||||||
|
inffast$(O) inflate$(O) inftrees$(O) \
|
||||||
|
zutil$(O)
|
||||||
|
|
||||||
|
# libpng
|
||||||
|
PNGSRCS=png$(C) pngerror$(C) pngget$(C) pngmem$(C) \
|
||||||
|
pngpread$(C) pngread$(C) pngrio$(C) pngrtran$(C) pngrutil$(C) \
|
||||||
|
pngset$(C) pngtrans$(C)
|
||||||
|
|
||||||
|
# Standard headers
|
||||||
|
PNGH =png.h pngconf.h pngdebug.h pnginfo.h pngpriv.h pngstruct.h
|
||||||
|
|
||||||
|
# Machine generated headers
|
||||||
|
PNGCONF=pnglibconf.h
|
||||||
|
|
||||||
|
# Headers callers use
|
||||||
|
PNGINC= png.h pngconf.h pngusr.h $(PNGCONF)
|
||||||
|
|
||||||
|
# Headers the PNG library uses
|
||||||
|
PNGHDRS=$(PNGH) $(PNGCONF) pngusr.h
|
||||||
|
|
||||||
|
PNGOBJS=png$(O) pngerror$(O) pngget$(O) pngmem$(O) \
|
||||||
pngpread$(O) pngread$(O) pngrio$(O) pngrtran$(O) pngrutil$(O) \
|
pngpread$(O) pngread$(O) pngrio$(O) pngrtran$(O) pngrutil$(O) \
|
||||||
pngset$(O) pngtrans$(O) $(ZOBJS)
|
pngset$(O) pngtrans$(O)
|
||||||
|
|
||||||
|
PROGSRCS= rpng2-x$(C) readpng2$(C)
|
||||||
|
PROGHDRS= readpng2.h
|
||||||
|
PROGDOCS= COPYING LICENSE
|
||||||
|
PROGOBJS= rpng2-x$(O) readpng2$(O)
|
||||||
|
|
||||||
|
OBJS = $(PROGOBJS) $(PNGOBJS) $(ZOBJS)
|
||||||
|
|
||||||
# implicit make rules -------------------------------------------------------
|
# implicit make rules -------------------------------------------------------
|
||||||
|
|
||||||
.c$(O): png.h pngconf.h readpng2.h pngusr.h zlib.h
|
.c$(O):
|
||||||
$(CC) -c $(CFLAGS) $<
|
$(CC) -c $(CPPFLAGS) $(CFLAGS) $<
|
||||||
|
|
||||||
# dependencies
|
# dependencies
|
||||||
|
|
||||||
all: rpng2-x$(E)
|
all: $(PROGDOCS) rpng2-x$(E)
|
||||||
|
|
||||||
rpng2-x$(E): $(OBJS)
|
rpng2-x$(E): $(OBJS)
|
||||||
$(LD) -o rpng2-x$(E) $(OBJS) $(LIBS)
|
$(LD) -o rpng2-x$(E) $(OBJS) $(LIBS)
|
||||||
strip rpng2-x$(E)
|
|
||||||
|
# The DFA_XTRA setting turns all libpng options off then
|
||||||
|
# turns on those required for this minimal build.
|
||||||
|
# The CPP_FLAGS setting causes pngusr.h to be included in
|
||||||
|
# both the build of pnglibconf.h and, subsequently, when
|
||||||
|
# building libpng itself.
|
||||||
|
$(PNGCONF): $(PNGSRC)/scripts/pnglibconf.mak $(ZH)\
|
||||||
|
$(PNGSRC)/scripts/pnglibconf.dfa \
|
||||||
|
$(PNGSRC)/scripts/options.awk pngusr.h pngusr.dfa
|
||||||
|
$(RM) pnglibconf.h pnglibconf.dfn
|
||||||
|
$(MAKE) -f $(PNGSRC)/scripts/pnglibconf.mak $(MAKEFLAGS)\
|
||||||
|
srcdir=$(PNGSRC) CPPFLAGS="-DPNG_USER_CONFIG -I."\
|
||||||
|
DFA_XTRA="pngusr.dfa" $@
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
$(MAKE) -f $(PNGSRC)/scripts/pnglibconf.mak $(MAKEFLAGS)\
|
||||||
|
srcdir=$(PNGSRC) clean
|
||||||
$(RM) rpng2-x$(O)
|
$(RM) rpng2-x$(O)
|
||||||
$(RM) rpng2-x$(E)
|
$(RM) rpng2-x$(E)
|
||||||
$(RM) $(OBJS)
|
$(RM) $(OBJS)
|
||||||
|
|
||||||
|
# distclean also removes the copied source and headers
|
||||||
|
distclean: clean
|
||||||
|
$(RM) -r scripts # historical reasons
|
||||||
|
$(RM) $(PNGSRCS) $(PNGH)
|
||||||
|
$(RM) $(ZSRCS) $(ZH) $(ZCONF)
|
||||||
|
$(RM) $(PROGSRCS) $(PROGHDRS) $(PROGDOCS)
|
||||||
|
|
||||||
|
# Header file dependencies:
|
||||||
|
$(PROGOBJS): $(PROGHDRS) $(PNGINC) $(ZINC)
|
||||||
|
$(PNGOBJS): $(PNGHDRS) $(ZINC)
|
||||||
|
$(ZOBJS): $(ZHDRS)
|
||||||
|
|
||||||
|
# Gather the source code from the respective directories
|
||||||
|
$(PNGSRCS) $(PNGH): $(PNGSRC)/$@
|
||||||
|
$(RM) $@
|
||||||
|
$(COPY) $(PNGSRC)/$@ $@
|
||||||
|
|
||||||
|
# No dependency on the ZLIBSRC target so that it only needs
|
||||||
|
# to be specified once.
|
||||||
|
$(ZSRCS) $(ZH):
|
||||||
|
$(RM) $@
|
||||||
|
$(COPY) $(ZLIBSRC)/$@ $@
|
||||||
|
|
||||||
|
# The unconfigured zconf.h varies in name according to the
|
||||||
|
# zlib release
|
||||||
|
$(ZCONF):
|
||||||
|
$(RM) $@
|
||||||
|
@for f in zconf.h.in zconf.in.h zconf.h; do\
|
||||||
|
test -r $(ZLIBSRC)/$$f &&\
|
||||||
|
echo $(COPY) $(ZLIBSRC)/$$f $@ &&\
|
||||||
|
$(COPY) $(ZLIBSRC)/$$f $@ && exit 0;\
|
||||||
|
done; echo copy: $(ZLIBSRC)/zconf.h not found; exit 1
|
||||||
|
|
||||||
|
$(PROGSRCS) $(PROGHDRS) $(PROGDOCS): $(PROGSRC)/$@
|
||||||
|
$(RM) $@
|
||||||
|
$(COPY) $(PROGSRC)/$@ $@
|
||||||
|
|
||||||
# End of makefile for rpng2-x
|
# End of makefile for rpng2-x
|
||||||
|
|||||||
40
contrib/pngminim/preader/pngusr.dfa
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
# pngminim/preader/pngusr.dfa
|
||||||
|
#
|
||||||
|
# Copyright (c) 2010-2013 Glenn Randers-Pehrson
|
||||||
|
#
|
||||||
|
# This code is released under the libpng license.
|
||||||
|
# For conditions of distribution and use, see the disclaimer
|
||||||
|
# and license in png.h
|
||||||
|
|
||||||
|
# First all the build options off:
|
||||||
|
|
||||||
|
everything = off
|
||||||
|
|
||||||
|
# Just switch on the progressive read code
|
||||||
|
|
||||||
|
option PROGRESSIVE_READ on
|
||||||
|
|
||||||
|
# You may choose fixed or floating point APIs:
|
||||||
|
# option FLOATING_POINT on
|
||||||
|
|
||||||
|
option FIXED_POINT on
|
||||||
|
|
||||||
|
# You must chose the internal fixed point implementation or to
|
||||||
|
# use the system floating point. The latter is considerably
|
||||||
|
# smaller (by about 1kbyte on an x86 system):
|
||||||
|
|
||||||
|
option FLOATING_ARITHMETIC on
|
||||||
|
# option FLOATING_ARITHMETIC off
|
||||||
|
|
||||||
|
# Your program will probably need other options. The example
|
||||||
|
# program here, rpng2-x, requires the following. Take a look
|
||||||
|
# at pnglibconf.h to find out the full set of what has to be
|
||||||
|
# enabled to make the following work.
|
||||||
|
|
||||||
|
option SETJMP on
|
||||||
|
option STDIO on
|
||||||
|
option READ_bKGD on
|
||||||
|
option READ_GAMMA on
|
||||||
|
option READ_EXPAND on
|
||||||
|
option READ_STRIP_16_TO_8 on
|
||||||
|
option READ_GRAY_TO_RGB 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) 2009 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
|
||||||
@@ -12,52 +12,12 @@
|
|||||||
#ifndef MINPRDPNGCONF_H
|
#ifndef MINPRDPNGCONF_H
|
||||||
#define MINPRDPNGCONF_H
|
#define MINPRDPNGCONF_H
|
||||||
|
|
||||||
#define PNG_NO_WARNINGS
|
/* To include pngusr.h set -DPNG_USER_CONFIG in CPPFLAGS */
|
||||||
#define png_warning(s1,s2) ""
|
|
||||||
#define png_chunk_warning(s1,s2) ""
|
|
||||||
#define PNG_NO_ERROR_TEXT
|
|
||||||
#define png_error(s1,s2) png_err(s1)
|
|
||||||
#define png_chunk_error(s1,s2) png_err(s1)
|
|
||||||
|
|
||||||
#define PNG_NO_READ_DITHER
|
/* List options to turn off features of the build that do not
|
||||||
#define PNG_NO_READ_INVERT
|
* affect the API (so are not recorded in pnglibconf.h)
|
||||||
#define PNG_NO_READ_SHIFT
|
*/
|
||||||
#define PNG_NO_READ_PACK
|
|
||||||
#define PNG_NO_READ_PACKSWAP
|
|
||||||
#define PNG_NO_READ_FILLER
|
|
||||||
#define PNG_NO_READ_SWAP
|
|
||||||
#define PNG_NO_READ_SWAP_ALPHA
|
|
||||||
#define PNG_NO_READ_INVERT_ALPHA
|
|
||||||
#define PNG_NO_READ_RGB_TO_GRAY
|
|
||||||
#define PNG_NO_READ_USER_TRANSFORM
|
|
||||||
#define PNG_NO_READ_cHRM
|
|
||||||
#define PNG_NO_READ_hIST
|
|
||||||
#define PNG_NO_READ_iCCP
|
|
||||||
#define PNG_NO_READ_pCAL
|
|
||||||
#define PNG_NO_READ_pHYs
|
|
||||||
#define PNG_NO_READ_sBIT
|
|
||||||
#define PNG_NO_READ_sCAL
|
|
||||||
#define PNG_NO_READ_sPLT
|
|
||||||
#define PNG_NO_READ_TEXT
|
|
||||||
#define PNG_NO_READ_tIME
|
|
||||||
#define PNG_NO_READ_UNKNOWN_CHUNKS
|
|
||||||
#define PNG_NO_READ_USER_CHUNKS
|
|
||||||
#define PNG_NO_READ_EMPTY_PLTE
|
|
||||||
#define PNG_NO_READ_OPT_PLTE
|
|
||||||
#define PNG_NO_READ_STRIP_ALPHA
|
|
||||||
#define PNG_NO_READ_oFFs
|
|
||||||
|
|
||||||
#define PNG_NO_WRITE_SUPPORTED
|
#define PNG_ALIGN_TYPE PNG_ALIGN_NONE
|
||||||
|
|
||||||
#define PNG_NO_INFO_IMAGE
|
|
||||||
#define PNG_NO_USER_MEM
|
|
||||||
#define PNG_NO_FIXED_POINT_SUPPORTED
|
|
||||||
#define PNG_NO_MNG_FEATURES
|
|
||||||
#define PNG_NO_USER_TRANSFORM_PTR
|
|
||||||
#define PNG_NO_HANDLE_AS_UNKNOWN
|
|
||||||
#define PNG_NO_CONSOLE_IO
|
|
||||||
#define PNG_NO_ZALLOC_ZERO
|
|
||||||
#define PNG_NO_ERROR_NUMBERS
|
|
||||||
#define PNG_NO_EASY_ACCESS
|
|
||||||
|
|
||||||
#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/libpng12
|
#PNGINC = -I$(PNGPATH)/include/libpng16
|
||||||
#PNGLIB = -L$(PNGPATH)/lib -lpng12
|
#PNGLIB = -L$(PNGPATH)/lib -lpng16
|
||||||
#PNGLIBS = $(PNGPATH)/lib/libpng12.a
|
#PNGLIBS = $(PNGPATH)/lib/libpng16.a
|
||||||
PNGINC = -I../..
|
PNGINC = -I../..
|
||||||
PNGLIB = -L../.. -lpng
|
PNGLIB = -L../.. -lpng
|
||||||
PNGLIBS = ../../libpng.a
|
PNGLIBS = ../../libpng.a
|
||||||
@@ -23,9 +23,10 @@ ZINC = -I../../../zlib
|
|||||||
ZLIB = -L../../../zlib -lz
|
ZLIB = -L../../../zlib -lz
|
||||||
ZLIBS = ../../../zlib/libz.a
|
ZLIBS = ../../../zlib/libz.a
|
||||||
|
|
||||||
CFLAGS=-O3 $(PNGINC) $(ZINC)
|
CPPFLAGS=$(PNGINC) $(ZINC)
|
||||||
LDFLAGS=$(PNGLIB) $(ZLIB)
|
CFLAGS=
|
||||||
LDFLAGSS=$(PNGLIBS) $(ZLIBS)
|
LDLIBS=$(PNGLIB) $(ZLIB)
|
||||||
|
LDLIBSS=$(PNGLIBS) $(ZLIBS)
|
||||||
C=.c
|
C=.c
|
||||||
O=.o
|
O=.o
|
||||||
L=.a
|
L=.a
|
||||||
@@ -37,22 +38,22 @@ E=
|
|||||||
all: png2pnm$(E) pnm2png$(E) png2pnm-static$(E) pnm2png-static$(E)
|
all: png2pnm$(E) pnm2png$(E) png2pnm-static$(E) pnm2png-static$(E)
|
||||||
|
|
||||||
png2pnm$(O): png2pnm$(C)
|
png2pnm$(O): png2pnm$(C)
|
||||||
$(CC) -c $(CFLAGS) png2pnm$(C)
|
$(CC) -c $(CPPFLAGS) $(CFLAGS) png2pnm$(C)
|
||||||
|
|
||||||
png2pnm$(E): png2pnm$(O)
|
png2pnm$(E): png2pnm$(O)
|
||||||
$(LD) -o png2pnm$(E) png2pnm$(O) $(LDFLAGS) -lm
|
$(LD) $(LDFLAGS) -o png2pnm$(E) png2pnm$(O) $(LDLIBS) -lm
|
||||||
|
|
||||||
png2pnm-static$(E): png2pnm$(O)
|
png2pnm-static$(E): png2pnm$(O)
|
||||||
$(LD) -o png2pnm-static$(E) png2pnm$(O) $(LDFLAGSS) -lm
|
$(LD) $(LDFLAGS) -o png2pnm-static$(E) png2pnm$(O) $(LDLIBSS) -lm
|
||||||
|
|
||||||
pnm2png$(O): pnm2png$(C)
|
pnm2png$(O): pnm2png$(C)
|
||||||
$(CC) -c $(CFLAGS) pnm2png$(C)
|
$(CC) -c $(CPPFLAGS) $(CFLAGS) pnm2png$(C)
|
||||||
|
|
||||||
pnm2png$(E): pnm2png$(O)
|
pnm2png$(E): pnm2png$(O)
|
||||||
$(LD) -o pnm2png$(E) pnm2png$(O) $(LDFLAGS) -lm
|
$(LD) $(LDFLAGS) -o pnm2png$(E) pnm2png$(O) $(LDLIBS) -lm
|
||||||
|
|
||||||
pnm2png-static$(E): pnm2png$(O)
|
pnm2png-static$(E): pnm2png$(O)
|
||||||
$(LD) -o pnm2png-static$(E) pnm2png$(O) $(LDFLAGSS) -lm
|
$(LD) $(LDFLAGS) -o pnm2png-static$(E) pnm2png$(O) $(LDLIBSS) -lm
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(RM) png2pnm$(O)
|
$(RM) png2pnm$(O)
|
||||||
|
|||||||
@@ -7,7 +7,8 @@ LB=tlib
|
|||||||
RM=del
|
RM=del
|
||||||
CP=copy
|
CP=copy
|
||||||
MODEL=l
|
MODEL=l
|
||||||
CCFLAGS=-O -m$(MODEL) -I..\libpng -I..\zlib
|
CPPFLAGS=-I..\libpng -I..\zlib
|
||||||
|
CFLAGS=-O -m$(MODEL)
|
||||||
LDFLAGS=-m$(MODEL) -L..\libpng -L..\zlib
|
LDFLAGS=-m$(MODEL) -L..\libpng -L..\zlib
|
||||||
C=.c
|
C=.c
|
||||||
O=.obj
|
O=.obj
|
||||||
@@ -19,13 +20,13 @@ E=.exe
|
|||||||
all: png2pnm$(E) pnm2png$(E)
|
all: png2pnm$(E) pnm2png$(E)
|
||||||
|
|
||||||
png2pnm$(O): png2pnm$(C)
|
png2pnm$(O): png2pnm$(C)
|
||||||
$(CC) -c $(CCFLAGS) png2pnm$(C)
|
$(CC) -c $(CPPFLAGS) $(CFLAGS) png2pnm$(C)
|
||||||
|
|
||||||
png2pnm$(E): png2pnm$(O)
|
png2pnm$(E): png2pnm$(O)
|
||||||
$(LD) $(LDFLAGS) png2pnm$(O) libpng$(L) zlib$(L)
|
$(LD) $(LDFLAGS) png2pnm$(O) libpng$(L) zlib$(L)
|
||||||
|
|
||||||
pnm2png$(O): pnm2png$(C)
|
pnm2png$(O): pnm2png$(C)
|
||||||
$(CC) -c $(CCFLAGS) pnm2png$(C)
|
$(CC) -c $(CPPFLAGS) $(CFLAGS) pnm2png$(C)
|
||||||
|
|
||||||
pnm2png$(E): pnm2png$(O)
|
pnm2png$(E): pnm2png$(O)
|
||||||
$(LD) $(LDFLAGS) pnm2png$(O) libpng$(L) zlib$(L)
|
$(LD) $(LDFLAGS) pnm2png$(O) libpng$(L) zlib$(L)
|
||||||
@@ -35,4 +36,3 @@ clean:
|
|||||||
$(RM) *$(E)
|
$(RM) *$(E)
|
||||||
|
|
||||||
# End of makefile for png2pnm / pnm2png
|
# End of makefile for png2pnm / pnm2png
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -144,7 +145,7 @@ int main(int argc, char *argv[])
|
|||||||
if (png2pnm (fp_rd, fp_wr, fp_al, raw, alpha) == FALSE)
|
if (png2pnm (fp_rd, fp_wr, fp_al, raw, alpha) == FALSE)
|
||||||
{
|
{
|
||||||
fprintf (stderr, "PNG2PNM\n");
|
fprintf (stderr, "PNG2PNM\n");
|
||||||
fprintf (stderr, "Error: unsuccessful convertion of PNG-image\n");
|
fprintf (stderr, "Error: unsuccessful conversion of PNG-image\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -188,7 +189,7 @@ void usage()
|
|||||||
BOOL png2pnm (FILE *png_file, FILE *pnm_file, FILE *alpha_file, BOOL raw, BOOL alpha)
|
BOOL png2pnm (FILE *png_file, FILE *pnm_file, FILE *alpha_file, BOOL raw, BOOL alpha)
|
||||||
{
|
{
|
||||||
png_struct *png_ptr = NULL;
|
png_struct *png_ptr = NULL;
|
||||||
png_info *info_ptr = NULL;
|
png_info *info_ptr = NULL;
|
||||||
png_byte buf[8];
|
png_byte buf[8];
|
||||||
png_byte *png_pixels = NULL;
|
png_byte *png_pixels = NULL;
|
||||||
png_byte **row_pointers = NULL;
|
png_byte **row_pointers = NULL;
|
||||||
@@ -211,8 +212,8 @@ BOOL png2pnm (FILE *png_file, FILE *pnm_file, FILE *alpha_file, BOOL raw, BOOL a
|
|||||||
if (ret != 8)
|
if (ret != 8)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
ret = png_check_sig (buf, 8);
|
ret = png_sig_cmp (buf, 0, 8);
|
||||||
if (!ret)
|
if (ret)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
/* create png and info structures */
|
/* create png and info structures */
|
||||||
@@ -381,7 +382,7 @@ BOOL png2pnm (FILE *png_file, FILE *pnm_file, FILE *alpha_file, BOOL raw, BOOL a
|
|||||||
fputc ((int) *pix_ptr++ , pnm_file);
|
fputc ((int) *pix_ptr++ , pnm_file);
|
||||||
else
|
else
|
||||||
if (bit_depth == 16){
|
if (bit_depth == 16){
|
||||||
dep_16 = (long) *pix_ptr++;
|
dep_16 = (long) *pix_ptr++;
|
||||||
fprintf (pnm_file, "%ld ", (dep_16 << 8) + ((long) *pix_ptr++));
|
fprintf (pnm_file, "%ld ", (dep_16 << 8) + ((long) *pix_ptr++));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -401,9 +402,9 @@ BOOL png2pnm (FILE *png_file, FILE *pnm_file, FILE *alpha_file, BOOL raw, BOOL a
|
|||||||
fputc ((int) *pix_ptr++ , alpha_file);
|
fputc ((int) *pix_ptr++ , alpha_file);
|
||||||
else
|
else
|
||||||
if (bit_depth == 16){
|
if (bit_depth == 16){
|
||||||
dep_16 = (long) *pix_ptr++;
|
dep_16 = (long) *pix_ptr++;
|
||||||
fprintf (alpha_file, "%ld ", (dep_16 << 8) + (long) *pix_ptr++);
|
fprintf (alpha_file, "%ld ", (dep_16 << 8) + (long) *pix_ptr++);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
fprintf (alpha_file, "%ld ", (long) *pix_ptr++);
|
fprintf (alpha_file, "%ld ", (long) *pix_ptr++);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -1,41 +1,61 @@
|
|||||||
|
|
||||||
pngsuite
|
pngsuite
|
||||||
--------
|
--------
|
||||||
(c) Willem van Schaik, 1999
|
(c) Willem van Schaik, 1999, 2011, 2012
|
||||||
|
Two images are by Glenn Randers-Pehrson, 2012
|
||||||
|
|
||||||
Permission to use, copy, and distribute these images for any purpose and
|
Permission to use, copy, modify, and distribute these images for any
|
||||||
without fee is hereby granted.
|
purpose and without fee is hereby granted.
|
||||||
|
|
||||||
These 15 images are part of the much larger PngSuite test-set of
|
The 15 "bas*.png" images are part of the much larger PngSuite test-set of
|
||||||
images, available for developers of PNG supporting software. The
|
images, available for developers of PNG supporting software. The
|
||||||
complete set, available at http:/www.schaik.com/pngsuite/, contains
|
complete set, available at http:/www.schaik.com/pngsuite/, contains
|
||||||
a variety of images to test interlacing, gamma settings, ancillary
|
a variety of images to test interlacing, gamma settings, ancillary
|
||||||
chunks, etc.
|
chunks, etc.
|
||||||
|
|
||||||
|
The "ft*.png" images are "free/libre" replacements for the transparent
|
||||||
|
corresponding t*.png images in the PngSuite.
|
||||||
|
|
||||||
The images in this directory represent the basic PNG color-types:
|
The images in this directory represent the basic PNG color-types:
|
||||||
grayscale (1-16 bit deep), full color (8 or 16 bit), paletted
|
grayscale (1-16 bit deep), full color (8 or 16 bit), paletted
|
||||||
(1-8 bit) and grayscale or color images with alpha channel. You
|
(1-8 bit) and grayscale or color images with alpha channel. You
|
||||||
can use them to test the proper functioning of PNG software.
|
can use them to test the proper functioning of PNG software.
|
||||||
|
|
||||||
filename depth type
|
filename depth type
|
||||||
------------ ------ --------------
|
------------ ------ --------------
|
||||||
basn0g01.png 1-bit grayscale
|
basn0g01.png 1-bit grayscale
|
||||||
basn0g02.png 2-bit grayscale
|
basn0g02.png 2-bit grayscale
|
||||||
basn0g04.png 4-bit grayscale
|
basn0g04.png 4-bit grayscale
|
||||||
basn0g08.png 8-bit grayscale
|
basn0g08.png 8-bit grayscale
|
||||||
basn0g16.png 16-bit grayscale
|
basn0g16.png 16-bit grayscale
|
||||||
basn2c08.png 8-bit truecolor
|
basn2c08.png 8-bit truecolor
|
||||||
basn2c16.png 16-bit truecolor
|
basn2c16.png 16-bit truecolor
|
||||||
basn3p01.png 1-bit paletted
|
basn3p01.png 1-bit paletted
|
||||||
basn3p02.png 2-bit paletted
|
basn3p02.png 2-bit paletted
|
||||||
basn3p04.png 4-bit paletted
|
basn3p04.png 4-bit paletted
|
||||||
basn3p08.png 8-bit paletted
|
basn3p08.png 8-bit paletted
|
||||||
basn4a08.png 8-bit gray with alpha
|
basn4a08.png 8-bit gray with alpha
|
||||||
basn4a16.png 16-bit gray with alpha
|
basn4a16.png 16-bit gray with alpha
|
||||||
basn6a08.png 8-bit RGBA
|
basn6a08.png 8-bit RGBA
|
||||||
basn6a16.png 16-bit RGBA
|
basn6a16.png 16-bit RGBA
|
||||||
|
|
||||||
Here is the correct result of typing "pngtest -m *.png" in
|
ftbbn0g01.png 1-bit grayscale, black bKGD
|
||||||
|
ftbbn0g02.png 2-bit grayscale, black bKGD
|
||||||
|
ftbbn0g04.png 4-bit grayscale, black bKGD
|
||||||
|
ftbbn2c16.png 16-bit truecolor, black bKGD
|
||||||
|
ftbbn3p08.png 8-bit paletted, black bKGD
|
||||||
|
ftbgn2c16.png 16-bit truecolor, gray bKGD
|
||||||
|
ftbgn3p08.png 8-bit paletted, gray bKGD
|
||||||
|
ftbrn2c08.png 8-bit truecolor, red bKGD
|
||||||
|
ftbwn0g16.png 16-bit gray, white bKGD
|
||||||
|
ftbwn3p08.png 8-bit paletted, white bKGD
|
||||||
|
ftbyn3p08.png 8-bit paletted, yellow bKGD
|
||||||
|
ftp0n0g08.png 8-bit grayscale, opaque
|
||||||
|
ftp0n2c08.png 8-bit truecolor, opaque
|
||||||
|
ftp0n3p08.png 8-bit paletted, opaque
|
||||||
|
ftp1n3p08.png 8-bit paletted, no bKGD
|
||||||
|
|
||||||
|
Here is the correct result of typing "pngtest -m bas*.png" in
|
||||||
this directory:
|
this directory:
|
||||||
|
|
||||||
Testing basn0g01.png: PASS (524 zero samples)
|
Testing basn0g01.png: PASS (524 zero samples)
|
||||||
|
|||||||
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 |
BIN
contrib/pngsuite/ftbbn0g04.png
Normal file
|
After Width: | Height: | Size: 429 B |
BIN
contrib/pngsuite/ftbbn2c16.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
contrib/pngsuite/ftbbn3p08.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
contrib/pngsuite/ftbgn2c16.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
contrib/pngsuite/ftbgn3p08.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
contrib/pngsuite/ftbrn2c08.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
contrib/pngsuite/ftbwn0g16.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
contrib/pngsuite/ftbwn3p08.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
contrib/pngsuite/ftbyn3p08.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
contrib/pngsuite/ftp0n0g08.png
Normal file
|
After Width: | Height: | Size: 719 B |
BIN
contrib/pngsuite/ftp0n2c08.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
contrib/pngsuite/ftp0n3p08.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
contrib/pngsuite/ftp1n3p08.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
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;
|
||||||
|
}
|
||||||
137
contrib/tools/chkfmt
Executable file
@@ -0,0 +1,137 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# Check the format of the source files in the current directory - checks for a
|
||||||
|
# line length of 80 characters max and no tab characters.
|
||||||
|
#
|
||||||
|
# Optionally arguments are files or directories to check.
|
||||||
|
#
|
||||||
|
# -v: output the long lines (makes fixing them easier)
|
||||||
|
# -e: spawn an editor for each file that needs a change ($EDITOR must be
|
||||||
|
# defined). When using -e the script MUST be run from an interactive
|
||||||
|
# command line.
|
||||||
|
verbose=
|
||||||
|
edit=
|
||||||
|
vers=
|
||||||
|
test "$1" = "-v" && {
|
||||||
|
shift
|
||||||
|
verbose=yes
|
||||||
|
}
|
||||||
|
test "$1" = "-e" && {
|
||||||
|
shift
|
||||||
|
if test -n "$EDITOR"
|
||||||
|
then
|
||||||
|
edit=yes
|
||||||
|
|
||||||
|
# Copy the standard streams for the editor
|
||||||
|
exec 3>&0 4>&1 5>&2
|
||||||
|
else
|
||||||
|
echo "chkfmt -e: EDITOR must be defined" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to edit a single file - if the file isn't changed ask the user
|
||||||
|
# whether or not to continue. This stuff only works if the script is run from
|
||||||
|
# the command line (otherwise, don't specify -e or you will be sorry).
|
||||||
|
doed(){
|
||||||
|
cp "$file" "$file".orig
|
||||||
|
"$EDITOR" "$file" 0>&3 1>&4 2>&5 3>&- 4>&- 5>&- || exit 1
|
||||||
|
if cmp -s "$file".orig "$file"
|
||||||
|
then
|
||||||
|
rm "$file".orig
|
||||||
|
echo -n "$file: file not changed, type anything to continue: " >&5
|
||||||
|
read ans 0>&3
|
||||||
|
test -n "$ans" || return 1
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# In beta versions the version string which appears in files can be a little
|
||||||
|
# long and cause spuriously overlong lines. To avoid this subtitute the version
|
||||||
|
# string with a 'standard' version a.b.cc before checking for long lines.
|
||||||
|
if test -r png.h
|
||||||
|
then
|
||||||
|
vers="`sed -n -e \
|
||||||
|
's/^#define PNG_LIBPNG_VER_STRING .\([0-9]\.[0-9]\.[0-9][0-9a-z]*\).$/\1/p' \
|
||||||
|
png.h`"
|
||||||
|
echo "chkfmt: checking version $vers"
|
||||||
|
fi
|
||||||
|
if test -z "$vers"
|
||||||
|
then
|
||||||
|
echo "chkfmt: png.h not found, ignoring version number" >&2
|
||||||
|
fi
|
||||||
|
|
||||||
|
test -n "$1" || set -- .
|
||||||
|
find "$@" \( -type d \( -name '.git' -o -name '.libs' -o -name 'projects' \) \
|
||||||
|
-prune \) -o \( -type f \
|
||||||
|
! -name '*.[oa]' ! -name '*.l[oa]' ! -name '*.png' ! -name '*.out' \
|
||||||
|
! -name '*.jpg' ! -name '*.patch' ! -name '*.obj' ! -name '*.exe' \
|
||||||
|
! -name '*.com' ! -name '*.tar.*' ! -name '*.zip' ! -name '*.ico' \
|
||||||
|
! -name '*.res' ! -name '*.rc' ! -name '*.mms' ! -name '*.rej' \
|
||||||
|
! -name '*.dsp' ! -name '*.orig' ! -name '*.dfn' ! -name '*.swp' \
|
||||||
|
! -name '~*' ! -name '*.3' \
|
||||||
|
! -name 'missing' ! -name 'mkinstalldirs' ! -name 'depcomp' \
|
||||||
|
! -name 'aclocal.m4' ! -name 'install-sh' ! -name 'Makefile.in' \
|
||||||
|
! -name 'ltmain.sh' ! -name 'config*' -print \) | {
|
||||||
|
st=0
|
||||||
|
while read file
|
||||||
|
do
|
||||||
|
case "$file" in
|
||||||
|
*.mak|*[Mm]akefile.*|*[Mm]akefile)
|
||||||
|
# Makefiles require tabs, dependency lines can be this long.
|
||||||
|
check_tabs=
|
||||||
|
line_length=100;;
|
||||||
|
*.awk)
|
||||||
|
# Includes literal tabs
|
||||||
|
check_tabs=
|
||||||
|
# The following is arbitrary
|
||||||
|
line_length=132;;
|
||||||
|
*contrib/*/*.[ch])
|
||||||
|
check_tabs=yes
|
||||||
|
line_length=96;;
|
||||||
|
*)
|
||||||
|
check_tabs=yes
|
||||||
|
line_length=80;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Note that vers can only contain 0-9, . and a-z
|
||||||
|
if test -n "$vers"
|
||||||
|
then
|
||||||
|
sed -e "s/$vers/a.b.cc/g" "$file" >"$file".$$
|
||||||
|
else
|
||||||
|
cp "$file" "$file".$$
|
||||||
|
fi
|
||||||
|
splt="`fold -$line_length "$file".$$ | diff -c "$file".$$ -`"
|
||||||
|
rm "$file".$$
|
||||||
|
|
||||||
|
if test -n "$splt"
|
||||||
|
then
|
||||||
|
echo "$file: lines too long"
|
||||||
|
st=1
|
||||||
|
if test -n "$EDITOR" -a -n "$edit"
|
||||||
|
then
|
||||||
|
doed "$file" || exit 1
|
||||||
|
elif test -n "$verbose"
|
||||||
|
then
|
||||||
|
echo "$splt"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if test -n "$check_tabs"
|
||||||
|
then
|
||||||
|
tab="`tr -c -d '\t' <"$file"`"
|
||||||
|
if test -n "$tab"
|
||||||
|
then
|
||||||
|
echo "$file: file contains tab characters"
|
||||||
|
st=1
|
||||||
|
if test -n "$EDITOR" -a -n "$edit"
|
||||||
|
then
|
||||||
|
doed "$file" || exit 1
|
||||||
|
elif test -n "$verbose"
|
||||||
|
then
|
||||||
|
echo "$splt"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
exit $st
|
||||||
|
}
|
||||||
188
contrib/tools/cvtcolor.c
Normal file
@@ -0,0 +1,188 @@
|
|||||||
|
/*-
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
#define _ISOC99_SOURCE 1
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include <fenv.h>
|
||||||
|
|
||||||
|
#include "sRGB.h"
|
||||||
|
|
||||||
|
static void
|
||||||
|
usage(const char *prog)
|
||||||
|
{
|
||||||
|
fprintf(stderr,
|
||||||
|
"%s: usage: %s [-linear|-sRGB] [-gray|-color] component{1,4}\n",
|
||||||
|
prog, prog);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long
|
||||||
|
component(const char *prog, const char *arg, int issRGB)
|
||||||
|
{
|
||||||
|
char *ep;
|
||||||
|
unsigned long c = strtoul(arg, &ep, 0);
|
||||||
|
|
||||||
|
if (ep <= arg || *ep || c > 65535 || (issRGB && c > 255))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: %s: invalid component value (%lu)\n", prog, arg, c);
|
||||||
|
usage(prog);
|
||||||
|
}
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, const char **argv)
|
||||||
|
{
|
||||||
|
const char *prog = *argv++;
|
||||||
|
int to_linear = 0, to_gray = 0, to_color = 0;
|
||||||
|
int channels = 0;
|
||||||
|
double c[4];
|
||||||
|
|
||||||
|
/* FE_TONEAREST is the IEEE754 round to nearest, preferring even, mode; i.e.
|
||||||
|
* everything rounds to the nearest value except that '.5' rounds to the
|
||||||
|
* nearest even value.
|
||||||
|
*/
|
||||||
|
fesetround(FE_TONEAREST);
|
||||||
|
|
||||||
|
c[3] = c[2] = c[1] = c[0] = 0;
|
||||||
|
|
||||||
|
while (--argc > 0 && **argv == '-')
|
||||||
|
{
|
||||||
|
const char *arg = 1+*argv++;
|
||||||
|
|
||||||
|
if (strcmp(arg, "sRGB") == 0)
|
||||||
|
to_linear = 0;
|
||||||
|
|
||||||
|
else if (strcmp(arg, "linear") == 0)
|
||||||
|
to_linear = 1;
|
||||||
|
|
||||||
|
else if (strcmp(arg, "gray") == 0)
|
||||||
|
to_gray = 1, to_color = 0;
|
||||||
|
|
||||||
|
else if (strcmp(arg, "color") == 0)
|
||||||
|
to_gray = 0, to_color = 1;
|
||||||
|
|
||||||
|
else
|
||||||
|
usage(prog);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (argc)
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
usage(prog);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
c[3] = component(prog, argv[3], to_linear);
|
||||||
|
++channels;
|
||||||
|
case 3:
|
||||||
|
c[2] = component(prog, argv[2], to_linear);
|
||||||
|
++channels;
|
||||||
|
case 2:
|
||||||
|
c[1] = component(prog, argv[1], to_linear);
|
||||||
|
++channels;
|
||||||
|
case 1:
|
||||||
|
c[0] = component(prog, argv[0], to_linear);
|
||||||
|
++channels;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (to_linear)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int components = channels;
|
||||||
|
|
||||||
|
if ((components & 1) == 0)
|
||||||
|
--components;
|
||||||
|
|
||||||
|
for (i=0; i<components; ++i) c[i] = linear_from_sRGB(c[i] / 255);
|
||||||
|
if (components < channels)
|
||||||
|
c[components] = c[components] / 255;
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i=0; i<4; ++i) c[i] /= 65535;
|
||||||
|
|
||||||
|
if ((channels & 1) == 0)
|
||||||
|
{
|
||||||
|
double alpha = c[channels-1];
|
||||||
|
|
||||||
|
if (alpha > 0)
|
||||||
|
for (i=0; i<channels-1; ++i) c[i] /= alpha;
|
||||||
|
else
|
||||||
|
for (i=0; i<channels-1; ++i) c[i] = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (to_gray)
|
||||||
|
{
|
||||||
|
if (channels < 3)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: too few channels (%d) for -gray\n",
|
||||||
|
prog, channels);
|
||||||
|
usage(prog);
|
||||||
|
}
|
||||||
|
|
||||||
|
c[0] = YfromRGB(c[0], c[1], c[2]);
|
||||||
|
channels -= 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (to_color)
|
||||||
|
{
|
||||||
|
if (channels > 2)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: too many channels (%d) for -color\n",
|
||||||
|
prog, channels);
|
||||||
|
usage(prog);
|
||||||
|
}
|
||||||
|
|
||||||
|
c[3] = c[1]; /* alpha, if present */
|
||||||
|
c[2] = c[1] = c[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (to_linear)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
if ((channels & 1) == 0)
|
||||||
|
{
|
||||||
|
double alpha = c[channels-1];
|
||||||
|
for (i=0; i<channels-1; ++i) c[i] *= alpha;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i=0; i<channels; ++i) c[i] = nearbyint(c[i] * 65535);
|
||||||
|
}
|
||||||
|
|
||||||
|
else /* to sRGB */
|
||||||
|
{
|
||||||
|
int i = (channels+1)&~1;
|
||||||
|
while (--i >= 0)
|
||||||
|
c[i] = sRGB_from_linear(c[i]);
|
||||||
|
|
||||||
|
for (i=0; i<channels; ++i) c[i] = nearbyint(c[i] * 255);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i=0; i<channels; ++i) printf(" %g", c[i]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||