mirror of
https://github.com/davidgiven/fluxengine.git
synced 2025-10-24 11:11:02 -07:00
Compare commits
590 Commits
devices
...
dcae381973
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dcae381973 | ||
|
|
2142bc7cce | ||
|
|
ae3f82264a | ||
|
|
710e83c098 | ||
|
|
4f46fff3be | ||
|
|
58ea21a9a2 | ||
|
|
0fd1aa82a6 | ||
|
|
5b7f9d84f9 | ||
|
|
4b7e8e74a7 | ||
|
|
5375c72d02 | ||
|
|
5c257be164 | ||
|
|
7fa17322dc | ||
|
|
ed3640d945 | ||
|
|
87ce3ad61d | ||
|
|
6d75feb0ce | ||
|
|
168b8b6f6c | ||
|
|
3d063e932a | ||
|
|
157ec569b2 | ||
|
|
f63c8dadf1 | ||
|
|
d17f6116f0 | ||
|
|
2d6cb22e3a | ||
|
|
2de8b52e56 | ||
|
|
171576e538 | ||
|
|
2db9f65e8b | ||
|
|
2572b64bd1 | ||
|
|
533aaf85f2 | ||
|
|
f67ddc1f77 | ||
|
|
b1d64f3683 | ||
|
|
7e8840e03f | ||
|
|
b003297b22 | ||
|
|
7341cec2c4 | ||
|
|
a98b7f72fd | ||
|
|
2e97579394 | ||
|
|
f960c7efd0 | ||
|
|
c2e7f32cba | ||
|
|
137528fc53 | ||
|
|
cbf4cc35fb | ||
|
|
cd7b3de1b3 | ||
|
|
fddc2270e5 | ||
|
|
2a96d9bd78 | ||
|
|
fd554f0808 | ||
|
|
6776c51b23 | ||
|
|
ef58295304 | ||
|
|
2e2c3e3e34 | ||
|
|
e87bb44a2d | ||
|
|
0ba0a9cce5 | ||
|
|
97bb563ba0 | ||
|
|
8f047f842e | ||
|
|
9d596ef530 | ||
|
|
580ffa8cf7 | ||
|
|
341e0a320d | ||
|
|
cff0a9703c | ||
|
|
38618532c4 | ||
|
|
6026dcd86d | ||
|
|
3949971546 | ||
|
|
6146f442fb | ||
|
|
7090c1bfdf | ||
|
|
563babc969 | ||
|
|
b649c2b9af | ||
|
|
f7f887789c | ||
|
|
a8fcdcc528 | ||
|
|
a988578cc7 | ||
|
|
ee585b24f0 | ||
|
|
3d6e980990 | ||
|
|
f5d19416a9 | ||
|
|
4187fa5a09 | ||
|
|
eb7613c03f | ||
|
|
7910429037 | ||
|
|
cd1cc736a7 | ||
|
|
e6d6805f25 | ||
|
|
9733879360 | ||
|
|
725712f796 | ||
|
|
2122cea5c4 | ||
|
|
5466e716a9 | ||
|
|
0dc0e3d9a1 | ||
|
|
4bb12b2caa | ||
|
|
0d9c5f5150 | ||
|
|
4030031a2c | ||
|
|
3143c87f1c | ||
|
|
f16f02c4c7 | ||
|
|
3e13b2461d | ||
|
|
5fd0d1589e | ||
|
|
23e6d234d0 | ||
|
|
cf2a97f8aa | ||
|
|
5a815e0cd6 | ||
|
|
06a3af2a1d | ||
|
|
0558d95fa3 | ||
|
|
81f9246ab8 | ||
|
|
6979567429 | ||
|
|
348de4165d | ||
|
|
0755d420dd | ||
|
|
dead21bce5 | ||
|
|
4cf451ce60 | ||
|
|
72298ac805 | ||
|
|
3d1ad81652 | ||
|
|
88c79169b6 | ||
|
|
d9747b9021 | ||
|
|
256976a5a1 | ||
|
|
0ba4b82e10 | ||
|
|
ffd9e28b42 | ||
|
|
9c919c786d | ||
|
|
47a9a56959 | ||
|
|
6e03bc604a | ||
|
|
feea6a027a | ||
|
|
08fa06b7fe | ||
|
|
8a976edef9 | ||
|
|
c71d8d6c74 | ||
|
|
e809af7426 | ||
|
|
ab05db9040 | ||
|
|
04f916741e | ||
|
|
f6224f3718 | ||
|
|
10185bb7a1 | ||
|
|
d565960c70 | ||
|
|
c21073294f | ||
|
|
3cd95de434 | ||
|
|
6552dba9aa | ||
|
|
c8ebe55aa9 | ||
|
|
1eefa2d604 | ||
|
|
a359394eea | ||
|
|
9f13026bec | ||
|
|
8fcc99b2a1 | ||
|
|
125a0536ff | ||
|
|
4115947d80 | ||
|
|
2f1dcd7c9a | ||
|
|
5e00ffca13 | ||
|
|
ac27095493 | ||
|
|
e27ca5cd4c | ||
|
|
cc72ac6327 | ||
|
|
5443aa6501 | ||
|
|
902bf32169 | ||
|
|
d200633747 | ||
|
|
a48b749c2e | ||
|
|
46fab84b95 | ||
|
|
b0290f858c | ||
|
|
fe09c12cd6 | ||
|
|
b5ae5a1cea | ||
|
|
113cb85512 | ||
|
|
da276bcb3b | ||
|
|
9a78d0f38c | ||
|
|
ec2e1666e7 | ||
|
|
478df40d4b | ||
|
|
a8b9d79cb1 | ||
|
|
23865d1a10 | ||
|
|
458b3f24fe | ||
|
|
86fa23e6fa | ||
|
|
dd9d5aaed5 | ||
|
|
b22df17bb5 | ||
|
|
b81e609e66 | ||
|
|
d41e57cba6 | ||
|
|
da7e83e257 | ||
|
|
83be12fcf1 | ||
|
|
a999e2d6c9 | ||
|
|
6d6251e757 | ||
|
|
be8b26ef94 | ||
|
|
c6b8bce5d6 | ||
|
|
d8b3452c07 | ||
|
|
eddbd43cd9 | ||
|
|
168189180d | ||
|
|
9e092bab6a | ||
|
|
2c35126b3a | ||
|
|
7dc0e4ca31 | ||
|
|
96257f89d5 | ||
|
|
09919343b4 | ||
|
|
b070c1068c | ||
|
|
5628a576db | ||
|
|
073c78e25f | ||
|
|
6a826d6eb5 | ||
|
|
11a6143d4c | ||
|
|
6127c9a46d | ||
|
|
98f7febef7 | ||
|
|
85afadacf0 | ||
|
|
01cd812162 | ||
|
|
39329acc77 | ||
|
|
bdc96038ef | ||
|
|
93760d989a | ||
|
|
b306c7063b | ||
|
|
e3d7fa69d8 | ||
|
|
f6c0e5405a | ||
|
|
fc12a2662c | ||
|
|
ab5b16488c | ||
|
|
4d5900268b | ||
|
|
b5c5a4335d | ||
|
|
e76235541a | ||
|
|
e75e1a6e27 | ||
|
|
aa220ecbcb | ||
|
|
edc8d74418 | ||
|
|
2831aa09ae | ||
|
|
e1b4b0d3a3 | ||
|
|
e5df6ca33b | ||
|
|
68c3cbb020 | ||
|
|
ca3c37d20a | ||
|
|
6fcd9233ea | ||
|
|
3761c4b1e2 | ||
|
|
c89c53b1c7 | ||
|
|
be0f63a133 | ||
|
|
a8216995ad | ||
|
|
995359ef45 | ||
|
|
bc84e3c8a0 | ||
|
|
af12a25a9d | ||
|
|
f6b2821221 | ||
|
|
458601a139 | ||
|
|
a89130edbd | ||
|
|
c95cd8a4da | ||
|
|
4d313a8495 | ||
|
|
263eef3442 | ||
|
|
2e97996211 | ||
|
|
7035b9c3c2 | ||
|
|
5628d2ca06 | ||
|
|
61cf7fbccf | ||
|
|
ce347c6326 | ||
|
|
94119b19fe | ||
|
|
9c7be1268f | ||
|
|
a9d59f67ba | ||
|
|
8d2a72228f | ||
|
|
60b95dd3f3 | ||
|
|
b1094f40dc | ||
|
|
e40ea80e34 | ||
|
|
9e1222d38a | ||
|
|
4446785729 | ||
|
|
790f015d72 | ||
|
|
ccb0dcea3c | ||
|
|
15a0632af0 | ||
|
|
3c0da28947 | ||
|
|
95227f32ca | ||
|
|
edf75b5cda | ||
|
|
af87c48451 | ||
|
|
7cde8e3aa6 | ||
|
|
34fe6f0a5f | ||
|
|
76c9674f3f | ||
|
|
addbabd123 | ||
|
|
46b90d9c36 | ||
|
|
7ee67082aa | ||
|
|
e8042ed5f3 | ||
|
|
8828874c25 | ||
|
|
1bdb093319 | ||
|
|
a1e2191ad5 | ||
|
|
e61fcf1d9b | ||
|
|
610ef0dc4b | ||
|
|
273d38f237 | ||
|
|
8194a08382 | ||
|
|
6170b704b1 | ||
|
|
b05f5e7caa | ||
|
|
4b38fc6044 | ||
|
|
cee16a75ca | ||
|
|
9fd85a8289 | ||
|
|
2f1eff1474 | ||
|
|
8c582b8d72 | ||
|
|
e49673329d | ||
|
|
07ebed83bf | ||
|
|
1def87fdc3 | ||
|
|
d91fed7dd4 | ||
|
|
5f2f7e70ef | ||
|
|
83432beff6 | ||
|
|
979b550178 | ||
|
|
9062a531f3 | ||
|
|
e2a6fbcf3c | ||
|
|
ec16931f3a | ||
|
|
0ec0ca7495 | ||
|
|
51fa7c9371 | ||
|
|
6c69f10fe7 | ||
|
|
206e85a356 | ||
|
|
8d7dd4867b | ||
|
|
d1524f78fb | ||
|
|
b26735d520 | ||
|
|
603baee777 | ||
|
|
e105b7f498 | ||
|
|
bb3fbccb50 | ||
|
|
c8edcd963d | ||
|
|
3b60cdc707 | ||
|
|
ea061d65c9 | ||
|
|
da64c0237f | ||
|
|
d2b1602881 | ||
|
|
1afd45068c | ||
|
|
f01b30e112 | ||
|
|
b5f7fbe14e | ||
|
|
8b6073ccbb | ||
|
|
f902c759df | ||
|
|
996fdbc0f5 | ||
|
|
9ff3e3b42a | ||
|
|
0a5604521e | ||
|
|
786636ef5d | ||
|
|
18bdb27225 | ||
|
|
faca35dec0 | ||
|
|
f8813daae3 | ||
|
|
da5a20390f | ||
|
|
3ab3db92f5 | ||
|
|
a3cd3dd9dc | ||
|
|
918868e9e8 | ||
|
|
cf05a25445 | ||
|
|
5d5399a267 | ||
|
|
2de7af0ba5 | ||
|
|
0382c304ad | ||
|
|
182d9946fe | ||
|
|
f24e4029b4 | ||
|
|
4ebda29171 | ||
|
|
53026f3d02 | ||
|
|
99c0e95a2f | ||
|
|
dfa56c6b08 | ||
|
|
0419df4b2d | ||
|
|
70bdcd0978 | ||
|
|
022df995aa | ||
|
|
dcbe7ec41d | ||
|
|
df4d27eefe | ||
|
|
8f233f55e9 | ||
|
|
7db49aec21 | ||
|
|
b5eaec0778 | ||
|
|
06b126a2e7 | ||
|
|
ed96ebac79 | ||
|
|
c6e34d2d88 | ||
|
|
53ac8bad79 | ||
|
|
d2e163bc3b | ||
|
|
1404123281 | ||
|
|
01a7afd28a | ||
|
|
3a42911e6f | ||
|
|
8e5d52f2c7 | ||
|
|
dfff5d7230 | ||
|
|
19b63786c8 | ||
|
|
5293e1c18b | ||
|
|
f200bb8b00 | ||
|
|
ed11a5c412 | ||
|
|
cdcc63f519 | ||
|
|
7096e9fd9c | ||
|
|
c8fe56ea95 | ||
|
|
8a2a58b1a5 | ||
|
|
42aec98368 | ||
|
|
6d73371a79 | ||
|
|
4d60ff8e67 | ||
|
|
311ff4a89f | ||
|
|
5d57957a6e | ||
|
|
f89adce02d | ||
|
|
3e505f47bc | ||
|
|
06e29142e6 | ||
|
|
15a69f6dcb | ||
|
|
0f763fe06b | ||
|
|
f5adb89338 | ||
|
|
36b120bdbe | ||
|
|
cc169d414f | ||
|
|
0fcb2075e0 | ||
|
|
2bda78fb40 | ||
|
|
e878c6eef6 | ||
|
|
9ce405cec5 | ||
|
|
f064d413b3 | ||
|
|
e5a3331f24 | ||
|
|
6f99f88b29 | ||
|
|
8ff0153708 | ||
|
|
c7273c06da | ||
|
|
cd36caccc7 | ||
|
|
a022aab28a | ||
|
|
949e9c216d | ||
|
|
3fcf7d4e69 | ||
|
|
e335621558 | ||
|
|
9a0357c67b | ||
|
|
0953039369 | ||
|
|
d4a8eb5847 | ||
|
|
d48ab7c84e | ||
|
|
c43b88ac0b | ||
|
|
76ffbb96ba | ||
|
|
b6b28c8a02 | ||
|
|
a736e1da05 | ||
|
|
a8cc280574 | ||
|
|
da9d9385b9 | ||
|
|
149e5c6fba | ||
|
|
e14da81b48 | ||
|
|
49a0a6fdb3 | ||
|
|
da678dc52d | ||
|
|
6ff68f3f06 | ||
|
|
33feda7208 | ||
|
|
38af98ec9b | ||
|
|
d6a11d7164 | ||
|
|
33d241c33e | ||
|
|
944ac97ba4 | ||
|
|
bb6e8dc6b2 | ||
|
|
ed604f6284 | ||
|
|
3c67a67ae7 | ||
|
|
f3e7a4e439 | ||
|
|
fb5bb874dd | ||
|
|
d3ccb4b0d7 | ||
|
|
d096d7742f | ||
|
|
92b5accb90 | ||
|
|
1bcc8f45b5 | ||
|
|
5eef01377f | ||
|
|
4c140b1b90 | ||
|
|
4bcbf2b089 | ||
|
|
6d3969ab79 | ||
|
|
ea35551b9d | ||
|
|
0d4c747a05 | ||
|
|
6cc7d7b8fe | ||
|
|
3d0f82e4c6 | ||
|
|
26abcbaf81 | ||
|
|
f7efaa37f5 | ||
|
|
167bb0287e | ||
|
|
3020705012 | ||
|
|
ecd80775d8 | ||
|
|
c42e73f17a | ||
|
|
ec271a67ad | ||
|
|
ce4a9cfbd7 | ||
|
|
45f769893c | ||
|
|
8a23046187 | ||
|
|
ca8f2a886e | ||
|
|
9dc6bdb03b | ||
|
|
c9b3e5e7e5 | ||
|
|
f0ce9c1431 | ||
|
|
0b22593572 | ||
|
|
2fd1115ec9 | ||
|
|
38d4bbdba1 | ||
|
|
cb9325843e | ||
|
|
900ba11623 | ||
|
|
7da4e15b73 | ||
|
|
7983a4b883 | ||
|
|
ea4a147751 | ||
|
|
33495e812e | ||
|
|
c6e2958665 | ||
|
|
86ede224ac | ||
|
|
e07a906731 | ||
|
|
76d139c29e | ||
|
|
4b8487f164 | ||
|
|
a006e0bf6f | ||
|
|
c5373480ba | ||
|
|
e1f2494966 | ||
|
|
9ddfa5a56b | ||
|
|
6339cd6b31 | ||
|
|
7e80e255a4 | ||
|
|
c6cbae4bc4 | ||
|
|
68f239765c | ||
|
|
77c57d7344 | ||
|
|
259c5d67e6 | ||
|
|
4c2fa27717 | ||
|
|
f5b14cadf8 | ||
|
|
e154e41bc0 | ||
|
|
1f2ebe8c33 | ||
|
|
28444b7907 | ||
|
|
75f41fc630 | ||
|
|
d091479f29 | ||
|
|
665ceb9ea6 | ||
|
|
27ab1e3e5a | ||
|
|
a777470cda | ||
|
|
f48d1c5196 | ||
|
|
cee893b845 | ||
|
|
07ccb6319a | ||
|
|
a6981ff7ef | ||
|
|
fc8d0283b1 | ||
|
|
5e892e8fc3 | ||
|
|
8b124e5ced | ||
|
|
65dc707c29 | ||
|
|
65fb3e9e76 | ||
|
|
3a0c02459d | ||
|
|
33f3c97b03 | ||
|
|
c55032531c | ||
|
|
12f999e9e4 | ||
|
|
817cf03592 | ||
|
|
ca940d1599 | ||
|
|
d00fba02a0 | ||
|
|
045e5e7303 | ||
|
|
6fd98e3c67 | ||
|
|
98279e44ef | ||
|
|
22b78cee56 | ||
|
|
8f7203e38b | ||
|
|
38b8cd2574 | ||
|
|
6b28f36b97 | ||
|
|
d394b21920 | ||
|
|
14255a5076 | ||
|
|
8fa1a887ce | ||
|
|
fb6fa969a8 | ||
|
|
2840831017 | ||
|
|
a4a83c6cfc | ||
|
|
2c508cf51d | ||
|
|
e02aa00d07 | ||
|
|
dc384c3635 | ||
|
|
69db44d1cf | ||
|
|
6fdc9a252a | ||
|
|
11166a3c5c | ||
|
|
3b2a3c6e3a | ||
|
|
d890383ad2 | ||
|
|
4c4b6ee045 | ||
|
|
a55196e7e5 | ||
|
|
866d5a2933 | ||
|
|
8cba89722b | ||
|
|
6d1c623716 | ||
|
|
a8c7ffc77d | ||
|
|
fb05b6ac6d | ||
|
|
0e83b2e7df | ||
|
|
1baaa4402d | ||
|
|
2af61e4aca | ||
|
|
db235dae5e | ||
|
|
241878bd0e | ||
|
|
1386e343ec | ||
|
|
9ff51ec8ef | ||
|
|
45036b708f | ||
|
|
ec3b5b10df | ||
|
|
4817298dbb | ||
|
|
af0ce4cf35 | ||
|
|
3c3d8d080c | ||
|
|
dc6af483a5 | ||
|
|
9a0b487f4b | ||
|
|
cac4d1ce86 | ||
|
|
7a3a31a929 | ||
|
|
eee6f95b15 | ||
|
|
7a3d10451d | ||
|
|
e4f1a5a06f | ||
|
|
500fcde21b | ||
|
|
eb363a4b2a | ||
|
|
8a78e609b0 | ||
|
|
15c67b8cc1 | ||
|
|
00e9c5a07f | ||
|
|
7643457374 | ||
|
|
78d5584e21 | ||
|
|
1d1143a893 | ||
|
|
91093e1304 | ||
|
|
1175a06f3d | ||
|
|
6e5abd1189 | ||
|
|
34f97384e7 | ||
|
|
653a6a0189 | ||
|
|
f0b1b61eac | ||
|
|
c0fd121bdf | ||
|
|
b805b86ddb | ||
|
|
654e7e750c | ||
|
|
7501fcfe8b | ||
|
|
fdb7837e03 | ||
|
|
1c57cea483 | ||
|
|
0c8e8d4d69 | ||
|
|
8876aae2cc | ||
|
|
3e053b32e2 | ||
|
|
0611728537 | ||
|
|
a84cf83ce5 | ||
|
|
c064aa7862 | ||
|
|
195f7126cc | ||
|
|
50d466c9c1 | ||
|
|
5763574634 | ||
|
|
2da568b3e8 | ||
|
|
2732d9aec8 | ||
|
|
15d34aff15 | ||
|
|
af3e257c78 | ||
|
|
c2248c7e4a | ||
|
|
a7967b6dc3 | ||
|
|
c1f47921e6 | ||
|
|
cda93d516b | ||
|
|
8f9c12b26c | ||
|
|
cdb4e9ed21 | ||
|
|
1a612c3db5 | ||
|
|
72ab957134 | ||
|
|
621523db62 | ||
|
|
cdf9cc387c | ||
|
|
b84ecd289d | ||
|
|
d4cb8f414a | ||
|
|
8180c1f79e | ||
|
|
b23b21a7bf | ||
|
|
b30eff294d | ||
|
|
cacb397198 | ||
|
|
0f8c7d6969 | ||
|
|
7b35232cad | ||
|
|
43624796db | ||
|
|
bc17c624d3 | ||
|
|
61476ea0cc | ||
|
|
f0663030e1 | ||
|
|
989a11931b | ||
|
|
94372a7f09 | ||
|
|
5c2702c6ab | ||
|
|
586c09f5c3 | ||
|
|
7a94123f0d | ||
|
|
4cad34a8a4 | ||
|
|
c0ef3215df | ||
|
|
08982aae7a | ||
|
|
6366ac6639 | ||
|
|
3807d22a78 | ||
|
|
3adbfd7ef5 | ||
|
|
7e40dfa5da | ||
|
|
62ddca2bb4 | ||
|
|
1a59e5065d | ||
|
|
52c0c409e9 | ||
|
|
e74b16d28b | ||
|
|
c2369bcc31 | ||
|
|
2636352a49 | ||
|
|
222a88f097 | ||
|
|
dbc691726d | ||
|
|
9ff3aedf18 | ||
|
|
8303a1fbca | ||
|
|
0f584ee343 | ||
|
|
aafad0a628 | ||
|
|
9d03951da9 | ||
|
|
b15d6cb8e5 | ||
|
|
f9c1816e6f | ||
|
|
d960b020ea | ||
|
|
72e9d57b15 | ||
|
|
968b90dbab | ||
|
|
2bccdcc93b | ||
|
|
ce2a5eb6d9 | ||
|
|
353e4f6210 | ||
|
|
c115de9d40 | ||
|
|
df83b558bf | ||
|
|
30fe75f9bf |
111
.github/workflows/ccpp.yml
vendored
111
.github/workflows/ccpp.yml
vendored
@@ -8,84 +8,114 @@ concurrency:
|
||||
|
||||
jobs:
|
||||
build-linux:
|
||||
runs-on: ubuntu-22.04
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
repository: 'davidgiven/fluxengine'
|
||||
path: 'fluxengine'
|
||||
- uses: actions/checkout@v2
|
||||
submodules: 'true'
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
repository: 'davidgiven/fluxengine-testdata'
|
||||
path: 'fluxengine-testdata'
|
||||
- name: apt
|
||||
run: |
|
||||
sudo apt install libudev-dev libsqlite3-dev protobuf-compiler libwxgtk3.0-gtk3-dev libfmt-dev libprotobuf-dev wx-common
|
||||
sudo apt update
|
||||
sudo apt install libudev-dev libsqlite3-dev protobuf-compiler libwxgtk3.2-dev libfmt-dev libprotobuf-dev libmagic-dev libmbedtls-dev libcurl4-openssl-dev libmagic-dev nlohmann-json3-dev libdbus-1-dev libglfw3-dev libmd4c-dev libfreetype-dev libcli11-dev libboost-regex-dev
|
||||
- name: make
|
||||
run: CXXFLAGS="-Wp,-D_GLIBCXX_ASSERTIONS" make -j`nproc` -C fluxengine
|
||||
|
||||
#build-linux-debian-11:
|
||||
# runs-on: ubuntu-22.04
|
||||
# container: debian:11
|
||||
# steps:
|
||||
# - uses: actions/checkout@v4
|
||||
# with:
|
||||
# repository: 'davidgiven/fluxengine'
|
||||
# path: 'fluxengine'
|
||||
# - uses: actions/checkout@v4
|
||||
# with:
|
||||
# repository: 'davidgiven/fluxengine-testdata'
|
||||
# path: 'fluxengine-testdata'
|
||||
# - name: apt update
|
||||
# run: apt update
|
||||
# - name: apt
|
||||
# run: >
|
||||
# apt install -y python3 make xz-utils python3 python3-hamcrest
|
||||
# protobuf-compiler libprotobuf-dev libsqlite3-dev
|
||||
# libfmt-dev libprotobuf-dev wx-common pkg-config
|
||||
# libudev-dev g++ libwxgtk3.0-gtk3-dev
|
||||
# - name: make
|
||||
# run: make -C fluxengine
|
||||
|
||||
build-macos-current:
|
||||
runs-on: macos-latest
|
||||
strategy:
|
||||
matrix:
|
||||
runs-on: [macos-15, macos-15-intel]
|
||||
runs-on: ${{ matrix.runs-on }}
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
repository: 'davidgiven/fluxengine'
|
||||
path: 'fluxengine'
|
||||
- uses: actions/checkout@v2
|
||||
submodules: 'true'
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
repository: 'davidgiven/fluxengine-testdata'
|
||||
path: 'fluxengine-testdata'
|
||||
- name: brew
|
||||
run: brew install sqlite pkg-config libusb protobuf wxwidgets fmt make coreutils dylibbundler libjpeg
|
||||
run: |
|
||||
brew install sqlite pkg-config libusb protobuf wxwidgets fmt make coreutils dylibbundler libjpeg libmagic nlohmann-json cli11 boost glfw3 md4c ninja python freetype2 mbedtls
|
||||
brew upgrade
|
||||
- name: make
|
||||
run: gmake -j`nproc` -C fluxengine
|
||||
|
||||
run: gmake -C fluxengine
|
||||
- name: Upload build artifacts
|
||||
uses: actions/upload-artifact@v2
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ${{ github.event.repository.name }}.${{ github.sha }}
|
||||
path: fluxengine/FluxEngine.pkg
|
||||
name: ${{ github.event.repository.name }}.${{ github.sha }}.fluxengine.${{ runner.arch }}.pkg
|
||||
path: |
|
||||
fluxengine/FluxEngine.pkg
|
||||
fluxengine/FluxEngine.app.zip
|
||||
|
||||
build-windows:
|
||||
runs-on: windows-latest
|
||||
defaults:
|
||||
run:
|
||||
shell: msys2 {0}
|
||||
|
||||
steps:
|
||||
- uses: msys2/setup-msys2@v2
|
||||
with:
|
||||
msystem: mingw64
|
||||
update: true
|
||||
msystem: MINGW32
|
||||
install: >-
|
||||
diffutils
|
||||
make
|
||||
mingw-w64-i686-binutils
|
||||
mingw-w64-i686-fmt
|
||||
mingw-w64-i686-gcc
|
||||
mingw-w64-i686-libusb
|
||||
mingw-w64-i686-nsis
|
||||
mingw-w64-i686-pkg-config
|
||||
mingw-w64-i686-protobuf
|
||||
mingw-w64-i686-python
|
||||
mingw-w64-i686-sqlite3
|
||||
mingw-w64-i686-wxWidgets
|
||||
mingw-w64-i686-zlib
|
||||
mingw-w64-i686-png2ico
|
||||
vim
|
||||
zip
|
||||
- name: update-protobuf
|
||||
install: |
|
||||
python diffutils ninja make zip
|
||||
pacboy: |
|
||||
protobuf:p pkgconf:p curl-winssl:p file:p glfw:p mbedtls:p
|
||||
sqlite:p freetype:p boost:p gcc:p binutils:p nsis:p abseil-cpp:p
|
||||
|
||||
- name: debug
|
||||
run: |
|
||||
pacman -U --noconfirm https://repo.msys2.org/mingw/mingw32/mingw-w64-i686-protobuf-21.9-1-any.pkg.tar.zst
|
||||
- uses: actions/checkout@v2
|
||||
pacboy -Q --info protobuf:p
|
||||
cat /mingw64/lib/pkgconfig/protobuf.pc
|
||||
/mingw64/bin/pkg-config.exe protobuf --cflags
|
||||
/mingw64/bin/pkg-config.exe protobuf --cflags --static
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
repository: 'davidgiven/fluxengine'
|
||||
path: 'fluxengine'
|
||||
- uses: actions/checkout@v2
|
||||
submodules: 'true'
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
repository: 'davidgiven/fluxengine-testdata'
|
||||
path: 'fluxengine-testdata'
|
||||
- name: build
|
||||
run: MAGICK_TIME_LIMIT=100 make -j`nproc` -C fluxengine
|
||||
|
||||
- name: run
|
||||
run: |
|
||||
make -C fluxengine BUILDTYPE=windows
|
||||
|
||||
- name: nsis
|
||||
run: |
|
||||
@@ -96,11 +126,10 @@ jobs:
|
||||
|
||||
- name: zip
|
||||
run: |
|
||||
cd fluxengine
|
||||
zip -9 fluxengine-windows.zip fluxengine.exe fluxengine-gui.exe upgrade-flux-file.exe brother120tool.exe brother240tool.exe FluxEngine.cydsn/CortexM3/ARM_GCC_541/Release/FluxEngine.hex fluxengine-installer.exe
|
||||
cd fluxengine && zip -9 fluxengine-windows.zip fluxengine.exe fluxengine-gui.exe upgrade-flux-file.exe brother120tool.exe brother240tool.exe FluxEngine.cydsn/CortexM3/ARM_GCC_541/Release/FluxEngine.hex fluxengine-installer.exe
|
||||
|
||||
- name: Upload build artifacts
|
||||
uses: actions/upload-artifact@v2
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ${{ github.event.repository.name }}.${{ github.sha }}
|
||||
name: ${{ github.event.repository.name }}.${{ github.sha }}.windows.zip
|
||||
path: fluxengine/fluxengine-windows.zip
|
||||
|
||||
84
.github/workflows/release.yml
vendored
84
.github/workflows/release.yml
vendored
@@ -12,50 +12,43 @@ on:
|
||||
jobs:
|
||||
dev-release:
|
||||
runs-on: windows-latest
|
||||
defaults:
|
||||
run:
|
||||
shell: msys2 {0}
|
||||
|
||||
steps:
|
||||
- uses: msys2/setup-msys2@v2
|
||||
- name: setup WSL
|
||||
run: |
|
||||
curl -L https://github.com/WhitewaterFoundry/Fedora-Remix-for-WSL/releases/download/41.0.0/Fedora-Remix-for-WSL-SL_41.0.0.0_x64_arm64.msixbundle -o fedora.msixbundle
|
||||
unzip fedora.msixbundle Fedora-Remix-for-WSL-SL_41.0.0.0_x64.msix
|
||||
unzip Fedora-Remix-for-WSL-SL_41.0.0.0_x64.msix install.tar.gz
|
||||
wsl --update
|
||||
wsl --set-default-version 1
|
||||
wsl --import fedora fedora install.tar.gz
|
||||
wsl --set-default fedora
|
||||
wsl sh -c 'dnf -y install https://github.com/rpmsphere/noarch/raw/master/r/rpmsphere-release-40-1.noarch.rpm'
|
||||
wsl sh -c 'dnf -y install gcc gcc-c++ protobuf-c-compiler protobuf-devel fmt-devel systemd-devel sqlite-devel wxGTK-devel mingw32-gcc mingw32-gcc-c++ mingw32-zlib-static mingw32-protobuf-static mingw32-sqlite-static mingw32-wxWidgets3-static mingw32-libpng-static mingw32-libjpeg-static mingw32-libtiff-static mingw32-nsis png2ico ninja-build'
|
||||
|
||||
- name: fix line endings
|
||||
run: |
|
||||
git config --global core.autocrlf false
|
||||
git config --global core.eol lf
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
update: true
|
||||
msystem: MINGW32
|
||||
install: >-
|
||||
diffutils
|
||||
make
|
||||
mingw-w64-i686-binutils
|
||||
mingw-w64-i686-fmt
|
||||
mingw-w64-i686-gcc
|
||||
mingw-w64-i686-libusb
|
||||
mingw-w64-i686-nsis
|
||||
mingw-w64-i686-pkg-config
|
||||
mingw-w64-i686-protobuf
|
||||
mingw-w64-i686-python
|
||||
mingw-w64-i686-sqlite3
|
||||
mingw-w64-i686-wxWidgets
|
||||
mingw-w64-i686-zlib
|
||||
mingw-w64-i686-png2ico
|
||||
vim
|
||||
zip
|
||||
- uses: actions/checkout@v3
|
||||
repository: 'davidgiven/fluxengine'
|
||||
path: 'fluxengine'
|
||||
|
||||
- name: update-protobuf
|
||||
- name: run
|
||||
run: |
|
||||
pacman -U --noconfirm https://repo.msys2.org/mingw/mingw32/mingw-w64-i686-protobuf-21.9-1-any.pkg.tar.zst
|
||||
|
||||
- name: build
|
||||
run: |
|
||||
MAGICK_TIME_LIMIT=100 make -j`nproc`
|
||||
wsl sh -c 'cd fluxengine && make BUILDTYPE=windows -j$(nproc)'
|
||||
|
||||
- name: nsis
|
||||
run: |
|
||||
strip fluxengine.exe -o fluxengine-stripped.exe
|
||||
strip fluxengine-gui.exe -o fluxengine-gui-stripped.exe
|
||||
makensis -v2 -nocd -dOUTFILE=fluxengine-installer.exe extras/windows-installer.nsi
|
||||
wsl sh -c 'cd fluxengine && strip fluxengine.exe -o fluxengine-stripped.exe'
|
||||
wsl sh -c 'cd fluxengine && strip fluxengine-gui.exe -o fluxengine-gui-stripped.exe'
|
||||
wsl sh -c 'cd fluxengine && makensis -v2 -nocd -dOUTFILE=fluxengine-installer.exe extras/windows-installer.nsi'
|
||||
|
||||
- name: zip
|
||||
run: |
|
||||
zip -9 fluxengine.zip fluxengine.exe fluxengine-gui.exe upgrade-flux-file.exe brother120tool.exe brother240tool.exe FluxEngine.cydsn/CortexM3/ARM_GCC_541/Release/FluxEngine.hex
|
||||
wsl sh -c 'cd fluxengine && zip -9 fluxengine-windows.zip fluxengine.exe fluxengine-gui.exe upgrade-flux-file.exe brother120tool.exe brother240tool.exe FluxEngine.cydsn/CortexM3/ARM_GCC_541/Release/FluxEngine.hex fluxengine-installer.exe'
|
||||
|
||||
- name: date
|
||||
run: |
|
||||
@@ -66,6 +59,7 @@ jobs:
|
||||
with:
|
||||
tag-name: dev
|
||||
force-branch: false
|
||||
git-directory: 'fluxengine'
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
@@ -84,22 +78,28 @@ jobs:
|
||||
with:
|
||||
name: Development build ${{ env.RELEASE_DATE }}
|
||||
files: |
|
||||
fluxengine.zip
|
||||
fluxengine-installer.exe
|
||||
fluxengine/fluxengine.zip
|
||||
fluxengine/fluxengine-installer.exe
|
||||
tag_name: dev
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
build-macos:
|
||||
runs-on: macos-latest
|
||||
strategy:
|
||||
matrix:
|
||||
runs-on: [macos-13, macos-latest]
|
||||
runs-on: ${{ matrix.runs-on }}
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: brew
|
||||
run: brew install sqlite pkg-config libusb protobuf wxwidgets fmt make coreutils dylibbundler libjpeg
|
||||
|
||||
- name: make
|
||||
run: gmake -j`nproc`
|
||||
run: |
|
||||
gmake
|
||||
mv FluxEngine.pkg FluxEngine-${{ runner.arch }}.pkg
|
||||
mv FluxEngine.app.zip FluxEngine-${{ runner.arch }}.app.zip
|
||||
|
||||
- name: tag
|
||||
uses: EndBug/latest-tag@latest
|
||||
@@ -115,7 +115,8 @@ jobs:
|
||||
token: ${{ github.token }}
|
||||
tag: dev
|
||||
assets: |
|
||||
FluxEngine.pkg
|
||||
FluxEngine-${{ runner.arch }}.pkg
|
||||
FluxEngine-${{ runner.arch }}.app.zip
|
||||
fail-if-no-assets: false
|
||||
|
||||
- name: release
|
||||
@@ -123,7 +124,8 @@ jobs:
|
||||
with:
|
||||
name: Development build ${{ env.RELEASE_DATE }}
|
||||
files: |
|
||||
FluxEngine.pkg
|
||||
FluxEngine-${{ runner.arch }}.pkg
|
||||
FluxEngine-${{ runner.arch }}.app.zip
|
||||
tag_name: dev
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
36
.gitmodules
vendored
Normal file
36
.gitmodules
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
[submodule "dep/imhex"]
|
||||
path = dep/imhex
|
||||
url = git@github.com:davidgiven/ImHex.git
|
||||
[submodule "dep/libwolv"]
|
||||
path = dep/libwolv
|
||||
url = https://github.com/WerWolv/libwolv.git
|
||||
[submodule "dep/imgui"]
|
||||
path = dep/imgui
|
||||
url = https://github.com/ocornut/imgui.git
|
||||
[submodule "dep/pattern-language"]
|
||||
path = dep/pattern-language
|
||||
url = https://github.com/WerWolv/PatternLanguage.git
|
||||
[submodule "dep/native-file-dialog"]
|
||||
path = dep/native-file-dialog
|
||||
url = https://github.com/btzy/nativefiledialog-extended.git
|
||||
[submodule "dep/xdgpp"]
|
||||
path = dep/xdgpp
|
||||
url = https://github.com/WerWolv/xdgpp.git
|
||||
[submodule "dep/libromfs"]
|
||||
path = dep/libromfs
|
||||
url = https://github.com/WerWolv/libromfs.git
|
||||
[submodule "dep/throwing_ptr"]
|
||||
path = dep/throwing_ptr
|
||||
url = https://github.com/rockdreamer/throwing_ptr.git
|
||||
[submodule "dep/lunasvg"]
|
||||
path = dep/lunasvg
|
||||
url = https://github.com/sammycage/lunasvg.git
|
||||
[submodule "dep/md4c"]
|
||||
path = dep/md4c
|
||||
url = https://github.com/mity/md4c
|
||||
[submodule "dep/nlohmann_json"]
|
||||
path = dep/nlohmann_json
|
||||
url = https://github.com/nlohmann/json
|
||||
[submodule "dep/cli11"]
|
||||
path = dep/cli11
|
||||
url = https://github.com/CLIUtils/CLI11
|
||||
147
Makefile
147
Makefile
@@ -1,40 +1,110 @@
|
||||
CC = gcc
|
||||
CXX = g++ -std=c++17
|
||||
CFLAGS = -g -O3
|
||||
LDFLAGS =
|
||||
ifeq ($(BUILDTYPE),)
|
||||
buildtype_Darwin = osx
|
||||
buildtype_Haiku = haiku
|
||||
BUILDTYPE := $(buildtype_$(shell uname -s ))
|
||||
ifeq ($(BUILDTYPE),)
|
||||
BUILDTYPE := unix
|
||||
endif
|
||||
endif
|
||||
export BUILDTYPE
|
||||
|
||||
OBJ = .obj
|
||||
OPTFLAGS = -g -O3
|
||||
|
||||
ifeq ($(BUILDTYPE),windows)
|
||||
MINGW = x86_64-w64-mingw32-
|
||||
CC = $(MINGW)gcc
|
||||
CXX = $(MINGW)g++
|
||||
CFLAGS += \
|
||||
$(OPTFLAGS) \
|
||||
-ffunction-sections \
|
||||
-fdata-sections \
|
||||
-Wno-attributes \
|
||||
-Wa,-mbig-obj \
|
||||
-static
|
||||
CXXFLAGS += \
|
||||
$(OPTFLAGS) \
|
||||
-std=c++23 \
|
||||
-Wno-deprecated-enum-float-conversion \
|
||||
-Wno-deprecated-enum-enum-conversion \
|
||||
-Wno-attributes \
|
||||
-Wa,-mbig-obj \
|
||||
-static
|
||||
LDFLAGS += -Wl,--gc-sections -static
|
||||
AR = $(MINGW)gcc-ar
|
||||
PKG_CONFIG = $(MINGW)pkg-config --static
|
||||
WINDRES = $(MINGW)windres
|
||||
WX_CONFIG = /usr/i686-w64-mingw32/sys-root/mingw/bin/wx-config-3.0 --static=yes
|
||||
NINJA = /bin/ninja
|
||||
PROTOC = /mingw64/bin/protoc
|
||||
PROTOC_SEPARATOR = ;
|
||||
EXT = .exe
|
||||
|
||||
AB_SANDBOX = no
|
||||
else
|
||||
CC = clang
|
||||
CXX = clang++
|
||||
CFLAGS = \
|
||||
$(OPTFLAGS) \
|
||||
-I/opt/homebrew/include -I/usr/local/include \
|
||||
-Wno-unknown-warning-option
|
||||
CXXFLAGS = \
|
||||
$(OPTFLAGS) \
|
||||
-std=c++23 \
|
||||
-fexperimental-library \
|
||||
-I/opt/homebrew/include -I/usr/local/include \
|
||||
-Wformat \
|
||||
-Wformat-security \
|
||||
-Wno-deprecated-enum-float-conversion \
|
||||
-Wno-deprecated-enum-enum-conversion
|
||||
LDFLAGS =
|
||||
AR = ar
|
||||
PKG_CONFIG = pkg-config
|
||||
ifeq ($(BUILDTYPE),osx)
|
||||
else
|
||||
LDFLAGS += -pthread -Wl,--no-as-needed
|
||||
endif
|
||||
endif
|
||||
|
||||
HOSTCC = gcc
|
||||
HOSTCXX = g++ -std=c++20
|
||||
HOSTCFLAGS = -g -O3
|
||||
HOSTLDFLAGS =
|
||||
|
||||
REALOBJ = .obj
|
||||
OBJ = $(REALOBJ)/$(BUILDTYPE)
|
||||
DESTDIR ?=
|
||||
PREFIX ?= /usr/local
|
||||
BINDIR ?= $(PREFIX)/bin
|
||||
|
||||
# Special Windows settings.
|
||||
|
||||
ifeq ($(OS), Windows_NT)
|
||||
EXT ?= .exe
|
||||
MINGWBIN = /mingw32/bin
|
||||
CCPREFIX = $(MINGWBIN)/
|
||||
PKG_CONFIG = $(MINGWBIN)/pkg-config
|
||||
WX_CONFIG = /usr/bin/sh $(MINGWBIN)/wx-config --static=yes
|
||||
PROTOC = $(MINGWBIN)/protoc
|
||||
WINDRES = windres
|
||||
LDFLAGS += \
|
||||
-static
|
||||
CXXFLAGS += \
|
||||
-fext-numeric-literals \
|
||||
-Wno-deprecated-enum-float-conversion \
|
||||
-Wno-deprecated-enum-enum-conversion
|
||||
|
||||
# Required to get the gcc run - time libraries on the path.
|
||||
export PATH := $(PATH):$(MINGWBIN)
|
||||
endif
|
||||
#ifeq ($(OS), Windows_NT)
|
||||
# EXT ?= .exe
|
||||
# MINGWBIN = /mingw32/bin
|
||||
# CCPREFIX = $(MINGWBIN)/
|
||||
# PKG_CONFIG = $(MINGWBIN)/pkg-config
|
||||
# WX_CONFIG = /usr/bin/sh $(MINGWBIN)/wx-config --static=yes
|
||||
# PROTOC = $(MINGWBIN)/protoc
|
||||
# WINDRES = windres
|
||||
# LDFLAGS += \
|
||||
# -static
|
||||
# CXXFLAGS += \
|
||||
# -fext-numeric-literals \
|
||||
# -Wno-deprecated-enum-float-conversion \
|
||||
# -Wno-deprecated-enum-enum-conversion
|
||||
#
|
||||
# # Required to get the gcc run - time libraries on the path.
|
||||
# export PATH := $(PATH):$(MINGWBIN)
|
||||
#endif
|
||||
|
||||
# Special OSX settings.
|
||||
|
||||
ifeq ($(shell uname),Darwin)
|
||||
LDFLAGS += \
|
||||
-framework IOKit \
|
||||
-framework Foundation
|
||||
-framework AppKit \
|
||||
-framework UniformTypeIdentifiers \
|
||||
-framework UserNotifications
|
||||
endif
|
||||
|
||||
.PHONY: all
|
||||
@@ -44,22 +114,27 @@ all: +all README.md
|
||||
binaries: all
|
||||
tests: all
|
||||
|
||||
README.md: $(OBJ)/scripts+mkdocindex/scripts+mkdocindex$(EXT)
|
||||
@echo MKDOC $@
|
||||
README.md: $(OBJ)/scripts/+mkdocindex/mkdocindex$(EXT)
|
||||
@echo $(PROGRESSINFO)MKDOC $@
|
||||
@csplit -s -f$(OBJ)/README. README.md '/<!-- FORMATSSTART -->/' '%<!-- FORMATSEND -->%'
|
||||
@(cat $(OBJ)/README.00 && $< && cat $(OBJ)/README.01) > README.md
|
||||
|
||||
.PHONY: tests
|
||||
|
||||
.PHONY: install install-bin
|
||||
install:: all install-bin
|
||||
|
||||
install-bin:
|
||||
@echo "INSTALL"
|
||||
$(hide) install -D -v "$(OBJ)/src+fluxengine/src+fluxengine" "$(DESTDIR)$(BINDIR)/fluxengine"
|
||||
$(hide) install -D -v "$(OBJ)/src/gui+gui/gui+gui" "$(DESTDIR)$(BINDIR)/fluxengine-gui"
|
||||
$(hide) install -D -v "$(OBJ)/tools+brother120tool/tools+brother120tool" "$(DESTDIR)$(BINDIR)/brother120tool"
|
||||
$(hide) install -D -v "$(OBJ)/tools+brother240tool/tools+brother240tool" "$(DESTDIR)$(BINDIR)/brother240tool"
|
||||
$(hide) install -D -v "$(OBJ)/tools+upgrade-flux-file/tools+upgrade-flux-file" "$(DESTDIR)$(BINDIR)/upgrade-flux-file"
|
||||
clean::
|
||||
$(hide) rm -rf $(REALOBJ)
|
||||
|
||||
include build/ab.mk
|
||||
|
||||
DOCKERFILES = \
|
||||
debian11 \
|
||||
debian12 \
|
||||
fedora40 \
|
||||
fedora41 \
|
||||
manjaro
|
||||
|
||||
docker-%: tests/docker/Dockerfile.%
|
||||
docker build -t $* -f $< .
|
||||
|
||||
.PHONY: dockertests
|
||||
dockertests: $(foreach f,$(DOCKERFILES), docker-$(strip $f) .WAIT)
|
||||
|
||||
33
README.md
33
README.md
@@ -4,11 +4,8 @@ FluxEngine
|
||||
(If you're reading this on GitHub, the formatting's a bit messed up. [Try the
|
||||
version on cowlark.com instead.](http://cowlark.com/fluxengine/))
|
||||
|
||||
**Breaking news!** As of 2022-09-09, there's new [filesystem
|
||||
support](doc/filesystem.md). Read (and sometimes write) files directly from
|
||||
(and to) your disks, with eight different file systems! It works in the GUI,
|
||||
too, which is available for Linux (and other Unix clones), Windows and OSX. See
|
||||
the details below.
|
||||
**Breaking news!** As of 2024-10-01, the FluxEngine client software works
|
||||
(to a point) with [Applesauce](doc/applesauce.md) hardware.
|
||||
|
||||
<div style="text-align: center">
|
||||
<a href="doc/screenshot.jpg"><img src="doc/screenshot.jpg" style="width:60%" alt="screenshot of the GUI in action"></a>
|
||||
@@ -35,12 +32,14 @@ Don't believe me? Watch the demo reel!
|
||||
</div>
|
||||
|
||||
**New!** The FluxEngine client software now works with
|
||||
[Greaseweazle](https://github.com/keirf/Greaseweazle/wiki) hardware. So, if you
|
||||
can't find a PSoC5 development kit, or don't want to use the Cypress Windows
|
||||
tools for programming it, you can use one of these instead. Very nearly all
|
||||
FluxEngine features are available with the Greaseweazle and it works out-of-the
|
||||
box. See the [dedicated Greaseweazle documentation page](doc/greaseweazle.md)
|
||||
for more information.
|
||||
[Greaseweazle](https://github.com/keirf/Greaseweazle/wiki) and
|
||||
[Applesauce](https://applesaucefdc.com/) hardware. So, if you can't find a PSoC5
|
||||
development kit, or don't want to use the Cypress Windows tools for programming
|
||||
it, you can use one of these instead. Very nearly all FluxEngine features are
|
||||
available with the Greaseweazle and it works out-of-the box; the Applesauce is a
|
||||
bit less supported but still works. See the [dedicated Greaseweazle
|
||||
documentation page](doc/greaseweazle.md) or the [Applesauce
|
||||
page](doc/applesauce.md) for more information.
|
||||
|
||||
Where?
|
||||
------
|
||||
@@ -126,6 +125,7 @@ choices because they can store multiple types of file system.
|
||||
| [`hplif`](doc/disk-hplif.md) | Hewlett-Packard LIF: a variety of disk formats used by HP | 🦄 | 🦄 | LIF |
|
||||
| [`ibm`](doc/disk-ibm.md) | IBM PC: Generic PC 3.5"/5.25" disks | 🦄 | 🦄 | FATFS |
|
||||
| [`icl30`](doc/disk-icl30.md) | ICL Model 30: CP/M; 263kB 35-track DSSD | 🦖 | | CPMFS |
|
||||
| [`juku`](doc/disk-juku.md) | Juku E5104: CP/M | | | CPMFS |
|
||||
| [`mac`](doc/disk-mac.md) | Macintosh: 400kB/800kB 3.5" GCR | 🦄 | 🦄 | MACHFS |
|
||||
| [`micropolis`](doc/disk-micropolis.md) | Micropolis: 100tpi MetaFloppy disks | 🦄 | 🦄 | |
|
||||
| [`ms2000`](doc/disk-ms2000.md) | : MS2000 Microdisk Development System | | | MICRODOS |
|
||||
@@ -136,6 +136,8 @@ choices because they can store multiple types of file system.
|
||||
| [`rolandd20`](doc/disk-rolandd20.md) | Roland D20: 3.5" electronic synthesiser disks | 🦄 | 🦖 | ROLAND |
|
||||
| [`rx50`](doc/disk-rx50.md) | Digital RX50: 400kB 5.25" 80-track 10-sector SSDD | 🦖 | 🦖 | |
|
||||
| [`smaky6`](doc/disk-smaky6.md) | Smaky 6: 308kB 5.25" 77-track 16-sector SSDD, hard sectored | 🦖 | | SMAKY6 |
|
||||
| [`tartu`](doc/disk-tartu.md) | Tartu: The Palivere and variations | 🦄 | 🦖 | CPMFS |
|
||||
| [`ti99`](doc/disk-ti99.md) | TI-99: 90kB 35-track SSSD | 🦖 | | |
|
||||
| [`tids990`](doc/disk-tids990.md) | Texas Instruments DS990: 1126kB 8" DSSD | 🦖 | 🦖 | |
|
||||
| [`tiki`](doc/disk-tiki.md) | Tiki 100: CP/M | | | CPMFS |
|
||||
| [`victor9k`](doc/disk-victor9k.md) | Victor 9000 / Sirius One: 1224kB 5.25" DSDD GCR | 🦖 | 🦖 | |
|
||||
@@ -257,6 +259,15 @@ package, written by Robert Leslie et al, taken from
|
||||
https://www.mars.org/home/rob/proj/hfs. It is GPL 2.0 licensed. Please see the
|
||||
contents of the directory for the full text.
|
||||
|
||||
As an exception, `dep/lexy` contains a partial copy of the lexy package, written
|
||||
by foonathen@github, taken from https://github.com/foonathan/lexy. It is BSL 1.0
|
||||
licensed. Please see the contents of the directory for the full text.
|
||||
|
||||
As an exception, `dep/alphanum` contains a copy of the alphanum package,
|
||||
written by Dave Koelle, taken from
|
||||
https://web.archive.org/web/20210207124255/davekoelle.com/alphanum.html. It is
|
||||
MIT licensed. Please see the source for the full text.
|
||||
|
||||
__Important:__ Because of all these exceptions, if you distribute the
|
||||
FluxEngine package as a whole, you must comply with the terms of _all_ of the
|
||||
licensing terms. This means that __effectively the FluxEngine package is
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "aeslanier.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "arch/aeslanier/aeslanier.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "fmt/format.h"
|
||||
#include <string.h>
|
||||
|
||||
@@ -35,8 +36,8 @@ public:
|
||||
decodeFmMfm(rawbits).slice(0, AESLANIER_RECORD_SIZE);
|
||||
const auto& reversed = bytes.reverseBits();
|
||||
|
||||
_sector->logicalTrack = reversed[1];
|
||||
_sector->logicalSide = 0;
|
||||
_sector->logicalCylinder = reversed[1];
|
||||
_sector->logicalHead = 0;
|
||||
_sector->logicalSector = reversed[2];
|
||||
|
||||
/* Check header 'checksum' (which seems far too simple to mean much). */
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "agat.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "arch/agat/agat.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "fmt/format.h"
|
||||
|
||||
uint8_t agatChecksum(const Bytes& bytes)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
syntax = "proto2";
|
||||
|
||||
import "lib/common.proto";
|
||||
import "lib/config/common.proto";
|
||||
|
||||
message AgatDecoderProto {}
|
||||
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "agat.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "arch/agat/agat.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "fmt/format.h"
|
||||
#include <string.h>
|
||||
|
||||
@@ -58,9 +59,9 @@ public:
|
||||
if (bytes[3] != 0x5a)
|
||||
return;
|
||||
|
||||
_sector->logicalTrack = bytes[1] >> 1;
|
||||
_sector->logicalCylinder = bytes[1] >> 1;
|
||||
_sector->logicalSector = bytes[2];
|
||||
_sector->logicalSide = bytes[1] & 1;
|
||||
_sector->logicalHead = bytes[1] & 1;
|
||||
_sector->status = Sector::DATA_MISSING; /* unintuitive but correct */
|
||||
}
|
||||
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/core/utils.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "agat.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/readerwriter.h"
|
||||
#include "lib/image.h"
|
||||
#include "lib/layout.h"
|
||||
#include "arch/agat/agat.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "lib/data/layout.h"
|
||||
#include "arch/agat/agat.pb.h"
|
||||
#include "lib/encoders/encoders.pb.h"
|
||||
|
||||
@@ -58,13 +58,10 @@ private:
|
||||
};
|
||||
|
||||
public:
|
||||
std::unique_ptr<Fluxmap> encode(std::shared_ptr<const TrackInfo>& trackInfo,
|
||||
std::unique_ptr<Fluxmap> encode(const LogicalTrackLayout& ltl,
|
||||
const std::vector<std::shared_ptr<const Sector>>& sectors,
|
||||
const Image& image) override
|
||||
{
|
||||
auto trackLayout = Layout::getLayoutOfTrack(
|
||||
trackInfo->logicalTrack, trackInfo->logicalSide);
|
||||
|
||||
double clockRateUs = _config.target_clock_period_us() / 2.0;
|
||||
int bitsPerRevolution =
|
||||
(_config.target_rotational_period_ms() * 1000.0) / clockRateUs;
|
||||
@@ -80,7 +77,7 @@ public:
|
||||
writeFillerRawBytes(_config.pre_sector_gap_bytes(), 0xaaaa);
|
||||
writeRawBits(SECTOR_ID, 64);
|
||||
writeByte(0x5a);
|
||||
writeByte((sector->logicalTrack << 1) | sector->logicalSide);
|
||||
writeByte((sector->logicalCylinder << 1) | sector->logicalHead);
|
||||
writeByte(sector->logicalSector);
|
||||
writeByte(0x5a);
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "amiga.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "arch/amiga/amiga.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "fmt/format.h"
|
||||
|
||||
uint32_t amigaChecksum(const Bytes& bytes)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
syntax = "proto2";
|
||||
|
||||
import "lib/common.proto";
|
||||
import "lib/config/common.proto";
|
||||
|
||||
message AmigaDecoderProto {}
|
||||
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "protocol.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/sector.h"
|
||||
#include "amiga.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "arch/amiga/amiga.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "fmt/format.h"
|
||||
#include "lib/decoders/decoders.pb.h"
|
||||
#include <string.h>
|
||||
@@ -51,8 +52,8 @@ public:
|
||||
Bytes header = amigaDeinterleave(ptr, 4);
|
||||
Bytes recoveryinfo = amigaDeinterleave(ptr, 16);
|
||||
|
||||
_sector->logicalTrack = header[1] >> 1;
|
||||
_sector->logicalSide = header[1] & 1;
|
||||
_sector->logicalCylinder = header[1] >> 1;
|
||||
_sector->logicalHead = header[1] & 1;
|
||||
_sector->logicalSector = header[2];
|
||||
|
||||
uint32_t wantedheaderchecksum =
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/core/utils.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "amiga.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/readerwriter.h"
|
||||
#include "lib/image.h"
|
||||
#include "arch/amiga/amiga.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "arch/amiga/amiga.pb.h"
|
||||
#include "lib/encoders/encoders.pb.h"
|
||||
|
||||
@@ -84,7 +84,7 @@ static void write_sector(std::vector<bool>& bits,
|
||||
|
||||
checksum = 0;
|
||||
Bytes header = {0xff, /* Amiga 1.0 format byte */
|
||||
(uint8_t)((sector->logicalTrack << 1) | sector->logicalSide),
|
||||
(uint8_t)((sector->logicalCylinder << 1) | sector->logicalHead),
|
||||
(uint8_t)sector->logicalSector,
|
||||
(uint8_t)(AMIGA_SECTORS_PER_TRACK - sector->logicalSector)};
|
||||
write_interleaved_bytes(header);
|
||||
@@ -110,7 +110,7 @@ public:
|
||||
}
|
||||
|
||||
public:
|
||||
std::unique_ptr<Fluxmap> encode(std::shared_ptr<const TrackInfo>& trackInfo,
|
||||
std::unique_ptr<Fluxmap> encode(const LogicalTrackLayout& ltl,
|
||||
const std::vector<std::shared_ptr<const Sector>>& sectors,
|
||||
const Image& image) override
|
||||
{
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
syntax = "proto2";
|
||||
|
||||
import "lib/common.proto";
|
||||
import "lib/config/common.proto";
|
||||
|
||||
message Apple2DecoderProto {
|
||||
optional uint32 side_one_track_offset = 1
|
||||
|
||||
@@ -1,13 +1,15 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "protocol.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/sector.h"
|
||||
#include "apple2.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/data/layout.h"
|
||||
#include "arch/apple2/apple2.h"
|
||||
#include "arch/apple2/apple2.pb.h"
|
||||
#include "lib/decoders/decoders.pb.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "fmt/format.h"
|
||||
#include <string.h>
|
||||
#include <algorithm>
|
||||
@@ -92,24 +94,25 @@ public:
|
||||
ByteReader br(header);
|
||||
|
||||
uint8_t volume = combine(br.read_be16());
|
||||
_sector->logicalTrack = combine(br.read_be16());
|
||||
_sector->logicalSide = _sector->physicalSide;
|
||||
_sector->logicalCylinder = combine(br.read_be16());
|
||||
_sector->logicalHead = _ltl->logicalHead;
|
||||
_sector->logicalSector = combine(br.read_be16());
|
||||
uint8_t checksum = combine(br.read_be16());
|
||||
|
||||
// If the checksum is correct, upgrade the sector from MISSING
|
||||
// to DATA_MISSING in anticipation of its data record
|
||||
if (checksum ==
|
||||
(volume ^ _sector->logicalTrack ^ _sector->logicalSector))
|
||||
(volume ^ _sector->logicalCylinder ^ _sector->logicalSector))
|
||||
_sector->status =
|
||||
Sector::DATA_MISSING; /* unintuitive but correct */
|
||||
|
||||
if (_sector->logicalSide == 1)
|
||||
_sector->logicalTrack -= _config.apple2().side_one_track_offset();
|
||||
if (_sector->logicalHead == 1)
|
||||
_sector->logicalCylinder -=
|
||||
_config.apple2().side_one_track_offset();
|
||||
|
||||
/* Sanity check. */
|
||||
|
||||
if (_sector->logicalTrack > 100)
|
||||
if (_sector->logicalCylinder > 100)
|
||||
{
|
||||
_sector->status = Sector::MISSING;
|
||||
return;
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/core/utils.h"
|
||||
#include "arch/apple2/apple2.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/readerwriter.h"
|
||||
#include "lib/image.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "fmt/format.h"
|
||||
#include "lib/encoders/encoders.pb.h"
|
||||
#include <ctype.h>
|
||||
#include "lib/bytes.h"
|
||||
#include "lib/core/bytes.h"
|
||||
|
||||
static int encode_data_gcr(uint8_t data)
|
||||
{
|
||||
@@ -36,7 +36,7 @@ private:
|
||||
const Apple2EncoderProto& _config;
|
||||
|
||||
public:
|
||||
std::unique_ptr<Fluxmap> encode(std::shared_ptr<const TrackInfo>& trackInfo,
|
||||
std::unique_ptr<Fluxmap> encode(const LogicalTrackLayout& ltl,
|
||||
const std::vector<std::shared_ptr<const Sector>>& sectors,
|
||||
const Image& image) override
|
||||
{
|
||||
@@ -129,8 +129,8 @@ private:
|
||||
// extra padding.
|
||||
write_ff40(sector.logicalSector == 0 ? 32 : 8);
|
||||
|
||||
int track = sector.logicalTrack;
|
||||
if (sector.logicalSide == 1)
|
||||
int track = sector.logicalCylinder;
|
||||
if (sector.logicalHead == 1)
|
||||
track += _config.side_one_track_offset();
|
||||
|
||||
// Write address field: APPLE2_SECTOR_RECORD + sector identifier +
|
||||
|
||||
97
arch/arch.cc
Normal file
97
arch/arch.cc
Normal file
@@ -0,0 +1,97 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/config/config.h"
|
||||
#include "arch/agat/agat.h"
|
||||
#include "arch/aeslanier/aeslanier.h"
|
||||
#include "arch/amiga/amiga.h"
|
||||
#include "arch/apple2/apple2.h"
|
||||
#include "arch/brother/brother.h"
|
||||
#include "arch/c64/c64.h"
|
||||
#include "arch/f85/f85.h"
|
||||
#include "arch/fb100/fb100.h"
|
||||
#include "arch/ibm/ibm.h"
|
||||
#include "arch/macintosh/macintosh.h"
|
||||
#include "arch/micropolis/micropolis.h"
|
||||
#include "arch/mx/mx.h"
|
||||
#include "arch/northstar/northstar.h"
|
||||
#include "arch/rolandd20/rolandd20.h"
|
||||
#include "arch/smaky6/smaky6.h"
|
||||
#include "arch/tartu/tartu.h"
|
||||
#include "arch/tids990/tids990.h"
|
||||
#include "arch/victor9k/victor9k.h"
|
||||
#include "arch/zilogmcz/zilogmcz.h"
|
||||
#include "arch/arch.h"
|
||||
|
||||
std::unique_ptr<Encoder> Arch::createEncoder(Config& config)
|
||||
{
|
||||
if (!config.hasEncoder())
|
||||
error("no encoder configured");
|
||||
return createEncoder(config->encoder());
|
||||
}
|
||||
|
||||
std::unique_ptr<Encoder> Arch::createEncoder(const EncoderProto& config)
|
||||
{
|
||||
static const std::map<int,
|
||||
std::function<std::unique_ptr<Encoder>(const EncoderProto&)>>
|
||||
encoders = {
|
||||
{EncoderProto::kAgat, createAgatEncoder },
|
||||
{EncoderProto::kAmiga, createAmigaEncoder },
|
||||
{EncoderProto::kApple2, createApple2Encoder },
|
||||
{EncoderProto::kBrother, createBrotherEncoder },
|
||||
{EncoderProto::kC64, createCommodore64Encoder},
|
||||
{EncoderProto::kIbm, createIbmEncoder },
|
||||
{EncoderProto::kMacintosh, createMacintoshEncoder },
|
||||
{EncoderProto::kMicropolis, createMicropolisEncoder },
|
||||
{EncoderProto::kNorthstar, createNorthstarEncoder },
|
||||
{EncoderProto::kTartu, createTartuEncoder },
|
||||
{EncoderProto::kTids990, createTids990Encoder },
|
||||
{EncoderProto::kVictor9K, createVictor9kEncoder },
|
||||
};
|
||||
|
||||
auto encoder = encoders.find(config.format_case());
|
||||
if (encoder == encoders.end())
|
||||
error("no encoder specified");
|
||||
|
||||
return (encoder->second)(config);
|
||||
}
|
||||
|
||||
std::unique_ptr<Decoder> Arch::createDecoder(Config& config)
|
||||
{
|
||||
if (!config.hasDecoder())
|
||||
error("no decoder configured");
|
||||
return createDecoder(config->decoder());
|
||||
}
|
||||
|
||||
std::unique_ptr<Decoder> Arch::createDecoder(const DecoderProto& config)
|
||||
{
|
||||
static const std::map<int,
|
||||
std::function<std::unique_ptr<Decoder>(const DecoderProto&)>>
|
||||
decoders = {
|
||||
{DecoderProto::kAgat, createAgatDecoder },
|
||||
{DecoderProto::kAeslanier, createAesLanierDecoder },
|
||||
{DecoderProto::kAmiga, createAmigaDecoder },
|
||||
{DecoderProto::kApple2, createApple2Decoder },
|
||||
{DecoderProto::kBrother, createBrotherDecoder },
|
||||
{DecoderProto::kC64, createCommodore64Decoder},
|
||||
{DecoderProto::kF85, createDurangoF85Decoder },
|
||||
{DecoderProto::kFb100, createFb100Decoder },
|
||||
{DecoderProto::kIbm, createIbmDecoder },
|
||||
{DecoderProto::kMacintosh, createMacintoshDecoder },
|
||||
{DecoderProto::kMicropolis, createMicropolisDecoder },
|
||||
{DecoderProto::kMx, createMxDecoder },
|
||||
{DecoderProto::kNorthstar, createNorthstarDecoder },
|
||||
{DecoderProto::kRolandd20, createRolandD20Decoder },
|
||||
{DecoderProto::kSmaky6, createSmaky6Decoder },
|
||||
{DecoderProto::kTartu, createTartuDecoder },
|
||||
{DecoderProto::kTids990, createTids990Decoder },
|
||||
{DecoderProto::kVictor9K, createVictor9kDecoder },
|
||||
{DecoderProto::kZilogmcz, createZilogMczDecoder },
|
||||
};
|
||||
|
||||
auto decoder = decoders.find(config.format_case());
|
||||
if (decoder == decoders.end())
|
||||
error("no decoder specified");
|
||||
|
||||
return (decoder->second)(config);
|
||||
}
|
||||
16
arch/arch.h
Normal file
16
arch/arch.h
Normal file
@@ -0,0 +1,16 @@
|
||||
#pragma once
|
||||
|
||||
class Encoder;
|
||||
class Decoder;
|
||||
class DecoderProto;
|
||||
class EncoderProto;
|
||||
class Config;
|
||||
|
||||
namespace Arch
|
||||
{
|
||||
std::unique_ptr<Decoder> createDecoder(Config& config);
|
||||
std::unique_ptr<Decoder> createDecoder(const DecoderProto& config);
|
||||
|
||||
std::unique_ptr<Encoder> createEncoder(Config& config);
|
||||
std::unique_ptr<Encoder> createEncoder(const EncoderProto& config);
|
||||
}
|
||||
@@ -1,12 +1,13 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "brother.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "lib/crc.h"
|
||||
#include "arch/brother/brother.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include <ctype.h>
|
||||
|
||||
const FluxPattern SECTOR_RECORD_PATTERN(32, BROTHER_SECTOR_RECORD);
|
||||
@@ -74,14 +75,14 @@ public:
|
||||
const auto& bytes = toBytes(rawbits).slice(0, 4);
|
||||
|
||||
ByteReader br(bytes);
|
||||
_sector->logicalTrack = decode_header_gcr(br.read_be16());
|
||||
_sector->logicalCylinder = decode_header_gcr(br.read_be16());
|
||||
_sector->logicalSector = decode_header_gcr(br.read_be16());
|
||||
|
||||
/* Sanity check the values read; there's no header checksum and
|
||||
* occasionally we get garbage due to bit errors. */
|
||||
if (_sector->logicalSector > 11)
|
||||
return;
|
||||
if (_sector->logicalTrack > 79)
|
||||
if (_sector->logicalCylinder > 79)
|
||||
return;
|
||||
|
||||
_sector->status = Sector::DATA_MISSING;
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/core/utils.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "brother.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/readerwriter.h"
|
||||
#include "lib/image.h"
|
||||
#include "arch/brother/brother.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "arch/brother/brother.pb.h"
|
||||
#include "lib/encoders/encoders.pb.h"
|
||||
|
||||
@@ -107,7 +107,7 @@ public:
|
||||
}
|
||||
|
||||
public:
|
||||
std::unique_ptr<Fluxmap> encode(std::shared_ptr<const TrackInfo>& trackInfo,
|
||||
std::unique_ptr<Fluxmap> encode(const LogicalTrackLayout& ltl,
|
||||
const std::vector<std::shared_ptr<const Sector>>& sectors,
|
||||
const Image& image) override
|
||||
{
|
||||
@@ -127,7 +127,7 @@ public:
|
||||
fillBitmapTo(bits, cursor, headerCursor, {true, false});
|
||||
write_sector_header(bits,
|
||||
cursor,
|
||||
sectorData->logicalTrack,
|
||||
sectorData->logicalCylinder,
|
||||
sectorData->logicalSector);
|
||||
fillBitmapTo(bits, cursor, dataCursor, {true, false});
|
||||
write_sector_data(bits, cursor, sectorData->data);
|
||||
|
||||
@@ -1,26 +1,61 @@
|
||||
from build.c import cxxlibrary
|
||||
from build.protobuf import proto, protocc
|
||||
from build.protobuf import proto, protocc, protolib
|
||||
from os.path import *
|
||||
from glob import glob
|
||||
import sys
|
||||
|
||||
proto(
|
||||
name="arch_proto",
|
||||
srcs=[
|
||||
"./aeslanier/aeslanier.proto",
|
||||
"./agat/agat.proto",
|
||||
"./amiga/amiga.proto",
|
||||
"./apple2/apple2.proto",
|
||||
"./brother/brother.proto",
|
||||
"./c64/c64.proto",
|
||||
"./f85/f85.proto",
|
||||
"./fb100/fb100.proto",
|
||||
"./ibm/ibm.proto",
|
||||
"./macintosh/macintosh.proto",
|
||||
"./micropolis/micropolis.proto",
|
||||
"./mx/mx.proto",
|
||||
"./northstar/northstar.proto",
|
||||
"./rolandd20/rolandd20.proto",
|
||||
"./smaky6/smaky6.proto",
|
||||
"./tids990/tids990.proto",
|
||||
"./victor9k/victor9k.proto",
|
||||
"./zilogmcz/zilogmcz.proto",
|
||||
],
|
||||
archs = [f for f in glob("*", root_dir="arch") if isfile(f"arch/{f}/{f}.proto")]
|
||||
|
||||
ps = []
|
||||
pls = []
|
||||
cls = []
|
||||
for a in archs:
|
||||
ps += [
|
||||
proto(
|
||||
name=f"proto_{a}",
|
||||
srcs=[f"arch/{a}/{a}.proto"],
|
||||
deps=["lib/config+common_proto"],
|
||||
)
|
||||
]
|
||||
|
||||
pls += [
|
||||
protocc(
|
||||
name=f"proto_lib_{a}",
|
||||
srcs=[f".+proto_{a}"],
|
||||
deps=["lib/config+common_proto_lib"],
|
||||
)
|
||||
]
|
||||
|
||||
cls += [
|
||||
cxxlibrary(
|
||||
name=f"arch_{a}",
|
||||
srcs=glob(f"arch/{a}/*.cc") + glob(f"arch/{a}/*.h"),
|
||||
hdrs={f"arch/{a}/{a}.h": f"arch/{a}/{a}.h"},
|
||||
deps=[
|
||||
"lib/core",
|
||||
"lib/data",
|
||||
"lib/config",
|
||||
"lib/encoders",
|
||||
"lib/decoders",
|
||||
],
|
||||
)
|
||||
]
|
||||
|
||||
protolib(
|
||||
name="proto",
|
||||
srcs=ps + ["lib/config+common_proto"],
|
||||
)
|
||||
|
||||
cxxlibrary(name="proto_lib", deps=pls)
|
||||
|
||||
cxxlibrary(
|
||||
name="arch",
|
||||
srcs=[
|
||||
"./arch.cc",
|
||||
],
|
||||
hdrs={
|
||||
"arch/arch.h": "./arch.h",
|
||||
},
|
||||
deps=cls
|
||||
+ ["lib/core", "lib/data", "lib/config", "lib/encoders", "lib/decoders"],
|
||||
)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#include "lib/globals.h"
|
||||
#include "c64.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "arch/c64/c64.h"
|
||||
|
||||
/*
|
||||
* Track Sectors/track # Sectors Storage in Bytes Clock rate
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
syntax = "proto2";
|
||||
|
||||
import "lib/common.proto";
|
||||
import "lib/config/common.proto";
|
||||
|
||||
message Commodore64DecoderProto {}
|
||||
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "protocol.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/sector.h"
|
||||
#include "c64.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "arch/c64/c64.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "fmt/format.h"
|
||||
#include <string.h>
|
||||
#include <algorithm>
|
||||
@@ -73,8 +74,8 @@ public:
|
||||
|
||||
uint8_t checksum = bytes[0];
|
||||
_sector->logicalSector = bytes[1];
|
||||
_sector->logicalSide = 0;
|
||||
_sector->logicalTrack = bytes[2] - 1;
|
||||
_sector->logicalHead = 0;
|
||||
_sector->logicalCylinder = bytes[2] - 1;
|
||||
if (checksum == xorBytes(bytes.slice(1, 4)))
|
||||
_sector->status =
|
||||
Sector::DATA_MISSING; /* unintuitive but correct */
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/core/utils.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "c64.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/readerwriter.h"
|
||||
#include "lib/image.h"
|
||||
#include "arch/c64/c64.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "fmt/format.h"
|
||||
#include "arch/c64/c64.pb.h"
|
||||
#include "lib/encoders/encoders.pb.h"
|
||||
#include "lib/layout.h"
|
||||
#include "lib/data/layout.h"
|
||||
#include <ctype.h>
|
||||
#include "lib/bytes.h"
|
||||
#include "lib/core/bytes.h"
|
||||
|
||||
static bool lastBit;
|
||||
|
||||
@@ -155,7 +155,7 @@ public:
|
||||
}
|
||||
|
||||
public:
|
||||
std::unique_ptr<Fluxmap> encode(std::shared_ptr<const TrackInfo>& trackInfo,
|
||||
std::unique_ptr<Fluxmap> encode(const LogicalTrackLayout& ltl,
|
||||
const std::vector<std::shared_ptr<const Sector>>& sectors,
|
||||
const Image& image) override
|
||||
{
|
||||
@@ -178,7 +178,7 @@ public:
|
||||
else
|
||||
_formatByte1 = _formatByte2 = 0;
|
||||
|
||||
double clockRateUs = clockPeriodForC64Track(trackInfo->logicalTrack);
|
||||
double clockRateUs = clockPeriodForC64Track(ltl.logicalCylinder);
|
||||
int bitsPerRevolution = 200000.0 / clockRateUs;
|
||||
|
||||
std::vector<bool> bits(bitsPerRevolution);
|
||||
@@ -245,7 +245,7 @@ private:
|
||||
* 06-07 - $0F ("off" bytes)
|
||||
*/
|
||||
uint8_t encodedTrack =
|
||||
((sector->logicalTrack) +
|
||||
((sector->logicalCylinder) +
|
||||
1); // C64 track numbering starts with 1. Fluxengine with 0.
|
||||
uint8_t encodedSector = sector->logicalSector;
|
||||
// uint8_t formatByte1 = C64_FORMAT_ID_BYTE1;
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "protocol.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/sector.h"
|
||||
#include "f85.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "arch/f85/f85.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "fmt/format.h"
|
||||
#include <string.h>
|
||||
#include <algorithm>
|
||||
@@ -75,8 +76,8 @@ public:
|
||||
const auto& bytes = decode(readRawBits(6 * 10));
|
||||
|
||||
_sector->logicalSector = bytes[2];
|
||||
_sector->logicalSide = 0;
|
||||
_sector->logicalTrack = bytes[0];
|
||||
_sector->logicalHead = 0;
|
||||
_sector->logicalCylinder = bytes[0];
|
||||
|
||||
uint16_t wantChecksum = bytes.reader().seek(4).read_be16();
|
||||
uint16_t gotChecksum = crc16(CCITT_POLY, 0xef21, bytes.slice(0, 4));
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "protocol.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/sector.h"
|
||||
#include "fb100.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "arch/fb100/fb100.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "lib/decoders/rawbits.h"
|
||||
#include "fmt/format.h"
|
||||
#include <string.h>
|
||||
@@ -125,8 +126,8 @@ public:
|
||||
return;
|
||||
|
||||
uint8_t abssector = id[2];
|
||||
_sector->logicalTrack = abssector >> 1;
|
||||
_sector->logicalSide = 0;
|
||||
_sector->logicalCylinder = abssector >> 1;
|
||||
_sector->logicalHead = 0;
|
||||
_sector->logicalSector = abssector & 1;
|
||||
_sector->data.writer().append(id.slice(5, 12)).append(payload);
|
||||
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "ibm.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/sector.h"
|
||||
#include "arch/ibm/ibm.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "arch/ibm/ibm.pb.h"
|
||||
#include "lib/proto.h"
|
||||
#include "lib/layout.h"
|
||||
#include "lib/config/proto.h"
|
||||
#include "lib/data/layout.h"
|
||||
#include <string.h>
|
||||
|
||||
static_assert(std::is_trivially_copyable<IbmIdam>::value,
|
||||
@@ -140,11 +141,10 @@ public:
|
||||
bw += decodeFmMfm(bits).slice(0, IBM_IDAM_LEN);
|
||||
|
||||
IbmDecoderProto::TrackdataProto trackdata;
|
||||
getTrackFormat(
|
||||
trackdata, _sector->physicalTrack, _sector->physicalSide);
|
||||
getTrackFormat(trackdata, _ltl->logicalCylinder, _ltl->logicalHead);
|
||||
|
||||
_sector->logicalTrack = br.read_8();
|
||||
_sector->logicalSide = br.read_8();
|
||||
_sector->logicalCylinder = br.read_8();
|
||||
_sector->logicalHead = br.read_8();
|
||||
_sector->logicalSector = br.read_8();
|
||||
_currentSectorSize = 1 << (br.read_8() + 7);
|
||||
|
||||
@@ -155,11 +155,10 @@ public:
|
||||
Sector::DATA_MISSING; /* correct but unintuitive */
|
||||
|
||||
if (trackdata.ignore_side_byte())
|
||||
_sector->logicalSide =
|
||||
Layout::remapSidePhysicalToLogical(_sector->physicalSide);
|
||||
_sector->logicalSide ^= trackdata.invert_side_byte();
|
||||
_sector->logicalHead = _ltl->logicalHead;
|
||||
_sector->logicalHead ^= trackdata.invert_side_byte();
|
||||
if (trackdata.ignore_track_byte())
|
||||
_sector->logicalTrack = _sector->physicalTrack;
|
||||
_sector->logicalCylinder = _ltl->logicalCylinder;
|
||||
|
||||
for (int sector : trackdata.ignore_sector())
|
||||
if (_sector->logicalSector == sector)
|
||||
@@ -208,16 +207,14 @@ public:
|
||||
_sector->status =
|
||||
(wantCrc == gotCrc) ? Sector::OK : Sector::BAD_CHECKSUM;
|
||||
|
||||
auto layout = Layout::getLayoutOfTrack(
|
||||
_sector->logicalTrack, _sector->logicalSide);
|
||||
if (_currentSectorSize != layout->sectorSize)
|
||||
if (_currentSectorSize != _ltl->sectorSize)
|
||||
std::cerr << fmt::format(
|
||||
"Warning: configured sector size for t{}.h{}.s{} is {} bytes "
|
||||
"but that seen on disk is {} bytes\n",
|
||||
_sector->logicalTrack,
|
||||
_sector->logicalSide,
|
||||
_sector->logicalCylinder,
|
||||
_sector->logicalHead,
|
||||
_sector->logicalSector,
|
||||
layout->sectorSize,
|
||||
_ltl->sectorSize,
|
||||
_currentSectorSize);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/config/config.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "ibm.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/readerwriter.h"
|
||||
#include "lib/image.h"
|
||||
#include "arch/ibm/ibm.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "arch/ibm/ibm.pb.h"
|
||||
#include "lib/encoders/encoders.pb.h"
|
||||
#include "fmt/format.h"
|
||||
#include "lib/proto.h"
|
||||
#include "lib/layout.h"
|
||||
#include "lib/config/proto.h"
|
||||
#include "lib/data/layout.h"
|
||||
#include <ctype.h>
|
||||
|
||||
/* IAM record separator:
|
||||
@@ -107,16 +107,12 @@ private:
|
||||
}
|
||||
|
||||
public:
|
||||
std::unique_ptr<Fluxmap> encode(std::shared_ptr<const TrackInfo>& trackInfo,
|
||||
std::unique_ptr<Fluxmap> encode(const LogicalTrackLayout& ltl,
|
||||
const std::vector<std::shared_ptr<const Sector>>& sectors,
|
||||
const Image& image) override
|
||||
{
|
||||
IbmEncoderProto::TrackdataProto trackdata;
|
||||
getEncoderTrackData(
|
||||
trackdata, trackInfo->logicalTrack, trackInfo->logicalSide);
|
||||
|
||||
auto trackLayout = Layout::getLayoutOfTrack(
|
||||
trackInfo->logicalTrack, trackInfo->logicalSide);
|
||||
getEncoderTrackData(trackdata, ltl.logicalCylinder, ltl.logicalHead);
|
||||
|
||||
auto writeBytes = [&](const Bytes& bytes)
|
||||
{
|
||||
@@ -152,7 +148,7 @@ public:
|
||||
|
||||
uint8_t sectorSize = 0;
|
||||
{
|
||||
int s = trackLayout->sectorSize >> 7;
|
||||
int s = ltl.sectorSize >> 7;
|
||||
while (s > 1)
|
||||
{
|
||||
s >>= 1;
|
||||
@@ -202,9 +198,9 @@ public:
|
||||
bw.write_8(MFM_RECORD_SEPARATOR_BYTE);
|
||||
}
|
||||
bw.write_8(idamUnencoded);
|
||||
bw.write_8(sectorData->logicalTrack);
|
||||
bw.write_8(sectorData->logicalCylinder);
|
||||
bw.write_8(
|
||||
sectorData->logicalSide ^ trackdata.invert_side_byte());
|
||||
sectorData->logicalHead ^ trackdata.invert_side_byte());
|
||||
bw.write_8(sectorData->logicalSector);
|
||||
bw.write_8(sectorSize);
|
||||
uint16_t crc = crc16(CCITT_POLY, header);
|
||||
@@ -237,8 +233,7 @@ public:
|
||||
}
|
||||
bw.write_8(damUnencoded);
|
||||
|
||||
Bytes truncatedData =
|
||||
sectorData->data.slice(0, trackLayout->sectorSize);
|
||||
Bytes truncatedData = sectorData->data.slice(0, ltl.sectorSize);
|
||||
bw += truncatedData;
|
||||
uint16_t crc = crc16(CCITT_POLY, data);
|
||||
bw.write_be16(crc);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
syntax = "proto2";
|
||||
|
||||
import "lib/common.proto";
|
||||
import "lib/config/common.proto";
|
||||
|
||||
message IbmDecoderProto {
|
||||
// Next: 11
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "protocol.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/sector.h"
|
||||
#include "macintosh.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/data/layout.h"
|
||||
#include "arch/macintosh/macintosh.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "fmt/format.h"
|
||||
#include <string.h>
|
||||
#include <algorithm>
|
||||
@@ -145,7 +147,7 @@ public:
|
||||
auto header = toBytes(readRawBits(7 * 8)).slice(0, 7);
|
||||
|
||||
uint8_t encodedTrack = decode_data_gcr(header[0]);
|
||||
if (encodedTrack != (_sector->physicalTrack & 0x3f))
|
||||
if (encodedTrack != (_ltl->logicalCylinder & 0x3f))
|
||||
return;
|
||||
|
||||
uint8_t encodedSector = decode_data_gcr(header[1]);
|
||||
@@ -156,8 +158,8 @@ public:
|
||||
if (encodedSector > 11)
|
||||
return;
|
||||
|
||||
_sector->logicalTrack = _sector->physicalTrack;
|
||||
_sector->logicalSide = decode_side(encodedSide);
|
||||
_sector->logicalCylinder = _ltl->logicalCylinder;
|
||||
_sector->logicalHead = decode_side(encodedSide);
|
||||
_sector->logicalSector = encodedSector;
|
||||
uint8_t gotsum =
|
||||
(encodedTrack ^ encodedSector ^ encodedSide ^ formatByte) & 0x3f;
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/core/utils.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "macintosh.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/readerwriter.h"
|
||||
#include "lib/image.h"
|
||||
#include "arch/macintosh/macintosh.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "fmt/format.h"
|
||||
#include "lib/encoders/encoders.pb.h"
|
||||
#include "lib/layout.h"
|
||||
#include "lib/data/layout.h"
|
||||
#include "arch/macintosh/macintosh.pb.h"
|
||||
#include <ctype.h>
|
||||
|
||||
@@ -181,10 +181,10 @@ static void write_sector(std::vector<bool>& bits,
|
||||
write_bits(bits, cursor, 0xff3fcff3fcffLL, 6 * 8); /* sync */
|
||||
write_bits(bits, cursor, MAC_SECTOR_RECORD, 3 * 8);
|
||||
|
||||
uint8_t encodedTrack = sector->logicalTrack & 0x3f;
|
||||
uint8_t encodedTrack = sector->logicalCylinder & 0x3f;
|
||||
uint8_t encodedSector = sector->logicalSector;
|
||||
uint8_t encodedSide =
|
||||
encode_side(sector->logicalTrack, sector->logicalSide);
|
||||
encode_side(sector->logicalCylinder, sector->logicalHead);
|
||||
uint8_t formatByte = MAC_FORMAT_BYTE;
|
||||
uint8_t headerChecksum =
|
||||
(encodedTrack ^ encodedSector ^ encodedSide ^ formatByte) & 0x3f;
|
||||
@@ -220,11 +220,11 @@ public:
|
||||
}
|
||||
|
||||
public:
|
||||
std::unique_ptr<Fluxmap> encode(std::shared_ptr<const TrackInfo>& trackInfo,
|
||||
std::unique_ptr<Fluxmap> encode(const LogicalTrackLayout& ltl,
|
||||
const std::vector<std::shared_ptr<const Sector>>& sectors,
|
||||
const Image& image) override
|
||||
{
|
||||
double clockRateUs = clockRateUsForTrack(trackInfo->logicalTrack);
|
||||
double clockRateUs = clockRateUsForTrack(ltl.logicalCylinder);
|
||||
int bitsPerRevolution = 200000.0 / clockRateUs;
|
||||
std::vector<bool> bits(bitsPerRevolution);
|
||||
unsigned cursor = 0;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
syntax = "proto2";
|
||||
|
||||
import "lib/common.proto";
|
||||
import "lib/config/common.proto";
|
||||
|
||||
message MacintoshDecoderProto {}
|
||||
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/sector.h"
|
||||
#include "micropolis.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/data/layout.h"
|
||||
#include "arch/micropolis/micropolis.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "fmt/format.h"
|
||||
#include "lib/decoders/decoders.pb.h"
|
||||
|
||||
@@ -221,14 +223,14 @@ public:
|
||||
if (syncByte != 0xFF)
|
||||
return;
|
||||
|
||||
_sector->logicalTrack = br.read_8();
|
||||
_sector->logicalSide = _sector->physicalSide;
|
||||
_sector->logicalCylinder = br.read_8();
|
||||
_sector->logicalHead = _ltl->logicalHead;
|
||||
_sector->logicalSector = br.read_8();
|
||||
if (_sector->logicalSector > 15)
|
||||
return;
|
||||
if (_sector->logicalTrack > 76)
|
||||
if (_sector->logicalCylinder > 76)
|
||||
return;
|
||||
if (_sector->logicalTrack != _sector->physicalTrack)
|
||||
if (_sector->logicalCylinder != _ltl->logicalCylinder)
|
||||
return;
|
||||
|
||||
br.read(10); /* OS data or padding */
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
#include "lib/globals.h"
|
||||
#include "micropolis.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "arch/micropolis/micropolis.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "lib/image.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "lib/encoders/encoders.pb.h"
|
||||
|
||||
static void write_sector(std::vector<bool>& bits,
|
||||
@@ -40,7 +40,7 @@ static void write_sector(std::vector<bool>& bits,
|
||||
{
|
||||
ByteWriter writer(sectorData);
|
||||
writer.write_8(0xff); /* Sync */
|
||||
writer.write_8(sector->logicalTrack);
|
||||
writer.write_8(sector->logicalCylinder);
|
||||
writer.write_8(sector->logicalSector);
|
||||
for (int i = 0; i < 10; i++)
|
||||
writer.write_8(0); /* Padding */
|
||||
@@ -87,7 +87,7 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
std::unique_ptr<Fluxmap> encode(std::shared_ptr<const TrackInfo>& trackInfo,
|
||||
std::unique_ptr<Fluxmap> encode(const LogicalTrackLayout& ltl,
|
||||
const std::vector<std::shared_ptr<const Sector>>& sectors,
|
||||
const Image& image) override
|
||||
{
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
syntax = "proto2";
|
||||
|
||||
import "lib/common.proto";
|
||||
import "lib/config/common.proto";
|
||||
|
||||
message MicropolisDecoderProto {
|
||||
enum ChecksumType {
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "arch/mx/mx.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/data/layout.h"
|
||||
#include <string.h>
|
||||
|
||||
const int SECTOR_SIZE = 256;
|
||||
@@ -63,8 +65,8 @@ public:
|
||||
gotChecksum += br.read_be16();
|
||||
uint16_t wantChecksum = br.read_be16();
|
||||
|
||||
_sector->logicalTrack = _sector->physicalTrack;
|
||||
_sector->logicalSide = _sector->physicalSide;
|
||||
_sector->logicalCylinder = _ltl->logicalCylinder;
|
||||
_sector->logicalHead = _ltl->logicalHead;
|
||||
_sector->logicalSector = _currentSector;
|
||||
_sector->data = bytes.slice(0, SECTOR_SIZE).swab();
|
||||
_sector->status =
|
||||
|
||||
@@ -11,13 +11,15 @@
|
||||
* sure that the hardSectorId is correct.
|
||||
*/
|
||||
|
||||
#include "lib/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/sector.h"
|
||||
#include "northstar.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/data/layout.h"
|
||||
#include "arch/northstar/northstar.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "lib/decoders/decoders.pb.h"
|
||||
#include "fmt/format.h"
|
||||
|
||||
@@ -158,9 +160,9 @@ public:
|
||||
auto bytes = decodeFmMfm(rawbits).slice(0, recordSize);
|
||||
ByteReader br(bytes);
|
||||
|
||||
_sector->logicalSide = _sector->physicalSide;
|
||||
_sector->logicalHead = _ltl->logicalHead;
|
||||
_sector->logicalSector = _hardSectorId;
|
||||
_sector->logicalTrack = _sector->physicalTrack;
|
||||
_sector->logicalCylinder = _ltl->logicalCylinder;
|
||||
|
||||
if (headerSize == NORTHSTAR_HEADER_SIZE_DD)
|
||||
{
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
#include "lib/globals.h"
|
||||
#include "northstar.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "arch/northstar/northstar.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "lib/image.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "lib/encoders/encoders.pb.h"
|
||||
|
||||
#define GAP_FILL_SIZE_SD 30
|
||||
@@ -129,7 +129,7 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
std::unique_ptr<Fluxmap> encode(std::shared_ptr<const TrackInfo>& trackInfo,
|
||||
std::unique_ptr<Fluxmap> encode(const LogicalTrackLayout& ltl,
|
||||
const std::vector<std::shared_ptr<const Sector>>& sectors,
|
||||
const Image& image) override
|
||||
{
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
syntax = "proto2";
|
||||
|
||||
import "lib/common.proto";
|
||||
import "lib/config/common.proto";
|
||||
|
||||
message NorthstarDecoderProto {}
|
||||
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "rolandd20.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "arch/rolandd20/rolandd20.h"
|
||||
#include <string.h>
|
||||
|
||||
/* Sector header record:
|
||||
|
||||
@@ -1,12 +1,14 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "protocol.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/sector.h"
|
||||
#include "smaky6.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/data/layout.h"
|
||||
#include "arch/smaky6/smaky6.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "fmt/format.h"
|
||||
#include "lib/decoders/decoders.pb.h"
|
||||
#include <string.h>
|
||||
@@ -128,11 +130,11 @@ public:
|
||||
uint8_t wantedChecksum = br.read_8();
|
||||
uint8_t gotChecksum = sumBytes(data) & 0xff;
|
||||
|
||||
if (track != _sector->physicalTrack)
|
||||
if (track != _ltl->logicalCylinder)
|
||||
return;
|
||||
|
||||
_sector->logicalTrack = _sector->physicalTrack;
|
||||
_sector->logicalSide = _sector->physicalSide;
|
||||
_sector->logicalCylinder = _ltl->physicalCylinder;
|
||||
_sector->logicalHead = _ltl->logicalHead;
|
||||
_sector->logicalSector = _sectorId;
|
||||
|
||||
_sector->data = data;
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
syntax = "proto2";
|
||||
|
||||
import "lib/common.proto";
|
||||
|
||||
message Smaky6DecoderProto {}
|
||||
|
||||
|
||||
81
arch/tartu/decoder.cc
Normal file
81
arch/tartu/decoder.cc
Normal file
@@ -0,0 +1,81 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/config/config.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "arch/tartu/tartu.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include <string.h>
|
||||
|
||||
constexpr uint64_t HEADER_BITS = 0xaaaaaaaa44895554LL;
|
||||
constexpr uint64_t DATA_BITS = 0xaaaaaaaa44895545LL;
|
||||
|
||||
static const FluxPattern HEADER_PATTERN(64, HEADER_BITS);
|
||||
static const FluxPattern DATA_PATTERN(64, DATA_BITS);
|
||||
|
||||
const FluxMatchers ANY_RECORD_PATTERN{&HEADER_PATTERN, &DATA_PATTERN};
|
||||
|
||||
class TartuDecoder : public Decoder
|
||||
{
|
||||
public:
|
||||
TartuDecoder(const DecoderProto& config):
|
||||
Decoder(config),
|
||||
_config(config.tartu())
|
||||
{
|
||||
}
|
||||
|
||||
void beginTrack() override {}
|
||||
|
||||
nanoseconds_t advanceToNextRecord() override
|
||||
{
|
||||
return seekToPattern(ANY_RECORD_PATTERN);
|
||||
}
|
||||
|
||||
void decodeSectorRecord() override
|
||||
{
|
||||
if (readRaw64() != HEADER_BITS)
|
||||
return;
|
||||
|
||||
auto bits = readRawBits(16 * 4);
|
||||
auto bytes = decodeFmMfm(bits).slice(0, 4);
|
||||
|
||||
ByteReader br(bytes);
|
||||
uint8_t track = br.read_8();
|
||||
_sector->logicalCylinder = track >> 1;
|
||||
_sector->logicalHead = track & 1;
|
||||
br.skip(1); /* seems always to be 1 */
|
||||
_sector->logicalSector = br.read_8();
|
||||
uint8_t wantChecksum = br.read_8();
|
||||
uint8_t gotChecksum = ~sumBytes(bytes.slice(0, 3));
|
||||
|
||||
if (wantChecksum == gotChecksum)
|
||||
_sector->status = Sector::DATA_MISSING;
|
||||
|
||||
_sector->status = Sector::DATA_MISSING;
|
||||
}
|
||||
|
||||
void decodeDataRecord() override
|
||||
{
|
||||
if (readRaw64() != DATA_BITS)
|
||||
return;
|
||||
|
||||
const auto& bits = readRawBits(129 * 16);
|
||||
const auto& bytes = decodeFmMfm(bits).slice(0, 129);
|
||||
_sector->data = bytes.slice(0, 128);
|
||||
|
||||
uint8_t wantChecksum = bytes.reader().seek(128).read_8();
|
||||
uint8_t gotChecksum = ~sumBytes(_sector->data);
|
||||
_sector->status =
|
||||
(wantChecksum == gotChecksum) ? Sector::OK : Sector::BAD_CHECKSUM;
|
||||
}
|
||||
|
||||
private:
|
||||
const TartuDecoderProto& _config;
|
||||
};
|
||||
|
||||
std::unique_ptr<Decoder> createTartuDecoder(const DecoderProto& config)
|
||||
{
|
||||
return std::unique_ptr<Decoder>(new TartuDecoder(config));
|
||||
}
|
||||
115
arch/tartu/encoder.cc
Normal file
115
arch/tartu/encoder.cc
Normal file
@@ -0,0 +1,115 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/config/config.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "arch/tartu/tartu.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include <string.h>
|
||||
|
||||
class TartuEncoder : public Encoder
|
||||
{
|
||||
public:
|
||||
TartuEncoder(const EncoderProto& config):
|
||||
Encoder(config),
|
||||
_config(config.tartu())
|
||||
{
|
||||
}
|
||||
|
||||
std::unique_ptr<Fluxmap> encode(const LogicalTrackLayout& ltl,
|
||||
const std::vector<std::shared_ptr<const Sector>>& sectors,
|
||||
const Image& image) override
|
||||
{
|
||||
_clockRateUs = _config.clock_period_us();
|
||||
int bitsPerRevolution =
|
||||
(_config.target_rotational_period_ms() * 1000.0) / _clockRateUs;
|
||||
|
||||
const auto& sector = *sectors.begin();
|
||||
_bits.resize(bitsPerRevolution);
|
||||
_cursor = 0;
|
||||
|
||||
writeFillerRawBitsUs(_config.gap1_us());
|
||||
bool first = true;
|
||||
for (const auto& sectorData : sectors)
|
||||
{
|
||||
if (!first)
|
||||
writeFillerRawBitsUs(_config.gap4_us());
|
||||
first = false;
|
||||
writeSector(sectorData);
|
||||
}
|
||||
|
||||
if (_cursor > _bits.size())
|
||||
error("track data overrun");
|
||||
writeFillerRawBitsUs(_config.target_rotational_period_ms() * 1000.0);
|
||||
|
||||
std::unique_ptr<Fluxmap> fluxmap(new Fluxmap);
|
||||
fluxmap->appendBits(_bits,
|
||||
calculatePhysicalClockPeriod(_clockRateUs * 1e3,
|
||||
_config.target_rotational_period_ms() * 1e6));
|
||||
return fluxmap;
|
||||
}
|
||||
|
||||
private:
|
||||
void writeBytes(const Bytes& bytes)
|
||||
{
|
||||
encodeMfm(_bits, _cursor, bytes, _lastBit);
|
||||
}
|
||||
|
||||
void writeRawBits(uint64_t data, int width)
|
||||
{
|
||||
_cursor += width;
|
||||
_lastBit = data & 1;
|
||||
for (int i = 0; i < width; i++)
|
||||
{
|
||||
unsigned pos = _cursor - i - 1;
|
||||
if (pos < _bits.size())
|
||||
_bits[pos] = data & 1;
|
||||
data >>= 1;
|
||||
}
|
||||
}
|
||||
|
||||
void writeFillerRawBitsUs(double us)
|
||||
{
|
||||
unsigned count = (us / _clockRateUs) / 2;
|
||||
for (int i = 0; i < count; i++)
|
||||
writeRawBits(0b10, 2);
|
||||
};
|
||||
|
||||
void writeSector(const std::shared_ptr<const Sector>& sectorData)
|
||||
{
|
||||
writeRawBits(_config.header_marker(), 64);
|
||||
{
|
||||
Bytes bytes;
|
||||
ByteWriter bw(bytes);
|
||||
bw.write_8(
|
||||
(sectorData->logicalCylinder << 1) | sectorData->logicalHead);
|
||||
bw.write_8(1);
|
||||
bw.write_8(sectorData->logicalSector);
|
||||
bw.write_8(~sumBytes(bytes.slice(0, 3)));
|
||||
writeBytes(bytes);
|
||||
}
|
||||
|
||||
writeFillerRawBitsUs(_config.gap3_us());
|
||||
writeRawBits(_config.data_marker(), 64);
|
||||
{
|
||||
Bytes bytes;
|
||||
ByteWriter bw(bytes);
|
||||
bw.append(sectorData->data);
|
||||
bw.write_8(~sumBytes(bytes.slice(0, sectorData->data.size())));
|
||||
writeBytes(bytes);
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
const TartuEncoderProto& _config;
|
||||
double _clockRateUs;
|
||||
std::vector<bool> _bits;
|
||||
unsigned _cursor;
|
||||
bool _lastBit;
|
||||
};
|
||||
|
||||
std::unique_ptr<Encoder> createTartuEncoder(const EncoderProto& config)
|
||||
{
|
||||
return std::unique_ptr<Encoder>(new TartuEncoder(config));
|
||||
}
|
||||
7
arch/tartu/tartu.h
Normal file
7
arch/tartu/tartu.h
Normal file
@@ -0,0 +1,7 @@
|
||||
#ifndef TARTU_H
|
||||
#define TARTU_H
|
||||
|
||||
extern std::unique_ptr<Decoder> createTartuDecoder(const DecoderProto& config);
|
||||
extern std::unique_ptr<Encoder> createTartuEncoder(const EncoderProto& config);
|
||||
|
||||
#endif
|
||||
27
arch/tartu/tartu.proto
Normal file
27
arch/tartu/tartu.proto
Normal file
@@ -0,0 +1,27 @@
|
||||
syntax = "proto2";
|
||||
|
||||
import "lib/config/common.proto";
|
||||
|
||||
message TartuDecoderProto {}
|
||||
|
||||
message TartuEncoderProto {
|
||||
optional double clock_period_us = 1
|
||||
[ default = 2.0, (help) = "clock rate on the real device (for MFM)" ];
|
||||
optional double target_rotational_period_ms = 2
|
||||
[ default=200, (help) = "rotational period of target disk" ];
|
||||
optional double gap1_us = 3
|
||||
[ default = 1200,
|
||||
(help) = "size of gap 1 (the post-index gap)" ];
|
||||
optional double gap3_us = 4
|
||||
[ default = 150,
|
||||
(help) = "size of gap 3 (the pre-data gap)" ];
|
||||
optional double gap4_us = 5
|
||||
[ default = 180,
|
||||
(help) = "size of gap 4 (the post-data or format gap)" ];
|
||||
optional uint64 header_marker = 6
|
||||
[ default = 0xaaaaaaaa44895554,
|
||||
(help) = "64-bit raw bit pattern of header record marker" ];
|
||||
optional uint64 data_marker = 7
|
||||
[ default = 0xaaaaaaaa44895545,
|
||||
(help) = "64-bit raw bit pattern of data record marker" ];
|
||||
}
|
||||
@@ -1,13 +1,14 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "arch/tids990/tids990.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include <string.h>
|
||||
#include <fmt/format.h>
|
||||
#include "fmt/format.h"
|
||||
|
||||
/* The Texas Instruments DS990 uses MFM with a scheme similar to a simplified
|
||||
* version of the IBM record scheme (it's actually easier to parse than IBM).
|
||||
@@ -63,8 +64,8 @@ public:
|
||||
uint16_t gotChecksum =
|
||||
crc16(CCITT_POLY, bytes.slice(1, TIDS990_SECTOR_RECORD_SIZE - 3));
|
||||
|
||||
_sector->logicalSide = br.read_8() >> 3;
|
||||
_sector->logicalTrack = br.read_8();
|
||||
_sector->logicalHead = br.read_8() >> 3;
|
||||
_sector->logicalCylinder = br.read_8();
|
||||
br.read_8(); /* number of sectors per track */
|
||||
_sector->logicalSector = br.read_8();
|
||||
br.read_be16(); /* sector size */
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "tids990.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/readerwriter.h"
|
||||
#include "lib/image.h"
|
||||
#include "arch/tids990/tids990.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "arch/tids990/tids990.pb.h"
|
||||
#include "lib/encoders/encoders.pb.h"
|
||||
#include <fmt/format.h>
|
||||
#include "fmt/format.h"
|
||||
|
||||
static int charToInt(char c)
|
||||
{
|
||||
@@ -60,7 +59,7 @@ private:
|
||||
}
|
||||
|
||||
public:
|
||||
std::unique_ptr<Fluxmap> encode(std::shared_ptr<const TrackInfo>& trackInfo,
|
||||
std::unique_ptr<Fluxmap> encode(const LogicalTrackLayout& ltl,
|
||||
const std::vector<std::shared_ptr<const Sector>>& sectors,
|
||||
const Image& image) override
|
||||
{
|
||||
@@ -96,8 +95,8 @@ public:
|
||||
|
||||
writeBytes(12, 0x55);
|
||||
bw.write_8(am1Unencoded);
|
||||
bw.write_8(sectorData->logicalSide << 3);
|
||||
bw.write_8(sectorData->logicalTrack);
|
||||
bw.write_8(sectorData->logicalHead << 3);
|
||||
bw.write_8(sectorData->logicalCylinder);
|
||||
bw.write_8(_config.sector_count());
|
||||
bw.write_8(sectorData->logicalSector);
|
||||
bw.write_be16(sectorData->data.size());
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
syntax = "proto2";
|
||||
|
||||
import "lib/common.proto";
|
||||
import "lib/config/common.proto";
|
||||
|
||||
message Tids990DecoderProto {}
|
||||
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "protocol.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/sector.h"
|
||||
#include "victor9k.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "arch/victor9k/victor9k.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "fmt/format.h"
|
||||
#include <string.h>
|
||||
#include <algorithm>
|
||||
@@ -79,11 +80,11 @@ public:
|
||||
_sector->logicalSector = bytes[1];
|
||||
uint8_t gotChecksum = bytes[2];
|
||||
|
||||
_sector->logicalTrack = rawTrack & 0x7f;
|
||||
_sector->logicalSide = rawTrack >> 7;
|
||||
_sector->logicalCylinder = rawTrack & 0x7f;
|
||||
_sector->logicalHead = rawTrack >> 7;
|
||||
uint8_t wantChecksum = bytes[0] + bytes[1];
|
||||
if ((_sector->logicalSector > 20) || (_sector->logicalTrack > 85) ||
|
||||
(_sector->logicalSide > 1))
|
||||
if ((_sector->logicalSector > 20) || (_sector->logicalCylinder > 85) ||
|
||||
(_sector->logicalHead > 1))
|
||||
return;
|
||||
|
||||
if (wantChecksum == gotChecksum)
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/core/utils.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "victor9k.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/readerwriter.h"
|
||||
#include "lib/image.h"
|
||||
#include "arch/victor9k/victor9k.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "fmt/format.h"
|
||||
#include "arch/victor9k/victor9k.pb.h"
|
||||
#include "lib/encoders/encoders.pb.h"
|
||||
#include "lib/layout.h"
|
||||
#include "lib/data/layout.h"
|
||||
#include <ctype.h>
|
||||
#include "lib/bytes.h"
|
||||
#include "lib/core/bytes.h"
|
||||
|
||||
static bool lastBit;
|
||||
|
||||
@@ -112,7 +112,7 @@ static void write_sector(std::vector<bool>& bits,
|
||||
write_one_bits(bits, cursor, trackdata.pre_header_sync_bits());
|
||||
write_bits(bits, cursor, VICTOR9K_SECTOR_RECORD, 10);
|
||||
|
||||
uint8_t encodedTrack = sector.logicalTrack | (sector.logicalSide << 7);
|
||||
uint8_t encodedTrack = sector.logicalCylinder | (sector.logicalHead << 7);
|
||||
uint8_t encodedSector = sector.logicalSector;
|
||||
write_bytes(bits,
|
||||
cursor,
|
||||
@@ -164,13 +164,12 @@ private:
|
||||
}
|
||||
|
||||
public:
|
||||
std::unique_ptr<Fluxmap> encode(std::shared_ptr<const TrackInfo>& trackInfo,
|
||||
std::unique_ptr<Fluxmap> encode(const LogicalTrackLayout& ltl,
|
||||
const std::vector<std::shared_ptr<const Sector>>& sectors,
|
||||
const Image& image) override
|
||||
{
|
||||
Victor9kEncoderProto::TrackdataProto trackdata;
|
||||
getTrackFormat(
|
||||
trackdata, trackInfo->logicalTrack, trackInfo->logicalSide);
|
||||
getTrackFormat(trackdata, ltl.logicalCylinder, ltl.logicalHead);
|
||||
|
||||
unsigned bitsPerRevolution = (trackdata.rotational_period_ms() * 1e3) /
|
||||
trackdata.clock_period_us();
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
syntax = "proto2";
|
||||
|
||||
import "lib/common.proto";
|
||||
import "lib/config/common.proto";
|
||||
|
||||
message Victor9kDecoderProto {}
|
||||
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "protocol.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/sector.h"
|
||||
#include "zilogmcz.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "arch/zilogmcz/zilogmcz.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "fmt/format.h"
|
||||
#include <string.h>
|
||||
#include <algorithm>
|
||||
@@ -33,11 +34,11 @@ public:
|
||||
ByteReader br(bytes);
|
||||
|
||||
_sector->logicalSector = br.read_8() & 0x1f;
|
||||
_sector->logicalSide = 0;
|
||||
_sector->logicalTrack = br.read_8() & 0x7f;
|
||||
_sector->logicalHead = 0;
|
||||
_sector->logicalCylinder = br.read_8() & 0x7f;
|
||||
if (_sector->logicalSector > 31)
|
||||
return;
|
||||
if (_sector->logicalTrack > 80)
|
||||
if (_sector->logicalCylinder > 80)
|
||||
return;
|
||||
|
||||
_sector->data = br.read(132);
|
||||
|
||||
251
build.py
251
build.py
@@ -7,221 +7,19 @@ from glob import glob
|
||||
import config
|
||||
import re
|
||||
|
||||
# Hack for building on Fedora/WSL; executables get the .exe extension,
|
||||
# but the build system detects it as Linux.
|
||||
import build.toolchain
|
||||
|
||||
toolchain.Toolchain.EXE = "$(EXT)"
|
||||
|
||||
package(name="protobuf_lib", package="protobuf")
|
||||
package(name="z_lib", package="zlib")
|
||||
package(name="fmt_lib", package="fmt")
|
||||
package(name="fmt_lib", package="fmt", fallback="dep/fmt")
|
||||
package(name="sqlite3_lib", package="sqlite3")
|
||||
|
||||
clibrary(name="protocol", hdrs={"protocol.h": "./protocol.h"})
|
||||
|
||||
proto(name="fl2_proto", srcs=["lib/fl2.proto"])
|
||||
protocc(name="fl2_proto_lib", srcs=["+fl2_proto"])
|
||||
|
||||
cxxlibrary(
|
||||
name="lib",
|
||||
srcs=[
|
||||
"./lib/bitmap.cc",
|
||||
"./lib/bytes.cc",
|
||||
"./lib/config.cc",
|
||||
"./lib/crc.cc",
|
||||
"./lib/csvreader.cc",
|
||||
"./lib/decoders/decoders.cc",
|
||||
"./lib/decoders/fluxdecoder.cc",
|
||||
"./lib/decoders/fluxmapreader.cc",
|
||||
"./lib/decoders/fmmfm.cc",
|
||||
"./lib/encoders/encoders.cc",
|
||||
"./lib/fl2.cc",
|
||||
"./lib/flags.cc",
|
||||
"./lib/fluxmap.cc",
|
||||
"./lib/fluxsink/a2rfluxsink.cc",
|
||||
"./lib/fluxsink/aufluxsink.cc",
|
||||
"./lib/fluxsink/fl2fluxsink.cc",
|
||||
"./lib/fluxsink/fluxsink.cc",
|
||||
"./lib/fluxsink/hardwarefluxsink.cc",
|
||||
"./lib/fluxsink/scpfluxsink.cc",
|
||||
"./lib/fluxsink/vcdfluxsink.cc",
|
||||
"./lib/fluxsource/a2rfluxsource.cc",
|
||||
"./lib/fluxsource/catweasel.cc",
|
||||
"./lib/fluxsource/cwffluxsource.cc",
|
||||
"./lib/fluxsource/dmkfluxsource.cc",
|
||||
"./lib/fluxsource/erasefluxsource.cc",
|
||||
"./lib/fluxsource/fl2fluxsource.cc",
|
||||
"./lib/fluxsource/fluxsource.cc",
|
||||
"./lib/fluxsource/flx.cc",
|
||||
"./lib/fluxsource/flxfluxsource.cc",
|
||||
"./lib/fluxsource/hardwarefluxsource.cc",
|
||||
"./lib/fluxsource/kryoflux.cc",
|
||||
"./lib/fluxsource/kryofluxfluxsource.cc",
|
||||
"./lib/fluxsource/memoryfluxsource.cc",
|
||||
"./lib/fluxsource/scpfluxsource.cc",
|
||||
"./lib/fluxsource/testpatternfluxsource.cc",
|
||||
"./lib/globals.cc",
|
||||
"./lib/hexdump.cc",
|
||||
"./lib/image.cc",
|
||||
"./lib/imagereader/d64imagereader.cc",
|
||||
"./lib/imagereader/d88imagereader.cc",
|
||||
"./lib/imagereader/dimimagereader.cc",
|
||||
"./lib/imagereader/diskcopyimagereader.cc",
|
||||
"./lib/imagereader/fdiimagereader.cc",
|
||||
"./lib/imagereader/imagereader.cc",
|
||||
"./lib/imagereader/imdimagereader.cc",
|
||||
"./lib/imagereader/imgimagereader.cc",
|
||||
"./lib/imagereader/jv3imagereader.cc",
|
||||
"./lib/imagereader/nfdimagereader.cc",
|
||||
"./lib/imagereader/nsiimagereader.cc",
|
||||
"./lib/imagereader/td0imagereader.cc",
|
||||
"./lib/imagewriter/d64imagewriter.cc",
|
||||
"./lib/imagewriter/d88imagewriter.cc",
|
||||
"./lib/imagewriter/diskcopyimagewriter.cc",
|
||||
"./lib/imagewriter/imagewriter.cc",
|
||||
"./lib/imagewriter/imdimagewriter.cc",
|
||||
"./lib/imagewriter/imgimagewriter.cc",
|
||||
"./lib/imagewriter/ldbsimagewriter.cc",
|
||||
"./lib/imagewriter/nsiimagewriter.cc",
|
||||
"./lib/imagewriter/rawimagewriter.cc",
|
||||
"./lib/layout.cc",
|
||||
"./lib/ldbs.cc",
|
||||
"./lib/logger.cc",
|
||||
"./lib/proto.cc",
|
||||
"./lib/readerwriter.cc",
|
||||
"./lib/sector.cc",
|
||||
"./lib/usb/fluxengineusb.cc",
|
||||
"./lib/usb/greaseweazle.cc",
|
||||
"./lib/usb/greaseweazleusb.cc",
|
||||
"./lib/usb/serial.cc",
|
||||
"./lib/usb/usb.cc",
|
||||
"./lib/usb/usbfinder.cc",
|
||||
"./lib/utils.cc",
|
||||
"./lib/vfs/acorndfs.cc",
|
||||
"./lib/vfs/amigaffs.cc",
|
||||
"./lib/vfs/appledos.cc",
|
||||
"./lib/vfs/applesingle.cc",
|
||||
"./lib/vfs/brother120fs.cc",
|
||||
"./lib/vfs/cbmfs.cc",
|
||||
"./lib/vfs/cpmfs.cc",
|
||||
"./lib/vfs/fatfs.cc",
|
||||
"./lib/vfs/fluxsectorinterface.cc",
|
||||
"./lib/vfs/imagesectorinterface.cc",
|
||||
"./lib/vfs/lif.cc",
|
||||
"./lib/vfs/machfs.cc",
|
||||
"./lib/vfs/microdos.cc",
|
||||
"./lib/vfs/philefs.cc",
|
||||
"./lib/vfs/prodos.cc",
|
||||
"./lib/vfs/roland.cc",
|
||||
"./lib/vfs/smaky6fs.cc",
|
||||
"./lib/vfs/vfs.cc",
|
||||
"./lib/vfs/zdos.cc",
|
||||
"./arch/aeslanier/decoder.cc",
|
||||
"./arch/agat/agat.cc",
|
||||
"./arch/agat/decoder.cc",
|
||||
"./arch/agat/encoder.cc",
|
||||
"./arch/amiga/amiga.cc",
|
||||
"./arch/amiga/decoder.cc",
|
||||
"./arch/amiga/encoder.cc",
|
||||
"./arch/apple2/decoder.cc",
|
||||
"./arch/apple2/encoder.cc",
|
||||
"./arch/brother/decoder.cc",
|
||||
"./arch/brother/encoder.cc",
|
||||
"./arch/c64/c64.cc",
|
||||
"./arch/c64/decoder.cc",
|
||||
"./arch/c64/encoder.cc",
|
||||
"./arch/f85/decoder.cc",
|
||||
"./arch/fb100/decoder.cc",
|
||||
"./arch/ibm/decoder.cc",
|
||||
"./arch/ibm/encoder.cc",
|
||||
"./arch/macintosh/decoder.cc",
|
||||
"./arch/macintosh/encoder.cc",
|
||||
"./arch/micropolis/decoder.cc",
|
||||
"./arch/micropolis/encoder.cc",
|
||||
"./arch/mx/decoder.cc",
|
||||
"./arch/northstar/decoder.cc",
|
||||
"./arch/northstar/encoder.cc",
|
||||
"./arch/rolandd20/decoder.cc",
|
||||
"./arch/smaky6/decoder.cc",
|
||||
"./arch/tids990/decoder.cc",
|
||||
"./arch/tids990/encoder.cc",
|
||||
"./arch/victor9k/decoder.cc",
|
||||
"./arch/victor9k/encoder.cc",
|
||||
"./arch/zilogmcz/decoder.cc",
|
||||
],
|
||||
hdrs={
|
||||
"arch/ibm/ibm.h": "./arch/ibm/ibm.h",
|
||||
"arch/apple2/data_gcr.h": "./arch/apple2/data_gcr.h",
|
||||
"arch/apple2/apple2.h": "./arch/apple2/apple2.h",
|
||||
"arch/smaky6/smaky6.h": "./arch/smaky6/smaky6.h",
|
||||
"arch/tids990/tids990.h": "./arch/tids990/tids990.h",
|
||||
"arch/zilogmcz/zilogmcz.h": "./arch/zilogmcz/zilogmcz.h",
|
||||
"arch/amiga/amiga.h": "./arch/amiga/amiga.h",
|
||||
"arch/f85/data_gcr.h": "./arch/f85/data_gcr.h",
|
||||
"arch/f85/f85.h": "./arch/f85/f85.h",
|
||||
"arch/mx/mx.h": "./arch/mx/mx.h",
|
||||
"arch/aeslanier/aeslanier.h": "./arch/aeslanier/aeslanier.h",
|
||||
"arch/northstar/northstar.h": "./arch/northstar/northstar.h",
|
||||
"arch/brother/data_gcr.h": "./arch/brother/data_gcr.h",
|
||||
"arch/brother/brother.h": "./arch/brother/brother.h",
|
||||
"arch/brother/header_gcr.h": "./arch/brother/header_gcr.h",
|
||||
"arch/macintosh/data_gcr.h": "./arch/macintosh/data_gcr.h",
|
||||
"arch/macintosh/macintosh.h": "./arch/macintosh/macintosh.h",
|
||||
"arch/agat/agat.h": "./arch/agat/agat.h",
|
||||
"arch/fb100/fb100.h": "./arch/fb100/fb100.h",
|
||||
"arch/victor9k/data_gcr.h": "./arch/victor9k/data_gcr.h",
|
||||
"arch/victor9k/victor9k.h": "./arch/victor9k/victor9k.h",
|
||||
"arch/rolandd20/rolandd20.h": "./arch/rolandd20/rolandd20.h",
|
||||
"arch/micropolis/micropolis.h": "./arch/micropolis/micropolis.h",
|
||||
"arch/c64/data_gcr.h": "./arch/c64/data_gcr.h",
|
||||
"arch/c64/c64.h": "./arch/c64/c64.h",
|
||||
"lib/a2r.h": "./lib/a2r.h",
|
||||
"lib/bitmap.h": "./lib/bitmap.h",
|
||||
"lib/bytes.h": "./lib/bytes.h",
|
||||
"lib/config.h": "./lib/config.h",
|
||||
"lib/crc.h": "./lib/crc.h",
|
||||
"lib/csvreader.h": "./lib/csvreader.h",
|
||||
"lib/decoders/decoders.h": "./lib/decoders/decoders.h",
|
||||
"lib/decoders/fluxdecoder.h": "./lib/decoders/fluxdecoder.h",
|
||||
"lib/decoders/fluxmapreader.h": "./lib/decoders/fluxmapreader.h",
|
||||
"lib/decoders/rawbits.h": "./lib/decoders/rawbits.h",
|
||||
"lib/encoders/encoders.h": "./lib/encoders/encoders.h",
|
||||
"lib/scp.h": "./lib/scp.h",
|
||||
"lib/fl2.h": "./lib/fl2.h",
|
||||
"lib/flags.h": "./lib/flags.h",
|
||||
"lib/flux.h": "./lib/flux.h",
|
||||
"lib/fluxmap.h": "./lib/fluxmap.h",
|
||||
"lib/fluxsink/fluxsink.h": "./lib/fluxsink/fluxsink.h",
|
||||
"lib/fluxsource/catweasel.h": "lib/fluxsource/catweasel.h",
|
||||
"lib/fluxsource/fluxsource.h": "lib/fluxsource/fluxsource.h",
|
||||
"lib/fluxsource/flx.h": "lib/fluxsource/flx.h",
|
||||
"lib/fluxsource/kryoflux.h": "lib/fluxsource/kryoflux.h",
|
||||
"lib/globals.h": "./lib/globals.h",
|
||||
"lib/image.h": "./lib/image.h",
|
||||
"lib/imagereader/imagereader.h": "./lib/imagereader/imagereader.h",
|
||||
"lib/imagewriter/imagewriter.h": "./lib/imagewriter/imagewriter.h",
|
||||
"lib/layout.h": "./lib/layout.h",
|
||||
"lib/ldbs.h": "./lib/ldbs.h",
|
||||
"lib/logger.h": "./lib/logger.h",
|
||||
"lib/proto.h": "./lib/proto.h",
|
||||
"lib/readerwriter.h": "./lib/readerwriter.h",
|
||||
"lib/sector.h": "./lib/sector.h",
|
||||
"lib/usb/greaseweazle.h": "./lib/usb/greaseweazle.h",
|
||||
"lib/usb/usb.h": "./lib/usb/usb.h",
|
||||
"lib/usb/usbfinder.h": "./lib/usb/usbfinder.h",
|
||||
"lib/utils.h": "./lib/utils.h",
|
||||
"lib/vfs/applesingle.h": "./lib/vfs/applesingle.h",
|
||||
"lib/vfs/sectorinterface.h": "./lib/vfs/sectorinterface.h",
|
||||
"lib/vfs/vfs.h": "./lib/vfs/vfs.h",
|
||||
},
|
||||
deps=[
|
||||
"+fl2_proto_lib",
|
||||
"+protocol",
|
||||
"lib+config_proto_lib",
|
||||
"dep/adflib",
|
||||
"dep/agg",
|
||||
"dep/fatfs",
|
||||
"dep/hfsutils",
|
||||
"dep/libusbp",
|
||||
"dep/stb",
|
||||
],
|
||||
)
|
||||
|
||||
corpustests = []
|
||||
if not glob("../fluxengine-testdata/data"):
|
||||
print("fluxengine-testdata not found; skipping corpus tests")
|
||||
@@ -230,7 +28,7 @@ else:
|
||||
("acorndfs", "", "--200"),
|
||||
("agat", "", ""),
|
||||
("amiga", "", ""),
|
||||
("apple2", "", "--140 40track_drive"),
|
||||
("apple2", "", "--140 --drivetype=40"),
|
||||
("atarist", "", "--360"),
|
||||
("atarist", "", "--370"),
|
||||
("atarist", "", "--400"),
|
||||
@@ -240,17 +38,17 @@ else:
|
||||
("atarist", "", "--800"),
|
||||
("atarist", "", "--820"),
|
||||
("bk", "", ""),
|
||||
("brother", "", "--120 40track_drive"),
|
||||
("brother", "", "--120 --drivetype=40"),
|
||||
("brother", "", "--240"),
|
||||
(
|
||||
"commodore",
|
||||
"scripts/commodore1541_test.textpb",
|
||||
"--171 40track_drive",
|
||||
"--171 --drivetype=40",
|
||||
),
|
||||
(
|
||||
"commodore",
|
||||
"scripts/commodore1541_test.textpb",
|
||||
"--192 40track_drive",
|
||||
"--192 --drivetype=40",
|
||||
),
|
||||
("commodore", "", "--800"),
|
||||
("commodore", "", "--1620"),
|
||||
@@ -262,16 +60,18 @@ else:
|
||||
("ibm", "", "--1232"),
|
||||
("ibm", "", "--1440"),
|
||||
("ibm", "", "--1680"),
|
||||
("ibm", "", "--180 40track_drive"),
|
||||
("ibm", "", "--160 40track_drive"),
|
||||
("ibm", "", "--320 40track_drive"),
|
||||
("ibm", "", "--360 40track_drive"),
|
||||
("ibm", "", "--180 --drivetype=40"),
|
||||
("ibm", "", "--160 --drivetype=40"),
|
||||
("ibm", "", "--320 --drivetype=40"),
|
||||
("ibm", "", "--360 --drivetype=40"),
|
||||
("ibm", "", "--720_96"),
|
||||
("ibm", "", "--720_135"),
|
||||
("mac", "scripts/mac400_test.textpb", "--400"),
|
||||
("mac", "scripts/mac800_test.textpb", "--800"),
|
||||
("n88basic", "", ""),
|
||||
("rx50", "", ""),
|
||||
("tartu", "", "--390 --drivetype=40"),
|
||||
("tartu", "", "--780"),
|
||||
("tids990", "", ""),
|
||||
("victor9k", "", "--612"),
|
||||
("victor9k", "", "--1224"),
|
||||
@@ -285,15 +85,15 @@ else:
|
||||
ins=["src+fluxengine"],
|
||||
deps=["scripts/encodedecodetest.sh"],
|
||||
commands=[
|
||||
"{deps[0]} "
|
||||
"$[deps[0]] "
|
||||
+ c[0]
|
||||
+ " "
|
||||
+ format
|
||||
+ " {ins[0]} '"
|
||||
+ " $[ins[0]] '"
|
||||
+ c[1]
|
||||
+ "' '"
|
||||
+ c[2]
|
||||
+ "' $(dir {outs[0]}) > /dev/null"
|
||||
+ "' $[dirname(filenameof(outs[0]))] > /dev/null"
|
||||
],
|
||||
label="CORPUSTEST",
|
||||
)
|
||||
@@ -304,11 +104,18 @@ export(
|
||||
name="all",
|
||||
items={
|
||||
"fluxengine$(EXT)": "src+fluxengine",
|
||||
"fluxengine-gui$(EXT)": "src/gui",
|
||||
"fluxengine-gui$(EXT)": "src/gui2",
|
||||
"brother120tool$(EXT)": "tools+brother120tool",
|
||||
"brother240tool$(EXT)": "tools+brother240tool",
|
||||
"upgrade-flux-file$(EXT)": "tools+upgrade-flux-file",
|
||||
}
|
||||
| ({"FluxEngine.pkg": "src/gui+fluxengine_pkg"} if config.osx else {}),
|
||||
| (
|
||||
{
|
||||
"FluxEngine.pkg": "src/gui2+fluxengine_pkg",
|
||||
"FluxEngine.app.zip": "src/gui2+fluxengine_app_zip",
|
||||
}
|
||||
if config.osx
|
||||
else {}
|
||||
),
|
||||
deps=["tests", "src/formats+docs", "scripts+mkdocindex"] + corpustests,
|
||||
)
|
||||
|
||||
49
build/_sandbox.py
Normal file
49
build/_sandbox.py
Normal file
@@ -0,0 +1,49 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
from os.path import *
|
||||
import argparse
|
||||
import os
|
||||
import shutil
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("-s", "--sandbox")
|
||||
parser.add_argument("-v", "--verbose", action="store_true")
|
||||
parser.add_argument("-l", "--link", action="store_true")
|
||||
parser.add_argument("-e", "--export", action="store_true")
|
||||
parser.add_argument("files", nargs="*")
|
||||
args = parser.parse_args()
|
||||
|
||||
assert args.sandbox, "You must specify a sandbox directory"
|
||||
assert args.link ^ args.export, "You can't link and export at the same time"
|
||||
|
||||
if args.link:
|
||||
os.makedirs(args.sandbox, exist_ok=True)
|
||||
for f in args.files:
|
||||
sf = join(args.sandbox, f)
|
||||
if args.verbose:
|
||||
print("link", sf)
|
||||
os.makedirs(dirname(sf), exist_ok=True)
|
||||
try:
|
||||
os.symlink(abspath(f), sf)
|
||||
except PermissionError:
|
||||
shutil.copy(f, sf)
|
||||
|
||||
if args.export:
|
||||
for f in args.files:
|
||||
sf = join(args.sandbox, f)
|
||||
if args.verbose:
|
||||
print("export", sf)
|
||||
df = dirname(f)
|
||||
if df:
|
||||
os.makedirs(df, exist_ok=True)
|
||||
|
||||
try:
|
||||
os.remove(f)
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
os.rename(sf, f)
|
||||
|
||||
|
||||
main()
|
||||
25
build/_zip.py
Executable file
25
build/_zip.py
Executable file
@@ -0,0 +1,25 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
from os.path import *
|
||||
import argparse
|
||||
import os
|
||||
from zipfile import ZipFile
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("-z", "--zipfile")
|
||||
parser.add_argument("-v", "--verbose", action="store_true")
|
||||
parser.add_argument("-f", "--file", nargs=2, action="append")
|
||||
args = parser.parse_args()
|
||||
|
||||
assert args.zipfile, "You must specify a zipfile to create"
|
||||
|
||||
with ZipFile(args.zipfile, mode="w") as zf:
|
||||
for zipname, filename in args.file:
|
||||
if args.verbose:
|
||||
print(filename, "->", zipname)
|
||||
zf.write(filename, arcname=zipname)
|
||||
|
||||
|
||||
main()
|
||||
111
build/ab.mk
111
build/ab.mk
@@ -1,24 +1,99 @@
|
||||
ifeq ($(findstring 4.,$(MAKE_VERSION)),)
|
||||
MAKENOT4 := $(if $(findstring 3.9999, $(lastword $(sort 3.9999 $(MAKE_VERSION)))),yes,no)
|
||||
|
||||
ifeq ($(MAKENOT4),yes)
|
||||
$(error You need GNU Make 4.x for this (if you're on OSX, use gmake).)
|
||||
endif
|
||||
|
||||
OBJ ?= .obj
|
||||
PYTHON ?= python3
|
||||
CC ?= gcc
|
||||
CXX ?= g++
|
||||
AR ?= ar
|
||||
CFLAGS ?= -g -Og
|
||||
LDFLAGS ?= -g
|
||||
hide = @
|
||||
PKG_CONFIG ?= pkg-config
|
||||
HOST_PKG_CONFIG ?= $(PKG_CONFIG)
|
||||
ECHO ?= echo
|
||||
CP ?= cp
|
||||
|
||||
HOSTCC ?= gcc
|
||||
HOSTCXX ?= g++
|
||||
HOSTAR ?= ar
|
||||
HOSTCFLAGS ?= -g -Og
|
||||
HOSTCXXFLAGS ?= $(HOSTCFLAGS)
|
||||
HOSTLDFLAGS ?= -g
|
||||
|
||||
CC ?= $(HOSTCC)
|
||||
CXX ?= $(HOSTCXX)
|
||||
AR ?= $(HOSTAR)
|
||||
CFLAGS ?= $(HOSTCFLAGS)
|
||||
CXXFLAGS ?= $(CFLAGS)
|
||||
LDFLAGS ?= $(HOSTLDFLAGS)
|
||||
|
||||
NINJA ?= ninja
|
||||
|
||||
ifdef VERBOSE
|
||||
hide =
|
||||
else
|
||||
ifdef V
|
||||
hide =
|
||||
else
|
||||
hide = @
|
||||
endif
|
||||
endif
|
||||
|
||||
# If enabled, shows a nice display of how far through the build you are. This
|
||||
# doubles Make startup time. Also, on Make 4.3 and above, rebuilds don't show
|
||||
# correct progress information.
|
||||
AB_ENABLE_PROGRESS_INFO ?= true
|
||||
|
||||
WINDOWS := no
|
||||
OSX := no
|
||||
LINUX := no
|
||||
ifeq ($(OS),Windows_NT)
|
||||
WINDOWS := yes
|
||||
else
|
||||
UNAME_S := $(shell uname -s)
|
||||
ifeq ($(UNAME_S),Linux)
|
||||
LINUX := yes
|
||||
endif
|
||||
ifeq ($(UNAME_S),Darwin)
|
||||
OSX := yes
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(OS), Windows_NT)
|
||||
EXT ?= .exe
|
||||
endif
|
||||
EXT ?=
|
||||
|
||||
include $(OBJ)/build.mk
|
||||
CWD=$(shell pwd)
|
||||
|
||||
define newline
|
||||
|
||||
|
||||
endef
|
||||
|
||||
define check_for_command
|
||||
$(shell command -v $1 >/dev/null || (echo "Required command '$1' missing" >&2 && kill $$PPID))
|
||||
endef
|
||||
|
||||
$(call check_for_command,ninja)
|
||||
$(call check_for_command,cmp)
|
||||
$(call check_for_command,$(PYTHON))
|
||||
|
||||
pkg-config-hash = $(shell ($(PKG_CONFIG) --list-all && $(HOST_PKG_CONFIG) --list-all) | md5sum)
|
||||
build-files = $(shell find . -name .obj -prune -o \( -name 'build.py' -a -type f \) -print) $(wildcard build/*.py) $(wildcard config.py)
|
||||
build-file-timestamps = $(shell ls -l $(build-files) | md5sum)
|
||||
|
||||
# Wipe the build file (forcing a regeneration) if the make environment is different.
|
||||
# (Conveniently, this includes the pkg-config hash calculated above.)
|
||||
|
||||
ignored-variables = MAKE_RESTARTS .VARIABLES MAKECMDGOALS MAKEFLAGS MFLAGS PAGER _ \
|
||||
DESKTOP_STARTUP_ID XAUTHORITY ICEAUTHORITY SSH_AUTH_SOCK SESSION_MANAGER \
|
||||
INVOCATION_ID SYSTEMD_EXEC_PID MANAGER_PID SSH_AGENT_PID JOURNAL_STREAM \
|
||||
GPG_TTY WINDOWID MANAGERPID MAKE_TERMOUT MAKE_TERMERR OLDPWD
|
||||
$(shell mkdir -p $(OBJ))
|
||||
$(file >$(OBJ)/newvars.txt,$(foreach v,$(filter-out $(ignored-variables),$(.VARIABLES)),$(v)=$($(v))$(newline)))
|
||||
$(shell touch $(OBJ)/vars.txt)
|
||||
#$(shell diff -u $(OBJ)/vars.txt $(OBJ)/newvars.txt >&2)
|
||||
$(shell cmp -s $(OBJ)/newvars.txt $(OBJ)/vars.txt || (rm -f $(OBJ)/build.ninja && echo "Environment changed --- regenerating" >&2))
|
||||
$(shell mv $(OBJ)/newvars.txt $(OBJ)/vars.txt)
|
||||
|
||||
.PHONY: update-ab
|
||||
update-ab:
|
||||
@@ -30,13 +105,21 @@ update-ab:
|
||||
.PHONY: clean
|
||||
clean::
|
||||
@echo CLEAN
|
||||
$(hide) rm -rf $(OBJ) bin
|
||||
$(hide) rm -rf $(OBJ)
|
||||
|
||||
compile_commands.json: $(OBJ)/build.ninja
|
||||
+$(hide) $(NINJA) -f $(OBJ)/build.ninja -t compdb > $@
|
||||
|
||||
export PYTHONHASHSEED = 1
|
||||
build-files = $(shell find . -name 'build.py') build/*.py config.py
|
||||
$(OBJ)/build.mk: Makefile $(build-files)
|
||||
$(OBJ)/build.ninja $(OBJ)/build.targets &:
|
||||
@echo "AB"
|
||||
@mkdir -p $(OBJ)
|
||||
$(hide) $(PYTHON) -X pycache_prefix=$(OBJ) build/ab.py -t +all -o $@ \
|
||||
build.py || rm -f $@
|
||||
$(hide) $(PYTHON) -X pycache_prefix=$(OBJ)/__pycache__ build/ab.py \
|
||||
-o $(OBJ) build.py \
|
||||
-v $(OBJ)/vars.txt \
|
||||
|| (rm -f $@ && false)
|
||||
|
||||
include $(OBJ)/build.targets
|
||||
.PHONY: $(ninja-targets)
|
||||
.NOTPARALLEL:
|
||||
$(ninja-targets): $(OBJ)/build.ninja
|
||||
+$(hide) $(NINJA) -f $(OBJ)/build.ninja $@
|
||||
|
||||
2
build/ab.ninja
Normal file
2
build/ab.ninja
Normal file
@@ -0,0 +1,2 @@
|
||||
rule rule
|
||||
command = $command
|
||||
921
build/ab.py
921
build/ab.py
File diff suppressed because it is too large
Load Diff
579
build/c.py
579
build/c.py
@@ -1,30 +1,122 @@
|
||||
from os.path import basename, join
|
||||
from build.ab import (
|
||||
ABException,
|
||||
Rule,
|
||||
Targets,
|
||||
TargetsMap,
|
||||
filenameof,
|
||||
flatten,
|
||||
filenamesof,
|
||||
normalrule,
|
||||
stripext,
|
||||
flatten,
|
||||
simplerule,
|
||||
emit,
|
||||
G,
|
||||
)
|
||||
from build.utils import stripext, collectattrs
|
||||
from build.toolchain import Toolchain, HostToolchain
|
||||
from os.path import *
|
||||
from types import SimpleNamespace
|
||||
|
||||
if G.OSX != "yes":
|
||||
G.STARTGROUP = "-Wl,--start-group"
|
||||
G.ENDGROUP = "-Wl,--end-group"
|
||||
else:
|
||||
G.STARTGROUP = ""
|
||||
G.ENDGROUP = ""
|
||||
|
||||
Toolchain.CC = ["$(CC) -c -o $[outs[0]] $[ins[0]] $(CFLAGS) $[cflags]"]
|
||||
Toolchain.CPP = ["$(CC) -E -P -o $[outs] $[cflags] -x c $[ins]"]
|
||||
Toolchain.CXX = ["$(CXX) -c -o $[outs[0]] $[ins[0]] $(CXXFLAGS) $[cflags]"]
|
||||
Toolchain.AR = ["$(AR) cqs $[outs[0]] $[ins]"]
|
||||
Toolchain.ARXX = ["$(AR) cqs $[outs[0]] $[ins]"]
|
||||
Toolchain.CLINK = [
|
||||
"$(CC) -o $[outs[0]] $(STARTGROUP) $[ins] $[ldflags] $(LDFLAGS) $(ENDGROUP)"
|
||||
]
|
||||
Toolchain.CXXLINK = [
|
||||
"$(CXX) -o $[outs[0]] $(STARTGROUP) $[ins] $[ldflags] $(LDFLAGS) $(ENDGROUP)"
|
||||
]
|
||||
|
||||
Toolchain.is_source_file = (
|
||||
lambda f: f.endswith(".c")
|
||||
or f.endswith(".cc")
|
||||
or f.endswith(".cpp")
|
||||
or f.endswith(".S")
|
||||
or f.endswith(".s")
|
||||
or f.endswith(".m")
|
||||
or f.endswith(".mm")
|
||||
)
|
||||
|
||||
|
||||
def cfileimpl(self, name, srcs, deps, suffix, commands, label, kind, cflags):
|
||||
outleaf = stripext(basename(filenameof(srcs[0]))) + suffix
|
||||
# Given a set of dependencies, finds the set of relevant library targets (i.e.
|
||||
# contributes *.a files) for compiling C programs. The actual list of libraries
|
||||
# is in dep.clibrary_files.
|
||||
def _toolchain_find_library_targets(deps):
|
||||
lib_deps = []
|
||||
for d in deps:
|
||||
lib_deps = _combine(lib_deps, d.args.get("clibrary_deps", []))
|
||||
return lib_deps
|
||||
|
||||
normalrule(
|
||||
|
||||
Toolchain.find_c_library_targets = _toolchain_find_library_targets
|
||||
|
||||
|
||||
# Given a set of dependencies, finds the set of relevant header targets (i.e.
|
||||
# contributes *.h files) for compiling C programs. The actual list of libraries
|
||||
# is in dep.cheader_files.
|
||||
def _toolchain_find_header_targets(deps, initial=[]):
|
||||
hdr_deps = initial
|
||||
for d in deps:
|
||||
hdr_deps = _combine(hdr_deps, d.args.get("cheader_deps", []))
|
||||
return hdr_deps
|
||||
|
||||
|
||||
Toolchain.find_c_header_targets = _toolchain_find_header_targets
|
||||
|
||||
|
||||
HostToolchain.CC = ["$(HOSTCC) -c -o $[outs[0]] $[ins[0]] $(HOSTCFLAGS) $[cflags]"]
|
||||
HostToolchain.CPP = ["$(HOSTCC) -E -P -o $[outs] $[cflags] -x c $[ins]"]
|
||||
HostToolchain.CXX = ["$(HOSTCXX) -c -o $[outs[0]] $[ins[0]] $(HOSTCFLAGS) $[cflags]"]
|
||||
HostToolchain.AR = ["$(HOSTAR) cqs $[outs[0]] $[ins]"]
|
||||
HostToolchain.ARXX = ["$(HOSTAR) cqs $[outs[0]] $[ins]"]
|
||||
HostToolchain.CLINK = [
|
||||
"$(HOSTCC) -o $[outs[0]] $(STARTGROUP) $[ins] $[ldflags] $(HOSTLDFLAGS) $(ENDGROUP)"
|
||||
]
|
||||
HostToolchain.CXXLINK = [
|
||||
"$(HOSTCXX) -o $[outs[0]] $(STARTGROUP) $[ins] $[ldflags] $(HOSTLDFLAGS) $(ENDGROUP)"
|
||||
]
|
||||
|
||||
|
||||
def _combine(list1, list2):
|
||||
r = list(list1)
|
||||
for i in list2:
|
||||
if i not in r:
|
||||
r.append(i)
|
||||
return r
|
||||
|
||||
|
||||
def _indirect(deps, name):
|
||||
r = []
|
||||
for d in deps:
|
||||
r = _combine(r, d.args.get(name, [d]))
|
||||
return r
|
||||
|
||||
|
||||
def cfileimpl(self, name, srcs, deps, suffix, commands, label, toolchain, cflags):
|
||||
outleaf = "=" + stripext(basename(filenameof(srcs[0]))) + suffix
|
||||
|
||||
hdr_deps = toolchain.find_c_header_targets(deps)
|
||||
other_deps = [
|
||||
d
|
||||
for d in deps
|
||||
if ("cheader_deps" not in d.args) and ("clibrary_deps" not in d.args)
|
||||
]
|
||||
hdr_files = collectattrs(targets=hdr_deps, name="cheader_files")
|
||||
cflags = collectattrs(targets=hdr_deps, name="caller_cflags", initial=cflags)
|
||||
|
||||
t = simplerule(
|
||||
replaces=self,
|
||||
ins=srcs,
|
||||
deps=deps,
|
||||
deps=other_deps + hdr_files,
|
||||
outs=[outleaf],
|
||||
label=label,
|
||||
commands=commands,
|
||||
cflags=cflags,
|
||||
args={"cflags": cflags},
|
||||
)
|
||||
|
||||
|
||||
@@ -32,145 +124,223 @@ def cfileimpl(self, name, srcs, deps, suffix, commands, label, kind, cflags):
|
||||
def cfile(
|
||||
self,
|
||||
name,
|
||||
srcs: Targets = [],
|
||||
deps: Targets = [],
|
||||
srcs: Targets = None,
|
||||
deps: Targets = None,
|
||||
cflags=[],
|
||||
suffix=".o",
|
||||
commands=["$(CC) -c -o {outs[0]} {ins[0]} $(CFLAGS) {cflags}"],
|
||||
toolchain=Toolchain,
|
||||
label="CC",
|
||||
):
|
||||
cfileimpl(self, name, srcs, deps, suffix, commands, label, "cfile", cflags)
|
||||
cfileimpl(
|
||||
self,
|
||||
name,
|
||||
srcs,
|
||||
deps,
|
||||
suffix,
|
||||
toolchain.CC,
|
||||
toolchain.PREFIX + label,
|
||||
toolchain,
|
||||
cflags,
|
||||
)
|
||||
|
||||
|
||||
@Rule
|
||||
def cxxfile(
|
||||
self,
|
||||
name,
|
||||
srcs: Targets = [],
|
||||
deps: Targets = [],
|
||||
srcs: Targets = None,
|
||||
deps: Targets = None,
|
||||
cflags=[],
|
||||
suffix=".o",
|
||||
commands=["$(CXX) -c -o {outs[0]} {ins[0]} $(CFLAGS) {cflags}"],
|
||||
toolchain=Toolchain,
|
||||
label="CXX",
|
||||
):
|
||||
cfileimpl(
|
||||
self, name, srcs, deps, suffix, commands, label, "cxxfile", cflags
|
||||
self,
|
||||
name,
|
||||
srcs,
|
||||
deps,
|
||||
suffix,
|
||||
toolchain.CXX,
|
||||
toolchain.PREFIX + label,
|
||||
toolchain,
|
||||
cflags,
|
||||
)
|
||||
|
||||
|
||||
def findsources(name, srcs, deps, cflags, filerule):
|
||||
def _removeprefix(self, prefix):
|
||||
if self.startswith(prefix):
|
||||
return self[len(prefix) :]
|
||||
else:
|
||||
return self[:]
|
||||
|
||||
|
||||
def findsources(self, srcs, deps, cflags, filerule, toolchain, cwd):
|
||||
for f in filenamesof(srcs):
|
||||
if not toolchain.is_source_file(f):
|
||||
cflags = cflags + [f"-I{dirname(f)}"]
|
||||
deps = deps + [f]
|
||||
|
||||
objs = []
|
||||
for s in flatten(srcs):
|
||||
objs += [
|
||||
filerule(
|
||||
name=join(name, f.removeprefix("$(OBJ)/")),
|
||||
name=join(self.localname, _removeprefix(f, G.OBJ + "/")),
|
||||
srcs=[f],
|
||||
deps=deps,
|
||||
cflags=cflags,
|
||||
cflags=sorted(set(cflags)),
|
||||
toolchain=toolchain,
|
||||
cwd=cwd,
|
||||
args=getattr(self, "explicit_args", {}),
|
||||
)
|
||||
for f in filenamesof(s)
|
||||
if f.endswith(".c") or f.endswith(".cc") or f.endswith(".cpp")
|
||||
for f in filenamesof([s])
|
||||
if toolchain.is_source_file(f)
|
||||
]
|
||||
if any(f.endswith(".o") for f in filenamesof(s)):
|
||||
if any(f.endswith(".o") for f in filenamesof([s])):
|
||||
objs += [s]
|
||||
|
||||
return objs
|
||||
|
||||
|
||||
def libraryimpl(
|
||||
self, name, srcs, deps, hdrs, cflags, ldflags, commands, label, kind
|
||||
self,
|
||||
name,
|
||||
srcs,
|
||||
deps,
|
||||
hdrs,
|
||||
caller_cflags,
|
||||
caller_ldflags,
|
||||
cflags,
|
||||
ldflags,
|
||||
toolchain,
|
||||
commands,
|
||||
label,
|
||||
filerule,
|
||||
):
|
||||
if not srcs and not hdrs:
|
||||
raise ABException(
|
||||
"clibrary contains no sources and no exported headers"
|
||||
hdr_deps = toolchain.find_c_header_targets(deps) + [self]
|
||||
lib_deps = toolchain.find_c_library_targets(deps) + [self]
|
||||
|
||||
hr = None
|
||||
hf = []
|
||||
ar = None
|
||||
if hdrs:
|
||||
cs = []
|
||||
ins = hdrs.values()
|
||||
outs = []
|
||||
i = 0
|
||||
for dest, src in hdrs.items():
|
||||
s = filenamesof([src])
|
||||
assert len(s) == 1, "the target of a header must return exactly one file"
|
||||
|
||||
cs += [f"$(CP) $[ins[{i}]] $[outs[{i}]]"]
|
||||
outs += ["=" + dest]
|
||||
i = i + 1
|
||||
|
||||
hr = simplerule(
|
||||
name=f"{self.localname}_hdr",
|
||||
ins=ins,
|
||||
outs=outs,
|
||||
commands=cs,
|
||||
label=toolchain.PREFIX + "CHEADERS",
|
||||
)
|
||||
hr.args["cheader_deps"] = [hr]
|
||||
hr.args["cheader_files"] = [hr]
|
||||
hf = [f"-I{hr.dir}"]
|
||||
|
||||
libraries = [d for d in deps if hasattr(d, "clibrary")]
|
||||
for library in libraries:
|
||||
if library.clibrary.cflags:
|
||||
cflags += library.clibrary.cflags
|
||||
if library.clibrary.ldflags:
|
||||
ldflags += library.clibrary.ldflags
|
||||
|
||||
for f in filenamesof(srcs):
|
||||
if f.endswith(".h"):
|
||||
deps += [f]
|
||||
|
||||
hdrcs = []
|
||||
hdrins = list(hdrs.values())
|
||||
hdrouts = []
|
||||
i = 0
|
||||
for dest, src in hdrs.items():
|
||||
s = filenamesof(src)
|
||||
if len(s) != 1:
|
||||
raise ABException(
|
||||
"a dependency of an export must have exactly one output file"
|
||||
)
|
||||
|
||||
hdrcs += ["cp {ins[" + str(i) + "]} {outs[" + str(i) + "]}"]
|
||||
hdrouts += [dest]
|
||||
i = i + 1
|
||||
|
||||
if not hasattr(self, "clibrary"):
|
||||
self.clibrary = SimpleNamespace()
|
||||
if srcs:
|
||||
hr = None
|
||||
if hdrcs:
|
||||
hr = normalrule(
|
||||
name=f"{name}_hdrs",
|
||||
ins=hdrins,
|
||||
outs=hdrouts,
|
||||
label="HEADERS",
|
||||
commands=hdrcs,
|
||||
)
|
||||
hr.materialise()
|
||||
|
||||
actualsrcs = findsources(
|
||||
name,
|
||||
# Can't depend on the current target to get the library headers, because
|
||||
# if we do it'll cause a dependency loop.
|
||||
objs = findsources(
|
||||
self,
|
||||
srcs,
|
||||
deps + ([f"{name}_hdrs"] if hr else []),
|
||||
cflags + ([f"-I{hr.normalrule.objdir}"] if hr else []),
|
||||
kind,
|
||||
deps + ([hr] if hr else []),
|
||||
cflags + hf,
|
||||
filerule,
|
||||
toolchain,
|
||||
self.cwd,
|
||||
)
|
||||
|
||||
normalrule(
|
||||
replaces=self,
|
||||
ins=actualsrcs,
|
||||
outs=[basename(name) + ".a"],
|
||||
ar = simplerule(
|
||||
name=f"{self.localname}_lib",
|
||||
ins=objs,
|
||||
outs=[f"={self.localname}.a"],
|
||||
deps=deps,
|
||||
label=label,
|
||||
commands=commands if actualsrcs else [],
|
||||
commands=commands,
|
||||
)
|
||||
ar.materialise()
|
||||
|
||||
self.clibrary.ldflags = ldflags
|
||||
self.clibrary.cflags = ["-I" + hr.normalrule.objdir] if hr else []
|
||||
else:
|
||||
r = normalrule(
|
||||
replaces=self,
|
||||
ins=hdrins,
|
||||
outs=hdrouts,
|
||||
label="HEADERS",
|
||||
commands=hdrcs,
|
||||
)
|
||||
r.materialise()
|
||||
|
||||
self.clibrary.ldflags = ldflags
|
||||
self.clibrary.cflags = ["-I" + r.normalrule.objdir]
|
||||
self.outs = ([hr] if hr else []) + ([ar] if ar else [])
|
||||
self.deps = self.outs
|
||||
self.args["cheader_deps"] = hdr_deps
|
||||
self.args["clibrary_deps"] = lib_deps
|
||||
self.args["cheader_files"] = [hr] if hr else []
|
||||
self.args["clibrary_files"] = [ar] if ar else []
|
||||
self.args["caller_cflags"] = caller_cflags + hf
|
||||
self.args["caller_ldflags"] = caller_ldflags
|
||||
|
||||
|
||||
@Rule
|
||||
def clibrary(
|
||||
self,
|
||||
name,
|
||||
srcs: Targets = [],
|
||||
deps: Targets = [],
|
||||
hdrs: TargetsMap = {},
|
||||
srcs: Targets = None,
|
||||
deps: Targets = None,
|
||||
hdrs: TargetsMap = None,
|
||||
caller_cflags=[],
|
||||
caller_ldflags=[],
|
||||
cflags=[],
|
||||
ldflags=[],
|
||||
commands=["$(AR) cqs {outs[0]} {ins}"],
|
||||
toolchain=Toolchain,
|
||||
label="LIB",
|
||||
cfilerule=cfile,
|
||||
):
|
||||
return libraryimpl(
|
||||
self, name, srcs, deps, hdrs, cflags, ldflags, commands, label, cfile
|
||||
libraryimpl(
|
||||
self,
|
||||
name,
|
||||
srcs,
|
||||
deps,
|
||||
hdrs,
|
||||
caller_cflags,
|
||||
caller_ldflags,
|
||||
cflags,
|
||||
ldflags,
|
||||
toolchain,
|
||||
toolchain.AR,
|
||||
toolchain.PREFIX + label,
|
||||
cfilerule,
|
||||
)
|
||||
|
||||
|
||||
@Rule
|
||||
def hostclibrary(
|
||||
self,
|
||||
name,
|
||||
srcs: Targets = None,
|
||||
deps: Targets = None,
|
||||
hdrs: TargetsMap = None,
|
||||
caller_cflags=[],
|
||||
caller_ldflags=[],
|
||||
cflags=[],
|
||||
ldflags=[],
|
||||
toolchain=HostToolchain,
|
||||
label="LIB",
|
||||
cfilerule=cfile,
|
||||
):
|
||||
libraryimpl(
|
||||
self,
|
||||
name,
|
||||
srcs,
|
||||
deps,
|
||||
hdrs,
|
||||
caller_cflags,
|
||||
caller_ldflags,
|
||||
cflags,
|
||||
ldflags,
|
||||
toolchain,
|
||||
toolchain.AR,
|
||||
toolchain.PREFIX + label,
|
||||
cfilerule,
|
||||
)
|
||||
|
||||
|
||||
@@ -178,40 +348,92 @@ def clibrary(
|
||||
def cxxlibrary(
|
||||
self,
|
||||
name,
|
||||
srcs: Targets = [],
|
||||
deps: Targets = [],
|
||||
hdrs: TargetsMap = {},
|
||||
srcs: Targets = None,
|
||||
deps: Targets = None,
|
||||
hdrs: TargetsMap = None,
|
||||
caller_cflags=[],
|
||||
caller_ldflags=[],
|
||||
cflags=[],
|
||||
ldflags=[],
|
||||
commands=["$(AR) cqs {outs[0]} {ins}"],
|
||||
label="LIB",
|
||||
toolchain=Toolchain,
|
||||
label="CXXLIB",
|
||||
cxxfilerule=cxxfile,
|
||||
):
|
||||
return libraryimpl(
|
||||
self, name, srcs, deps, hdrs, cflags, ldflags, commands, label, cxxfile
|
||||
libraryimpl(
|
||||
self,
|
||||
name,
|
||||
srcs,
|
||||
deps,
|
||||
hdrs,
|
||||
caller_cflags,
|
||||
caller_ldflags,
|
||||
cflags,
|
||||
ldflags,
|
||||
toolchain,
|
||||
toolchain.ARXX,
|
||||
toolchain.PREFIX + label,
|
||||
cxxfilerule,
|
||||
)
|
||||
|
||||
|
||||
@Rule
|
||||
def hostcxxlibrary(
|
||||
self,
|
||||
name,
|
||||
srcs: Targets = None,
|
||||
deps: Targets = None,
|
||||
hdrs: TargetsMap = None,
|
||||
caller_cflags=[],
|
||||
caller_ldflags=[],
|
||||
cflags=[],
|
||||
ldflags=[],
|
||||
toolchain=HostToolchain,
|
||||
label="CXXLIB",
|
||||
cxxfilerule=cxxfile,
|
||||
):
|
||||
libraryimpl(
|
||||
self,
|
||||
name,
|
||||
srcs,
|
||||
deps,
|
||||
hdrs,
|
||||
caller_cflags,
|
||||
caller_ldflags,
|
||||
cflags,
|
||||
ldflags,
|
||||
toolchain,
|
||||
toolchain.ARXX,
|
||||
toolchain.PREFIX + label,
|
||||
cxxfilerule,
|
||||
)
|
||||
|
||||
|
||||
def programimpl(
|
||||
self, name, srcs, deps, cflags, ldflags, commands, label, filerule, kind
|
||||
self,
|
||||
name,
|
||||
srcs,
|
||||
deps,
|
||||
cflags,
|
||||
ldflags,
|
||||
toolchain,
|
||||
commands,
|
||||
label,
|
||||
filerule,
|
||||
):
|
||||
libraries = [d for d in deps if hasattr(d, "clibrary")]
|
||||
for library in libraries:
|
||||
if library.clibrary.cflags:
|
||||
cflags += library.clibrary.cflags
|
||||
if library.clibrary.ldflags:
|
||||
ldflags += library.clibrary.ldflags
|
||||
cfiles = findsources(self, srcs, deps, cflags, filerule, toolchain, self.cwd)
|
||||
|
||||
deps += [f for f in filenamesof(srcs) if f.endswith(".h")]
|
||||
lib_deps = toolchain.find_c_library_targets(deps)
|
||||
libs = collectattrs(targets=lib_deps, name="clibrary_files")
|
||||
ldflags = collectattrs(targets=lib_deps, name="caller_ldflags", initial=ldflags)
|
||||
|
||||
ars = [f for f in filenamesof(libraries) if f.endswith(".a")]
|
||||
normalrule(
|
||||
simplerule(
|
||||
replaces=self,
|
||||
ins=(findsources(name, srcs, deps, cflags, filerule) + ars + ars),
|
||||
outs=[basename(name) + "$(EXT)"],
|
||||
ins=cfiles + libs,
|
||||
outs=[f"={self.localname}{toolchain.EXE}"],
|
||||
deps=deps,
|
||||
label=label,
|
||||
commands=commands,
|
||||
ldflags=ldflags,
|
||||
args={"ldflags": ldflags},
|
||||
)
|
||||
|
||||
|
||||
@@ -219,12 +441,13 @@ def programimpl(
|
||||
def cprogram(
|
||||
self,
|
||||
name,
|
||||
srcs: Targets = [],
|
||||
deps: Targets = [],
|
||||
srcs: Targets = None,
|
||||
deps: Targets = None,
|
||||
cflags=[],
|
||||
ldflags=[],
|
||||
commands=["$(CC) -o {outs[0]} {ins} {ldflags} $(LDFLAGS)"],
|
||||
toolchain=Toolchain,
|
||||
label="CLINK",
|
||||
cfilerule=cfile,
|
||||
):
|
||||
programimpl(
|
||||
self,
|
||||
@@ -233,10 +456,36 @@ def cprogram(
|
||||
deps,
|
||||
cflags,
|
||||
ldflags,
|
||||
commands,
|
||||
label,
|
||||
cfile,
|
||||
"cprogram",
|
||||
toolchain,
|
||||
toolchain.CLINK,
|
||||
toolchain.PREFIX + label,
|
||||
cfilerule,
|
||||
)
|
||||
|
||||
|
||||
@Rule
|
||||
def hostcprogram(
|
||||
self,
|
||||
name,
|
||||
srcs: Targets = None,
|
||||
deps: Targets = None,
|
||||
cflags=[],
|
||||
ldflags=[],
|
||||
toolchain=HostToolchain,
|
||||
label="CLINK",
|
||||
cfilerule=cfile,
|
||||
):
|
||||
programimpl(
|
||||
self,
|
||||
name,
|
||||
srcs,
|
||||
deps,
|
||||
cflags,
|
||||
ldflags,
|
||||
toolchain,
|
||||
toolchain.CLINK,
|
||||
toolchain.PREFIX + label,
|
||||
cfilerule,
|
||||
)
|
||||
|
||||
|
||||
@@ -244,12 +493,13 @@ def cprogram(
|
||||
def cxxprogram(
|
||||
self,
|
||||
name,
|
||||
srcs: Targets = [],
|
||||
deps: Targets = [],
|
||||
srcs: Targets = None,
|
||||
deps: Targets = None,
|
||||
cflags=[],
|
||||
ldflags=[],
|
||||
commands=["$(CXX) -o {outs[0]} {ins} {ldflags} $(LDFLAGS)"],
|
||||
toolchain=Toolchain,
|
||||
label="CXXLINK",
|
||||
cxxfilerule=cxxfile,
|
||||
):
|
||||
programimpl(
|
||||
self,
|
||||
@@ -258,8 +508,73 @@ def cxxprogram(
|
||||
deps,
|
||||
cflags,
|
||||
ldflags,
|
||||
commands,
|
||||
label,
|
||||
cxxfile,
|
||||
"cxxprogram",
|
||||
toolchain,
|
||||
toolchain.CXXLINK,
|
||||
toolchain.PREFIX + label,
|
||||
cxxfilerule,
|
||||
)
|
||||
|
||||
|
||||
@Rule
|
||||
def hostcxxprogram(
|
||||
self,
|
||||
name,
|
||||
srcs: Targets = None,
|
||||
deps: Targets = None,
|
||||
cflags=[],
|
||||
ldflags=[],
|
||||
toolchain=HostToolchain,
|
||||
label="CXXLINK",
|
||||
cxxfilerule=cxxfile,
|
||||
):
|
||||
programimpl(
|
||||
self,
|
||||
name,
|
||||
srcs,
|
||||
deps,
|
||||
cflags,
|
||||
ldflags,
|
||||
toolchain,
|
||||
toolchain.CXXLINK,
|
||||
toolchain.PREFIX + label,
|
||||
cxxfilerule,
|
||||
)
|
||||
|
||||
|
||||
def _cppfileimpl(self, name, srcs, deps, cflags, toolchain):
|
||||
hdr_deps = _indirect(deps, "cheader_deps")
|
||||
cflags = collectattrs(targets=hdr_deps, name="caller_cflags", initial=cflags)
|
||||
|
||||
simplerule(
|
||||
replaces=self,
|
||||
ins=srcs,
|
||||
outs=[f"={self.localname}"],
|
||||
deps=deps,
|
||||
commands=toolchain.CPP,
|
||||
args={"cflags": cflags},
|
||||
label=toolchain.PREFIX + "CPPFILE",
|
||||
)
|
||||
|
||||
|
||||
@Rule
|
||||
def cppfile(
|
||||
self,
|
||||
name,
|
||||
srcs: Targets = [],
|
||||
deps: Targets = [],
|
||||
cflags=[],
|
||||
toolchain=Toolchain,
|
||||
):
|
||||
_cppfileimpl(self, name, srcs, deps, cflags, toolchain)
|
||||
|
||||
|
||||
@Rule
|
||||
def hostcppfile(
|
||||
self,
|
||||
name,
|
||||
srcs: Targets = [],
|
||||
deps: Targets = [],
|
||||
cflags=[],
|
||||
toolchain=HostToolchain,
|
||||
):
|
||||
_cppfileimpl(self, name, srcs, deps, cflags, toolchain)
|
||||
|
||||
103
build/pkg.py
103
build/pkg.py
@@ -1,38 +1,83 @@
|
||||
from build.ab import Rule, emit, Target
|
||||
from types import SimpleNamespace
|
||||
from build.ab import Rule, Target, G
|
||||
import os
|
||||
import subprocess
|
||||
|
||||
emit(
|
||||
"""
|
||||
PKG_CONFIG ?= pkg-config
|
||||
PACKAGES := $(shell $(PKG_CONFIG) --list-all | cut -d' ' -f1 | sort)
|
||||
"""
|
||||
)
|
||||
|
||||
class _PkgConfig:
|
||||
package_present = set()
|
||||
package_properties = {}
|
||||
pkgconfig = None
|
||||
|
||||
def __init__(self, cmd):
|
||||
assert cmd, "no pkg-config environment variable supplied"
|
||||
self.pkgconfig = cmd
|
||||
|
||||
r = subprocess.run(f"{cmd} --list-all", shell=True, capture_output=True)
|
||||
ps = r.stdout.decode("utf-8")
|
||||
self.package_present = {l.split(" ", 1)[0] for l in ps.splitlines()}
|
||||
|
||||
def has_package(self, name):
|
||||
return name in self.package_present
|
||||
|
||||
def get_property(self, name, flag):
|
||||
p = f"{name}.{flag}"
|
||||
if p not in self.package_properties:
|
||||
r = subprocess.run(
|
||||
f"{self.pkgconfig} {flag} {name}",
|
||||
shell=True,
|
||||
capture_output=True,
|
||||
)
|
||||
self.package_properties[p] = r.stdout.decode("utf-8").strip()
|
||||
return self.package_properties[p]
|
||||
|
||||
|
||||
TargetPkgConfig = _PkgConfig(G.PKG_CONFIG)
|
||||
HostPkgConfig = _PkgConfig(G.HOST_PKG_CONFIG)
|
||||
|
||||
|
||||
def _package(self, name, package, fallback, pkgconfig):
|
||||
if pkgconfig.has_package(package):
|
||||
cflags = pkgconfig.get_property(package, "--cflags")
|
||||
ldflags = pkgconfig.get_property(package, "--libs")
|
||||
|
||||
if cflags:
|
||||
self.args["caller_cflags"] = [cflags]
|
||||
if ldflags:
|
||||
self.args["caller_ldflags"] = [ldflags]
|
||||
self.args["clibrary_deps"] = [self]
|
||||
self.args["cheader_deps"] = [self]
|
||||
self.traits.update({"clibrary", "cxxlibrary"})
|
||||
return
|
||||
|
||||
assert fallback, f"Required package '{package}' not installed"
|
||||
|
||||
if "cheader_deps" in fallback.args:
|
||||
self.args["cheader_deps"] = fallback.args["cheader_deps"]
|
||||
if "clibrary_deps" in fallback.args:
|
||||
self.args["clibrary_deps"] = fallback.args["clibrary_deps"]
|
||||
if "cheader_files" in fallback.args:
|
||||
self.args["cheader_files"] = fallback.args["cheader_files"]
|
||||
if "clibrary_files" in fallback.args:
|
||||
self.args["clibrary_files"] = fallback.args["clibrary_files"]
|
||||
self.ins = fallback.ins
|
||||
self.outs = fallback.outs
|
||||
self.deps = fallback.deps
|
||||
self.traits = fallback.traits
|
||||
|
||||
|
||||
@Rule
|
||||
def package(self, name, package=None, fallback: Target = None):
|
||||
emit("ifeq ($(filter %s, $(PACKAGES)),)" % package)
|
||||
if fallback:
|
||||
emit(f"PACKAGE_CFLAGS_{package} :=", fallback.clibrary.cflags)
|
||||
emit(f"PACKAGE_LDFLAGS_{package} := ", fallback.clibrary.ldflags)
|
||||
emit(f"PACKAGE_DEP_{package} := ", fallback.name)
|
||||
else:
|
||||
emit(f"$(error Required package '{package}' not installed.)")
|
||||
emit("else")
|
||||
emit(
|
||||
f"PACKAGE_CFLAGS_{package} := $(shell $(PKG_CONFIG) --cflags {package})"
|
||||
)
|
||||
emit(
|
||||
f"PACKAGE_LDFLAGS_{package} := $(shell $(PKG_CONFIG) --libs {package})"
|
||||
)
|
||||
emit(f"PACKAGE_DEP_{package} := ")
|
||||
emit("endif")
|
||||
_package(self, name, package, fallback, TargetPkgConfig)
|
||||
|
||||
self.clibrary = SimpleNamespace()
|
||||
self.clibrary.cflags = [f"$(PACKAGE_CFLAGS_{package})"]
|
||||
self.clibrary.ldflags = [f"$(PACKAGE_LDFLAGS_{package})"]
|
||||
|
||||
self.ins = []
|
||||
self.outs = [f"$(PACKAGE_DEP_{package})"]
|
||||
@Rule
|
||||
def hostpackage(self, name, package=None, fallback: Target = None):
|
||||
_package(self, name, package, fallback, HostPkgConfig)
|
||||
|
||||
|
||||
def has_package(name):
|
||||
return TargetPkgConfig.has_package(name)
|
||||
|
||||
|
||||
def has_host_package(name):
|
||||
return HostPkgConfig.has_package(name)
|
||||
|
||||
@@ -1,33 +1,79 @@
|
||||
from os.path import join
|
||||
from build.ab import Rule, Targets, emit, normalrule, filenamesof, flatten
|
||||
from build.c import cxxlibrary
|
||||
import build.pkg
|
||||
from types import SimpleNamespace
|
||||
from build.ab import Rule, Targets, emit, simplerule, filenamesof, G
|
||||
from build.utils import filenamesmatchingof, collectattrs
|
||||
from os.path import join, abspath, dirname, relpath
|
||||
from build.pkg import has_package
|
||||
|
||||
emit(
|
||||
"""
|
||||
PROTOC ?= protoc
|
||||
ifeq ($(filter protobuf, $(PACKAGES)),)
|
||||
$(error Required package 'protobuf' not installed.)"
|
||||
endif
|
||||
"""
|
||||
)
|
||||
G.setdefault("PROTOC", "protoc")
|
||||
G.setdefault("PROTOC_SEPARATOR", ":")
|
||||
G.setdefault("HOSTPROTOC", "hostprotoc")
|
||||
|
||||
assert has_package("protobuf"), "required package 'protobuf' not installed"
|
||||
|
||||
|
||||
|
||||
def _getprotodeps(deps):
|
||||
r = set()
|
||||
for d in deps:
|
||||
r.update(d.args.get("protodeps", {d}))
|
||||
return sorted(r)
|
||||
|
||||
|
||||
@Rule
|
||||
def proto(self, name, srcs: Targets = [], deps: Targets = []):
|
||||
normalrule(
|
||||
protodeps = _getprotodeps(deps)
|
||||
descriptorlist = (G.PROTOC_SEPARATOR).join(
|
||||
[
|
||||
relpath(f, start=self.dir)
|
||||
for f in filenamesmatchingof(protodeps, "*.descriptor")
|
||||
]
|
||||
)
|
||||
|
||||
dirs = sorted({"$[dir]/" + dirname(f) for f in filenamesof(srcs)})
|
||||
simplerule(
|
||||
replaces=self,
|
||||
ins=srcs,
|
||||
outs=[f"{name}.descriptor"],
|
||||
deps=deps,
|
||||
commands=[
|
||||
"$(PROTOC) --include_source_info --descriptor_set_out={outs[0]} {ins}"
|
||||
],
|
||||
outs=[f"={self.localname}.descriptor"],
|
||||
deps=protodeps,
|
||||
commands=(
|
||||
["mkdir -p " + (" ".join(dirs))]
|
||||
+ [f"$(CP) {f} $[dir]/{f}" for f in filenamesof(srcs)]
|
||||
+ [
|
||||
"cd $[dir] && "
|
||||
+ (
|
||||
" ".join(
|
||||
[
|
||||
"$(PROTOC)",
|
||||
"--proto_path=.",
|
||||
"--include_source_info",
|
||||
f"--descriptor_set_out={self.localname}.descriptor",
|
||||
]
|
||||
+ (
|
||||
[f"--descriptor_set_in='{descriptorlist}'"]
|
||||
if descriptorlist
|
||||
else []
|
||||
)
|
||||
+ ["$[ins]"]
|
||||
)
|
||||
)
|
||||
]
|
||||
),
|
||||
label="PROTO",
|
||||
args={
|
||||
"protosrcs": filenamesof(srcs),
|
||||
"protodeps": set(protodeps) | {self},
|
||||
},
|
||||
)
|
||||
self.proto.srcs = filenamesof(srcs) + flatten(
|
||||
[s.proto.srcs for s in flatten(deps)]
|
||||
|
||||
|
||||
@Rule
|
||||
def protolib(self, name, srcs: Targets = []):
|
||||
simplerule(
|
||||
replaces=self,
|
||||
label="PROTOLIB",
|
||||
args={
|
||||
"protosrcs": collectattrs(targets=srcs, name="protosrcs"),
|
||||
"protodeps": set(_getprotodeps(srcs)),
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@@ -35,31 +81,102 @@ def proto(self, name, srcs: Targets = [], deps: Targets = []):
|
||||
def protocc(self, name, srcs: Targets = [], deps: Targets = []):
|
||||
outs = []
|
||||
protos = []
|
||||
for f in flatten([s.proto.srcs for s in flatten(srcs + deps)]):
|
||||
if f.endswith(".proto"):
|
||||
cc = f.replace(".proto", ".pb.cc")
|
||||
h = f.replace(".proto", ".pb.h")
|
||||
protos += [f]
|
||||
srcs += [f]
|
||||
outs += [cc, h]
|
||||
|
||||
r = normalrule(
|
||||
name=f"{name}_srcs",
|
||||
ins=protos,
|
||||
allsrcs = collectattrs(targets=srcs, name="protosrcs")
|
||||
assert allsrcs, "no sources provided"
|
||||
for f in filenamesmatchingof(allsrcs, "*.proto"):
|
||||
cc = f.replace(".proto", ".pb.cc")
|
||||
h = f.replace(".proto", ".pb.h")
|
||||
protos += [f]
|
||||
outs += ["=" + cc, "=" + h]
|
||||
|
||||
protodeps = _getprotodeps(deps + srcs)
|
||||
descriptorlist = G.PROTOC_SEPARATOR.join(
|
||||
[
|
||||
relpath(f, start=self.dir)
|
||||
for f in filenamesmatchingof(protodeps, "*.descriptor")
|
||||
]
|
||||
)
|
||||
|
||||
r = simplerule(
|
||||
name=f"{self.localname}_srcs",
|
||||
cwd=self.cwd,
|
||||
ins=srcs,
|
||||
outs=outs,
|
||||
deps=deps,
|
||||
commands=["$(PROTOC) --cpp_out={self.normalrule.objdir} {ins}"],
|
||||
deps=protodeps,
|
||||
commands=[
|
||||
"cd $[dir] && "
|
||||
+ (
|
||||
" ".join(
|
||||
[
|
||||
"$(PROTOC)",
|
||||
"--proto_path=.",
|
||||
"--cpp_out=.",
|
||||
f"--descriptor_set_in='{descriptorlist}'",
|
||||
]
|
||||
+ protos
|
||||
)
|
||||
)
|
||||
],
|
||||
label="PROTOCC",
|
||||
)
|
||||
|
||||
r.materialise()
|
||||
headers = {
|
||||
f: join(r.normalrule.objdir, f) for f in outs if f.endswith(".pb.h")
|
||||
}
|
||||
headers = {f[1:]: join(r.dir, f[1:]) for f in outs if f.endswith(".pb.h")}
|
||||
|
||||
from build.c import cxxlibrary
|
||||
|
||||
cxxlibrary(
|
||||
replaces=self,
|
||||
srcs=[f"{name}_srcs"],
|
||||
srcs=[r],
|
||||
deps=deps,
|
||||
hdrs=headers,
|
||||
cflags=[f"-I{r.normalrule.objdir}"],
|
||||
)
|
||||
|
||||
|
||||
@Rule
|
||||
def protojava(self, name, srcs: Targets = [], deps: Targets = []):
|
||||
outs = []
|
||||
|
||||
allsrcs = collectattrs(targets=srcs, name="protosrcs")
|
||||
assert allsrcs, "no sources provided"
|
||||
protos = []
|
||||
for f in filenamesmatchingof(allsrcs, "*.proto"):
|
||||
protos += [f]
|
||||
srcs += [f]
|
||||
|
||||
descriptorlist = ":".join(
|
||||
[abspath(f) for f in filenamesmatchingof(srcs + deps, "*.descriptor")]
|
||||
)
|
||||
|
||||
r = simplerule(
|
||||
name=f"{self.localname}_srcs",
|
||||
cwd=self.cwd,
|
||||
ins=protos,
|
||||
outs=[f"={self.localname}.srcjar"],
|
||||
deps=srcs + deps,
|
||||
commands=[
|
||||
"mkdir -p $[dir]/srcs",
|
||||
"cd $[dir]/srcs && "
|
||||
+ (
|
||||
" ".join(
|
||||
[
|
||||
"$(PROTOC)",
|
||||
"--proto_path=.",
|
||||
"--java_out=.",
|
||||
f"--descriptor_set_in={descriptorlist}",
|
||||
]
|
||||
+ protos
|
||||
)
|
||||
),
|
||||
"$(JAR) cf $[outs[0]] -C $[dir]/srcs .",
|
||||
],
|
||||
traits={"srcjar"},
|
||||
label="PROTOJAVA",
|
||||
)
|
||||
|
||||
from build.java import javalibrary
|
||||
|
||||
javalibrary(
|
||||
replaces=self,
|
||||
deps=[r] + deps,
|
||||
)
|
||||
|
||||
11
build/toolchain.py
Normal file
11
build/toolchain.py
Normal file
@@ -0,0 +1,11 @@
|
||||
import platform
|
||||
|
||||
_is_windows = (platform.system() == "Windows")
|
||||
|
||||
class Toolchain:
|
||||
PREFIX = ""
|
||||
EXE = ".exe" if _is_windows else ""
|
||||
|
||||
|
||||
class HostToolchain(Toolchain):
|
||||
PREFIX = "HOST"
|
||||
@@ -1,14 +1,76 @@
|
||||
from build.ab import Rule, normalrule, Target, filenameof, Targets
|
||||
from os.path import basename
|
||||
from build.ab import (
|
||||
Rule,
|
||||
Target,
|
||||
Targets,
|
||||
filenameof,
|
||||
filenamesof,
|
||||
cwdStack,
|
||||
error,
|
||||
simplerule,
|
||||
G
|
||||
)
|
||||
from os.path import relpath, splitext, join, basename, isfile
|
||||
from glob import iglob
|
||||
import fnmatch
|
||||
import subprocess
|
||||
import shutil
|
||||
|
||||
|
||||
def filenamesmatchingof(xs, pattern):
|
||||
return fnmatch.filter(filenamesof(xs), pattern)
|
||||
|
||||
|
||||
def stripext(path):
|
||||
return splitext(path)[0]
|
||||
|
||||
|
||||
def targetswithtraitsof(xs, trait):
|
||||
return [t for t in xs if trait in t.traits]
|
||||
|
||||
|
||||
def collectattrs(*, targets, name, initial=[]):
|
||||
s = set(initial)
|
||||
for a in [t.args.get(name, []) for t in targets]:
|
||||
s.update(a)
|
||||
return sorted(s)
|
||||
|
||||
|
||||
def itemsof(pattern, root=None, cwd=None):
|
||||
if not cwd:
|
||||
cwd = cwdStack[-1]
|
||||
if not root:
|
||||
root = "."
|
||||
|
||||
pattern = join(cwd, pattern)
|
||||
root = join(cwd, root)
|
||||
|
||||
result = {}
|
||||
for f in iglob(pattern, recursive=True):
|
||||
try:
|
||||
if isfile(f):
|
||||
result[relpath(f, root)] = f
|
||||
except ValueError:
|
||||
error(f"file '{f}' is not in root '{root}'")
|
||||
return result
|
||||
|
||||
|
||||
def does_command_exist(cmd):
|
||||
basecmd = cmd.strip().split()[0]
|
||||
return shutil.which(basecmd)
|
||||
|
||||
|
||||
def shell(cmd):
|
||||
r = subprocess.check_output([G.SHELL, "-c", cmd])
|
||||
return r.decode("utf-8").strip()
|
||||
|
||||
|
||||
@Rule
|
||||
def objectify(self, name, src: Target, symbol):
|
||||
normalrule(
|
||||
simplerule(
|
||||
replaces=self,
|
||||
ins=["build/_objectify.py", src],
|
||||
outs=[basename(filenameof(src)) + ".h"],
|
||||
commands=["$(PYTHON) {ins[0]} {ins[1]} " + symbol + " > {outs}"],
|
||||
outs=[f"={basename(filenameof(src))}.h"],
|
||||
commands=["$(PYTHON) $[ins[0]] $[ins[1]] " + symbol + " > $[outs]"],
|
||||
label="OBJECTIFY",
|
||||
)
|
||||
|
||||
@@ -19,25 +81,25 @@ def test(
|
||||
name,
|
||||
command: Target = None,
|
||||
commands=None,
|
||||
ins: Targets = [],
|
||||
deps: Targets = [],
|
||||
ins: Targets = None,
|
||||
deps: Targets = None,
|
||||
label="TEST",
|
||||
):
|
||||
if command:
|
||||
normalrule(
|
||||
simplerule(
|
||||
replaces=self,
|
||||
ins=[command],
|
||||
outs=["sentinel"],
|
||||
commands=["{ins[0]}", "touch {outs}"],
|
||||
outs=["=sentinel"],
|
||||
commands=["$[ins[0]]", "touch $[outs[0]]"],
|
||||
deps=deps,
|
||||
label=label,
|
||||
)
|
||||
else:
|
||||
normalrule(
|
||||
simplerule(
|
||||
replaces=self,
|
||||
ins=ins,
|
||||
outs=["sentinel"],
|
||||
commands=commands + ["touch {outs}"],
|
||||
outs=["=sentinel"],
|
||||
commands=commands + ["touch $[outs[0]]"],
|
||||
deps=deps,
|
||||
label=label,
|
||||
)
|
||||
|
||||
25
build/zip.py
Normal file
25
build/zip.py
Normal file
@@ -0,0 +1,25 @@
|
||||
from build.ab import (
|
||||
Rule,
|
||||
simplerule,
|
||||
TargetsMap,
|
||||
filenameof,
|
||||
)
|
||||
|
||||
|
||||
@Rule
|
||||
def zip(self, name, flags="", items: TargetsMap = {}, extension="zip", label="ZIP"):
|
||||
cs = ["$(PYTHON) build/_zip.py -z $[outs]"]
|
||||
|
||||
ins = []
|
||||
for k, v in items.items():
|
||||
cs += [f"-f {k} {filenameof(v)}"]
|
||||
ins += [v]
|
||||
|
||||
simplerule(
|
||||
replaces=self,
|
||||
ins=ins,
|
||||
deps=["build/_zip.py"],
|
||||
outs=[f"={self.localname}." + extension],
|
||||
commands=[" ".join(cs)],
|
||||
label=label,
|
||||
)
|
||||
12
config.py
12
config.py
@@ -1,5 +1,11 @@
|
||||
import platform
|
||||
import os
|
||||
|
||||
windows = platform.system() == "Windows"
|
||||
osx = platform.system() == "Darwin"
|
||||
unix = not windows
|
||||
if os.getenv("BUILDTYPE") == "windows":
|
||||
windows = True
|
||||
osx = False
|
||||
unix = False
|
||||
else:
|
||||
windows = False
|
||||
osx = platform.system() == "Darwin"
|
||||
unix = True
|
||||
|
||||
@@ -2,33 +2,34 @@
|
||||
#define ADF_NATIV_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#include "adf_str.h"
|
||||
|
||||
#define NATIVE_FILE 8001
|
||||
|
||||
struct nativeDevice
|
||||
{
|
||||
FILE* fd;
|
||||
};
|
||||
struct nativeDevice
|
||||
{
|
||||
FILE* fd;
|
||||
};
|
||||
|
||||
struct nativeFunctions
|
||||
{
|
||||
/* called by adfMount() */
|
||||
RETCODE (*adfInitDevice)(struct Device*, char*, BOOL);
|
||||
/* called by adfReadBlock() */
|
||||
RETCODE (*adfNativeReadSector)(struct Device*, int32_t, int, uint8_t*);
|
||||
/* called by adfWriteBlock() */
|
||||
RETCODE (*adfNativeWriteSector)(struct Device*, int32_t, int, uint8_t*);
|
||||
/* called by adfMount() */
|
||||
BOOL (*adfIsDevNative)(char*);
|
||||
/* called by adfUnMount() */
|
||||
RETCODE (*adfReleaseDevice)(struct Device*);
|
||||
};
|
||||
struct nativeFunctions
|
||||
{
|
||||
/* called by adfMount() */
|
||||
RETCODE (*adfInitDevice)(struct Device*, char*, BOOL);
|
||||
/* called by adfReadBlock() */
|
||||
RETCODE (*adfNativeReadSector)(struct Device*, int32_t, int, uint8_t*);
|
||||
/* called by adfWriteBlock() */
|
||||
RETCODE (*adfNativeWriteSector)(struct Device*, int32_t, int, uint8_t*);
|
||||
/* called by adfMount() */
|
||||
BOOL (*adfIsDevNative)(char*);
|
||||
/* called by adfUnMount() */
|
||||
RETCODE (*adfReleaseDevice)(struct Device*);
|
||||
};
|
||||
|
||||
extern void adfInitNativeFct();
|
||||
extern void adfInitNativeFct();
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -35,7 +35,7 @@ clibrary(
|
||||
"./config.h",
|
||||
"./src/adflib.h",
|
||||
],
|
||||
cflags=["-Idep/adflib", "-Idep/adflib/src"],
|
||||
cflags=["-Wno-stringop-overflow"],
|
||||
hdrs={
|
||||
"adf_blk.h": "./src/adf_blk.h",
|
||||
"adf_defs.h": "./src/adf_defs.h",
|
||||
|
||||
@@ -1,2 +1 @@
|
||||
/* empty config.h to keep the source happy */
|
||||
|
||||
|
||||
@@ -27,25 +27,28 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include"adf_str.h"
|
||||
#include"prefix.h"
|
||||
#include "adf_str.h"
|
||||
#include "prefix.h"
|
||||
|
||||
RETCODE adfReadBitmapBlock(struct Volume*, SECTNUM nSect, struct bBitmapBlock*);
|
||||
RETCODE adfWriteBitmapBlock(struct Volume*, SECTNUM nSect, struct bBitmapBlock*);
|
||||
RETCODE adfReadBitmapExtBlock(struct Volume*, SECTNUM nSect, struct bBitmapExtBlock*);
|
||||
RETCODE adfWriteBitmapExtBlock(struct Volume*, SECTNUM, struct bBitmapExtBlock* );
|
||||
RETCODE adfWriteBitmapBlock(
|
||||
struct Volume*, SECTNUM nSect, struct bBitmapBlock*);
|
||||
RETCODE adfReadBitmapExtBlock(
|
||||
struct Volume*, SECTNUM nSect, struct bBitmapExtBlock*);
|
||||
RETCODE adfWriteBitmapExtBlock(
|
||||
struct Volume*, SECTNUM, struct bBitmapExtBlock*);
|
||||
|
||||
SECTNUM adfGet1FreeBlock(struct Volume *vol);
|
||||
RETCODE adfUpdateBitmap(struct Volume *vol);
|
||||
SECTNUM adfGet1FreeBlock(struct Volume* vol);
|
||||
RETCODE adfUpdateBitmap(struct Volume* vol);
|
||||
PREFIX int32_t adfCountFreeBlocks(struct Volume* vol);
|
||||
RETCODE adfReadBitmap(struct Volume* , SECTNUM nBlock, struct bRootBlock* root);
|
||||
RETCODE adfReadBitmap(struct Volume*, SECTNUM nBlock, struct bRootBlock* root);
|
||||
BOOL adfIsBlockFree(struct Volume* vol, SECTNUM nSect);
|
||||
void adfSetBlockFree(struct Volume* vol, SECTNUM nSect);
|
||||
void adfSetBlockUsed(struct Volume* vol, SECTNUM nSect);
|
||||
BOOL adfGetFreeBlocks(struct Volume* vol, int nbSect, SECTNUM* sectList);
|
||||
RETCODE adfCreateBitmap(struct Volume *vol);
|
||||
RETCODE adfWriteNewBitmap(struct Volume *vol);
|
||||
void adfFreeBitmap(struct Volume *vol);
|
||||
RETCODE adfCreateBitmap(struct Volume* vol);
|
||||
RETCODE adfWriteNewBitmap(struct Volume* vol);
|
||||
void adfFreeBitmap(struct Volume* vol);
|
||||
|
||||
#endif /* ADF_BITM_H */
|
||||
|
||||
|
||||
@@ -25,264 +25,255 @@
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef ADF_BLK_H
|
||||
#define ADF_BLK_H 1
|
||||
|
||||
#define ULONG uint32_t
|
||||
#define USHORT uint16_t
|
||||
#define UCHAR uint8_t
|
||||
#define ULONG uint32_t
|
||||
#define USHORT uint16_t
|
||||
#define UCHAR uint8_t
|
||||
|
||||
#define LOGICAL_BLOCK_SIZE 512
|
||||
#define LOGICAL_BLOCK_SIZE 512
|
||||
|
||||
/* ----- FILE SYSTEM ----- */
|
||||
|
||||
#define FSMASK_FFS 1
|
||||
#define FSMASK_INTL 2
|
||||
#define FSMASK_DIRCACHE 4
|
||||
|
||||
#define isFFS(c) ((c)&FSMASK_FFS)
|
||||
#define isOFS(c) (!((c)&FSMASK_FFS))
|
||||
#define isINTL(c) ((c)&FSMASK_INTL)
|
||||
#define isDIRCACHE(c) ((c)&FSMASK_DIRCACHE)
|
||||
#define FSMASK_FFS 1
|
||||
#define FSMASK_INTL 2
|
||||
#define FSMASK_DIRCACHE 4
|
||||
|
||||
#define isFFS(c) ((c)&FSMASK_FFS)
|
||||
#define isOFS(c) (!((c)&FSMASK_FFS))
|
||||
#define isINTL(c) ((c)&FSMASK_INTL)
|
||||
#define isDIRCACHE(c) ((c)&FSMASK_DIRCACHE)
|
||||
|
||||
/* ----- ENTRIES ----- */
|
||||
|
||||
/* access constants */
|
||||
|
||||
#define ACCMASK_D (1<<0)
|
||||
#define ACCMASK_E (1<<1)
|
||||
#define ACCMASK_W (1<<2)
|
||||
#define ACCMASK_R (1<<3)
|
||||
#define ACCMASK_A (1<<4)
|
||||
#define ACCMASK_P (1<<5)
|
||||
#define ACCMASK_S (1<<6)
|
||||
#define ACCMASK_H (1<<7)
|
||||
|
||||
#define hasD(c) ((c)&ACCMASK_D)
|
||||
#define hasE(c) ((c)&ACCMASK_E)
|
||||
#define hasW(c) ((c)&ACCMASK_W)
|
||||
#define hasR(c) ((c)&ACCMASK_R)
|
||||
#define hasA(c) ((c)&ACCMASK_A)
|
||||
#define hasP(c) ((c)&ACCMASK_P)
|
||||
#define hasS(c) ((c)&ACCMASK_S)
|
||||
#define hasH(c) ((c)&ACCMASK_H)
|
||||
#define ACCMASK_D (1 << 0)
|
||||
#define ACCMASK_E (1 << 1)
|
||||
#define ACCMASK_W (1 << 2)
|
||||
#define ACCMASK_R (1 << 3)
|
||||
#define ACCMASK_A (1 << 4)
|
||||
#define ACCMASK_P (1 << 5)
|
||||
#define ACCMASK_S (1 << 6)
|
||||
#define ACCMASK_H (1 << 7)
|
||||
|
||||
#define hasD(c) ((c)&ACCMASK_D)
|
||||
#define hasE(c) ((c)&ACCMASK_E)
|
||||
#define hasW(c) ((c)&ACCMASK_W)
|
||||
#define hasR(c) ((c)&ACCMASK_R)
|
||||
#define hasA(c) ((c)&ACCMASK_A)
|
||||
#define hasP(c) ((c)&ACCMASK_P)
|
||||
#define hasS(c) ((c)&ACCMASK_S)
|
||||
#define hasH(c) ((c)&ACCMASK_H)
|
||||
|
||||
/* ----- BLOCKS ----- */
|
||||
|
||||
/* block constants */
|
||||
|
||||
#define BM_VALID -1
|
||||
#define BM_INVALID 0
|
||||
#define BM_VALID -1
|
||||
#define BM_INVALID 0
|
||||
|
||||
#define HT_SIZE 72
|
||||
#define BM_SIZE 25
|
||||
#define MAX_DATABLK 72
|
||||
|
||||
#define MAXNAMELEN 30
|
||||
#define MAXCMMTLEN 79
|
||||
#define HT_SIZE 72
|
||||
#define BM_SIZE 25
|
||||
#define MAX_DATABLK 72
|
||||
|
||||
#define MAXNAMELEN 30
|
||||
#define MAXCMMTLEN 79
|
||||
|
||||
/* block primary and secondary types */
|
||||
|
||||
#define T_HEADER 2
|
||||
#define ST_ROOT 1
|
||||
#define ST_DIR 2
|
||||
#define ST_FILE -3
|
||||
#define ST_LFILE -4
|
||||
#define ST_LDIR 4
|
||||
#define ST_LSOFT 3
|
||||
#define T_LIST 16
|
||||
#define T_DATA 8
|
||||
#define T_DIRC 33
|
||||
|
||||
#define T_HEADER 2
|
||||
#define ST_ROOT 1
|
||||
#define ST_DIR 2
|
||||
#define ST_FILE -3
|
||||
#define ST_LFILE -4
|
||||
#define ST_LDIR 4
|
||||
#define ST_LSOFT 3
|
||||
#define T_LIST 16
|
||||
#define T_DATA 8
|
||||
#define T_DIRC 33
|
||||
|
||||
/*--- blocks structures --- */
|
||||
|
||||
|
||||
struct bBootBlock {
|
||||
/*000*/ char dosType[4];
|
||||
/*004*/ ULONG checkSum;
|
||||
/*008*/ int32_t rootBlock;
|
||||
/*00c*/ UCHAR data[500+512];
|
||||
struct bBootBlock
|
||||
{
|
||||
/*000*/ char dosType[4];
|
||||
/*004*/ ULONG checkSum;
|
||||
/*008*/ int32_t rootBlock;
|
||||
/*00c*/ UCHAR data[500 + 512];
|
||||
};
|
||||
|
||||
|
||||
struct bRootBlock {
|
||||
/*000*/ int32_t type;
|
||||
int32_t headerKey;
|
||||
int32_t highSeq;
|
||||
/*00c*/ int32_t hashTableSize;
|
||||
int32_t firstData;
|
||||
/*014*/ ULONG checkSum;
|
||||
/*018*/ int32_t hashTable[HT_SIZE]; /* hash table */
|
||||
/*138*/ int32_t bmFlag; /* bitmap flag, -1 means VALID */
|
||||
/*13c*/ int32_t bmPages[BM_SIZE];
|
||||
/*1a0*/ int32_t bmExt;
|
||||
/*1a4*/ int32_t cDays; /* creation date FFS and OFS */
|
||||
/*1a8*/ int32_t cMins;
|
||||
/*1ac*/ int32_t cTicks;
|
||||
/*1b0*/ char nameLen;
|
||||
/*1b1*/ char diskName[MAXNAMELEN+1];
|
||||
char r2[8];
|
||||
/*1d8*/ int32_t days; /* last access : days after 1 jan 1978 */
|
||||
/*1dc*/ int32_t mins; /* hours and minutes in minutes */
|
||||
/*1e0*/ int32_t ticks; /* 1/50 seconds */
|
||||
/*1e4*/ int32_t coDays; /* creation date OFS */
|
||||
/*1e8*/ int32_t coMins;
|
||||
/*1ec*/ int32_t coTicks;
|
||||
int32_t nextSameHash; /* == 0 */
|
||||
int32_t parent; /* == 0 */
|
||||
/*1f8*/ int32_t extension; /* FFS: first directory cache block */
|
||||
/*1fc*/ int32_t secType; /* == 1 */
|
||||
struct bRootBlock
|
||||
{
|
||||
/*000*/ int32_t type;
|
||||
int32_t headerKey;
|
||||
int32_t highSeq;
|
||||
/*00c*/ int32_t hashTableSize;
|
||||
int32_t firstData;
|
||||
/*014*/ ULONG checkSum;
|
||||
/*018*/ int32_t hashTable[HT_SIZE]; /* hash table */
|
||||
/*138*/ int32_t bmFlag; /* bitmap flag, -1 means VALID */
|
||||
/*13c*/ int32_t bmPages[BM_SIZE];
|
||||
/*1a0*/ int32_t bmExt;
|
||||
/*1a4*/ int32_t cDays; /* creation date FFS and OFS */
|
||||
/*1a8*/ int32_t cMins;
|
||||
/*1ac*/ int32_t cTicks;
|
||||
/*1b0*/ char nameLen;
|
||||
/*1b1*/ char diskName[MAXNAMELEN + 1];
|
||||
char r2[8];
|
||||
/*1d8*/ int32_t days; /* last access : days after 1 jan 1978 */
|
||||
/*1dc*/ int32_t mins; /* hours and minutes in minutes */
|
||||
/*1e0*/ int32_t ticks; /* 1/50 seconds */
|
||||
/*1e4*/ int32_t coDays; /* creation date OFS */
|
||||
/*1e8*/ int32_t coMins;
|
||||
/*1ec*/ int32_t coTicks;
|
||||
int32_t nextSameHash; /* == 0 */
|
||||
int32_t parent; /* == 0 */
|
||||
/*1f8*/ int32_t extension; /* FFS: first directory cache block */
|
||||
/*1fc*/ int32_t secType; /* == 1 */
|
||||
};
|
||||
|
||||
|
||||
struct bFileHeaderBlock {
|
||||
/*000*/ int32_t type; /* == 2 */
|
||||
/*004*/ int32_t headerKey; /* current block number */
|
||||
/*008*/ int32_t highSeq; /* number of data block in this hdr block */
|
||||
/*00c*/ int32_t dataSize; /* == 0 */
|
||||
/*010*/ int32_t firstData;
|
||||
/*014*/ ULONG checkSum;
|
||||
/*018*/ int32_t dataBlocks[MAX_DATABLK];
|
||||
/*138*/ int32_t r1;
|
||||
/*13c*/ int32_t r2;
|
||||
/*140*/ int32_t access; /* bit0=del, 1=modif, 2=write, 3=read */
|
||||
/*144*/ uint32_t byteSize;
|
||||
/*148*/ char commLen;
|
||||
/*149*/ char comment[MAXCMMTLEN+1];
|
||||
char r3[91-(MAXCMMTLEN+1)];
|
||||
/*1a4*/ int32_t days;
|
||||
/*1a8*/ int32_t mins;
|
||||
/*1ac*/ int32_t ticks;
|
||||
/*1b0*/ char nameLen;
|
||||
/*1b1*/ char fileName[MAXNAMELEN+1];
|
||||
int32_t r4;
|
||||
/*1d4*/ int32_t real; /* unused == 0 */
|
||||
/*1d8*/ int32_t nextLink; /* link chain */
|
||||
int32_t r5[5];
|
||||
/*1f0*/ int32_t nextSameHash; /* next entry with sane hash */
|
||||
/*1f4*/ int32_t parent; /* parent directory */
|
||||
/*1f8*/ int32_t extension; /* pointer to extension block */
|
||||
/*1fc*/ int32_t secType; /* == -3 */
|
||||
struct bFileHeaderBlock
|
||||
{
|
||||
/*000*/ int32_t type; /* == 2 */
|
||||
/*004*/ int32_t headerKey; /* current block number */
|
||||
/*008*/ int32_t highSeq; /* number of data block in this hdr block */
|
||||
/*00c*/ int32_t dataSize; /* == 0 */
|
||||
/*010*/ int32_t firstData;
|
||||
/*014*/ ULONG checkSum;
|
||||
/*018*/ int32_t dataBlocks[MAX_DATABLK];
|
||||
/*138*/ int32_t r1;
|
||||
/*13c*/ int32_t r2;
|
||||
/*140*/ int32_t access; /* bit0=del, 1=modif, 2=write, 3=read */
|
||||
/*144*/ uint32_t byteSize;
|
||||
/*148*/ char commLen;
|
||||
/*149*/ char comment[MAXCMMTLEN + 1];
|
||||
char r3[91 - (MAXCMMTLEN + 1)];
|
||||
/*1a4*/ int32_t days;
|
||||
/*1a8*/ int32_t mins;
|
||||
/*1ac*/ int32_t ticks;
|
||||
/*1b0*/ char nameLen;
|
||||
/*1b1*/ char fileName[MAXNAMELEN + 1];
|
||||
int32_t r4;
|
||||
/*1d4*/ int32_t real; /* unused == 0 */
|
||||
/*1d8*/ int32_t nextLink; /* link chain */
|
||||
int32_t r5[5];
|
||||
/*1f0*/ int32_t nextSameHash; /* next entry with sane hash */
|
||||
/*1f4*/ int32_t parent; /* parent directory */
|
||||
/*1f8*/ int32_t extension; /* pointer to extension block */
|
||||
/*1fc*/ int32_t secType; /* == -3 */
|
||||
};
|
||||
|
||||
|
||||
/*--- file header extension block structure ---*/
|
||||
|
||||
struct bFileExtBlock {
|
||||
/*000*/ int32_t type; /* == 0x10 */
|
||||
/*004*/ int32_t headerKey;
|
||||
/*008*/ int32_t highSeq;
|
||||
/*00c*/ int32_t dataSize; /* == 0 */
|
||||
/*010*/ int32_t firstData; /* == 0 */
|
||||
/*014*/ ULONG checkSum;
|
||||
/*018*/ int32_t dataBlocks[MAX_DATABLK];
|
||||
int32_t r[45];
|
||||
int32_t info; /* == 0 */
|
||||
int32_t nextSameHash; /* == 0 */
|
||||
/*1f4*/ int32_t parent; /* header block */
|
||||
/*1f8*/ int32_t extension; /* next header extension block */
|
||||
/*1fc*/ int32_t secType; /* -3 */
|
||||
struct bFileExtBlock
|
||||
{
|
||||
/*000*/ int32_t type; /* == 0x10 */
|
||||
/*004*/ int32_t headerKey;
|
||||
/*008*/ int32_t highSeq;
|
||||
/*00c*/ int32_t dataSize; /* == 0 */
|
||||
/*010*/ int32_t firstData; /* == 0 */
|
||||
/*014*/ ULONG checkSum;
|
||||
/*018*/ int32_t dataBlocks[MAX_DATABLK];
|
||||
int32_t r[45];
|
||||
int32_t info; /* == 0 */
|
||||
int32_t nextSameHash; /* == 0 */
|
||||
/*1f4*/ int32_t parent; /* header block */
|
||||
/*1f8*/ int32_t extension; /* next header extension block */
|
||||
/*1fc*/ int32_t secType; /* -3 */
|
||||
};
|
||||
|
||||
|
||||
|
||||
struct bDirBlock {
|
||||
/*000*/ int32_t type; /* == 2 */
|
||||
/*004*/ int32_t headerKey;
|
||||
/*008*/ int32_t highSeq; /* == 0 */
|
||||
/*00c*/ int32_t hashTableSize; /* == 0 */
|
||||
int32_t r1; /* == 0 */
|
||||
/*014*/ ULONG checkSum;
|
||||
/*018*/ int32_t hashTable[HT_SIZE]; /* hash table */
|
||||
int32_t r2[2];
|
||||
/*140*/ int32_t access;
|
||||
int32_t r4; /* == 0 */
|
||||
/*148*/ char commLen;
|
||||
/*149*/ char comment[MAXCMMTLEN+1];
|
||||
char r5[91-(MAXCMMTLEN+1)];
|
||||
/*1a4*/ int32_t days; /* last access */
|
||||
/*1a8*/ int32_t mins;
|
||||
/*1ac*/ int32_t ticks;
|
||||
/*1b0*/ char nameLen;
|
||||
/*1b1*/ char dirName[MAXNAMELEN+1];
|
||||
int32_t r6;
|
||||
/*1d4*/ int32_t real; /* ==0 */
|
||||
/*1d8*/ int32_t nextLink; /* link list */
|
||||
int32_t r7[5];
|
||||
/*1f0*/ int32_t nextSameHash;
|
||||
/*1f4*/ int32_t parent;
|
||||
/*1f8*/ int32_t extension; /* FFS : first directory cache */
|
||||
/*1fc*/ int32_t secType; /* == 2 */
|
||||
struct bDirBlock
|
||||
{
|
||||
/*000*/ int32_t type; /* == 2 */
|
||||
/*004*/ int32_t headerKey;
|
||||
/*008*/ int32_t highSeq; /* == 0 */
|
||||
/*00c*/ int32_t hashTableSize; /* == 0 */
|
||||
int32_t r1; /* == 0 */
|
||||
/*014*/ ULONG checkSum;
|
||||
/*018*/ int32_t hashTable[HT_SIZE]; /* hash table */
|
||||
int32_t r2[2];
|
||||
/*140*/ int32_t access;
|
||||
int32_t r4; /* == 0 */
|
||||
/*148*/ char commLen;
|
||||
/*149*/ char comment[MAXCMMTLEN + 1];
|
||||
char r5[91 - (MAXCMMTLEN + 1)];
|
||||
/*1a4*/ int32_t days; /* last access */
|
||||
/*1a8*/ int32_t mins;
|
||||
/*1ac*/ int32_t ticks;
|
||||
/*1b0*/ char nameLen;
|
||||
/*1b1*/ char dirName[MAXNAMELEN + 1];
|
||||
int32_t r6;
|
||||
/*1d4*/ int32_t real; /* ==0 */
|
||||
/*1d8*/ int32_t nextLink; /* link list */
|
||||
int32_t r7[5];
|
||||
/*1f0*/ int32_t nextSameHash;
|
||||
/*1f4*/ int32_t parent;
|
||||
/*1f8*/ int32_t extension; /* FFS : first directory cache */
|
||||
/*1fc*/ int32_t secType; /* == 2 */
|
||||
};
|
||||
|
||||
|
||||
|
||||
struct bOFSDataBlock{
|
||||
/*000*/ int32_t type; /* == 8 */
|
||||
/*004*/ int32_t headerKey; /* pointer to file_hdr block */
|
||||
/*008*/ int32_t seqNum; /* file data block number */
|
||||
/*00c*/ int32_t dataSize; /* <= 0x1e8 */
|
||||
/*010*/ int32_t nextData; /* next data block */
|
||||
/*014*/ ULONG checkSum;
|
||||
/*018*/ UCHAR data[488];
|
||||
struct bOFSDataBlock
|
||||
{
|
||||
/*000*/ int32_t type; /* == 8 */
|
||||
/*004*/ int32_t headerKey; /* pointer to file_hdr block */
|
||||
/*008*/ int32_t seqNum; /* file data block number */
|
||||
/*00c*/ int32_t dataSize; /* <= 0x1e8 */
|
||||
/*010*/ int32_t nextData; /* next data block */
|
||||
/*014*/ ULONG checkSum;
|
||||
/*018*/ UCHAR data[488];
|
||||
/*200*/ };
|
||||
|
||||
|
||||
/* --- bitmap --- */
|
||||
|
||||
struct bBitmapBlock {
|
||||
/*000*/ ULONG checkSum;
|
||||
/*004*/ ULONG map[127];
|
||||
};
|
||||
|
||||
|
||||
struct bBitmapExtBlock {
|
||||
/*000*/ int32_t bmPages[127];
|
||||
/*1fc*/ int32_t nextBlock;
|
||||
};
|
||||
|
||||
|
||||
struct bLinkBlock {
|
||||
/*000*/ int32_t type; /* == 2 */
|
||||
/*004*/ int32_t headerKey; /* self pointer */
|
||||
int32_t r1[3];
|
||||
/*014*/ ULONG checkSum;
|
||||
/*018*/ char realName[64];
|
||||
int32_t r2[83];
|
||||
/*1a4*/ int32_t days; /* last access */
|
||||
/*1a8*/ int32_t mins;
|
||||
/*1ac*/ int32_t ticks;
|
||||
/*1b0*/ char nameLen;
|
||||
/*1b1*/ char name[MAXNAMELEN+1];
|
||||
int32_t r3;
|
||||
/*1d4*/ int32_t realEntry;
|
||||
/*1d8*/ int32_t nextLink;
|
||||
int32_t r4[5];
|
||||
/*1f0*/ int32_t nextSameHash;
|
||||
/*1f4*/ int32_t parent;
|
||||
int32_t r5;
|
||||
/*1fc*/ int32_t secType; /* == -4, 4, 3 */
|
||||
};
|
||||
struct bBitmapBlock
|
||||
{
|
||||
/*000*/ ULONG checkSum;
|
||||
/*004*/ ULONG map[127];
|
||||
};
|
||||
|
||||
struct bBitmapExtBlock
|
||||
{
|
||||
/*000*/ int32_t bmPages[127];
|
||||
/*1fc*/ int32_t nextBlock;
|
||||
};
|
||||
|
||||
struct bLinkBlock
|
||||
{
|
||||
/*000*/ int32_t type; /* == 2 */
|
||||
/*004*/ int32_t headerKey; /* self pointer */
|
||||
int32_t r1[3];
|
||||
/*014*/ ULONG checkSum;
|
||||
/*018*/ char realName[64];
|
||||
int32_t r2[83];
|
||||
/*1a4*/ int32_t days; /* last access */
|
||||
/*1a8*/ int32_t mins;
|
||||
/*1ac*/ int32_t ticks;
|
||||
/*1b0*/ char nameLen;
|
||||
/*1b1*/ char name[MAXNAMELEN + 1];
|
||||
int32_t r3;
|
||||
/*1d4*/ int32_t realEntry;
|
||||
/*1d8*/ int32_t nextLink;
|
||||
int32_t r4[5];
|
||||
/*1f0*/ int32_t nextSameHash;
|
||||
/*1f4*/ int32_t parent;
|
||||
int32_t r5;
|
||||
/*1fc*/ int32_t secType; /* == -4, 4, 3 */
|
||||
};
|
||||
|
||||
/*--- directory cache block structure ---*/
|
||||
|
||||
struct bDirCacheBlock {
|
||||
/*000*/ int32_t type; /* == 33 */
|
||||
/*004*/ int32_t headerKey;
|
||||
/*008*/ int32_t parent;
|
||||
/*00c*/ int32_t recordsNb;
|
||||
/*010*/ int32_t nextDirC;
|
||||
/*014*/ ULONG checkSum;
|
||||
/*018*/ uint8_t records[488];
|
||||
};
|
||||
|
||||
struct bDirCacheBlock
|
||||
{
|
||||
/*000*/ int32_t type; /* == 33 */
|
||||
/*004*/ int32_t headerKey;
|
||||
/*008*/ int32_t parent;
|
||||
/*00c*/ int32_t recordsNb;
|
||||
/*010*/ int32_t nextDirC;
|
||||
/*014*/ ULONG checkSum;
|
||||
/*018*/ uint8_t records[488];
|
||||
};
|
||||
|
||||
#endif /* ADF_BLK_H */
|
||||
/*##########################################################################*/
|
||||
|
||||
@@ -27,20 +27,28 @@
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#include "adf_str.h"
|
||||
|
||||
void adfGetCacheEntry(struct bDirCacheBlock *dirc, int *p, struct CacheEntry *cEntry);
|
||||
int adfPutCacheEntry( struct bDirCacheBlock *dirc, int *p, struct CacheEntry *cEntry);
|
||||
void adfGetCacheEntry(
|
||||
struct bDirCacheBlock* dirc, int* p, struct CacheEntry* cEntry);
|
||||
int adfPutCacheEntry(
|
||||
struct bDirCacheBlock* dirc, int* p, struct CacheEntry* cEntry);
|
||||
|
||||
struct List* adfGetDirEntCache(struct Volume *vol, SECTNUM dir, BOOL recurs);
|
||||
struct List* adfGetDirEntCache(struct Volume* vol, SECTNUM dir, BOOL recurs);
|
||||
|
||||
RETCODE adfCreateEmptyCache(struct Volume *vol, struct bEntryBlock *parent, SECTNUM nSect);
|
||||
RETCODE adfAddInCache(struct Volume *vol, struct bEntryBlock *parent, struct bEntryBlock *entry);
|
||||
RETCODE adfUpdateCache(struct Volume *vol, struct bEntryBlock *parent, struct bEntryBlock *entry, BOOL);
|
||||
RETCODE adfDelFromCache(struct Volume *vol, struct bEntryBlock *parent, SECTNUM);
|
||||
RETCODE adfCreateEmptyCache(
|
||||
struct Volume* vol, struct bEntryBlock* parent, SECTNUM nSect);
|
||||
RETCODE adfAddInCache(
|
||||
struct Volume* vol, struct bEntryBlock* parent, struct bEntryBlock* entry);
|
||||
RETCODE adfUpdateCache(struct Volume* vol,
|
||||
struct bEntryBlock* parent,
|
||||
struct bEntryBlock* entry,
|
||||
BOOL);
|
||||
RETCODE adfDelFromCache(
|
||||
struct Volume* vol, struct bEntryBlock* parent, SECTNUM);
|
||||
|
||||
RETCODE adfReadDirCBlock(struct Volume *vol, SECTNUM nSect, struct bDirCacheBlock *dirc);
|
||||
RETCODE adfReadDirCBlock(
|
||||
struct Volume* vol, SECTNUM nSect, struct bDirCacheBlock* dirc);
|
||||
RETCODE adfWriteDirCBlock(struct Volume*, int32_t, struct bDirCacheBlock* dirc);
|
||||
|
||||
#endif /* _ADF_CACHE_H */
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _ADF_DEFS_H
|
||||
#define _ADF_DEFS_H 1
|
||||
|
||||
@@ -34,38 +33,33 @@
|
||||
#define SECTNUM int32_t
|
||||
#define RETCODE int32_t
|
||||
|
||||
#define TRUE 1
|
||||
#define FALSE 0
|
||||
#define TRUE 1
|
||||
#define FALSE 0
|
||||
|
||||
#include <stdint.h>
|
||||
#define ULONG uint32_t
|
||||
#define USHORT uint16_t
|
||||
#define UCHAR uint8_t
|
||||
#define BOOL int
|
||||
|
||||
#define ULONG uint32_t
|
||||
#define USHORT uint16_t
|
||||
#define UCHAR uint8_t
|
||||
#define BOOL int
|
||||
|
||||
/* defines max and min */
|
||||
|
||||
#ifndef max
|
||||
#define max(a,b) (a)>(b) ? (a) : (b)
|
||||
#define max(a, b) (a) > (b) ? (a) : (b)
|
||||
#endif
|
||||
#ifndef min
|
||||
#define min(a,b) (a)<(b) ? (a) : (b)
|
||||
#define min(a, b) (a) < (b) ? (a) : (b)
|
||||
#endif
|
||||
|
||||
|
||||
/* (*byte) to (*short) and (*byte) to (*long) conversion */
|
||||
|
||||
#define Short(p) ((p)[0]<<8 | (p)[1])
|
||||
#define Long(p) (Short(p)<<16 | Short(p+2))
|
||||
|
||||
#define Short(p) ((p)[0] << 8 | (p)[1])
|
||||
#define Long(p) (Short(p) << 16 | Short(p + 2))
|
||||
|
||||
/* swap short and swap long macros for little endian machines */
|
||||
|
||||
#define swapShort(p) ((p)[0]<<8 | (p)[1])
|
||||
#define swapLong(p) (swapShort(p)<<16 | swapShort(p+2))
|
||||
|
||||
|
||||
#define swapShort(p) ((p)[0] << 8 | (p)[1])
|
||||
#define swapLong(p) (swapShort(p) << 16 | swapShort(p + 2))
|
||||
|
||||
#endif /* _ADF_DEFS_H */
|
||||
/*##########################################################################*/
|
||||
|
||||
@@ -26,45 +26,54 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include"adf_str.h"
|
||||
#include"adf_err.h"
|
||||
#include"adf_defs.h"
|
||||
#include "adf_str.h"
|
||||
#include "adf_err.h"
|
||||
#include "adf_defs.h"
|
||||
|
||||
#include"prefix.h"
|
||||
#include "prefix.h"
|
||||
|
||||
PREFIX RETCODE adfToRootDir(struct Volume *vol);
|
||||
BOOL isDirEmpty(struct bDirBlock *dir);
|
||||
PREFIX RETCODE adfRemoveEntry(struct Volume *vol, SECTNUM pSect, char *name);
|
||||
PREFIX struct List* adfGetDirEnt(struct Volume* vol, SECTNUM nSect );
|
||||
PREFIX struct List* adfGetRDirEnt(struct Volume* vol, SECTNUM nSect, BOOL recurs );
|
||||
PREFIX RETCODE adfToRootDir(struct Volume* vol);
|
||||
BOOL isDirEmpty(struct bDirBlock* dir);
|
||||
PREFIX RETCODE adfRemoveEntry(struct Volume* vol, SECTNUM pSect, char* name);
|
||||
PREFIX struct List* adfGetDirEnt(struct Volume* vol, SECTNUM nSect);
|
||||
PREFIX struct List* adfGetRDirEnt(
|
||||
struct Volume* vol, SECTNUM nSect, BOOL recurs);
|
||||
PREFIX void adfFreeDirList(struct List* list);
|
||||
|
||||
RETCODE adfEntBlock2Entry(struct bEntryBlock *entryBlk, struct Entry *entry);
|
||||
PREFIX void adfFreeEntry(struct Entry *entry);
|
||||
RETCODE adfCreateFile(struct Volume* vol, SECTNUM parent, char *name,
|
||||
struct bFileHeaderBlock *fhdr);
|
||||
RETCODE adfEntBlock2Entry(struct bEntryBlock* entryBlk, struct Entry* entry);
|
||||
PREFIX void adfFreeEntry(struct Entry* entry);
|
||||
RETCODE adfCreateFile(struct Volume* vol,
|
||||
SECTNUM parent,
|
||||
char* name,
|
||||
struct bFileHeaderBlock* fhdr);
|
||||
PREFIX RETCODE adfCreateDir(struct Volume* vol, SECTNUM parent, char* name);
|
||||
SECTNUM adfCreateEntry(struct Volume *vol, struct bEntryBlock *dir, char *name, SECTNUM );
|
||||
PREFIX RETCODE adfRenameEntry(struct Volume *vol, SECTNUM, char *old,SECTNUM,char *new);
|
||||
SECTNUM adfCreateEntry(
|
||||
struct Volume* vol, struct bEntryBlock* dir, char* name, SECTNUM);
|
||||
PREFIX RETCODE adfRenameEntry(
|
||||
struct Volume* vol, SECTNUM, char* old, SECTNUM, char* new);
|
||||
|
||||
|
||||
RETCODE adfReadEntryBlock(struct Volume* vol, SECTNUM nSect, struct bEntryBlock* ent);
|
||||
RETCODE adfWriteDirBlock(struct Volume* vol, SECTNUM nSect, struct bDirBlock *dir);
|
||||
RETCODE adfWriteEntryBlock(struct Volume* vol, SECTNUM nSect, struct bEntryBlock *ent);
|
||||
RETCODE adfReadEntryBlock(
|
||||
struct Volume* vol, SECTNUM nSect, struct bEntryBlock* ent);
|
||||
RETCODE adfWriteDirBlock(
|
||||
struct Volume* vol, SECTNUM nSect, struct bDirBlock* dir);
|
||||
RETCODE adfWriteEntryBlock(
|
||||
struct Volume* vol, SECTNUM nSect, struct bEntryBlock* ent);
|
||||
|
||||
char* adfAccess2String(int32_t acc);
|
||||
uint8_t adfIntlToUpper(uint8_t c);
|
||||
int adfGetHashValue(uint8_t *name, BOOL intl);
|
||||
void myToUpper( uint8_t *ostr, uint8_t *nstr, int,BOOL intl );
|
||||
PREFIX RETCODE adfChangeDir(struct Volume* vol, char *name);
|
||||
int adfGetHashValue(uint8_t* name, BOOL intl);
|
||||
void myToUpper(uint8_t* ostr, uint8_t* nstr, int, BOOL intl);
|
||||
PREFIX RETCODE adfChangeDir(struct Volume* vol, char* name);
|
||||
PREFIX RETCODE adfParentDir(struct Volume* vol);
|
||||
PREFIX RETCODE adfSetEntryAccess(struct Volume*, SECTNUM, char*, int32_t);
|
||||
PREFIX RETCODE adfSetEntryComment(struct Volume*, SECTNUM, char*, char*);
|
||||
SECTNUM adfNameToEntryBlk(struct Volume *vol, int32_t ht[], char* name,
|
||||
struct bEntryBlock *entry, SECTNUM *);
|
||||
SECTNUM adfNameToEntryBlk(struct Volume* vol,
|
||||
int32_t ht[],
|
||||
char* name,
|
||||
struct bEntryBlock* entry,
|
||||
SECTNUM*);
|
||||
|
||||
PREFIX void printEntry(struct Entry* entry);
|
||||
void adfFreeDirList(struct List* list);
|
||||
|
||||
#endif /* ADF_DIR_H */
|
||||
|
||||
|
||||
@@ -31,21 +31,21 @@
|
||||
#include "adf_str.h"
|
||||
#include "adf_defs.h"
|
||||
|
||||
PREFIX RETCODE adfInstallBootBlock(struct Volume *vol,uint8_t*);
|
||||
PREFIX RETCODE adfInstallBootBlock(struct Volume* vol, uint8_t*);
|
||||
|
||||
PREFIX BOOL isSectNumValid(struct Volume *vol, SECTNUM nSect);
|
||||
PREFIX BOOL isSectNumValid(struct Volume* vol, SECTNUM nSect);
|
||||
|
||||
PREFIX struct Volume* adfMount( struct Device *dev, int nPart, BOOL readOnly );
|
||||
PREFIX void adfUnMount(struct Volume *vol);
|
||||
PREFIX void adfVolumeInfo(struct Volume *vol);
|
||||
struct Volume* adfCreateVol( struct Device* dev, int32_t start, int32_t len,
|
||||
char* volName, int volType );
|
||||
PREFIX struct Volume* adfMount(struct Device* dev, int nPart, BOOL readOnly);
|
||||
PREFIX void adfUnMount(struct Volume* vol);
|
||||
PREFIX void adfVolumeInfo(struct Volume* vol);
|
||||
struct Volume* adfCreateVol(
|
||||
struct Device* dev, int32_t start, int32_t len, char* volName, int volType);
|
||||
|
||||
/*void adfReadBitmap(struct Volume* , int32_t nBlock, struct bRootBlock* root);
|
||||
void adfUpdateBitmap(struct Volume*);
|
||||
*/
|
||||
PREFIX RETCODE adfReadBlock(struct Volume* , int32_t nSect, uint8_t* buf);
|
||||
PREFIX RETCODE adfWriteBlock(struct Volume* , int32_t nSect, uint8_t* buf);
|
||||
PREFIX RETCODE adfReadBlock(struct Volume*, int32_t nSect, uint8_t* buf);
|
||||
PREFIX RETCODE adfWriteBlock(struct Volume*, int32_t nSect, uint8_t* buf);
|
||||
|
||||
#endif /* _ADF_DISK_H */
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
* adf_dump.h
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
*
|
||||
* This file is part of ADFLib.
|
||||
*
|
||||
* ADFLib is free software; you can redistribute it and/or modify
|
||||
@@ -26,14 +26,13 @@
|
||||
*
|
||||
*/
|
||||
|
||||
PREFIX struct Device*
|
||||
adfCreateDumpDevice(char* filename, int32_t cyl, int32_t heads, int32_t sec);
|
||||
PREFIX struct Device* adfCreateDumpDevice(
|
||||
char* filename, int32_t cyl, int32_t heads, int32_t sec);
|
||||
PREFIX RETCODE adfCreateHdFile(struct Device* dev, char* volName, int volType);
|
||||
BOOL adfInitDumpDevice(struct Device* dev, char* name,BOOL);
|
||||
BOOL adfReadDumpSector(struct Device *dev, int32_t n, int size, uint8_t* buf);
|
||||
BOOL adfWriteDumpSector(struct Device *dev, int32_t n, int size, uint8_t* buf);
|
||||
RETCODE adfReleaseDumpDevice(struct Device *dev);
|
||||
|
||||
BOOL adfInitDumpDevice(struct Device* dev, char* name, BOOL);
|
||||
BOOL adfReadDumpSector(struct Device* dev, int32_t n, int size, uint8_t* buf);
|
||||
BOOL adfWriteDumpSector(struct Device* dev, int32_t n, int size, uint8_t* buf);
|
||||
RETCODE adfReleaseDumpDevice(struct Device* dev);
|
||||
|
||||
#endif /* ADF_DUMP_H */
|
||||
/*##########################################################################*/
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
* adf_env.h
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
*
|
||||
* This file is part of ADFLib.
|
||||
*
|
||||
* ADFLib is free software; you can redistribute it and/or modify
|
||||
@@ -26,13 +26,15 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include"prefix.h"
|
||||
#include "prefix.h"
|
||||
|
||||
PREFIX void adfEnvInitDefault();
|
||||
PREFIX void adfSetEnvFct( void(*e)(char*), void(*w)(char*), void(*v)(char*),
|
||||
void(*n)(SECTNUM,int) );
|
||||
PREFIX void adfSetEnvFct(void (*e)(char*),
|
||||
void (*w)(char*),
|
||||
void (*v)(char*),
|
||||
void (*n)(SECTNUM, int));
|
||||
PREFIX void adfEnvCleanUp();
|
||||
PREFIX void adfChgEnvProp(int prop, void *new);
|
||||
PREFIX void adfChgEnvProp(int prop, void* new);
|
||||
PREFIX char* adfGetVersionNumber();
|
||||
PREFIX char* adfGetVersionDate();
|
||||
|
||||
|
||||
@@ -26,39 +26,36 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#define hasRC(rc, c) ((rc) & (c))
|
||||
|
||||
#define hasRC(rc,c) ((rc)&(c))
|
||||
#define RC_OK 0
|
||||
#define RC_ERROR -1
|
||||
|
||||
#define RC_OK 0
|
||||
#define RC_ERROR -1
|
||||
#define RC_MALLOC 1
|
||||
#define RC_VOLFULL 2
|
||||
|
||||
#define RC_MALLOC 1
|
||||
#define RC_VOLFULL 2
|
||||
|
||||
|
||||
#define RC_FOPEN 1<<10
|
||||
#define RC_NULLPTR 1<<12
|
||||
#define RC_FOPEN 1 << 10
|
||||
#define RC_NULLPTR 1 << 12
|
||||
|
||||
/* adfRead*Block() */
|
||||
|
||||
#define RC_BLOCKTYPE 1
|
||||
#define RC_BLOCKSTYPE 1<<1
|
||||
#define RC_BLOCKSUM 1<<2
|
||||
#define RC_HEADERKEY 1<<3
|
||||
#define RC_BLOCKREAD 1<<4
|
||||
#define RC_BLOCKTYPE 1
|
||||
#define RC_BLOCKSTYPE 1 << 1
|
||||
#define RC_BLOCKSUM 1 << 2
|
||||
#define RC_HEADERKEY 1 << 3
|
||||
#define RC_BLOCKREAD 1 << 4
|
||||
|
||||
/* adfWrite*Block */
|
||||
#define RC_BLOCKWRITE 1<<4
|
||||
|
||||
#define RC_BLOCKWRITE 1 << 4
|
||||
|
||||
/* adfReadBlock() */
|
||||
#define RC_BLOCKOUTOFRANGE 1
|
||||
#define RC_BLOCKNATREAD 1<<1
|
||||
#define RC_BLOCKOUTOFRANGE 1
|
||||
#define RC_BLOCKNATREAD 1 << 1
|
||||
|
||||
/* adfWriteBlock() */
|
||||
/* RC_BLOCKOUTOFRANGE */
|
||||
#define RC_BLOCKNATWRITE 1<<1
|
||||
#define RC_BLOCKREADONLY 1<<2
|
||||
#define RC_BLOCKNATWRITE 1 << 1
|
||||
#define RC_BLOCKREADONLY 1 << 2
|
||||
|
||||
/* adfInitDumpDevice() */
|
||||
/* RC_FOPEN */
|
||||
@@ -66,17 +63,16 @@
|
||||
|
||||
/* adfNativeReadBlock(), adfReadDumpSector() */
|
||||
|
||||
#define RC_BLOCKSHORTREAD 1
|
||||
#define RC_BLOCKFSEEK 1<<1
|
||||
#define RC_BLOCKSHORTREAD 1
|
||||
#define RC_BLOCKFSEEK 1 << 1
|
||||
|
||||
/* adfNativeWriteBlock(), adfWriteDumpSector() */
|
||||
|
||||
#define RC_BLOCKSHORTWRITE 1
|
||||
#define RC_BLOCKSHORTWRITE 1
|
||||
/* RC_BLOCKFSEEK */
|
||||
|
||||
|
||||
/*-- adfReadRDSKblock --*/
|
||||
#define RC_BLOCKID 1<<5
|
||||
#define RC_BLOCKID 1 << 5
|
||||
|
||||
/*-- adfWriteRDSKblock() --*/
|
||||
/*RC_BLOCKREADONLY*/
|
||||
|
||||
@@ -26,35 +26,40 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include"prefix.h"
|
||||
#include "prefix.h"
|
||||
|
||||
#include"adf_str.h"
|
||||
#include "adf_str.h"
|
||||
|
||||
RETCODE adfGetFileBlocks(struct Volume* vol, struct bFileHeaderBlock* entry,
|
||||
struct FileBlocks* );
|
||||
RETCODE adfFreeFileBlocks(struct Volume* vol, struct bFileHeaderBlock *entry);
|
||||
PREFIX int32_t adfFileRealSize(uint32_t size, int blockSize, int32_t *dataN, int32_t *extN);
|
||||
RETCODE adfGetFileBlocks(
|
||||
struct Volume* vol, struct bFileHeaderBlock* entry, struct FileBlocks*);
|
||||
RETCODE adfFreeFileBlocks(struct Volume* vol, struct bFileHeaderBlock* entry);
|
||||
PREFIX int32_t adfFileRealSize(
|
||||
uint32_t size, int blockSize, int32_t* dataN, int32_t* extN);
|
||||
|
||||
int32_t adfPos2DataBlock(int32_t pos, int blockSize, int *posInExtBlk, int *posInDataBlk, int32_t *curDataN );
|
||||
int32_t adfPos2DataBlock(int32_t pos,
|
||||
int blockSize,
|
||||
int* posInExtBlk,
|
||||
int* posInDataBlk,
|
||||
int32_t* curDataN);
|
||||
|
||||
RETCODE adfWriteFileHdrBlock(struct Volume *vol, SECTNUM nSect, struct bFileHeaderBlock* fhdr);
|
||||
RETCODE adfWriteFileHdrBlock(
|
||||
struct Volume* vol, SECTNUM nSect, struct bFileHeaderBlock* fhdr);
|
||||
|
||||
RETCODE adfReadDataBlock(struct Volume *vol, SECTNUM nSect, void *data);
|
||||
RETCODE adfWriteDataBlock(struct Volume *vol, SECTNUM nSect, void *data);
|
||||
RETCODE adfReadFileExtBlock(struct Volume *vol, SECTNUM nSect, struct bFileExtBlock* fext);
|
||||
RETCODE adfWriteFileExtBlock(struct Volume *vol, SECTNUM nSect, struct bFileExtBlock* fext);
|
||||
RETCODE adfReadDataBlock(struct Volume* vol, SECTNUM nSect, void* data);
|
||||
RETCODE adfWriteDataBlock(struct Volume* vol, SECTNUM nSect, void* data);
|
||||
RETCODE adfReadFileExtBlock(
|
||||
struct Volume* vol, SECTNUM nSect, struct bFileExtBlock* fext);
|
||||
RETCODE adfWriteFileExtBlock(
|
||||
struct Volume* vol, SECTNUM nSect, struct bFileExtBlock* fext);
|
||||
|
||||
PREFIX struct File* adfOpenFile(struct Volume *vol, char* name, char *mode);
|
||||
PREFIX void adfCloseFile(struct File *file);
|
||||
PREFIX int32_t adfReadFile(struct File* file, int32_t n, uint8_t *buffer);
|
||||
PREFIX struct File* adfOpenFile(struct Volume* vol, char* name, char* mode);
|
||||
PREFIX void adfCloseFile(struct File* file);
|
||||
PREFIX int32_t adfReadFile(struct File* file, int32_t n, uint8_t* buffer);
|
||||
PREFIX BOOL adfEndOfFile(struct File* file);
|
||||
PREFIX void adfFileSeek(struct File *file, uint32_t pos); /* BV */
|
||||
PREFIX void adfFileSeek(struct File* file, uint32_t pos); /* BV */
|
||||
RETCODE adfReadNextFileBlock(struct File* file);
|
||||
PREFIX int32_t adfWriteFile(struct File *file, int32_t n, uint8_t *buffer);
|
||||
PREFIX int32_t adfWriteFile(struct File* file, int32_t n, uint8_t* buffer);
|
||||
SECTNUM adfCreateNextFileBlock(struct File* file);
|
||||
PREFIX void adfFlushFile(struct File *file);
|
||||
|
||||
|
||||
PREFIX void adfFlushFile(struct File* file);
|
||||
|
||||
#endif /* ADF_FILE_H */
|
||||
|
||||
|
||||
@@ -28,38 +28,48 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include"prefix.h"
|
||||
#include "prefix.h"
|
||||
|
||||
#include "adf_str.h"
|
||||
#include "hd_blk.h"
|
||||
#include "adf_err.h"
|
||||
|
||||
int adfDevType(struct Device *dev);
|
||||
PREFIX void adfDeviceInfo(struct Device *dev);
|
||||
int adfDevType(struct Device* dev);
|
||||
PREFIX void adfDeviceInfo(struct Device* dev);
|
||||
|
||||
RETCODE adfMountHd(struct Device *dev);
|
||||
RETCODE adfMountHd(struct Device* dev);
|
||||
RETCODE adfMountFlop(struct Device* dev);
|
||||
PREFIX struct Device* adfMountDev( char* filename,BOOL);
|
||||
PREFIX void adfUnMountDev( struct Device* dev);
|
||||
PREFIX struct Device* adfMountDev(char* filename, BOOL);
|
||||
PREFIX void adfUnMountDev(struct Device* dev);
|
||||
|
||||
RETCODE adfCreateHdHeader(struct Device* dev, int n, struct Partition** partList );
|
||||
PREFIX RETCODE adfCreateFlop(struct Device* dev, char* volName, int volType );
|
||||
PREFIX RETCODE adfCreateHd(struct Device* dev, int n, struct Partition** partList );
|
||||
RETCODE adfCreateHdHeader(
|
||||
struct Device* dev, int n, struct Partition** partList);
|
||||
PREFIX RETCODE adfCreateFlop(struct Device* dev, char* volName, int volType);
|
||||
PREFIX RETCODE adfCreateHd(
|
||||
struct Device* dev, int n, struct Partition** partList);
|
||||
PREFIX RETCODE adfCreateHdFile(struct Device* dev, char* volName, int volType);
|
||||
|
||||
struct Device* adfCreateDev(char* filename, int32_t cylinders, int32_t heads, int32_t sectors);
|
||||
|
||||
RETCODE adfReadBlockDev( struct Device* dev, int32_t nSect, int32_t size, uint8_t* buf );
|
||||
RETCODE adfWriteBlockDev(struct Device* dev, int32_t nSect, int32_t size, uint8_t* buf );
|
||||
RETCODE adfReadRDSKblock( struct Device* dev, struct bRDSKblock* blk );
|
||||
RETCODE adfWriteRDSKblock(struct Device *dev, struct bRDSKblock* rdsk);
|
||||
RETCODE adfReadPARTblock( struct Device* dev, int32_t nSect, struct bPARTblock* blk );
|
||||
RETCODE adfWritePARTblock(struct Device *dev, int32_t nSect, struct bPARTblock* part);
|
||||
RETCODE adfReadFSHDblock( struct Device* dev, int32_t nSect, struct bFSHDblock* blk);
|
||||
RETCODE adfWriteFSHDblock(struct Device *dev, int32_t nSect, struct bFSHDblock* fshd);
|
||||
RETCODE adfReadLSEGblock(struct Device* dev, int32_t nSect, struct bLSEGblock* blk);
|
||||
RETCODE adfWriteLSEGblock(struct Device *dev, int32_t nSect, struct bLSEGblock* lseg);
|
||||
struct Device* adfCreateDev(
|
||||
char* filename, int32_t cylinders, int32_t heads, int32_t sectors);
|
||||
|
||||
RETCODE adfReadBlockDev(
|
||||
struct Device* dev, int32_t nSect, int32_t size, uint8_t* buf);
|
||||
RETCODE adfWriteBlockDev(
|
||||
struct Device* dev, int32_t nSect, int32_t size, uint8_t* buf);
|
||||
RETCODE adfReadRDSKblock(struct Device* dev, struct bRDSKblock* blk);
|
||||
RETCODE adfWriteRDSKblock(struct Device* dev, struct bRDSKblock* rdsk);
|
||||
RETCODE adfReadPARTblock(
|
||||
struct Device* dev, int32_t nSect, struct bPARTblock* blk);
|
||||
RETCODE adfWritePARTblock(
|
||||
struct Device* dev, int32_t nSect, struct bPARTblock* part);
|
||||
RETCODE adfReadFSHDblock(
|
||||
struct Device* dev, int32_t nSect, struct bFSHDblock* blk);
|
||||
RETCODE adfWriteFSHDblock(
|
||||
struct Device* dev, int32_t nSect, struct bFSHDblock* fshd);
|
||||
RETCODE adfReadLSEGblock(
|
||||
struct Device* dev, int32_t nSect, struct bLSEGblock* blk);
|
||||
RETCODE adfWriteLSEGblock(
|
||||
struct Device* dev, int32_t nSect, struct bLSEGblock* lseg);
|
||||
|
||||
#endif /* _ADF_HD_H */
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
* adf_link.h
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
*
|
||||
* This file is part of ADFLib.
|
||||
*
|
||||
* ADFLib is free software; you can redistribute it and/or modify
|
||||
@@ -26,11 +26,13 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include"prefix.h"
|
||||
#include "prefix.h"
|
||||
#include <stdint.h>
|
||||
PREFIX RETCODE adfBlockPtr2EntryName(struct Volume *vol, SECTNUM nSect, SECTNUM lPar,
|
||||
char **name, int32_t *size);
|
||||
|
||||
PREFIX RETCODE adfBlockPtr2EntryName(struct Volume* vol,
|
||||
SECTNUM nSect,
|
||||
SECTNUM lPar,
|
||||
char** name,
|
||||
int32_t* size);
|
||||
|
||||
#endif /* ADF_LINK_H */
|
||||
/*##########################################################################*/
|
||||
|
||||
@@ -30,38 +30,40 @@
|
||||
|
||||
#include "adf_str.h"
|
||||
|
||||
#define SW_LONG 4
|
||||
#define SW_LONG 4
|
||||
#define SW_SHORT 2
|
||||
#define SW_CHAR 1
|
||||
#define SW_CHAR 1
|
||||
|
||||
#define MAX_SWTYPE 11
|
||||
|
||||
#define SWBL_BOOT 0
|
||||
#define SWBL_ROOT 1
|
||||
#define SWBL_DATA 2
|
||||
#define SWBL_FILE 3
|
||||
#define SWBL_ENTRY 3
|
||||
#define SWBL_DIR 3
|
||||
#define SWBL_CACHE 4
|
||||
#define SWBL_BITMAP 5
|
||||
#define SWBL_FEXT 5
|
||||
#define SWBL_LINK 6
|
||||
#define SWBL_BITMAPE 5
|
||||
#define SWBL_RDSK 7
|
||||
#define SWBL_BADB 8
|
||||
#define SWBL_PART 9
|
||||
#define SWBL_FSHD 10
|
||||
#define SWBL_LSEG 11
|
||||
#define SWBL_BOOT 0
|
||||
#define SWBL_ROOT 1
|
||||
#define SWBL_DATA 2
|
||||
#define SWBL_FILE 3
|
||||
#define SWBL_ENTRY 3
|
||||
#define SWBL_DIR 3
|
||||
#define SWBL_CACHE 4
|
||||
#define SWBL_BITMAP 5
|
||||
#define SWBL_FEXT 5
|
||||
#define SWBL_LINK 6
|
||||
#define SWBL_BITMAPE 5
|
||||
#define SWBL_RDSK 7
|
||||
#define SWBL_BADB 8
|
||||
#define SWBL_PART 9
|
||||
#define SWBL_FSHD 10
|
||||
#define SWBL_LSEG 11
|
||||
|
||||
RETCODE adfReadRootBlock(struct Volume*, int32_t nSect, struct bRootBlock* root);
|
||||
RETCODE adfWriteRootBlock(struct Volume* vol, int32_t nSect, struct bRootBlock* root);
|
||||
RETCODE adfReadRootBlock(
|
||||
struct Volume*, int32_t nSect, struct bRootBlock* root);
|
||||
RETCODE adfWriteRootBlock(
|
||||
struct Volume* vol, int32_t nSect, struct bRootBlock* root);
|
||||
RETCODE adfReadBootBlock(struct Volume*, struct bBootBlock* boot);
|
||||
RETCODE adfWriteBootBlock(struct Volume* vol, struct bBootBlock* boot);
|
||||
|
||||
uint32_t adfBootSum(uint8_t *buf);
|
||||
uint32_t adfNormalSum( uint8_t *buf, int offset, int bufLen );
|
||||
uint32_t adfBootSum(uint8_t* buf);
|
||||
uint32_t adfNormalSum(uint8_t* buf, int offset, int bufLen);
|
||||
|
||||
void swapEndian( uint8_t *buf, int type );
|
||||
void swapEndian(uint8_t* buf, int type);
|
||||
|
||||
#endif /* _ADF_RAW_H */
|
||||
|
||||
|
||||
@@ -26,17 +26,16 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include"prefix.h"
|
||||
#include "prefix.h"
|
||||
|
||||
#include "adf_str.h"
|
||||
|
||||
RETCODE adfReadGenBlock(struct Volume *vol, SECTNUM nSect, struct GenBlock *block);
|
||||
RETCODE adfReadGenBlock(
|
||||
struct Volume* vol, SECTNUM nSect, struct GenBlock* block);
|
||||
PREFIX RETCODE adfCheckEntry(struct Volume* vol, SECTNUM nSect, int level);
|
||||
PREFIX RETCODE adfUndelEntry(struct Volume* vol, SECTNUM parent, SECTNUM nSect);
|
||||
PREFIX struct List* adfGetDelEnt(struct Volume *vol);
|
||||
PREFIX struct List* adfGetDelEnt(struct Volume* vol);
|
||||
PREFIX void adfFreeDelList(struct List* list);
|
||||
|
||||
|
||||
/*##########################################################################*/
|
||||
#endif /* _ADF_SALV_H */
|
||||
|
||||
|
||||
@@ -28,41 +28,43 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include<stdio.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include"adf_defs.h"
|
||||
#include"adf_blk.h"
|
||||
#include"adf_err.h"
|
||||
#include "adf_defs.h"
|
||||
#include "adf_blk.h"
|
||||
#include "adf_err.h"
|
||||
|
||||
/* ----- VOLUME ----- */
|
||||
|
||||
struct Volume {
|
||||
struct Volume
|
||||
{
|
||||
struct Device* dev;
|
||||
|
||||
SECTNUM firstBlock; /* first block of data area (from beginning of device) */
|
||||
SECTNUM lastBlock; /* last block of data area (from beginning of device) */
|
||||
SECTNUM rootBlock; /* root block (from firstBlock) */
|
||||
SECTNUM
|
||||
firstBlock; /* first block of data area (from beginning of device) */
|
||||
SECTNUM lastBlock; /* last block of data area (from beginning of device) */
|
||||
SECTNUM rootBlock; /* root block (from firstBlock) */
|
||||
|
||||
char dosType; /* FFS/OFS, DIRCACHE, INTERNATIONAL */
|
||||
char dosType; /* FFS/OFS, DIRCACHE, INTERNATIONAL */
|
||||
BOOL bootCode;
|
||||
BOOL readOnly;
|
||||
int datablockSize; /* 488 or 512 */
|
||||
int blockSize; /* 512 */
|
||||
int datablockSize; /* 488 or 512 */
|
||||
int blockSize; /* 512 */
|
||||
|
||||
char *volName;
|
||||
char* volName;
|
||||
|
||||
BOOL mounted;
|
||||
|
||||
int32_t bitmapSize; /* in blocks */
|
||||
SECTNUM *bitmapBlocks; /* bitmap blocks pointers */
|
||||
struct bBitmapBlock **bitmapTable;
|
||||
BOOL *bitmapBlocksChg;
|
||||
int32_t bitmapSize; /* in blocks */
|
||||
SECTNUM* bitmapBlocks; /* bitmap blocks pointers */
|
||||
struct bBitmapBlock** bitmapTable;
|
||||
BOOL* bitmapBlocksChg;
|
||||
|
||||
SECTNUM curDirPtr;
|
||||
};
|
||||
|
||||
|
||||
struct Partition {
|
||||
struct Partition
|
||||
{
|
||||
int32_t startCyl;
|
||||
int32_t lenCyl;
|
||||
char* volName;
|
||||
@@ -71,35 +73,36 @@ struct Partition {
|
||||
|
||||
/* ----- DEVICES ----- */
|
||||
|
||||
#define DEVTYPE_FLOPDD 1
|
||||
#define DEVTYPE_FLOPHD 2
|
||||
#define DEVTYPE_HARDDISK 3
|
||||
#define DEVTYPE_HARDFILE 4
|
||||
#define DEVTYPE_FLOPDD 1
|
||||
#define DEVTYPE_FLOPHD 2
|
||||
#define DEVTYPE_HARDDISK 3
|
||||
#define DEVTYPE_HARDFILE 4
|
||||
|
||||
struct Device {
|
||||
int devType; /* see below */
|
||||
struct Device
|
||||
{
|
||||
int devType; /* see below */
|
||||
BOOL readOnly;
|
||||
int32_t size; /* in bytes */
|
||||
int32_t size; /* in bytes */
|
||||
|
||||
int nVol; /* partitions */
|
||||
struct Volume** volList;
|
||||
|
||||
int32_t cylinders; /* geometry */
|
||||
int nVol; /* partitions */
|
||||
struct Volume** volList;
|
||||
|
||||
int32_t cylinders; /* geometry */
|
||||
int32_t heads;
|
||||
int32_t sectors;
|
||||
|
||||
BOOL isNativeDev;
|
||||
void *nativeDev;
|
||||
void* nativeDev;
|
||||
};
|
||||
|
||||
|
||||
/* ----- FILE ----- */
|
||||
|
||||
struct File {
|
||||
struct Volume *volume;
|
||||
struct File
|
||||
{
|
||||
struct Volume* volume;
|
||||
|
||||
struct bFileHeaderBlock* fileHdr;
|
||||
void *currentData;
|
||||
void* currentData;
|
||||
struct bFileExtBlock* currentExt;
|
||||
|
||||
int32_t nDataBlock;
|
||||
@@ -109,12 +112,12 @@ struct File {
|
||||
int posInDataBlk;
|
||||
int posInExtBlk;
|
||||
BOOL eof, writeMode;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
/* ----- ENTRY ---- */
|
||||
|
||||
struct Entry{
|
||||
struct Entry
|
||||
{
|
||||
int type;
|
||||
char* name;
|
||||
SECTNUM sector;
|
||||
@@ -127,72 +130,72 @@ struct Entry{
|
||||
int hour, mins, secs;
|
||||
};
|
||||
|
||||
struct CacheEntry{
|
||||
struct CacheEntry
|
||||
{
|
||||
int32_t header, size, protect;
|
||||
short days, mins, ticks;
|
||||
signed char type;
|
||||
char nLen, cLen;
|
||||
char name[MAXNAMELEN+1], comm[MAXCMMTLEN+1];
|
||||
/* char *name, *comm;*/
|
||||
|
||||
char name[MAXNAMELEN + 1], comm[MAXCMMTLEN + 1];
|
||||
/* char *name, *comm;*/
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
struct DateTime{
|
||||
int year,mon,day,hour,min,sec;
|
||||
struct DateTime
|
||||
{
|
||||
int year, mon, day, hour, min, sec;
|
||||
};
|
||||
|
||||
/* ----- ENVIRONMENT ----- */
|
||||
|
||||
#define PR_VFCT 1
|
||||
#define PR_WFCT 2
|
||||
#define PR_EFCT 3
|
||||
#define PR_NOTFCT 4
|
||||
#define PR_USEDIRC 5
|
||||
#define PR_USE_NOTFCT 6
|
||||
#define PR_PROGBAR 7
|
||||
#define PR_USE_PROGBAR 8
|
||||
#define PR_RWACCESS 9
|
||||
#define PR_VFCT 1
|
||||
#define PR_WFCT 2
|
||||
#define PR_EFCT 3
|
||||
#define PR_NOTFCT 4
|
||||
#define PR_USEDIRC 5
|
||||
#define PR_USE_NOTFCT 6
|
||||
#define PR_PROGBAR 7
|
||||
#define PR_USE_PROGBAR 8
|
||||
#define PR_RWACCESS 9
|
||||
#define PR_USE_RWACCESS 10
|
||||
|
||||
struct Env{
|
||||
void (*vFct)(char*); /* verbose callback function */
|
||||
void (*wFct)(char*); /* warning callback function */
|
||||
void (*eFct)(char*); /* error callback function */
|
||||
struct Env
|
||||
{
|
||||
void (*vFct)(char*); /* verbose callback function */
|
||||
void (*wFct)(char*); /* warning callback function */
|
||||
void (*eFct)(char*); /* error callback function */
|
||||
|
||||
void (*notifyFct)(SECTNUM, int);
|
||||
BOOL useNotify;
|
||||
|
||||
void (*rwhAccess)(SECTNUM,SECTNUM,BOOL);
|
||||
void (*rwhAccess)(SECTNUM, SECTNUM, BOOL);
|
||||
BOOL useRWAccess;
|
||||
|
||||
void (*progressBar)(int);
|
||||
BOOL useProgressBar;
|
||||
|
||||
BOOL useDirCache;
|
||||
|
||||
void *nativeFct;
|
||||
|
||||
void* nativeFct;
|
||||
};
|
||||
|
||||
|
||||
|
||||
struct List{ /* generic linked tree */
|
||||
void *content;
|
||||
struct List
|
||||
{ /* generic linked tree */
|
||||
void* content;
|
||||
struct List* subdir;
|
||||
struct List* next;
|
||||
};
|
||||
|
||||
struct GenBlock{
|
||||
struct GenBlock
|
||||
{
|
||||
SECTNUM sect;
|
||||
SECTNUM parent;
|
||||
int type;
|
||||
int secType;
|
||||
char *name; /* if (type == 2 and (secType==2 or secType==-3)) */
|
||||
char* name; /* if (type == 2 and (secType==2 or secType==-3)) */
|
||||
};
|
||||
|
||||
struct FileBlocks{
|
||||
struct FileBlocks
|
||||
{
|
||||
SECTNUM header;
|
||||
int32_t nbExtens;
|
||||
SECTNUM* extens;
|
||||
@@ -200,36 +203,35 @@ struct FileBlocks{
|
||||
SECTNUM* data;
|
||||
};
|
||||
|
||||
struct bEntryBlock {
|
||||
/*000*/ int32_t type; /* T_HEADER == 2 */
|
||||
/*004*/ int32_t headerKey; /* current block number */
|
||||
int32_t r1[3];
|
||||
/*014*/ uint32_t checkSum;
|
||||
/*018*/ int32_t hashTable[HT_SIZE];
|
||||
int32_t r2[2];
|
||||
/*140*/ int32_t access; /* bit0=del, 1=modif, 2=write, 3=read */
|
||||
/*144*/ int32_t byteSize;
|
||||
/*148*/ char commLen;
|
||||
/*149*/ char comment[MAXCMMTLEN+1];
|
||||
char r3[91-(MAXCMMTLEN+1)];
|
||||
/*1a4*/ int32_t days;
|
||||
/*1a8*/ int32_t mins;
|
||||
/*1ac*/ int32_t ticks;
|
||||
/*1b0*/ char nameLen;
|
||||
/*1b1*/ char name[MAXNAMELEN+1];
|
||||
int32_t r4;
|
||||
/*1d4*/ int32_t realEntry;
|
||||
/*1d8*/ int32_t nextLink;
|
||||
int32_t r5[5];
|
||||
/*1f0*/ int32_t nextSameHash;
|
||||
/*1f4*/ int32_t parent;
|
||||
/*1f8*/ int32_t extension;
|
||||
/*1fc*/ int32_t secType;
|
||||
};
|
||||
|
||||
struct bEntryBlock
|
||||
{
|
||||
/*000*/ int32_t type; /* T_HEADER == 2 */
|
||||
/*004*/ int32_t headerKey; /* current block number */
|
||||
int32_t r1[3];
|
||||
/*014*/ uint32_t checkSum;
|
||||
/*018*/ int32_t hashTable[HT_SIZE];
|
||||
int32_t r2[2];
|
||||
/*140*/ int32_t access; /* bit0=del, 1=modif, 2=write, 3=read */
|
||||
/*144*/ int32_t byteSize;
|
||||
/*148*/ char commLen;
|
||||
/*149*/ char comment[MAXCMMTLEN + 1];
|
||||
char r3[91 - (MAXCMMTLEN + 1)];
|
||||
/*1a4*/ int32_t days;
|
||||
/*1a8*/ int32_t mins;
|
||||
/*1ac*/ int32_t ticks;
|
||||
/*1b0*/ char nameLen;
|
||||
/*1b1*/ char name[MAXNAMELEN + 1];
|
||||
int32_t r4;
|
||||
/*1d4*/ int32_t realEntry;
|
||||
/*1d8*/ int32_t nextLink;
|
||||
int32_t r5[5];
|
||||
/*1f0*/ int32_t nextSameHash;
|
||||
/*1f4*/ int32_t parent;
|
||||
/*1f8*/ int32_t extension;
|
||||
/*1fc*/ int32_t secType;
|
||||
};
|
||||
|
||||
#define ENV_DECLARATION struct Env adfEnv
|
||||
|
||||
|
||||
#endif /* _ADF_STR_H */
|
||||
/*##########################################################################*/
|
||||
|
||||
@@ -26,25 +26,22 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include"prefix.h"
|
||||
#include "prefix.h"
|
||||
|
||||
#include "adf_str.h"
|
||||
|
||||
|
||||
void swLong(uint8_t* buf, uint32_t val);
|
||||
void swShort(uint8_t* buf, uint16_t val);
|
||||
|
||||
PREFIX struct List* newCell(struct List* list, void* content);
|
||||
PREFIX void freeList(struct List* list);
|
||||
void adfDays2Date(int32_t days, int *yy, int *mm, int *dd);
|
||||
void adfDays2Date(int32_t days, int* yy, int* mm, int* dd);
|
||||
BOOL adfIsLeap(int y);
|
||||
void
|
||||
adfTime2AmigaTime(struct DateTime dt, int32_t *day, int32_t *min, int32_t *ticks );
|
||||
struct DateTime
|
||||
adfGiveCurrentTime( void );
|
||||
void adfTime2AmigaTime(
|
||||
struct DateTime dt, int32_t* day, int32_t* min, int32_t* ticks);
|
||||
struct DateTime adfGiveCurrentTime(void);
|
||||
|
||||
void dumpBlock(uint8_t *buf);
|
||||
void dumpBlock(uint8_t* buf);
|
||||
|
||||
/*##########################################################################*/
|
||||
#endif /* _ADF_UTIL_H */
|
||||
|
||||
|
||||
@@ -29,96 +29,107 @@
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
extern "C"
|
||||
{
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
/* Visual C++ DLL specific, define WIN32DLL or not in the makefile */
|
||||
/* Visual C++ DLL specific, define WIN32DLL or not in the makefile */
|
||||
|
||||
#ifdef WIN32DLL
|
||||
#define PREFIX __declspec(dllimport)
|
||||
#else
|
||||
#define PREFIX
|
||||
#define PREFIX
|
||||
#endif /* WIN32DLL */
|
||||
|
||||
#include "adf_defs.h"
|
||||
#include "adf_str.h"
|
||||
|
||||
/* util */
|
||||
PREFIX struct List* newCell(struct List* list, void* content);
|
||||
PREFIX void freeList(struct List* list);
|
||||
/* util */
|
||||
PREFIX struct List* newCell(struct List* list, void* content);
|
||||
PREFIX void freeList(struct List* list);
|
||||
|
||||
/* dir */
|
||||
PREFIX struct Entry* adfFindEntry(struct Volume *vol, char* name);
|
||||
PREFIX RETCODE adfToRootDir(struct Volume *vol);
|
||||
PREFIX RETCODE adfCreateDir(struct Volume* vol, SECTNUM parent, char* name);
|
||||
PREFIX RETCODE adfChangeDir(struct Volume* vol, char *name);
|
||||
PREFIX RETCODE adfParentDir(struct Volume* vol);
|
||||
PREFIX RETCODE adfRemoveEntry(struct Volume *vol, SECTNUM pSect, char *name);
|
||||
PREFIX struct List* adfGetDirEnt(struct Volume* vol, SECTNUM nSect );
|
||||
PREFIX struct List* adfGetRDirEnt(struct Volume* vol, SECTNUM nSect, BOOL recurs );
|
||||
PREFIX void printEntry(struct Entry* entry);
|
||||
PREFIX void adfFreeDirList(struct List* list);
|
||||
PREFIX void adfFreeEntry(struct Entry *);
|
||||
PREFIX RETCODE adfRenameEntry(struct Volume *vol, SECTNUM, char *old,SECTNUM,char *pNew); /* BV */
|
||||
PREFIX RETCODE adfSetEntryAccess(struct Volume*, SECTNUM, char*, int32_t);
|
||||
PREFIX RETCODE adfSetEntryComment(struct Volume*, SECTNUM, char*, char*);
|
||||
/* dir */
|
||||
PREFIX struct Entry* adfFindEntry(struct Volume* vol, char* name);
|
||||
PREFIX RETCODE adfToRootDir(struct Volume* vol);
|
||||
PREFIX RETCODE adfCreateDir(struct Volume* vol, SECTNUM parent, char* name);
|
||||
PREFIX RETCODE adfChangeDir(struct Volume* vol, char* name);
|
||||
PREFIX RETCODE adfParentDir(struct Volume* vol);
|
||||
PREFIX RETCODE adfRemoveEntry(
|
||||
struct Volume* vol, SECTNUM pSect, char* name);
|
||||
PREFIX struct List* adfGetDirEnt(struct Volume* vol, SECTNUM nSect);
|
||||
PREFIX struct List* adfGetRDirEnt(
|
||||
struct Volume* vol, SECTNUM nSect, BOOL recurs);
|
||||
PREFIX void printEntry(struct Entry* entry);
|
||||
PREFIX void adfFreeDirList(struct List* list);
|
||||
PREFIX void adfFreeEntry(struct Entry*);
|
||||
PREFIX RETCODE adfRenameEntry(
|
||||
struct Volume* vol, SECTNUM, char* old, SECTNUM, char* pNew); /* BV */
|
||||
PREFIX RETCODE adfSetEntryAccess(struct Volume*, SECTNUM, char*, int32_t);
|
||||
PREFIX RETCODE adfSetEntryComment(struct Volume*, SECTNUM, char*, char*);
|
||||
|
||||
/* file */
|
||||
PREFIX int32_t adfFileRealSize(uint32_t size, int blockSize, int32_t *dataN, int32_t *extN);
|
||||
PREFIX struct File* adfOpenFile(struct Volume *vol, char* name, char *mode);
|
||||
PREFIX void adfCloseFile(struct File *file);
|
||||
PREFIX int32_t adfReadFile(struct File* file, int32_t n, uint8_t *buffer);
|
||||
PREFIX BOOL adfEndOfFile(struct File* file);
|
||||
PREFIX int32_t adfWriteFile(struct File *file, int32_t n, uint8_t *buffer);
|
||||
PREFIX void adfFlushFile(struct File *file);
|
||||
PREFIX void adfFileSeek(struct File *file, uint32_t pos);
|
||||
/* file */
|
||||
PREFIX int32_t adfFileRealSize(
|
||||
uint32_t size, int blockSize, int32_t* dataN, int32_t* extN);
|
||||
PREFIX struct File* adfOpenFile(struct Volume* vol, char* name, char* mode);
|
||||
PREFIX void adfCloseFile(struct File* file);
|
||||
PREFIX int32_t adfReadFile(struct File* file, int32_t n, uint8_t* buffer);
|
||||
PREFIX BOOL adfEndOfFile(struct File* file);
|
||||
PREFIX int32_t adfWriteFile(struct File* file, int32_t n, uint8_t* buffer);
|
||||
PREFIX void adfFlushFile(struct File* file);
|
||||
PREFIX void adfFileSeek(struct File* file, uint32_t pos);
|
||||
|
||||
/* volume */
|
||||
PREFIX RETCODE adfInstallBootBlock(struct Volume *vol,uint8_t*);
|
||||
PREFIX struct Volume* adfMount( struct Device *dev, int nPart, BOOL readOnly );
|
||||
PREFIX void adfUnMount(struct Volume *vol);
|
||||
PREFIX void adfVolumeInfo(struct Volume *vol);
|
||||
/* volume */
|
||||
PREFIX RETCODE adfInstallBootBlock(struct Volume* vol, uint8_t*);
|
||||
PREFIX struct Volume* adfMount(
|
||||
struct Device* dev, int nPart, BOOL readOnly);
|
||||
PREFIX void adfUnMount(struct Volume* vol);
|
||||
PREFIX void adfVolumeInfo(struct Volume* vol);
|
||||
|
||||
/* device */
|
||||
PREFIX void adfDeviceInfo(struct Device *dev);
|
||||
PREFIX struct Device* adfMountDev( char* filename,BOOL ro);
|
||||
PREFIX void adfUnMountDev( struct Device* dev);
|
||||
PREFIX RETCODE adfCreateHd(struct Device* dev, int n, struct Partition** partList );
|
||||
PREFIX RETCODE adfCreateFlop(struct Device* dev, char* volName, int volType );
|
||||
PREFIX RETCODE adfCreateHdFile(struct Device* dev, char* volName, int volType);
|
||||
/* device */
|
||||
PREFIX void adfDeviceInfo(struct Device* dev);
|
||||
PREFIX struct Device* adfMountDev(char* filename, BOOL ro);
|
||||
PREFIX void adfUnMountDev(struct Device* dev);
|
||||
PREFIX RETCODE adfCreateHd(
|
||||
struct Device* dev, int n, struct Partition** partList);
|
||||
PREFIX RETCODE adfCreateFlop(
|
||||
struct Device* dev, char* volName, int volType);
|
||||
PREFIX RETCODE adfCreateHdFile(
|
||||
struct Device* dev, char* volName, int volType);
|
||||
|
||||
/* dump device */
|
||||
PREFIX struct Device* adfCreateDumpDevice(char* filename, int32_t cyl, int32_t heads, int32_t sec);
|
||||
/* dump device */
|
||||
PREFIX struct Device* adfCreateDumpDevice(
|
||||
char* filename, int32_t cyl, int32_t heads, int32_t sec);
|
||||
|
||||
/* env */
|
||||
PREFIX void adfEnvInitDefault();
|
||||
PREFIX void adfEnvCleanUp();
|
||||
PREFIX void adfChgEnvProp(int prop, void *pNew); /* BV */
|
||||
PREFIX char* adfGetVersionNumber();
|
||||
PREFIX char* adfGetVersionDate();
|
||||
/* obsolete */
|
||||
PREFIX void adfSetEnvFct( void(*e)(char*), void(*w)(char*), void(*v)(char*) );
|
||||
/* env */
|
||||
PREFIX void adfEnvInitDefault();
|
||||
PREFIX void adfEnvCleanUp();
|
||||
PREFIX void adfChgEnvProp(int prop, void* pNew); /* BV */
|
||||
PREFIX char* adfGetVersionNumber();
|
||||
PREFIX char* adfGetVersionDate();
|
||||
/* obsolete */
|
||||
PREFIX void adfSetEnvFct(
|
||||
void (*e)(char*), void (*w)(char*), void (*v)(char*));
|
||||
|
||||
/* link */
|
||||
PREFIX RETCODE adfBlockPtr2EntryName(struct Volume *, SECTNUM, SECTNUM,char **, int32_t *);
|
||||
/* link */
|
||||
PREFIX RETCODE adfBlockPtr2EntryName(
|
||||
struct Volume*, SECTNUM, SECTNUM, char**, int32_t*);
|
||||
|
||||
/* salv */
|
||||
PREFIX struct List* adfGetDelEnt(struct Volume *vol);
|
||||
PREFIX RETCODE adfUndelEntry(struct Volume* vol, SECTNUM parent, SECTNUM nSect);
|
||||
PREFIX void adfFreeDelList(struct List* list);
|
||||
PREFIX RETCODE adfCheckEntry(struct Volume* vol, SECTNUM nSect, int level);
|
||||
/* salv */
|
||||
PREFIX struct List* adfGetDelEnt(struct Volume* vol);
|
||||
PREFIX RETCODE adfUndelEntry(
|
||||
struct Volume* vol, SECTNUM parent, SECTNUM nSect);
|
||||
PREFIX void adfFreeDelList(struct List* list);
|
||||
PREFIX RETCODE adfCheckEntry(struct Volume* vol, SECTNUM nSect, int level);
|
||||
|
||||
/* middle level API */
|
||||
/* middle level API */
|
||||
|
||||
PREFIX BOOL isSectNumValid(struct Volume *vol, SECTNUM nSect);
|
||||
PREFIX BOOL isSectNumValid(struct Volume* vol, SECTNUM nSect);
|
||||
|
||||
/* low level API */
|
||||
|
||||
PREFIX RETCODE adfReadBlock(struct Volume* , int32_t nSect, uint8_t* buf);
|
||||
PREFIX RETCODE adfWriteBlock(struct Volume* , int32_t nSect, uint8_t* buf);
|
||||
PREFIX int32_t adfCountFreeBlocks(struct Volume* vol);
|
||||
/* low level API */
|
||||
|
||||
PREFIX RETCODE adfReadBlock(struct Volume*, int32_t nSect, uint8_t* buf);
|
||||
PREFIX RETCODE adfWriteBlock(struct Volume*, int32_t nSect, uint8_t* buf);
|
||||
PREFIX int32_t adfCountFreeBlocks(struct Volume* vol);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -1,13 +1,11 @@
|
||||
#include "config.h"
|
||||
|
||||
#ifndef LITT_ENDIAN
|
||||
#if defined(__hppa__) || \
|
||||
defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \
|
||||
(defined(__MIPS__) && defined(__MISPEB__)) || \
|
||||
defined(__ppc__) || defined(__POWERPC__) || defined(_M_PPC) || \
|
||||
defined(__sparc__)
|
||||
#else
|
||||
#define LITT_ENDIAN 1
|
||||
#endif
|
||||
#if defined(__hppa__) || defined(__m68k__) || defined(mc68000) || \
|
||||
defined(_M_M68K) || (defined(__MIPS__) && defined(__MISPEB__)) || \
|
||||
defined(__ppc__) || defined(__POWERPC__) || defined(_M_PPC) || \
|
||||
defined(__sparc__)
|
||||
#else
|
||||
#define LITT_ENDIAN 1
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _HD_BLK_H
|
||||
#define _HD_BLK_H 1
|
||||
|
||||
@@ -33,135 +32,134 @@
|
||||
|
||||
/* ------- RDSK ---------*/
|
||||
|
||||
struct bRDSKblock {
|
||||
/*000*/ char id[4]; /* RDSK */
|
||||
/*004*/ int32_t size; /* 64 int32_ts */
|
||||
/*008*/ ULONG checksum;
|
||||
/*00c*/ int32_t hostID; /* 7 */
|
||||
/*010*/ int32_t blockSize; /* 512 bytes */
|
||||
/*014*/ int32_t flags; /* 0x17 */
|
||||
/*018*/ int32_t badBlockList;
|
||||
/*01c*/ int32_t partitionList;
|
||||
/*020*/ int32_t fileSysHdrList;
|
||||
/*024*/ int32_t driveInit;
|
||||
/*028*/ int32_t r1[6]; /* -1 */
|
||||
/*040*/ int32_t cylinders;
|
||||
/*044*/ int32_t sectors;
|
||||
/*048*/ int32_t heads;
|
||||
/*04c*/ int32_t interleave;
|
||||
/*050*/ int32_t parkingZone;
|
||||
/*054*/ int32_t r2[3]; /* 0 */
|
||||
/*060*/ int32_t writePreComp;
|
||||
/*064*/ int32_t reducedWrite;
|
||||
/*068*/ int32_t stepRate;
|
||||
/*06c*/ int32_t r3[5]; /* 0 */
|
||||
/*080*/ int32_t rdbBlockLo;
|
||||
/*084*/ int32_t rdbBlockHi;
|
||||
/*088*/ int32_t loCylinder;
|
||||
/*08c*/ int32_t hiCylinder;
|
||||
/*090*/ int32_t cylBlocks;
|
||||
/*094*/ int32_t autoParkSeconds;
|
||||
/*098*/ int32_t highRDSKBlock;
|
||||
/*09c*/ int32_t r4; /* 0 */
|
||||
/*0a0*/ char diskVendor[8];
|
||||
/*0a8*/ char diskProduct[16];
|
||||
/*0b8*/ char diskRevision[4];
|
||||
/*0bc*/ char controllerVendor[8];
|
||||
/*0c4*/ char controllerProduct[16];
|
||||
/*0d4*/ char controllerRevision[4];
|
||||
/*0d8*/ int32_t r5[10]; /* 0 */
|
||||
/*100*/
|
||||
struct bRDSKblock
|
||||
{
|
||||
/*000*/ char id[4]; /* RDSK */
|
||||
/*004*/ int32_t size; /* 64 int32_ts */
|
||||
/*008*/ ULONG checksum;
|
||||
/*00c*/ int32_t hostID; /* 7 */
|
||||
/*010*/ int32_t blockSize; /* 512 bytes */
|
||||
/*014*/ int32_t flags; /* 0x17 */
|
||||
/*018*/ int32_t badBlockList;
|
||||
/*01c*/ int32_t partitionList;
|
||||
/*020*/ int32_t fileSysHdrList;
|
||||
/*024*/ int32_t driveInit;
|
||||
/*028*/ int32_t r1[6]; /* -1 */
|
||||
/*040*/ int32_t cylinders;
|
||||
/*044*/ int32_t sectors;
|
||||
/*048*/ int32_t heads;
|
||||
/*04c*/ int32_t interleave;
|
||||
/*050*/ int32_t parkingZone;
|
||||
/*054*/ int32_t r2[3]; /* 0 */
|
||||
/*060*/ int32_t writePreComp;
|
||||
/*064*/ int32_t reducedWrite;
|
||||
/*068*/ int32_t stepRate;
|
||||
/*06c*/ int32_t r3[5]; /* 0 */
|
||||
/*080*/ int32_t rdbBlockLo;
|
||||
/*084*/ int32_t rdbBlockHi;
|
||||
/*088*/ int32_t loCylinder;
|
||||
/*08c*/ int32_t hiCylinder;
|
||||
/*090*/ int32_t cylBlocks;
|
||||
/*094*/ int32_t autoParkSeconds;
|
||||
/*098*/ int32_t highRDSKBlock;
|
||||
/*09c*/ int32_t r4; /* 0 */
|
||||
/*0a0*/ char diskVendor[8];
|
||||
/*0a8*/ char diskProduct[16];
|
||||
/*0b8*/ char diskRevision[4];
|
||||
/*0bc*/ char controllerVendor[8];
|
||||
/*0c4*/ char controllerProduct[16];
|
||||
/*0d4*/ char controllerRevision[4];
|
||||
/*0d8*/ int32_t r5[10]; /* 0 */
|
||||
/*100*/
|
||||
};
|
||||
|
||||
|
||||
struct bBADBentry {
|
||||
/*000*/ int32_t badBlock;
|
||||
/*004*/ int32_t goodBlock;
|
||||
struct bBADBentry
|
||||
{
|
||||
/*000*/ int32_t badBlock;
|
||||
/*004*/ int32_t goodBlock;
|
||||
};
|
||||
|
||||
|
||||
struct bBADBblock {
|
||||
/*000*/ char id[4]; /* BADB */
|
||||
/*004*/ int32_t size; /* 128 int32_ts */
|
||||
/*008*/ ULONG checksum;
|
||||
/*00c*/ int32_t hostID; /* 7 */
|
||||
/*010*/ int32_t next;
|
||||
/*014*/ int32_t r1;
|
||||
/*018*/ struct bBADBentry blockPairs[61];
|
||||
struct bBADBblock
|
||||
{
|
||||
/*000*/ char id[4]; /* BADB */
|
||||
/*004*/ int32_t size; /* 128 int32_ts */
|
||||
/*008*/ ULONG checksum;
|
||||
/*00c*/ int32_t hostID; /* 7 */
|
||||
/*010*/ int32_t next;
|
||||
/*014*/ int32_t r1;
|
||||
/*018*/ struct bBADBentry blockPairs[61];
|
||||
};
|
||||
|
||||
struct bPARTblock
|
||||
{
|
||||
/*000*/ char id[4]; /* PART */
|
||||
/*004*/ int32_t size; /* 64 int32_ts */
|
||||
/*008*/ ULONG checksum;
|
||||
/*00c*/ int32_t hostID; /* 7 */
|
||||
/*010*/ int32_t next;
|
||||
/*014*/ int32_t flags;
|
||||
/*018*/ int32_t r1[2];
|
||||
/*020*/ int32_t devFlags;
|
||||
/*024*/ char nameLen;
|
||||
/*025*/ char name[31];
|
||||
/*044*/ int32_t r2[15];
|
||||
|
||||
|
||||
struct bPARTblock {
|
||||
/*000*/ char id[4]; /* PART */
|
||||
/*004*/ int32_t size; /* 64 int32_ts */
|
||||
/*008*/ ULONG checksum;
|
||||
/*00c*/ int32_t hostID; /* 7 */
|
||||
/*010*/ int32_t next;
|
||||
/*014*/ int32_t flags;
|
||||
/*018*/ int32_t r1[2];
|
||||
/*020*/ int32_t devFlags;
|
||||
/*024*/ char nameLen;
|
||||
/*025*/ char name[31];
|
||||
/*044*/ int32_t r2[15];
|
||||
|
||||
/*080*/ int32_t vectorSize; /* often 16 int32_ts */
|
||||
/*084*/ int32_t blockSize; /* 128 int32_ts */
|
||||
/*088*/ int32_t secOrg;
|
||||
/*08c*/ int32_t surfaces;
|
||||
/*090*/ int32_t sectorsPerBlock; /* == 1 */
|
||||
/*094*/ int32_t blocksPerTrack;
|
||||
/*098*/ int32_t dosReserved;
|
||||
/*09c*/ int32_t dosPreAlloc;
|
||||
/*0a0*/ int32_t interleave;
|
||||
/*0a4*/ int32_t lowCyl;
|
||||
/*0a8*/ int32_t highCyl;
|
||||
/*0ac*/ int32_t numBuffer;
|
||||
/*0b0*/ int32_t bufMemType;
|
||||
/*0b4*/ int32_t maxTransfer;
|
||||
/*0b8*/ int32_t mask;
|
||||
/*0bc*/ int32_t bootPri;
|
||||
/*0c0*/ char dosType[4];
|
||||
/*0c4*/ int32_t r3[15];
|
||||
/*080*/ int32_t vectorSize; /* often 16 int32_ts */
|
||||
/*084*/ int32_t blockSize; /* 128 int32_ts */
|
||||
/*088*/ int32_t secOrg;
|
||||
/*08c*/ int32_t surfaces;
|
||||
/*090*/ int32_t sectorsPerBlock; /* == 1 */
|
||||
/*094*/ int32_t blocksPerTrack;
|
||||
/*098*/ int32_t dosReserved;
|
||||
/*09c*/ int32_t dosPreAlloc;
|
||||
/*0a0*/ int32_t interleave;
|
||||
/*0a4*/ int32_t lowCyl;
|
||||
/*0a8*/ int32_t highCyl;
|
||||
/*0ac*/ int32_t numBuffer;
|
||||
/*0b0*/ int32_t bufMemType;
|
||||
/*0b4*/ int32_t maxTransfer;
|
||||
/*0b8*/ int32_t mask;
|
||||
/*0bc*/ int32_t bootPri;
|
||||
/*0c0*/ char dosType[4];
|
||||
/*0c4*/ int32_t r3[15];
|
||||
};
|
||||
|
||||
|
||||
struct bLSEGblock {
|
||||
/*000*/ char id[4]; /* LSEG */
|
||||
/*004*/ int32_t size; /* 128 int32_ts */
|
||||
/*008*/ ULONG checksum;
|
||||
/*00c*/ int32_t hostID; /* 7 */
|
||||
/*010*/ int32_t next;
|
||||
/*014*/ char loadData[123*4];
|
||||
struct bLSEGblock
|
||||
{
|
||||
/*000*/ char id[4]; /* LSEG */
|
||||
/*004*/ int32_t size; /* 128 int32_ts */
|
||||
/*008*/ ULONG checksum;
|
||||
/*00c*/ int32_t hostID; /* 7 */
|
||||
/*010*/ int32_t next;
|
||||
/*014*/ char loadData[123 * 4];
|
||||
};
|
||||
|
||||
struct bFSHDblock
|
||||
{
|
||||
/*000*/ char id[4]; /* FSHD */
|
||||
/*004*/ int32_t size; /* 64 */
|
||||
/*008*/ ULONG checksum;
|
||||
/*00c*/ int32_t hostID; /* 7 */
|
||||
/*010*/ int32_t next;
|
||||
/*014*/ int32_t flags;
|
||||
/*018*/ int32_t r1[2];
|
||||
/*020*/ char dosType[4];
|
||||
/*024*/ short majVersion;
|
||||
/*026*/ short minVersion;
|
||||
/*028*/ int32_t patchFlags;
|
||||
|
||||
struct bFSHDblock {
|
||||
/*000*/ char id[4]; /* FSHD */
|
||||
/*004*/ int32_t size; /* 64 */
|
||||
/*008*/ ULONG checksum;
|
||||
/*00c*/ int32_t hostID; /* 7 */
|
||||
/*010*/ int32_t next;
|
||||
/*014*/ int32_t flags;
|
||||
/*018*/ int32_t r1[2];
|
||||
/*020*/ char dosType[4];
|
||||
/*024*/ short majVersion;
|
||||
/*026*/ short minVersion;
|
||||
/*028*/ int32_t patchFlags;
|
||||
|
||||
/*02c*/ int32_t type;
|
||||
/*030*/ int32_t task;
|
||||
/*034*/ int32_t lock;
|
||||
/*038*/ int32_t handler;
|
||||
/*03c*/ int32_t stackSize;
|
||||
/*040*/ int32_t priority;
|
||||
/*044*/ int32_t startup;
|
||||
/*048*/ int32_t segListBlock;
|
||||
/*04c*/ int32_t globalVec;
|
||||
/*050*/ int32_t r2[23];
|
||||
/*0ac*/ int32_t r3[21];
|
||||
/*02c*/ int32_t type;
|
||||
/*030*/ int32_t task;
|
||||
/*034*/ int32_t lock;
|
||||
/*038*/ int32_t handler;
|
||||
/*03c*/ int32_t stackSize;
|
||||
/*040*/ int32_t priority;
|
||||
/*044*/ int32_t startup;
|
||||
/*048*/ int32_t segListBlock;
|
||||
/*04c*/ int32_t globalVec;
|
||||
/*050*/ int32_t r2[23];
|
||||
/*0ac*/ int32_t r3[21];
|
||||
};
|
||||
|
||||
|
||||
#endif /* _HD_BLK_H */
|
||||
/*##########################################################################*/
|
||||
|
||||
@@ -25,12 +25,12 @@
|
||||
* along with Foobar; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
*/
|
||||
|
||||
#ifdef WIN32DLL
|
||||
#define PREFIX __declspec(dllexport)
|
||||
#else
|
||||
#define PREFIX
|
||||
#define PREFIX
|
||||
#endif /* WIN32DLL */
|
||||
|
||||
#endif /* _PREFIX_H */
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
#define AGG2D_INCLUDED
|
||||
|
||||
// With this define uncommented you can use floating-point pixel format
|
||||
//#define AGG2D_USE_FLOAT_FORMAT
|
||||
// #define AGG2D_USE_FLOAT_FORMAT
|
||||
|
||||
#include "agg_basics.h"
|
||||
#include "agg_trans_affine.h"
|
||||
@@ -56,37 +56,50 @@ class Agg2D
|
||||
#ifdef AGG2D_USE_FLOAT_FORMAT
|
||||
typedef agg::rgba32 ColorType;
|
||||
#else
|
||||
typedef agg::rgba8 ColorType;
|
||||
typedef agg::rgba8 ColorType;
|
||||
#endif
|
||||
typedef agg::order_bgra ComponentOrder; // Platform dependent!
|
||||
typedef agg::blender_rgba<ColorType, ComponentOrder> Blender;
|
||||
typedef agg::comp_op_adaptor_rgba<ColorType, ComponentOrder> BlenderComp;
|
||||
typedef agg::blender_rgba_pre<ColorType, ComponentOrder> BlenderPre;
|
||||
typedef agg::comp_op_adaptor_rgba_pre<ColorType, ComponentOrder> BlenderCompPre;
|
||||
typedef agg::blender_rgba<ColorType, ComponentOrder> Blender;
|
||||
typedef agg::comp_op_adaptor_rgba<ColorType, ComponentOrder> BlenderComp;
|
||||
typedef agg::blender_rgba_pre<ColorType, ComponentOrder> BlenderPre;
|
||||
typedef agg::comp_op_adaptor_rgba_pre<ColorType, ComponentOrder>
|
||||
BlenderCompPre;
|
||||
|
||||
typedef agg::pixfmt_alpha_blend_rgba<Blender, agg::rendering_buffer> PixFormat;
|
||||
typedef agg::pixfmt_custom_blend_rgba<BlenderComp, agg::rendering_buffer> PixFormatComp;
|
||||
typedef agg::pixfmt_alpha_blend_rgba<BlenderPre, agg::rendering_buffer> PixFormatPre;
|
||||
typedef agg::pixfmt_custom_blend_rgba<BlenderCompPre, agg::rendering_buffer> PixFormatCompPre;
|
||||
typedef agg::pixfmt_alpha_blend_rgba<Blender, agg::rendering_buffer>
|
||||
PixFormat;
|
||||
typedef agg::pixfmt_custom_blend_rgba<BlenderComp, agg::rendering_buffer>
|
||||
PixFormatComp;
|
||||
typedef agg::pixfmt_alpha_blend_rgba<BlenderPre, agg::rendering_buffer>
|
||||
PixFormatPre;
|
||||
typedef agg::pixfmt_custom_blend_rgba<BlenderCompPre, agg::rendering_buffer>
|
||||
PixFormatCompPre;
|
||||
|
||||
typedef agg::renderer_base<PixFormat> RendererBase;
|
||||
typedef agg::renderer_base<PixFormatComp> RendererBaseComp;
|
||||
typedef agg::renderer_base<PixFormatPre> RendererBasePre;
|
||||
typedef agg::renderer_base<PixFormat> RendererBase;
|
||||
typedef agg::renderer_base<PixFormatComp> RendererBaseComp;
|
||||
typedef agg::renderer_base<PixFormatPre> RendererBasePre;
|
||||
typedef agg::renderer_base<PixFormatCompPre> RendererBaseCompPre;
|
||||
|
||||
typedef agg::renderer_scanline_aa_solid<RendererBase> RendererSolid;
|
||||
typedef agg::renderer_scanline_aa_solid<RendererBase> RendererSolid;
|
||||
typedef agg::renderer_scanline_aa_solid<RendererBaseComp> RendererSolidComp;
|
||||
|
||||
typedef agg::span_allocator<ColorType> SpanAllocator;
|
||||
typedef agg::pod_auto_array<ColorType, 256> GradientArray;
|
||||
|
||||
typedef agg::span_gradient<ColorType, agg::span_interpolator_linear<>, agg::gradient_x, GradientArray> LinearGradientSpan;
|
||||
typedef agg::span_gradient<ColorType, agg::span_interpolator_linear<>, agg::gradient_circle, GradientArray> RadialGradientSpan;
|
||||
typedef agg::span_gradient<ColorType,
|
||||
agg::span_interpolator_linear<>,
|
||||
agg::gradient_x,
|
||||
GradientArray>
|
||||
LinearGradientSpan;
|
||||
typedef agg::span_gradient<ColorType,
|
||||
agg::span_interpolator_linear<>,
|
||||
agg::gradient_circle,
|
||||
GradientArray>
|
||||
RadialGradientSpan;
|
||||
|
||||
typedef agg::conv_curve<agg::path_storage> ConvCurve;
|
||||
typedef agg::conv_stroke<ConvCurve> ConvStroke;
|
||||
typedef agg::conv_transform<ConvCurve> PathTransform;
|
||||
typedef agg::conv_transform<ConvStroke> StrokeTransform;
|
||||
typedef agg::conv_curve<agg::path_storage> ConvCurve;
|
||||
typedef agg::conv_stroke<ConvCurve> ConvStroke;
|
||||
typedef agg::conv_transform<ConvCurve> PathTransform;
|
||||
typedef agg::conv_transform<ConvStroke> StrokeTransform;
|
||||
|
||||
enum Gradient
|
||||
{
|
||||
@@ -98,12 +111,12 @@ class Agg2D
|
||||
public:
|
||||
friend class Agg2DRenderer;
|
||||
|
||||
// Use srgba8 as the "user" color type, even though the underlying color type
|
||||
// might be something else, such as rgba32. This allows code based on
|
||||
// Use srgba8 as the "user" color type, even though the underlying color
|
||||
// type might be something else, such as rgba32. This allows code based on
|
||||
// 8-bit sRGB values to carry on working as before.
|
||||
typedef agg::srgba8 Color;
|
||||
typedef agg::rect_i Rect;
|
||||
typedef agg::rect_d RectD;
|
||||
typedef agg::srgba8 Color;
|
||||
typedef agg::rect_i Rect;
|
||||
typedef agg::rect_d RectD;
|
||||
typedef agg::trans_affine Affine;
|
||||
|
||||
enum LineJoin
|
||||
@@ -115,9 +128,9 @@ public:
|
||||
|
||||
enum LineCap
|
||||
{
|
||||
CapButt = agg::butt_cap,
|
||||
CapButt = agg::butt_cap,
|
||||
CapSquare = agg::square_cap,
|
||||
CapRound = agg::round_cap
|
||||
CapRound = agg::round_cap
|
||||
};
|
||||
|
||||
enum TextAlignment
|
||||
@@ -127,7 +140,6 @@ public:
|
||||
AlignCenter,
|
||||
};
|
||||
|
||||
|
||||
enum DrawPathFlag
|
||||
{
|
||||
FillOnly,
|
||||
@@ -155,20 +167,28 @@ public:
|
||||
double affineMatrix[6];
|
||||
};
|
||||
|
||||
|
||||
struct Image
|
||||
{
|
||||
agg::rendering_buffer renBuf;
|
||||
|
||||
Image() {}
|
||||
Image(unsigned char* buf, unsigned width, unsigned height, int stride) :
|
||||
renBuf(buf, width, height, stride) {}
|
||||
void attach(unsigned char* buf, unsigned width, unsigned height, int stride)
|
||||
Image(unsigned char* buf, unsigned width, unsigned height, int stride):
|
||||
renBuf(buf, width, height, stride)
|
||||
{
|
||||
}
|
||||
void attach(
|
||||
unsigned char* buf, unsigned width, unsigned height, int stride)
|
||||
{
|
||||
renBuf.attach(buf, width, height, stride);
|
||||
}
|
||||
int width() const { return renBuf.width(); }
|
||||
int height() const { return renBuf.height(); }
|
||||
int width() const
|
||||
{
|
||||
return renBuf.width();
|
||||
}
|
||||
int height() const
|
||||
{
|
||||
return renBuf.height();
|
||||
}
|
||||
void premultiply();
|
||||
void demultiply();
|
||||
};
|
||||
@@ -202,36 +222,37 @@ public:
|
||||
|
||||
enum BlendMode
|
||||
{
|
||||
BlendAlpha = agg::end_of_comp_op_e,
|
||||
BlendClear = agg::comp_op_clear,
|
||||
BlendSrc = agg::comp_op_src,
|
||||
BlendDst = agg::comp_op_dst,
|
||||
BlendSrcOver = agg::comp_op_src_over,
|
||||
BlendDstOver = agg::comp_op_dst_over,
|
||||
BlendSrcIn = agg::comp_op_src_in,
|
||||
BlendDstIn = agg::comp_op_dst_in,
|
||||
BlendSrcOut = agg::comp_op_src_out,
|
||||
BlendDstOut = agg::comp_op_dst_out,
|
||||
BlendSrcAtop = agg::comp_op_src_atop,
|
||||
BlendDstAtop = agg::comp_op_dst_atop,
|
||||
BlendXor = agg::comp_op_xor,
|
||||
BlendAdd = agg::comp_op_plus,
|
||||
BlendMultiply = agg::comp_op_multiply,
|
||||
BlendScreen = agg::comp_op_screen,
|
||||
BlendOverlay = agg::comp_op_overlay,
|
||||
BlendDarken = agg::comp_op_darken,
|
||||
BlendLighten = agg::comp_op_lighten,
|
||||
BlendAlpha = agg::end_of_comp_op_e,
|
||||
BlendClear = agg::comp_op_clear,
|
||||
BlendSrc = agg::comp_op_src,
|
||||
BlendDst = agg::comp_op_dst,
|
||||
BlendSrcOver = agg::comp_op_src_over,
|
||||
BlendDstOver = agg::comp_op_dst_over,
|
||||
BlendSrcIn = agg::comp_op_src_in,
|
||||
BlendDstIn = agg::comp_op_dst_in,
|
||||
BlendSrcOut = agg::comp_op_src_out,
|
||||
BlendDstOut = agg::comp_op_dst_out,
|
||||
BlendSrcAtop = agg::comp_op_src_atop,
|
||||
BlendDstAtop = agg::comp_op_dst_atop,
|
||||
BlendXor = agg::comp_op_xor,
|
||||
BlendAdd = agg::comp_op_plus,
|
||||
BlendMultiply = agg::comp_op_multiply,
|
||||
BlendScreen = agg::comp_op_screen,
|
||||
BlendOverlay = agg::comp_op_overlay,
|
||||
BlendDarken = agg::comp_op_darken,
|
||||
BlendLighten = agg::comp_op_lighten,
|
||||
BlendColorDodge = agg::comp_op_color_dodge,
|
||||
BlendColorBurn = agg::comp_op_color_burn,
|
||||
BlendHardLight = agg::comp_op_hard_light,
|
||||
BlendSoftLight = agg::comp_op_soft_light,
|
||||
BlendColorBurn = agg::comp_op_color_burn,
|
||||
BlendHardLight = agg::comp_op_hard_light,
|
||||
BlendSoftLight = agg::comp_op_soft_light,
|
||||
BlendDifference = agg::comp_op_difference,
|
||||
BlendExclusion = agg::comp_op_exclusion,
|
||||
BlendExclusion = agg::comp_op_exclusion,
|
||||
};
|
||||
|
||||
enum Direction
|
||||
{
|
||||
CW, CCW
|
||||
CW,
|
||||
CCW
|
||||
};
|
||||
|
||||
~Agg2D();
|
||||
@@ -239,26 +260,27 @@ public:
|
||||
|
||||
// Setup
|
||||
//-----------------------
|
||||
void attach(unsigned char* buf, unsigned width, unsigned height, int stride);
|
||||
void attach(Image& img);
|
||||
void attach(
|
||||
unsigned char* buf, unsigned width, unsigned height, int stride);
|
||||
void attach(Image& img);
|
||||
|
||||
void clipBox(double x1, double y1, double x2, double y2);
|
||||
void clipBox(double x1, double y1, double x2, double y2);
|
||||
RectD clipBox() const;
|
||||
|
||||
void clearAll(Color c);
|
||||
void clearAll(unsigned r, unsigned g, unsigned b, unsigned a = 255);
|
||||
void clearAll(Color c);
|
||||
void clearAll(unsigned r, unsigned g, unsigned b, unsigned a = 255);
|
||||
|
||||
void clearClipBox(Color c);
|
||||
void clearClipBox(unsigned r, unsigned g, unsigned b, unsigned a = 255);
|
||||
void clearClipBox(Color c);
|
||||
void clearClipBox(unsigned r, unsigned g, unsigned b, unsigned a = 255);
|
||||
|
||||
// Conversions
|
||||
//-----------------------
|
||||
void worldToScreen(double& x, double& y) const;
|
||||
void screenToWorld(double& x, double& y) const;
|
||||
void worldToScreen(double& x, double& y) const;
|
||||
void screenToWorld(double& x, double& y) const;
|
||||
double worldToScreen(double scalar) const;
|
||||
double screenToWorld(double scalar) const;
|
||||
void alignPoint(double& x, double& y) const;
|
||||
bool inBox(double worldX, double worldY) const;
|
||||
void alignPoint(double& x, double& y) const;
|
||||
bool inBox(double worldX, double worldY) const;
|
||||
|
||||
// General Attributes
|
||||
//-----------------------
|
||||
@@ -289,14 +311,30 @@ public:
|
||||
Color fillColor() const;
|
||||
Color lineColor() const;
|
||||
|
||||
void fillLinearGradient(double x1, double y1, double x2, double y2, Color c1, Color c2, double profile=1.0);
|
||||
void lineLinearGradient(double x1, double y1, double x2, double y2, Color c1, Color c2, double profile=1.0);
|
||||
void fillLinearGradient(double x1,
|
||||
double y1,
|
||||
double x2,
|
||||
double y2,
|
||||
Color c1,
|
||||
Color c2,
|
||||
double profile = 1.0);
|
||||
void lineLinearGradient(double x1,
|
||||
double y1,
|
||||
double x2,
|
||||
double y2,
|
||||
Color c1,
|
||||
Color c2,
|
||||
double profile = 1.0);
|
||||
|
||||
void fillRadialGradient(double x, double y, double r, Color c1, Color c2, double profile=1.0);
|
||||
void lineRadialGradient(double x, double y, double r, Color c1, Color c2, double profile=1.0);
|
||||
void fillRadialGradient(
|
||||
double x, double y, double r, Color c1, Color c2, double profile = 1.0);
|
||||
void lineRadialGradient(
|
||||
double x, double y, double r, Color c1, Color c2, double profile = 1.0);
|
||||
|
||||
void fillRadialGradient(double x, double y, double r, Color c1, Color c2, Color c3);
|
||||
void lineRadialGradient(double x, double y, double r, Color c1, Color c2, Color c3);
|
||||
void fillRadialGradient(
|
||||
double x, double y, double r, Color c1, Color c2, Color c3);
|
||||
void lineRadialGradient(
|
||||
double x, double y, double r, Color c1, Color c2, Color c3);
|
||||
|
||||
void fillRadialGradient(double x, double y, double r);
|
||||
void lineRadialGradient(double x, double y, double r);
|
||||
@@ -313,9 +351,12 @@ public:
|
||||
void fillEvenOdd(bool evenOddFlag);
|
||||
bool fillEvenOdd() const;
|
||||
|
||||
void textAlignment(TextAlignment alignment);
|
||||
void textSize(double sizeX, double sizeY);
|
||||
inline void textSize(double size) { textSize(size, size); }
|
||||
void textAlignment(TextAlignment alignment);
|
||||
void textSize(double sizeX, double sizeY);
|
||||
inline void textSize(double size)
|
||||
{
|
||||
textSize(size, size);
|
||||
}
|
||||
|
||||
// Transformations
|
||||
//-----------------------
|
||||
@@ -328,26 +369,54 @@ public:
|
||||
void scale(double sx, double sy);
|
||||
void skew(double sx, double sy);
|
||||
void translate(double x, double y);
|
||||
void parallelogram(double x1, double y1, double x2, double y2, const double* para);
|
||||
void viewport(double worldX1, double worldY1, double worldX2, double worldY2,
|
||||
double screenX1, double screenY1, double screenX2, double screenY2,
|
||||
ViewportOption opt=XMidYMid);
|
||||
void parallelogram(
|
||||
double x1, double y1, double x2, double y2, const double* para);
|
||||
void viewport(double worldX1,
|
||||
double worldY1,
|
||||
double worldX2,
|
||||
double worldY2,
|
||||
double screenX1,
|
||||
double screenY1,
|
||||
double screenX2,
|
||||
double screenY2,
|
||||
ViewportOption opt = XMidYMid);
|
||||
|
||||
// Basic Shapes
|
||||
//-----------------------
|
||||
void line(double x1, double y1, double x2, double y2);
|
||||
void triangle(double x1, double y1, double x2, double y2, double x3, double y3);
|
||||
void triangle(
|
||||
double x1, double y1, double x2, double y2, double x3, double y3);
|
||||
void rectangle(double x1, double y1, double x2, double y2);
|
||||
void roundedRect(double x1, double y1, double x2, double y2, double r);
|
||||
void roundedRect(double x1, double y1, double x2, double y2, double rx, double ry);
|
||||
void roundedRect(double x1, double y1, double x2, double y2,
|
||||
double rxBottom, double ryBottom,
|
||||
double rxTop, double ryTop);
|
||||
void roundedRect(
|
||||
double x1, double y1, double x2, double y2, double rx, double ry);
|
||||
void roundedRect(double x1,
|
||||
double y1,
|
||||
double x2,
|
||||
double y2,
|
||||
double rxBottom,
|
||||
double ryBottom,
|
||||
double rxTop,
|
||||
double ryTop);
|
||||
void ellipse(double cx, double cy, double rx, double ry);
|
||||
void arc(double cx, double cy, double rx, double ry, double start, double sweep);
|
||||
void star(double cx, double cy, double r1, double r2, double startAngle, int numRays);
|
||||
void curve(double x1, double y1, double x2, double y2, double x3, double y3);
|
||||
void curve(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4);
|
||||
void arc(
|
||||
double cx, double cy, double rx, double ry, double start, double sweep);
|
||||
void star(double cx,
|
||||
double cy,
|
||||
double r1,
|
||||
double r2,
|
||||
double startAngle,
|
||||
int numRays);
|
||||
void curve(
|
||||
double x1, double y1, double x2, double y2, double x3, double y3);
|
||||
void curve(double x1,
|
||||
double y1,
|
||||
double x2,
|
||||
double y2,
|
||||
double x3,
|
||||
double y3,
|
||||
double x4,
|
||||
double y4);
|
||||
void polygon(double* xy, int numPoints);
|
||||
void polyline(double* xy, int numPoints);
|
||||
|
||||
@@ -367,47 +436,53 @@ public:
|
||||
void verLineTo(double y);
|
||||
void verLineRel(double dy);
|
||||
|
||||
void arcTo(double rx, double ry,
|
||||
double angle,
|
||||
bool largeArcFlag,
|
||||
bool sweepFlag,
|
||||
double x, double y);
|
||||
void arcTo(double rx,
|
||||
double ry,
|
||||
double angle,
|
||||
bool largeArcFlag,
|
||||
bool sweepFlag,
|
||||
double x,
|
||||
double y);
|
||||
|
||||
void arcRel(double rx, double ry,
|
||||
double angle,
|
||||
bool largeArcFlag,
|
||||
bool sweepFlag,
|
||||
double dx, double dy);
|
||||
void arcRel(double rx,
|
||||
double ry,
|
||||
double angle,
|
||||
bool largeArcFlag,
|
||||
bool sweepFlag,
|
||||
double dx,
|
||||
double dy);
|
||||
|
||||
void quadricCurveTo(double xCtrl, double yCtrl,
|
||||
double xTo, double yTo);
|
||||
void quadricCurveRel(double dxCtrl, double dyCtrl,
|
||||
double dxTo, double dyTo);
|
||||
void quadricCurveTo(double xCtrl, double yCtrl, double xTo, double yTo);
|
||||
void quadricCurveRel(
|
||||
double dxCtrl, double dyCtrl, double dxTo, double dyTo);
|
||||
void quadricCurveTo(double xTo, double yTo);
|
||||
void quadricCurveRel(double dxTo, double dyTo);
|
||||
|
||||
void cubicCurveTo(double xCtrl1, double yCtrl1,
|
||||
double xCtrl2, double yCtrl2,
|
||||
double xTo, double yTo);
|
||||
void cubicCurveTo(double xCtrl1,
|
||||
double yCtrl1,
|
||||
double xCtrl2,
|
||||
double yCtrl2,
|
||||
double xTo,
|
||||
double yTo);
|
||||
|
||||
void cubicCurveRel(double dxCtrl1, double dyCtrl1,
|
||||
double dxCtrl2, double dyCtrl2,
|
||||
double dxTo, double dyTo);
|
||||
void cubicCurveRel(double dxCtrl1,
|
||||
double dyCtrl1,
|
||||
double dxCtrl2,
|
||||
double dyCtrl2,
|
||||
double dxTo,
|
||||
double dyTo);
|
||||
|
||||
void cubicCurveTo(double xCtrl2, double yCtrl2,
|
||||
double xTo, double yTo);
|
||||
void cubicCurveTo(double xCtrl2, double yCtrl2, double xTo, double yTo);
|
||||
|
||||
void cubicCurveRel(double xCtrl2, double yCtrl2,
|
||||
double xTo, double yTo);
|
||||
void cubicCurveRel(double xCtrl2, double yCtrl2, double xTo, double yTo);
|
||||
|
||||
void addEllipse(double cx, double cy, double rx, double ry, Direction dir);
|
||||
void text(double x, double y, const std::string& text);
|
||||
void text(double x, double y, const std::string& text);
|
||||
void closePolygon();
|
||||
|
||||
void drawPath(DrawPathFlag flag = FillAndStroke);
|
||||
void drawPathNoTransform(DrawPathFlag flag = FillAndStroke);
|
||||
|
||||
|
||||
// Image Transformations
|
||||
//-----------------------
|
||||
void imageFilter(ImageFilter f);
|
||||
@@ -417,52 +492,90 @@ public:
|
||||
ImageResample imageResample() const;
|
||||
|
||||
void transformImage(const Image& img,
|
||||
int imgX1, int imgY1, int imgX2, int imgY2,
|
||||
double dstX1, double dstY1, double dstX2, double dstY2);
|
||||
int imgX1,
|
||||
int imgY1,
|
||||
int imgX2,
|
||||
int imgY2,
|
||||
double dstX1,
|
||||
double dstY1,
|
||||
double dstX2,
|
||||
double dstY2);
|
||||
|
||||
void transformImage(const Image& img,
|
||||
double dstX1, double dstY1, double dstX2, double dstY2);
|
||||
double dstX1,
|
||||
double dstY1,
|
||||
double dstX2,
|
||||
double dstY2);
|
||||
|
||||
void transformImage(const Image& img,
|
||||
int imgX1, int imgY1, int imgX2, int imgY2,
|
||||
const double* parallelogram);
|
||||
int imgX1,
|
||||
int imgY1,
|
||||
int imgX2,
|
||||
int imgY2,
|
||||
const double* parallelogram);
|
||||
|
||||
void transformImage(const Image& img, const double* parallelogram);
|
||||
|
||||
void transformImagePath(const Image& img,
|
||||
int imgX1,
|
||||
int imgY1,
|
||||
int imgX2,
|
||||
int imgY2,
|
||||
double dstX1,
|
||||
double dstY1,
|
||||
double dstX2,
|
||||
double dstY2);
|
||||
|
||||
void transformImagePath(const Image& img,
|
||||
int imgX1, int imgY1, int imgX2, int imgY2,
|
||||
double dstX1, double dstY1, double dstX2, double dstY2);
|
||||
double dstX1,
|
||||
double dstY1,
|
||||
double dstX2,
|
||||
double dstY2);
|
||||
|
||||
void transformImagePath(const Image& img,
|
||||
double dstX1, double dstY1, double dstX2, double dstY2);
|
||||
|
||||
void transformImagePath(const Image& img,
|
||||
int imgX1, int imgY1, int imgX2, int imgY2,
|
||||
const double* parallelogram);
|
||||
int imgX1,
|
||||
int imgY1,
|
||||
int imgX2,
|
||||
int imgY2,
|
||||
const double* parallelogram);
|
||||
|
||||
void transformImagePath(const Image& img, const double* parallelogram);
|
||||
|
||||
|
||||
// Image Blending (no transformations available)
|
||||
void blendImage(Image& img,
|
||||
int imgX1, int imgY1, int imgX2, int imgY2,
|
||||
double dstX, double dstY, unsigned alpha=255);
|
||||
void blendImage(Image& img, double dstX, double dstY, unsigned alpha=255);
|
||||
|
||||
int imgX1,
|
||||
int imgY1,
|
||||
int imgX2,
|
||||
int imgY2,
|
||||
double dstX,
|
||||
double dstY,
|
||||
unsigned alpha = 255);
|
||||
void blendImage(Image& img, double dstX, double dstY, unsigned alpha = 255);
|
||||
|
||||
// Copy image directly, together with alpha-channel
|
||||
void copyImage(Image& img,
|
||||
int imgX1, int imgY1, int imgX2, int imgY2,
|
||||
double dstX, double dstY);
|
||||
int imgX1,
|
||||
int imgY1,
|
||||
int imgX2,
|
||||
int imgY2,
|
||||
double dstX,
|
||||
double dstY);
|
||||
void copyImage(Image& img, double dstX, double dstY);
|
||||
|
||||
|
||||
// Auxiliary
|
||||
//-----------------------
|
||||
static double pi() { return agg::pi; }
|
||||
static double deg2Rad(double v) { return v * agg::pi / 180.0; }
|
||||
static double rad2Deg(double v) { return v * 180.0 / agg::pi; }
|
||||
static double pi()
|
||||
{
|
||||
return agg::pi;
|
||||
}
|
||||
static double deg2Rad(double v)
|
||||
{
|
||||
return v * agg::pi / 180.0;
|
||||
}
|
||||
static double rad2Deg(double v)
|
||||
{
|
||||
return v * 180.0 / agg::pi;
|
||||
}
|
||||
|
||||
private:
|
||||
void render(bool fillColor);
|
||||
@@ -472,97 +585,94 @@ private:
|
||||
|
||||
void addLine(double x1, double y1, double x2, double y2);
|
||||
void updateRasterizerGamma();
|
||||
void renderImage(const Image& img, int x1, int y1, int x2, int y2, const double* parl);
|
||||
void renderImage(
|
||||
const Image& img, int x1, int y1, int x2, int y2, const double* parl);
|
||||
|
||||
agg::rendering_buffer m_rbuf;
|
||||
PixFormat m_pixFormat;
|
||||
PixFormatComp m_pixFormatComp;
|
||||
PixFormatPre m_pixFormatPre;
|
||||
PixFormatCompPre m_pixFormatCompPre;
|
||||
RendererBase m_renBase;
|
||||
RendererBaseComp m_renBaseComp;
|
||||
RendererBasePre m_renBasePre;
|
||||
RendererBaseCompPre m_renBaseCompPre;
|
||||
RendererSolid m_renSolid;
|
||||
RendererSolidComp m_renSolidComp;
|
||||
agg::rendering_buffer m_rbuf;
|
||||
PixFormat m_pixFormat;
|
||||
PixFormatComp m_pixFormatComp;
|
||||
PixFormatPre m_pixFormatPre;
|
||||
PixFormatCompPre m_pixFormatCompPre;
|
||||
RendererBase m_renBase;
|
||||
RendererBaseComp m_renBaseComp;
|
||||
RendererBasePre m_renBasePre;
|
||||
RendererBaseCompPre m_renBaseCompPre;
|
||||
RendererSolid m_renSolid;
|
||||
RendererSolidComp m_renSolidComp;
|
||||
|
||||
SpanAllocator m_allocator;
|
||||
RectD m_clipBox;
|
||||
SpanAllocator m_allocator;
|
||||
RectD m_clipBox;
|
||||
|
||||
BlendMode m_blendMode;
|
||||
BlendMode m_imageBlendMode;
|
||||
Color m_imageBlendColor;
|
||||
BlendMode m_blendMode;
|
||||
BlendMode m_imageBlendMode;
|
||||
Color m_imageBlendColor;
|
||||
|
||||
agg::scanline_u8 m_scanline;
|
||||
agg::rasterizer_scanline_aa<> m_rasterizer;
|
||||
agg::scanline_u8 m_scanline;
|
||||
agg::rasterizer_scanline_aa<> m_rasterizer;
|
||||
|
||||
double m_masterAlpha;
|
||||
double m_antiAliasGamma;
|
||||
double m_masterAlpha;
|
||||
double m_antiAliasGamma;
|
||||
|
||||
Color m_fillColor;
|
||||
Color m_lineColor;
|
||||
GradientArray m_fillGradient;
|
||||
GradientArray m_lineGradient;
|
||||
Color m_fillColor;
|
||||
Color m_lineColor;
|
||||
GradientArray m_fillGradient;
|
||||
GradientArray m_lineGradient;
|
||||
|
||||
LineCap m_lineCap;
|
||||
LineJoin m_lineJoin;
|
||||
LineCap m_lineCap;
|
||||
LineJoin m_lineJoin;
|
||||
|
||||
Gradient m_fillGradientFlag;
|
||||
Gradient m_lineGradientFlag;
|
||||
agg::trans_affine m_fillGradientMatrix;
|
||||
agg::trans_affine m_lineGradientMatrix;
|
||||
double m_fillGradientD1;
|
||||
double m_lineGradientD1;
|
||||
double m_fillGradientD2;
|
||||
double m_lineGradientD2;
|
||||
Gradient m_fillGradientFlag;
|
||||
Gradient m_lineGradientFlag;
|
||||
agg::trans_affine m_fillGradientMatrix;
|
||||
agg::trans_affine m_lineGradientMatrix;
|
||||
double m_fillGradientD1;
|
||||
double m_lineGradientD1;
|
||||
double m_fillGradientD2;
|
||||
double m_lineGradientD2;
|
||||
|
||||
TextAlignment m_textAlignment;
|
||||
double m_textSizeX;
|
||||
double m_textSizeY;
|
||||
TextAlignment m_textAlignment;
|
||||
double m_textSizeX;
|
||||
double m_textSizeY;
|
||||
|
||||
ImageFilter m_imageFilter;
|
||||
ImageResample m_imageResample;
|
||||
agg::image_filter_lut m_imageFilterLut;
|
||||
ImageFilter m_imageFilter;
|
||||
ImageResample m_imageResample;
|
||||
agg::image_filter_lut m_imageFilterLut;
|
||||
|
||||
agg::span_interpolator_linear<> m_fillGradientInterpolator;
|
||||
agg::span_interpolator_linear<> m_lineGradientInterpolator;
|
||||
|
||||
agg::gradient_x m_linearGradientFunction;
|
||||
agg::gradient_circle m_radialGradientFunction;
|
||||
agg::gradient_x m_linearGradientFunction;
|
||||
agg::gradient_circle m_radialGradientFunction;
|
||||
|
||||
double m_lineWidth;
|
||||
bool m_evenOddFlag;
|
||||
double m_lineWidth;
|
||||
bool m_evenOddFlag;
|
||||
|
||||
agg::path_storage m_path;
|
||||
agg::trans_affine m_transform;
|
||||
agg::path_storage m_path;
|
||||
agg::trans_affine m_transform;
|
||||
|
||||
ConvCurve m_convCurve;
|
||||
ConvStroke m_convStroke;
|
||||
ConvCurve m_convCurve;
|
||||
ConvStroke m_convStroke;
|
||||
|
||||
PathTransform m_pathTransform;
|
||||
StrokeTransform m_strokeTransform;
|
||||
PathTransform m_pathTransform;
|
||||
StrokeTransform m_strokeTransform;
|
||||
|
||||
#ifdef AGG_USE_FONTS
|
||||
#ifndef AGG2D_USE_FREETYPE
|
||||
HDC m_fontDC;
|
||||
HDC m_fontDC;
|
||||
#endif
|
||||
FontEngine m_fontEngine;
|
||||
FontCacheManager m_fontCacheManager;
|
||||
FontEngine m_fontEngine;
|
||||
FontCacheManager m_fontCacheManager;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
inline bool operator == (const Agg2D::Color& c1, const Agg2D::Color& c2)
|
||||
inline bool operator==(const Agg2D::Color& c1, const Agg2D::Color& c2)
|
||||
{
|
||||
return c1.r == c2.r && c1.g == c2.g && c1.b == c2.b && c1.a == c2.a;
|
||||
return c1.r == c2.r && c1.g == c2.g && c1.b == c2.b && c1.a == c2.a;
|
||||
}
|
||||
|
||||
inline bool operator != (const Agg2D::Color& c1, const Agg2D::Color& c2)
|
||||
inline bool operator!=(const Agg2D::Color& c1, const Agg2D::Color& c2)
|
||||
{
|
||||
return !(c1 == c2);
|
||||
return !(c1 == c2);
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
// Anti-Grain Geometry - Version 2.4
|
||||
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
|
||||
//
|
||||
// Permission to copy, use, modify, sell and distribute this software
|
||||
// is granted provided this copyright notice appears in all copies.
|
||||
// Permission to copy, use, modify, sell and distribute this software
|
||||
// is granted provided this copyright notice appears in all copies.
|
||||
// This software is provided "as is" without express or implied
|
||||
// warranty, and with no claim as to its suitability for any purpose.
|
||||
//
|
||||
@@ -28,52 +28,63 @@ namespace agg
|
||||
//===================================================one_component_mask_u8
|
||||
struct one_component_mask_u8
|
||||
{
|
||||
static unsigned calculate(const int8u* p) { return *p; }
|
||||
static unsigned calculate(const int8u* p)
|
||||
{
|
||||
return *p;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
//=====================================================rgb_to_gray_mask_u8
|
||||
template<unsigned R, unsigned G, unsigned B>
|
||||
template <unsigned R, unsigned G, unsigned B>
|
||||
struct rgb_to_gray_mask_u8
|
||||
{
|
||||
static unsigned calculate(const int8u* p)
|
||||
{
|
||||
return (p[R]*77 + p[G]*150 + p[B]*29) >> 8;
|
||||
static unsigned calculate(const int8u* p)
|
||||
{
|
||||
return (p[R] * 77 + p[G] * 150 + p[B] * 29) >> 8;
|
||||
}
|
||||
};
|
||||
|
||||
//==========================================================alpha_mask_u8
|
||||
template<unsigned Step=1, unsigned Offset=0, class MaskF=one_component_mask_u8>
|
||||
template <unsigned Step = 1,
|
||||
unsigned Offset = 0,
|
||||
class MaskF = one_component_mask_u8>
|
||||
class alpha_mask_u8
|
||||
{
|
||||
public:
|
||||
typedef int8u cover_type;
|
||||
typedef alpha_mask_u8<Step, Offset, MaskF> self_type;
|
||||
enum cover_scale_e
|
||||
{
|
||||
{
|
||||
cover_shift = 8,
|
||||
cover_none = 0,
|
||||
cover_full = 255
|
||||
cover_none = 0,
|
||||
cover_full = 255
|
||||
};
|
||||
|
||||
alpha_mask_u8() : m_rbuf(0) {}
|
||||
explicit alpha_mask_u8(rendering_buffer& rbuf) : m_rbuf(&rbuf) {}
|
||||
alpha_mask_u8(): m_rbuf(0) {}
|
||||
explicit alpha_mask_u8(rendering_buffer& rbuf): m_rbuf(&rbuf) {}
|
||||
|
||||
void attach(rendering_buffer& rbuf) { m_rbuf = &rbuf; }
|
||||
void attach(rendering_buffer& rbuf)
|
||||
{
|
||||
m_rbuf = &rbuf;
|
||||
}
|
||||
|
||||
MaskF& mask_function() { return m_mask_function; }
|
||||
const MaskF& mask_function() const { return m_mask_function; }
|
||||
MaskF& mask_function()
|
||||
{
|
||||
return m_mask_function;
|
||||
}
|
||||
const MaskF& mask_function() const
|
||||
{
|
||||
return m_mask_function;
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
cover_type pixel(int x, int y) const
|
||||
{
|
||||
if(x >= 0 && y >= 0 &&
|
||||
x < (int)m_rbuf->width() &&
|
||||
y < (int)m_rbuf->height())
|
||||
if (x >= 0 && y >= 0 && x < (int)m_rbuf->width() &&
|
||||
y < (int)m_rbuf->height())
|
||||
{
|
||||
return (cover_type)m_mask_function.calculate(
|
||||
m_rbuf->row_ptr(y) + x * Step + Offset);
|
||||
m_rbuf->row_ptr(y) + x * Step + Offset);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -81,19 +92,18 @@ namespace agg
|
||||
//--------------------------------------------------------------------
|
||||
cover_type combine_pixel(int x, int y, cover_type val) const
|
||||
{
|
||||
if(x >= 0 && y >= 0 &&
|
||||
x < (int)m_rbuf->width() &&
|
||||
y < (int)m_rbuf->height())
|
||||
if (x >= 0 && y >= 0 && x < (int)m_rbuf->width() &&
|
||||
y < (int)m_rbuf->height())
|
||||
{
|
||||
return (cover_type)((cover_full + val *
|
||||
m_mask_function.calculate(
|
||||
m_rbuf->row_ptr(y) + x * Step + Offset)) >>
|
||||
cover_shift);
|
||||
return (
|
||||
cover_type)((cover_full + val * m_mask_function.calculate(
|
||||
m_rbuf->row_ptr(y) +
|
||||
x * Step + Offset)) >>
|
||||
cover_shift);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
void fill_hspan(int x, int y, cover_type* dst, int num_pix) const
|
||||
{
|
||||
@@ -103,16 +113,16 @@ namespace agg
|
||||
int count = num_pix;
|
||||
cover_type* covers = dst;
|
||||
|
||||
if(y < 0 || y > ymax)
|
||||
if (y < 0 || y > ymax)
|
||||
{
|
||||
std::memset(dst, 0, num_pix * sizeof(cover_type));
|
||||
return;
|
||||
}
|
||||
|
||||
if(x < 0)
|
||||
if (x < 0)
|
||||
{
|
||||
count += x;
|
||||
if(count <= 0)
|
||||
if (count <= 0)
|
||||
{
|
||||
std::memset(dst, 0, num_pix * sizeof(cover_type));
|
||||
return;
|
||||
@@ -122,11 +132,11 @@ namespace agg
|
||||
x = 0;
|
||||
}
|
||||
|
||||
if(x + count > xmax)
|
||||
if (x + count > xmax)
|
||||
{
|
||||
int rest = x + count - xmax - 1;
|
||||
count -= rest;
|
||||
if(count <= 0)
|
||||
if (count <= 0)
|
||||
{
|
||||
std::memset(dst, 0, num_pix * sizeof(cover_type));
|
||||
return;
|
||||
@@ -139,11 +149,9 @@ namespace agg
|
||||
{
|
||||
*covers++ = (cover_type)m_mask_function.calculate(mask);
|
||||
mask += Step;
|
||||
}
|
||||
while(--count);
|
||||
} while (--count);
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
void combine_hspan(int x, int y, cover_type* dst, int num_pix) const
|
||||
{
|
||||
@@ -153,16 +161,16 @@ namespace agg
|
||||
int count = num_pix;
|
||||
cover_type* covers = dst;
|
||||
|
||||
if(y < 0 || y > ymax)
|
||||
if (y < 0 || y > ymax)
|
||||
{
|
||||
std::memset(dst, 0, num_pix * sizeof(cover_type));
|
||||
return;
|
||||
}
|
||||
|
||||
if(x < 0)
|
||||
if (x < 0)
|
||||
{
|
||||
count += x;
|
||||
if(count <= 0)
|
||||
if (count <= 0)
|
||||
{
|
||||
std::memset(dst, 0, num_pix * sizeof(cover_type));
|
||||
return;
|
||||
@@ -172,11 +180,11 @@ namespace agg
|
||||
x = 0;
|
||||
}
|
||||
|
||||
if(x + count > xmax)
|
||||
if (x + count > xmax)
|
||||
{
|
||||
int rest = x + count - xmax - 1;
|
||||
count -= rest;
|
||||
if(count <= 0)
|
||||
if (count <= 0)
|
||||
{
|
||||
std::memset(dst, 0, num_pix * sizeof(cover_type));
|
||||
return;
|
||||
@@ -187,13 +195,14 @@ namespace agg
|
||||
const int8u* mask = m_rbuf->row_ptr(y) + x * Step + Offset;
|
||||
do
|
||||
{
|
||||
*covers = (cover_type)((cover_full + (*covers) *
|
||||
m_mask_function.calculate(mask)) >>
|
||||
cover_shift);
|
||||
*covers =
|
||||
(cover_type)((cover_full +
|
||||
(*covers) *
|
||||
m_mask_function.calculate(mask)) >>
|
||||
cover_shift);
|
||||
++covers;
|
||||
mask += Step;
|
||||
}
|
||||
while(--count);
|
||||
} while (--count);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
@@ -205,16 +214,16 @@ namespace agg
|
||||
int count = num_pix;
|
||||
cover_type* covers = dst;
|
||||
|
||||
if(x < 0 || x > xmax)
|
||||
if (x < 0 || x > xmax)
|
||||
{
|
||||
std::memset(dst, 0, num_pix * sizeof(cover_type));
|
||||
return;
|
||||
}
|
||||
|
||||
if(y < 0)
|
||||
if (y < 0)
|
||||
{
|
||||
count += y;
|
||||
if(count <= 0)
|
||||
if (count <= 0)
|
||||
{
|
||||
std::memset(dst, 0, num_pix * sizeof(cover_type));
|
||||
return;
|
||||
@@ -224,11 +233,11 @@ namespace agg
|
||||
y = 0;
|
||||
}
|
||||
|
||||
if(y + count > ymax)
|
||||
if (y + count > ymax)
|
||||
{
|
||||
int rest = y + count - ymax - 1;
|
||||
count -= rest;
|
||||
if(count <= 0)
|
||||
if (count <= 0)
|
||||
{
|
||||
std::memset(dst, 0, num_pix * sizeof(cover_type));
|
||||
return;
|
||||
@@ -241,8 +250,7 @@ namespace agg
|
||||
{
|
||||
*covers++ = (cover_type)m_mask_function.calculate(mask);
|
||||
mask += m_rbuf->stride();
|
||||
}
|
||||
while(--count);
|
||||
} while (--count);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
@@ -254,16 +262,16 @@ namespace agg
|
||||
int count = num_pix;
|
||||
cover_type* covers = dst;
|
||||
|
||||
if(x < 0 || x > xmax)
|
||||
if (x < 0 || x > xmax)
|
||||
{
|
||||
std::memset(dst, 0, num_pix * sizeof(cover_type));
|
||||
return;
|
||||
}
|
||||
|
||||
if(y < 0)
|
||||
if (y < 0)
|
||||
{
|
||||
count += y;
|
||||
if(count <= 0)
|
||||
if (count <= 0)
|
||||
{
|
||||
std::memset(dst, 0, num_pix * sizeof(cover_type));
|
||||
return;
|
||||
@@ -273,11 +281,11 @@ namespace agg
|
||||
y = 0;
|
||||
}
|
||||
|
||||
if(y + count > ymax)
|
||||
if (y + count > ymax)
|
||||
{
|
||||
int rest = y + count - ymax - 1;
|
||||
count -= rest;
|
||||
if(count <= 0)
|
||||
if (count <= 0)
|
||||
{
|
||||
std::memset(dst, 0, num_pix * sizeof(cover_type));
|
||||
return;
|
||||
@@ -288,34 +296,33 @@ namespace agg
|
||||
const int8u* mask = m_rbuf->row_ptr(y) + x * Step + Offset;
|
||||
do
|
||||
{
|
||||
*covers = (cover_type)((cover_full + (*covers) *
|
||||
m_mask_function.calculate(mask)) >>
|
||||
cover_shift);
|
||||
*covers =
|
||||
(cover_type)((cover_full +
|
||||
(*covers) *
|
||||
m_mask_function.calculate(mask)) >>
|
||||
cover_shift);
|
||||
++covers;
|
||||
mask += m_rbuf->stride();
|
||||
}
|
||||
while(--count);
|
||||
} while (--count);
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
alpha_mask_u8(const self_type&);
|
||||
const self_type& operator = (const self_type&);
|
||||
const self_type& operator=(const self_type&);
|
||||
|
||||
rendering_buffer* m_rbuf;
|
||||
MaskF m_mask_function;
|
||||
MaskF m_mask_function;
|
||||
};
|
||||
|
||||
|
||||
typedef alpha_mask_u8<1, 0> alpha_mask_gray8; //----alpha_mask_gray8
|
||||
typedef alpha_mask_u8<1, 0> alpha_mask_gray8; //----alpha_mask_gray8
|
||||
|
||||
typedef alpha_mask_u8<3, 0> alpha_mask_rgb24r; //----alpha_mask_rgb24r
|
||||
typedef alpha_mask_u8<3, 1> alpha_mask_rgb24g; //----alpha_mask_rgb24g
|
||||
typedef alpha_mask_u8<3, 2> alpha_mask_rgb24b; //----alpha_mask_rgb24b
|
||||
typedef alpha_mask_u8<3, 0> alpha_mask_rgb24r; //----alpha_mask_rgb24r
|
||||
typedef alpha_mask_u8<3, 1> alpha_mask_rgb24g; //----alpha_mask_rgb24g
|
||||
typedef alpha_mask_u8<3, 2> alpha_mask_rgb24b; //----alpha_mask_rgb24b
|
||||
|
||||
typedef alpha_mask_u8<3, 2> alpha_mask_bgr24r; //----alpha_mask_bgr24r
|
||||
typedef alpha_mask_u8<3, 1> alpha_mask_bgr24g; //----alpha_mask_bgr24g
|
||||
typedef alpha_mask_u8<3, 0> alpha_mask_bgr24b; //----alpha_mask_bgr24b
|
||||
typedef alpha_mask_u8<3, 2> alpha_mask_bgr24r; //----alpha_mask_bgr24r
|
||||
typedef alpha_mask_u8<3, 1> alpha_mask_bgr24g; //----alpha_mask_bgr24g
|
||||
typedef alpha_mask_u8<3, 0> alpha_mask_bgr24b; //----alpha_mask_bgr24b
|
||||
|
||||
typedef alpha_mask_u8<4, 0> alpha_mask_rgba32r; //----alpha_mask_rgba32r
|
||||
typedef alpha_mask_u8<4, 1> alpha_mask_rgba32g; //----alpha_mask_rgba32g
|
||||
@@ -337,56 +344,68 @@ namespace agg
|
||||
typedef alpha_mask_u8<4, 1> alpha_mask_abgr32b; //----alpha_mask_abgr32b
|
||||
typedef alpha_mask_u8<4, 0> alpha_mask_abgr32a; //----alpha_mask_abgr32a
|
||||
|
||||
typedef alpha_mask_u8<3, 0, rgb_to_gray_mask_u8<0, 1, 2> > alpha_mask_rgb24gray; //----alpha_mask_rgb24gray
|
||||
typedef alpha_mask_u8<3, 0, rgb_to_gray_mask_u8<2, 1, 0> > alpha_mask_bgr24gray; //----alpha_mask_bgr24gray
|
||||
typedef alpha_mask_u8<4, 0, rgb_to_gray_mask_u8<0, 1, 2> > alpha_mask_rgba32gray; //----alpha_mask_rgba32gray
|
||||
typedef alpha_mask_u8<4, 1, rgb_to_gray_mask_u8<0, 1, 2> > alpha_mask_argb32gray; //----alpha_mask_argb32gray
|
||||
typedef alpha_mask_u8<4, 0, rgb_to_gray_mask_u8<2, 1, 0> > alpha_mask_bgra32gray; //----alpha_mask_bgra32gray
|
||||
typedef alpha_mask_u8<4, 1, rgb_to_gray_mask_u8<2, 1, 0> > alpha_mask_abgr32gray; //----alpha_mask_abgr32gray
|
||||
|
||||
|
||||
typedef alpha_mask_u8<3, 0, rgb_to_gray_mask_u8<0, 1, 2>>
|
||||
alpha_mask_rgb24gray; //----alpha_mask_rgb24gray
|
||||
typedef alpha_mask_u8<3, 0, rgb_to_gray_mask_u8<2, 1, 0>>
|
||||
alpha_mask_bgr24gray; //----alpha_mask_bgr24gray
|
||||
typedef alpha_mask_u8<4, 0, rgb_to_gray_mask_u8<0, 1, 2>>
|
||||
alpha_mask_rgba32gray; //----alpha_mask_rgba32gray
|
||||
typedef alpha_mask_u8<4, 1, rgb_to_gray_mask_u8<0, 1, 2>>
|
||||
alpha_mask_argb32gray; //----alpha_mask_argb32gray
|
||||
typedef alpha_mask_u8<4, 0, rgb_to_gray_mask_u8<2, 1, 0>>
|
||||
alpha_mask_bgra32gray; //----alpha_mask_bgra32gray
|
||||
typedef alpha_mask_u8<4, 1, rgb_to_gray_mask_u8<2, 1, 0>>
|
||||
alpha_mask_abgr32gray; //----alpha_mask_abgr32gray
|
||||
|
||||
//==========================================================amask_no_clip_u8
|
||||
template<unsigned Step=1, unsigned Offset=0, class MaskF=one_component_mask_u8>
|
||||
template <unsigned Step = 1,
|
||||
unsigned Offset = 0,
|
||||
class MaskF = one_component_mask_u8>
|
||||
class amask_no_clip_u8
|
||||
{
|
||||
public:
|
||||
typedef int8u cover_type;
|
||||
typedef amask_no_clip_u8<Step, Offset, MaskF> self_type;
|
||||
enum cover_scale_e
|
||||
{
|
||||
{
|
||||
cover_shift = 8,
|
||||
cover_none = 0,
|
||||
cover_full = 255
|
||||
cover_none = 0,
|
||||
cover_full = 255
|
||||
};
|
||||
|
||||
amask_no_clip_u8() : m_rbuf(0) {}
|
||||
explicit amask_no_clip_u8(rendering_buffer& rbuf) : m_rbuf(&rbuf) {}
|
||||
amask_no_clip_u8(): m_rbuf(0) {}
|
||||
explicit amask_no_clip_u8(rendering_buffer& rbuf): m_rbuf(&rbuf) {}
|
||||
|
||||
void attach(rendering_buffer& rbuf) { m_rbuf = &rbuf; }
|
||||
|
||||
MaskF& mask_function() { return m_mask_function; }
|
||||
const MaskF& mask_function() const { return m_mask_function; }
|
||||
void attach(rendering_buffer& rbuf)
|
||||
{
|
||||
m_rbuf = &rbuf;
|
||||
}
|
||||
|
||||
MaskF& mask_function()
|
||||
{
|
||||
return m_mask_function;
|
||||
}
|
||||
const MaskF& mask_function() const
|
||||
{
|
||||
return m_mask_function;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
cover_type pixel(int x, int y) const
|
||||
{
|
||||
return (cover_type)m_mask_function.calculate(
|
||||
m_rbuf->row_ptr(y) + x * Step + Offset);
|
||||
m_rbuf->row_ptr(y) + x * Step + Offset);
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
cover_type combine_pixel(int x, int y, cover_type val) const
|
||||
{
|
||||
return (cover_type)((cover_full + val *
|
||||
m_mask_function.calculate(
|
||||
m_rbuf->row_ptr(y) + x * Step + Offset)) >>
|
||||
cover_shift);
|
||||
return (cover_type)((cover_full + val * m_mask_function.calculate(
|
||||
m_rbuf->row_ptr(y) +
|
||||
x * Step + Offset)) >>
|
||||
cover_shift);
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
void fill_hspan(int x, int y, cover_type* dst, int num_pix) const
|
||||
{
|
||||
@@ -395,28 +414,24 @@ namespace agg
|
||||
{
|
||||
*dst++ = (cover_type)m_mask_function.calculate(mask);
|
||||
mask += Step;
|
||||
}
|
||||
while(--num_pix);
|
||||
} while (--num_pix);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
void combine_hspan(int x, int y, cover_type* dst, int num_pix) const
|
||||
{
|
||||
const int8u* mask = m_rbuf->row_ptr(y) + x * Step + Offset;
|
||||
do
|
||||
{
|
||||
*dst = (cover_type)((cover_full + (*dst) *
|
||||
m_mask_function.calculate(mask)) >>
|
||||
*dst = (cover_type)((cover_full +
|
||||
(*dst) *
|
||||
m_mask_function.calculate(mask)) >>
|
||||
cover_shift);
|
||||
++dst;
|
||||
mask += Step;
|
||||
}
|
||||
while(--num_pix);
|
||||
} while (--num_pix);
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
void fill_vspan(int x, int y, cover_type* dst, int num_pix) const
|
||||
{
|
||||
@@ -425,75 +440,98 @@ namespace agg
|
||||
{
|
||||
*dst++ = (cover_type)m_mask_function.calculate(mask);
|
||||
mask += m_rbuf->stride();
|
||||
}
|
||||
while(--num_pix);
|
||||
} while (--num_pix);
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
void combine_vspan(int x, int y, cover_type* dst, int num_pix) const
|
||||
{
|
||||
const int8u* mask = m_rbuf->row_ptr(y) + x * Step + Offset;
|
||||
do
|
||||
{
|
||||
*dst = (cover_type)((cover_full + (*dst) *
|
||||
m_mask_function.calculate(mask)) >>
|
||||
*dst = (cover_type)((cover_full +
|
||||
(*dst) *
|
||||
m_mask_function.calculate(mask)) >>
|
||||
cover_shift);
|
||||
++dst;
|
||||
mask += m_rbuf->stride();
|
||||
}
|
||||
while(--num_pix);
|
||||
} while (--num_pix);
|
||||
}
|
||||
|
||||
private:
|
||||
amask_no_clip_u8(const self_type&);
|
||||
const self_type& operator = (const self_type&);
|
||||
const self_type& operator=(const self_type&);
|
||||
|
||||
rendering_buffer* m_rbuf;
|
||||
MaskF m_mask_function;
|
||||
MaskF m_mask_function;
|
||||
};
|
||||
|
||||
|
||||
typedef amask_no_clip_u8<1, 0> amask_no_clip_gray8; //----amask_no_clip_gray8
|
||||
typedef amask_no_clip_u8<1, 0>
|
||||
amask_no_clip_gray8; //----amask_no_clip_gray8
|
||||
|
||||
typedef amask_no_clip_u8<3, 0> amask_no_clip_rgb24r; //----amask_no_clip_rgb24r
|
||||
typedef amask_no_clip_u8<3, 1> amask_no_clip_rgb24g; //----amask_no_clip_rgb24g
|
||||
typedef amask_no_clip_u8<3, 2> amask_no_clip_rgb24b; //----amask_no_clip_rgb24b
|
||||
typedef amask_no_clip_u8<3, 0>
|
||||
amask_no_clip_rgb24r; //----amask_no_clip_rgb24r
|
||||
typedef amask_no_clip_u8<3, 1>
|
||||
amask_no_clip_rgb24g; //----amask_no_clip_rgb24g
|
||||
typedef amask_no_clip_u8<3, 2>
|
||||
amask_no_clip_rgb24b; //----amask_no_clip_rgb24b
|
||||
|
||||
typedef amask_no_clip_u8<3, 2> amask_no_clip_bgr24r; //----amask_no_clip_bgr24r
|
||||
typedef amask_no_clip_u8<3, 1> amask_no_clip_bgr24g; //----amask_no_clip_bgr24g
|
||||
typedef amask_no_clip_u8<3, 0> amask_no_clip_bgr24b; //----amask_no_clip_bgr24b
|
||||
typedef amask_no_clip_u8<3, 2>
|
||||
amask_no_clip_bgr24r; //----amask_no_clip_bgr24r
|
||||
typedef amask_no_clip_u8<3, 1>
|
||||
amask_no_clip_bgr24g; //----amask_no_clip_bgr24g
|
||||
typedef amask_no_clip_u8<3, 0>
|
||||
amask_no_clip_bgr24b; //----amask_no_clip_bgr24b
|
||||
|
||||
typedef amask_no_clip_u8<4, 0> amask_no_clip_rgba32r; //----amask_no_clip_rgba32r
|
||||
typedef amask_no_clip_u8<4, 1> amask_no_clip_rgba32g; //----amask_no_clip_rgba32g
|
||||
typedef amask_no_clip_u8<4, 2> amask_no_clip_rgba32b; //----amask_no_clip_rgba32b
|
||||
typedef amask_no_clip_u8<4, 3> amask_no_clip_rgba32a; //----amask_no_clip_rgba32a
|
||||
typedef amask_no_clip_u8<4, 0>
|
||||
amask_no_clip_rgba32r; //----amask_no_clip_rgba32r
|
||||
typedef amask_no_clip_u8<4, 1>
|
||||
amask_no_clip_rgba32g; //----amask_no_clip_rgba32g
|
||||
typedef amask_no_clip_u8<4, 2>
|
||||
amask_no_clip_rgba32b; //----amask_no_clip_rgba32b
|
||||
typedef amask_no_clip_u8<4, 3>
|
||||
amask_no_clip_rgba32a; //----amask_no_clip_rgba32a
|
||||
|
||||
typedef amask_no_clip_u8<4, 1> amask_no_clip_argb32r; //----amask_no_clip_argb32r
|
||||
typedef amask_no_clip_u8<4, 2> amask_no_clip_argb32g; //----amask_no_clip_argb32g
|
||||
typedef amask_no_clip_u8<4, 3> amask_no_clip_argb32b; //----amask_no_clip_argb32b
|
||||
typedef amask_no_clip_u8<4, 0> amask_no_clip_argb32a; //----amask_no_clip_argb32a
|
||||
typedef amask_no_clip_u8<4, 1>
|
||||
amask_no_clip_argb32r; //----amask_no_clip_argb32r
|
||||
typedef amask_no_clip_u8<4, 2>
|
||||
amask_no_clip_argb32g; //----amask_no_clip_argb32g
|
||||
typedef amask_no_clip_u8<4, 3>
|
||||
amask_no_clip_argb32b; //----amask_no_clip_argb32b
|
||||
typedef amask_no_clip_u8<4, 0>
|
||||
amask_no_clip_argb32a; //----amask_no_clip_argb32a
|
||||
|
||||
typedef amask_no_clip_u8<4, 2> amask_no_clip_bgra32r; //----amask_no_clip_bgra32r
|
||||
typedef amask_no_clip_u8<4, 1> amask_no_clip_bgra32g; //----amask_no_clip_bgra32g
|
||||
typedef amask_no_clip_u8<4, 0> amask_no_clip_bgra32b; //----amask_no_clip_bgra32b
|
||||
typedef amask_no_clip_u8<4, 3> amask_no_clip_bgra32a; //----amask_no_clip_bgra32a
|
||||
typedef amask_no_clip_u8<4, 2>
|
||||
amask_no_clip_bgra32r; //----amask_no_clip_bgra32r
|
||||
typedef amask_no_clip_u8<4, 1>
|
||||
amask_no_clip_bgra32g; //----amask_no_clip_bgra32g
|
||||
typedef amask_no_clip_u8<4, 0>
|
||||
amask_no_clip_bgra32b; //----amask_no_clip_bgra32b
|
||||
typedef amask_no_clip_u8<4, 3>
|
||||
amask_no_clip_bgra32a; //----amask_no_clip_bgra32a
|
||||
|
||||
typedef amask_no_clip_u8<4, 3> amask_no_clip_abgr32r; //----amask_no_clip_abgr32r
|
||||
typedef amask_no_clip_u8<4, 2> amask_no_clip_abgr32g; //----amask_no_clip_abgr32g
|
||||
typedef amask_no_clip_u8<4, 1> amask_no_clip_abgr32b; //----amask_no_clip_abgr32b
|
||||
typedef amask_no_clip_u8<4, 0> amask_no_clip_abgr32a; //----amask_no_clip_abgr32a
|
||||
|
||||
typedef amask_no_clip_u8<3, 0, rgb_to_gray_mask_u8<0, 1, 2> > amask_no_clip_rgb24gray; //----amask_no_clip_rgb24gray
|
||||
typedef amask_no_clip_u8<3, 0, rgb_to_gray_mask_u8<2, 1, 0> > amask_no_clip_bgr24gray; //----amask_no_clip_bgr24gray
|
||||
typedef amask_no_clip_u8<4, 0, rgb_to_gray_mask_u8<0, 1, 2> > amask_no_clip_rgba32gray; //----amask_no_clip_rgba32gray
|
||||
typedef amask_no_clip_u8<4, 1, rgb_to_gray_mask_u8<0, 1, 2> > amask_no_clip_argb32gray; //----amask_no_clip_argb32gray
|
||||
typedef amask_no_clip_u8<4, 0, rgb_to_gray_mask_u8<2, 1, 0> > amask_no_clip_bgra32gray; //----amask_no_clip_bgra32gray
|
||||
typedef amask_no_clip_u8<4, 1, rgb_to_gray_mask_u8<2, 1, 0> > amask_no_clip_abgr32gray; //----amask_no_clip_abgr32gray
|
||||
typedef amask_no_clip_u8<4, 3>
|
||||
amask_no_clip_abgr32r; //----amask_no_clip_abgr32r
|
||||
typedef amask_no_clip_u8<4, 2>
|
||||
amask_no_clip_abgr32g; //----amask_no_clip_abgr32g
|
||||
typedef amask_no_clip_u8<4, 1>
|
||||
amask_no_clip_abgr32b; //----amask_no_clip_abgr32b
|
||||
typedef amask_no_clip_u8<4, 0>
|
||||
amask_no_clip_abgr32a; //----amask_no_clip_abgr32a
|
||||
|
||||
typedef amask_no_clip_u8<3, 0, rgb_to_gray_mask_u8<0, 1, 2>>
|
||||
amask_no_clip_rgb24gray; //----amask_no_clip_rgb24gray
|
||||
typedef amask_no_clip_u8<3, 0, rgb_to_gray_mask_u8<2, 1, 0>>
|
||||
amask_no_clip_bgr24gray; //----amask_no_clip_bgr24gray
|
||||
typedef amask_no_clip_u8<4, 0, rgb_to_gray_mask_u8<0, 1, 2>>
|
||||
amask_no_clip_rgba32gray; //----amask_no_clip_rgba32gray
|
||||
typedef amask_no_clip_u8<4, 1, rgb_to_gray_mask_u8<0, 1, 2>>
|
||||
amask_no_clip_argb32gray; //----amask_no_clip_argb32gray
|
||||
typedef amask_no_clip_u8<4, 0, rgb_to_gray_mask_u8<2, 1, 0>>
|
||||
amask_no_clip_bgra32gray; //----amask_no_clip_bgra32gray
|
||||
typedef amask_no_clip_u8<4, 1, rgb_to_gray_mask_u8<2, 1, 0>>
|
||||
amask_no_clip_abgr32gray; //----amask_no_clip_abgr32gray
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
// Anti-Grain Geometry - Version 2.4
|
||||
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
|
||||
//
|
||||
// Permission to copy, use, modify, sell and distribute this software
|
||||
// is granted provided this copyright notice appears in all copies.
|
||||
// Permission to copy, use, modify, sell and distribute this software
|
||||
// is granted provided this copyright notice appears in all copies.
|
||||
// This software is provided "as is" without express or implied
|
||||
// warranty, and with no claim as to its suitability for any purpose.
|
||||
//
|
||||
@@ -27,24 +27,33 @@ namespace agg
|
||||
|
||||
//=====================================================================arc
|
||||
//
|
||||
// See Implementation agg_arc.cpp
|
||||
// See Implementation agg_arc.cpp
|
||||
//
|
||||
class arc
|
||||
{
|
||||
public:
|
||||
arc() : m_scale(1.0), m_initialized(false) {}
|
||||
arc(double x, double y,
|
||||
double rx, double ry,
|
||||
double a1, double a2,
|
||||
bool ccw=true);
|
||||
arc(): m_scale(1.0), m_initialized(false) {}
|
||||
arc(double x,
|
||||
double y,
|
||||
double rx,
|
||||
double ry,
|
||||
double a1,
|
||||
double a2,
|
||||
bool ccw = true);
|
||||
|
||||
void init(double x, double y,
|
||||
double rx, double ry,
|
||||
double a1, double a2,
|
||||
bool ccw=true);
|
||||
void init(double x,
|
||||
double y,
|
||||
double rx,
|
||||
double ry,
|
||||
double a1,
|
||||
double a2,
|
||||
bool ccw = true);
|
||||
|
||||
void approximation_scale(double s);
|
||||
double approximation_scale() const { return m_scale; }
|
||||
double approximation_scale() const
|
||||
{
|
||||
return m_scale;
|
||||
}
|
||||
|
||||
void rewind(unsigned);
|
||||
unsigned vertex(double* x, double* y);
|
||||
@@ -52,22 +61,20 @@ namespace agg
|
||||
private:
|
||||
void normalize(double a1, double a2, bool ccw);
|
||||
|
||||
double m_x;
|
||||
double m_y;
|
||||
double m_rx;
|
||||
double m_ry;
|
||||
double m_angle;
|
||||
double m_start;
|
||||
double m_end;
|
||||
double m_scale;
|
||||
double m_da;
|
||||
bool m_ccw;
|
||||
bool m_initialized;
|
||||
double m_x;
|
||||
double m_y;
|
||||
double m_rx;
|
||||
double m_ry;
|
||||
double m_angle;
|
||||
double m_start;
|
||||
double m_end;
|
||||
double m_scale;
|
||||
double m_da;
|
||||
bool m_ccw;
|
||||
bool m_initialized;
|
||||
unsigned m_path_cmd;
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -2,8 +2,8 @@
|
||||
// Anti-Grain Geometry - Version 2.4
|
||||
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
|
||||
//
|
||||
// Permission to copy, use, modify, sell and distribute this software
|
||||
// is granted provided this copyright notice appears in all copies.
|
||||
// Permission to copy, use, modify, sell and distribute this software
|
||||
// is granted provided this copyright notice appears in all copies.
|
||||
// This software is provided "as is" without express or implied
|
||||
// warranty, and with no claim as to its suitability for any purpose.
|
||||
//
|
||||
@@ -13,7 +13,7 @@
|
||||
// http://www.antigrain.com
|
||||
//----------------------------------------------------------------------------
|
||||
//
|
||||
// Simple arrowhead/arrowtail generator
|
||||
// Simple arrowhead/arrowtail generator
|
||||
//
|
||||
//----------------------------------------------------------------------------
|
||||
#ifndef AGG_ARROWHEAD_INCLUDED
|
||||
@@ -26,7 +26,7 @@ namespace agg
|
||||
|
||||
//===============================================================arrowhead
|
||||
//
|
||||
// See implementation agg_arrowhead.cpp
|
||||
// See implementation agg_arrowhead.cpp
|
||||
//
|
||||
class arrowhead
|
||||
{
|
||||
@@ -42,8 +42,14 @@ namespace agg
|
||||
m_head_flag = true;
|
||||
}
|
||||
|
||||
void head() { m_head_flag = true; }
|
||||
void no_head() { m_head_flag = false; }
|
||||
void head()
|
||||
{
|
||||
m_head_flag = true;
|
||||
}
|
||||
void no_head()
|
||||
{
|
||||
m_head_flag = false;
|
||||
}
|
||||
|
||||
void tail(double d1, double d2, double d3, double d4)
|
||||
{
|
||||
@@ -54,24 +60,30 @@ namespace agg
|
||||
m_tail_flag = true;
|
||||
}
|
||||
|
||||
void tail() { m_tail_flag = true; }
|
||||
void no_tail() { m_tail_flag = false; }
|
||||
void tail()
|
||||
{
|
||||
m_tail_flag = true;
|
||||
}
|
||||
void no_tail()
|
||||
{
|
||||
m_tail_flag = false;
|
||||
}
|
||||
|
||||
void rewind(unsigned path_id);
|
||||
unsigned vertex(double* x, double* y);
|
||||
|
||||
private:
|
||||
double m_head_d1;
|
||||
double m_head_d2;
|
||||
double m_head_d3;
|
||||
double m_head_d4;
|
||||
double m_tail_d1;
|
||||
double m_tail_d2;
|
||||
double m_tail_d3;
|
||||
double m_tail_d4;
|
||||
bool m_head_flag;
|
||||
bool m_tail_flag;
|
||||
double m_coord[16];
|
||||
double m_head_d1;
|
||||
double m_head_d2;
|
||||
double m_head_d3;
|
||||
double m_head_d4;
|
||||
double m_tail_d1;
|
||||
double m_tail_d2;
|
||||
double m_tail_d3;
|
||||
double m_tail_d4;
|
||||
bool m_head_flag;
|
||||
bool m_tail_flag;
|
||||
double m_coord[16];
|
||||
unsigned m_cmd[8];
|
||||
unsigned m_curr_id;
|
||||
unsigned m_curr_coord;
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
// Anti-Grain Geometry - Version 2.4
|
||||
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
|
||||
//
|
||||
// Permission to copy, use, modify, sell and distribute this software
|
||||
// is granted provided this copyright notice appears in all copies.
|
||||
// Permission to copy, use, modify, sell and distribute this software
|
||||
// is granted provided this copyright notice appears in all copies.
|
||||
// This software is provided "as is" without express or implied
|
||||
// warranty, and with no claim as to its suitability for any purpose.
|
||||
//
|
||||
@@ -25,37 +25,50 @@
|
||||
#else
|
||||
namespace agg
|
||||
{
|
||||
// The policy of all AGG containers and memory allocation strategy
|
||||
// The policy of all AGG containers and memory allocation strategy
|
||||
// in general is that no allocated data requires explicit construction.
|
||||
// It means that the allocator can be really simple; you can even
|
||||
// replace new/delete to malloc/free. The constructors and destructors
|
||||
// won't be called in this case, however everything will remain working.
|
||||
// The second argument of deallocate() is the size of the allocated
|
||||
// replace new/delete to malloc/free. The constructors and destructors
|
||||
// won't be called in this case, however everything will remain working.
|
||||
// The second argument of deallocate() is the size of the allocated
|
||||
// block. You can use this information if you wish.
|
||||
//------------------------------------------------------------pod_allocator
|
||||
template<class T> struct pod_allocator
|
||||
template <class T>
|
||||
struct pod_allocator
|
||||
{
|
||||
static T* allocate(unsigned num) { return new T [num]; }
|
||||
static void deallocate(T* ptr, unsigned) { delete [] ptr; }
|
||||
static T* allocate(unsigned num)
|
||||
{
|
||||
return new T[num];
|
||||
}
|
||||
static void deallocate(T* ptr, unsigned)
|
||||
{
|
||||
delete[] ptr;
|
||||
}
|
||||
};
|
||||
|
||||
// Single object allocator. It's also can be replaced with your custom
|
||||
// allocator. The difference is that it can only allocate a single
|
||||
// object and the constructor and destructor must be called.
|
||||
// allocator. The difference is that it can only allocate a single
|
||||
// object and the constructor and destructor must be called.
|
||||
// In AGG there is no need to allocate an array of objects with
|
||||
// calling their constructors (only single ones). So that, if you
|
||||
// replace these new/delete to malloc/free make sure that the in-place
|
||||
// new is called and take care of calling the destructor too.
|
||||
//------------------------------------------------------------obj_allocator
|
||||
template<class T> struct obj_allocator
|
||||
template <class T>
|
||||
struct obj_allocator
|
||||
{
|
||||
static T* allocate() { return new T; }
|
||||
static void deallocate(T* ptr) { delete ptr; }
|
||||
static T* allocate()
|
||||
{
|
||||
return new T;
|
||||
}
|
||||
static void deallocate(T* ptr)
|
||||
{
|
||||
delete ptr;
|
||||
}
|
||||
};
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
//-------------------------------------------------------- Default basic types
|
||||
//
|
||||
// If the compiler has different capacity of the basic types you can redefine
|
||||
@@ -104,7 +117,7 @@ namespace agg
|
||||
|
||||
//------------------------------------------------ Some fixes for MS Visual C++
|
||||
#if defined(_MSC_VER)
|
||||
#pragma warning(disable:4786) // Identifier was truncated...
|
||||
#pragma warning(disable : 4786) // Identifier was truncated...
|
||||
#endif
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
@@ -116,38 +129,36 @@ namespace agg
|
||||
namespace agg
|
||||
{
|
||||
//-------------------------------------------------------------------------
|
||||
typedef AGG_INT8 int8; //----int8
|
||||
typedef AGG_INT8U int8u; //----int8u
|
||||
typedef AGG_INT16 int16; //----int16
|
||||
typedef AGG_INT16U int16u; //----int16u
|
||||
typedef AGG_INT32 int32; //----int32
|
||||
typedef AGG_INT32U int32u; //----int32u
|
||||
typedef AGG_INT64 int64; //----int64
|
||||
typedef AGG_INT64U int64u; //----int64u
|
||||
typedef AGG_INT8 int8; //----int8
|
||||
typedef AGG_INT8U int8u; //----int8u
|
||||
typedef AGG_INT16 int16; //----int16
|
||||
typedef AGG_INT16U int16u; //----int16u
|
||||
typedef AGG_INT32 int32; //----int32
|
||||
typedef AGG_INT32U int32u; //----int32u
|
||||
typedef AGG_INT64 int64; //----int64
|
||||
typedef AGG_INT64U int64u; //----int64u
|
||||
|
||||
#if defined(AGG_FISTP)
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable : 4035) //Disable warning "no return value"
|
||||
AGG_INLINE int iround(double v) //-------iround
|
||||
#pragma warning(disable : 4035) // Disable warning "no return value"
|
||||
AGG_INLINE int iround(double v) //-------iround
|
||||
{
|
||||
int t;
|
||||
__asm fld qword ptr [v]
|
||||
__asm fistp dword ptr [t]
|
||||
__asm mov eax, dword ptr [t]
|
||||
__asm fld qword ptr[v] __asm fistp dword ptr[t] __asm mov eax,
|
||||
dword ptr[t]
|
||||
}
|
||||
AGG_INLINE unsigned uround(double v) //-------uround
|
||||
AGG_INLINE unsigned uround(double v) //-------uround
|
||||
{
|
||||
unsigned t;
|
||||
__asm fld qword ptr [v]
|
||||
__asm fistp dword ptr [t]
|
||||
__asm mov eax, dword ptr [t]
|
||||
__asm fld qword ptr[v] __asm fistp dword ptr[t] __asm mov eax,
|
||||
dword ptr[t]
|
||||
}
|
||||
#pragma warning(pop)
|
||||
AGG_INLINE int ifloor(double v)
|
||||
{
|
||||
return int(floor(v));
|
||||
}
|
||||
AGG_INLINE unsigned ufloor(double v) //-------ufloor
|
||||
AGG_INLINE unsigned ufloor(double v) //-------ufloor
|
||||
{
|
||||
return unsigned(floor(v));
|
||||
}
|
||||
@@ -155,7 +166,7 @@ namespace agg
|
||||
{
|
||||
return int(ceil(v));
|
||||
}
|
||||
AGG_INLINE unsigned uceil(double v) //--------uceil
|
||||
AGG_INLINE unsigned uceil(double v) //--------uceil
|
||||
{
|
||||
return unsigned(ceil(v));
|
||||
}
|
||||
@@ -213,48 +224,53 @@ namespace agg
|
||||
#endif
|
||||
|
||||
//---------------------------------------------------------------saturation
|
||||
template<int Limit> struct saturation
|
||||
template <int Limit>
|
||||
struct saturation
|
||||
{
|
||||
AGG_INLINE static int iround(double v)
|
||||
{
|
||||
if(v < double(-Limit)) return -Limit;
|
||||
if(v > double( Limit)) return Limit;
|
||||
if (v < double(-Limit))
|
||||
return -Limit;
|
||||
if (v > double(Limit))
|
||||
return Limit;
|
||||
return agg::iround(v);
|
||||
}
|
||||
};
|
||||
|
||||
//------------------------------------------------------------------mul_one
|
||||
template<unsigned Shift> struct mul_one
|
||||
template <unsigned Shift>
|
||||
struct mul_one
|
||||
{
|
||||
AGG_INLINE static unsigned mul(unsigned a, unsigned b)
|
||||
{
|
||||
unsigned q = a * b + (1 << (Shift-1));
|
||||
unsigned q = a * b + (1 << (Shift - 1));
|
||||
return (q + (q >> Shift)) >> Shift;
|
||||
}
|
||||
};
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
typedef unsigned char cover_type; //----cover_type
|
||||
typedef unsigned char cover_type; //----cover_type
|
||||
enum cover_scale_e
|
||||
{
|
||||
cover_shift = 8, //----cover_shift
|
||||
cover_size = 1 << cover_shift, //----cover_size
|
||||
cover_mask = cover_size - 1, //----cover_mask
|
||||
cover_none = 0, //----cover_none
|
||||
cover_full = cover_mask //----cover_full
|
||||
cover_shift = 8, //----cover_shift
|
||||
cover_size = 1 << cover_shift, //----cover_size
|
||||
cover_mask = cover_size - 1, //----cover_mask
|
||||
cover_none = 0, //----cover_none
|
||||
cover_full = cover_mask //----cover_full
|
||||
};
|
||||
|
||||
//----------------------------------------------------poly_subpixel_scale_e
|
||||
// These constants determine the subpixel accuracy, to be more precise,
|
||||
// the number of bits of the fractional part of the coordinates.
|
||||
// These constants determine the subpixel accuracy, to be more precise,
|
||||
// the number of bits of the fractional part of the coordinates.
|
||||
// The possible coordinate capacity in bits can be calculated by formula:
|
||||
// sizeof(int) * 8 - poly_subpixel_shift, i.e, for 32-bit integers and
|
||||
// 8-bits fractional part the capacity is 24 bits.
|
||||
enum poly_subpixel_scale_e
|
||||
{
|
||||
poly_subpixel_shift = 8, //----poly_subpixel_shift
|
||||
poly_subpixel_scale = 1<<poly_subpixel_shift, //----poly_subpixel_scale
|
||||
poly_subpixel_mask = poly_subpixel_scale-1 //----poly_subpixel_mask
|
||||
poly_subpixel_shift = 8, //----poly_subpixel_shift
|
||||
poly_subpixel_scale = 1
|
||||
<< poly_subpixel_shift, //----poly_subpixel_scale
|
||||
poly_subpixel_mask = poly_subpixel_scale - 1 //----poly_subpixel_mask
|
||||
};
|
||||
|
||||
//----------------------------------------------------------filling_rule_e
|
||||
@@ -278,37 +294,60 @@ namespace agg
|
||||
{
|
||||
return rad * 180.0 / pi;
|
||||
}
|
||||
|
||||
|
||||
//----------------------------------------------------------------rect_base
|
||||
template<class T> struct rect_base
|
||||
template <class T>
|
||||
struct rect_base
|
||||
{
|
||||
typedef T value_type;
|
||||
typedef T value_type;
|
||||
typedef rect_base<T> self_type;
|
||||
T x1, y1, x2, y2;
|
||||
|
||||
rect_base() {}
|
||||
rect_base(T x1_, T y1_, T x2_, T y2_) :
|
||||
x1(x1_), y1(y1_), x2(x2_), y2(y2_) {}
|
||||
|
||||
void init(T x1_, T y1_, T x2_, T y2_)
|
||||
rect_base(T x1_, T y1_, T x2_, T y2_):
|
||||
x1(x1_),
|
||||
y1(y1_),
|
||||
x2(x2_),
|
||||
y2(y2_)
|
||||
{
|
||||
x1 = x1_; y1 = y1_; x2 = x2_; y2 = y2_;
|
||||
}
|
||||
|
||||
void init(T x1_, T y1_, T x2_, T y2_)
|
||||
{
|
||||
x1 = x1_;
|
||||
y1 = y1_;
|
||||
x2 = x2_;
|
||||
y2 = y2_;
|
||||
}
|
||||
|
||||
const self_type& normalize()
|
||||
{
|
||||
T t;
|
||||
if(x1 > x2) { t = x1; x1 = x2; x2 = t; }
|
||||
if(y1 > y2) { t = y1; y1 = y2; y2 = t; }
|
||||
if (x1 > x2)
|
||||
{
|
||||
t = x1;
|
||||
x1 = x2;
|
||||
x2 = t;
|
||||
}
|
||||
if (y1 > y2)
|
||||
{
|
||||
t = y1;
|
||||
y1 = y2;
|
||||
y2 = t;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool clip(const self_type& r)
|
||||
{
|
||||
if(x2 > r.x2) x2 = r.x2;
|
||||
if(y2 > r.y2) y2 = r.y2;
|
||||
if(x1 < r.x1) x1 = r.x1;
|
||||
if(y1 < r.y1) y1 = r.y1;
|
||||
if (x2 > r.x2)
|
||||
x2 = r.x2;
|
||||
if (y2 > r.y2)
|
||||
y2 = r.y2;
|
||||
if (x1 < r.x1)
|
||||
x1 = r.x1;
|
||||
if (y1 < r.y1)
|
||||
y1 = r.y1;
|
||||
return x1 <= x2 && y1 <= y2;
|
||||
}
|
||||
|
||||
@@ -321,72 +360,78 @@ namespace agg
|
||||
{
|
||||
return (x >= x1 && x <= x2 && y >= y1 && y <= y2);
|
||||
}
|
||||
|
||||
|
||||
bool overlaps(const self_type& r) const
|
||||
{
|
||||
return !(r.x1 > x2 || r.x2 < x1
|
||||
|| r.y1 > y2 || r.y2 < y1);
|
||||
return !(r.x1 > x2 || r.x2 < x1 || r.y1 > y2 || r.y2 < y1);
|
||||
}
|
||||
};
|
||||
|
||||
//-----------------------------------------------------intersect_rectangles
|
||||
template<class Rect>
|
||||
template <class Rect>
|
||||
inline Rect intersect_rectangles(const Rect& r1, const Rect& r2)
|
||||
{
|
||||
Rect r = r1;
|
||||
|
||||
// First process x2,y2 because the other order
|
||||
// results in Internal Compiler Error under
|
||||
// Microsoft Visual C++ .NET 2003 69462-335-0000007-18038 in
|
||||
// First process x2,y2 because the other order
|
||||
// results in Internal Compiler Error under
|
||||
// Microsoft Visual C++ .NET 2003 69462-335-0000007-18038 in
|
||||
// case of "Maximize Speed" optimization option.
|
||||
//-----------------
|
||||
if(r.x2 > r2.x2) r.x2 = r2.x2;
|
||||
if(r.y2 > r2.y2) r.y2 = r2.y2;
|
||||
if(r.x1 < r2.x1) r.x1 = r2.x1;
|
||||
if(r.y1 < r2.y1) r.y1 = r2.y1;
|
||||
if (r.x2 > r2.x2)
|
||||
r.x2 = r2.x2;
|
||||
if (r.y2 > r2.y2)
|
||||
r.y2 = r2.y2;
|
||||
if (r.x1 < r2.x1)
|
||||
r.x1 = r2.x1;
|
||||
if (r.y1 < r2.y1)
|
||||
r.y1 = r2.y1;
|
||||
return r;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------unite_rectangles
|
||||
template<class Rect>
|
||||
template <class Rect>
|
||||
inline Rect unite_rectangles(const Rect& r1, const Rect& r2)
|
||||
{
|
||||
Rect r = r1;
|
||||
if(r.x2 < r2.x2) r.x2 = r2.x2;
|
||||
if(r.y2 < r2.y2) r.y2 = r2.y2;
|
||||
if(r.x1 > r2.x1) r.x1 = r2.x1;
|
||||
if(r.y1 > r2.y1) r.y1 = r2.y1;
|
||||
if (r.x2 < r2.x2)
|
||||
r.x2 = r2.x2;
|
||||
if (r.y2 < r2.y2)
|
||||
r.y2 = r2.y2;
|
||||
if (r.x1 > r2.x1)
|
||||
r.x1 = r2.x1;
|
||||
if (r.y1 > r2.y1)
|
||||
r.y1 = r2.y1;
|
||||
return r;
|
||||
}
|
||||
|
||||
typedef rect_base<int> rect_i; //----rect_i
|
||||
typedef rect_base<float> rect_f; //----rect_f
|
||||
typedef rect_base<int> rect_i; //----rect_i
|
||||
typedef rect_base<float> rect_f; //----rect_f
|
||||
typedef rect_base<double> rect_d; //----rect_d
|
||||
|
||||
//---------------------------------------------------------path_commands_e
|
||||
enum path_commands_e
|
||||
{
|
||||
path_cmd_stop = 0, //----path_cmd_stop
|
||||
path_cmd_move_to = 1, //----path_cmd_move_to
|
||||
path_cmd_line_to = 2, //----path_cmd_line_to
|
||||
path_cmd_curve3 = 3, //----path_cmd_curve3
|
||||
path_cmd_curve4 = 4, //----path_cmd_curve4
|
||||
path_cmd_curveN = 5, //----path_cmd_curveN
|
||||
path_cmd_catrom = 6, //----path_cmd_catrom
|
||||
path_cmd_ubspline = 7, //----path_cmd_ubspline
|
||||
path_cmd_end_poly = 0x0F, //----path_cmd_end_poly
|
||||
path_cmd_mask = 0x0F //----path_cmd_mask
|
||||
path_cmd_stop = 0, //----path_cmd_stop
|
||||
path_cmd_move_to = 1, //----path_cmd_move_to
|
||||
path_cmd_line_to = 2, //----path_cmd_line_to
|
||||
path_cmd_curve3 = 3, //----path_cmd_curve3
|
||||
path_cmd_curve4 = 4, //----path_cmd_curve4
|
||||
path_cmd_curveN = 5, //----path_cmd_curveN
|
||||
path_cmd_catrom = 6, //----path_cmd_catrom
|
||||
path_cmd_ubspline = 7, //----path_cmd_ubspline
|
||||
path_cmd_end_poly = 0x0F, //----path_cmd_end_poly
|
||||
path_cmd_mask = 0x0F //----path_cmd_mask
|
||||
};
|
||||
|
||||
//------------------------------------------------------------path_flags_e
|
||||
enum path_flags_e
|
||||
{
|
||||
path_flags_none = 0, //----path_flags_none
|
||||
path_flags_ccw = 0x10, //----path_flags_ccw
|
||||
path_flags_cw = 0x20, //----path_flags_cw
|
||||
path_flags_close = 0x40, //----path_flags_close
|
||||
path_flags_mask = 0xF0 //----path_flags_mask
|
||||
path_flags_none = 0, //----path_flags_none
|
||||
path_flags_ccw = 0x10, //----path_flags_ccw
|
||||
path_flags_cw = 0x20, //----path_flags_cw
|
||||
path_flags_close = 0x40, //----path_flags_close
|
||||
path_flags_mask = 0xF0 //----path_flags_mask
|
||||
};
|
||||
|
||||
//---------------------------------------------------------------is_vertex
|
||||
@@ -403,7 +448,7 @@ namespace agg
|
||||
|
||||
//-----------------------------------------------------------------is_stop
|
||||
inline bool is_stop(unsigned c)
|
||||
{
|
||||
{
|
||||
return c == path_cmd_stop;
|
||||
}
|
||||
|
||||
@@ -447,7 +492,7 @@ namespace agg
|
||||
inline bool is_close(unsigned c)
|
||||
{
|
||||
return (c & ~(path_flags_cw | path_flags_ccw)) ==
|
||||
(path_cmd_end_poly | path_flags_close);
|
||||
(path_cmd_end_poly | path_flags_close);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------is_next_poly
|
||||
@@ -471,19 +516,19 @@ namespace agg
|
||||
//-------------------------------------------------------------is_oriented
|
||||
inline bool is_oriented(unsigned c)
|
||||
{
|
||||
return (c & (path_flags_cw | path_flags_ccw)) != 0;
|
||||
return (c & (path_flags_cw | path_flags_ccw)) != 0;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------is_closed
|
||||
inline bool is_closed(unsigned c)
|
||||
{
|
||||
return (c & path_flags_close) != 0;
|
||||
return (c & path_flags_close) != 0;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------get_close_flag
|
||||
inline unsigned get_close_flag(unsigned c)
|
||||
{
|
||||
return c & path_flags_close;
|
||||
return c & path_flags_close;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------clear_orientation
|
||||
@@ -505,70 +550,77 @@ namespace agg
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------point_base
|
||||
template<class T> struct point_base
|
||||
template <class T>
|
||||
struct point_base
|
||||
{
|
||||
typedef T value_type;
|
||||
T x,y;
|
||||
T x, y;
|
||||
point_base() {}
|
||||
point_base(T x_, T y_) : x(x_), y(y_) {}
|
||||
point_base(T x_, T y_): x(x_), y(y_) {}
|
||||
};
|
||||
typedef point_base<int> point_i; //-----point_i
|
||||
typedef point_base<float> point_f; //-----point_f
|
||||
typedef point_base<int> point_i; //-----point_i
|
||||
typedef point_base<float> point_f; //-----point_f
|
||||
typedef point_base<double> point_d; //-----point_d
|
||||
|
||||
//-------------------------------------------------------------vertex_base
|
||||
template<class T> struct vertex_base
|
||||
template <class T>
|
||||
struct vertex_base
|
||||
{
|
||||
typedef T value_type;
|
||||
T x,y;
|
||||
T x, y;
|
||||
unsigned cmd;
|
||||
vertex_base() {}
|
||||
vertex_base(T x_, T y_, unsigned cmd_) : x(x_), y(y_), cmd(cmd_) {}
|
||||
vertex_base(T x_, T y_, unsigned cmd_): x(x_), y(y_), cmd(cmd_) {}
|
||||
};
|
||||
typedef vertex_base<int> vertex_i; //-----vertex_i
|
||||
typedef vertex_base<float> vertex_f; //-----vertex_f
|
||||
typedef vertex_base<int> vertex_i; //-----vertex_i
|
||||
typedef vertex_base<float> vertex_f; //-----vertex_f
|
||||
typedef vertex_base<double> vertex_d; //-----vertex_d
|
||||
|
||||
//----------------------------------------------------------------row_info
|
||||
template<class T> struct row_info
|
||||
template <class T>
|
||||
struct row_info
|
||||
{
|
||||
int x1, x2;
|
||||
T* ptr;
|
||||
row_info() {}
|
||||
row_info(int x1_, int x2_, T* ptr_) : x1(x1_), x2(x2_), ptr(ptr_) {}
|
||||
row_info(int x1_, int x2_, T* ptr_): x1(x1_), x2(x2_), ptr(ptr_) {}
|
||||
};
|
||||
|
||||
//----------------------------------------------------------const_row_info
|
||||
template<class T> struct const_row_info
|
||||
template <class T>
|
||||
struct const_row_info
|
||||
{
|
||||
int x1, x2;
|
||||
const T* ptr;
|
||||
const_row_info() {}
|
||||
const_row_info(int x1_, int x2_, const T* ptr_) :
|
||||
x1(x1_), x2(x2_), ptr(ptr_) {}
|
||||
const_row_info(int x1_, int x2_, const T* ptr_):
|
||||
x1(x1_),
|
||||
x2(x2_),
|
||||
ptr(ptr_)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
//------------------------------------------------------------is_equal_eps
|
||||
template<class T> inline bool is_equal_eps(T v1, T v2, T epsilon)
|
||||
template <class T>
|
||||
inline bool is_equal_eps(T v1, T v2, T epsilon)
|
||||
{
|
||||
bool neg1 = v1 < 0.0;
|
||||
bool neg2 = v2 < 0.0;
|
||||
bool neg1 = v1 < 0.0;
|
||||
bool neg2 = v2 < 0.0;
|
||||
|
||||
if (neg1 != neg2)
|
||||
return std::fabs(v1) < epsilon && std::fabs(v2) < epsilon;
|
||||
if (neg1 != neg2)
|
||||
return std::fabs(v1) < epsilon && std::fabs(v2) < epsilon;
|
||||
|
||||
int int1, int2;
|
||||
std::frexp(v1, &int1);
|
||||
std::frexp(v2, &int2);
|
||||
int min12 = int1 < int2 ? int1 : int2;
|
||||
std::frexp(v1, &int1);
|
||||
std::frexp(v2, &int2);
|
||||
int min12 = int1 < int2 ? int1 : int2;
|
||||
|
||||
v1 = std::ldexp(v1, -min12);
|
||||
v2 = std::ldexp(v2, -min12);
|
||||
v1 = std::ldexp(v1, -min12);
|
||||
v2 = std::ldexp(v2, -min12);
|
||||
|
||||
return std::fabs(v1 - v2) < epsilon;
|
||||
return std::fabs(v1 - v2) < epsilon;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
// Anti-Grain Geometry - Version 2.4
|
||||
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
|
||||
//
|
||||
// Permission to copy, use, modify, sell and distribute this software
|
||||
// is granted provided this copyright notice appears in all copies.
|
||||
// Permission to copy, use, modify, sell and distribute this software
|
||||
// is granted provided this copyright notice appears in all copies.
|
||||
// This software is provided "as is" without express or implied
|
||||
// warranty, and with no claim as to its suitability for any purpose.
|
||||
//
|
||||
@@ -13,7 +13,7 @@
|
||||
// http://www.antigrain.com
|
||||
//----------------------------------------------------------------------------
|
||||
//
|
||||
// Arc generator. Produces at most 4 consecutive cubic bezier curves, i.e.,
|
||||
// Arc generator. Produces at most 4 consecutive cubic bezier curves, i.e.,
|
||||
// 4, 7, 10, or 13 vertices.
|
||||
//
|
||||
//----------------------------------------------------------------------------
|
||||
@@ -27,33 +27,42 @@ namespace agg
|
||||
{
|
||||
|
||||
//-----------------------------------------------------------------------
|
||||
void arc_to_bezier(double cx, double cy, double rx, double ry,
|
||||
double start_angle, double sweep_angle,
|
||||
double* curve);
|
||||
|
||||
void arc_to_bezier(double cx,
|
||||
double cy,
|
||||
double rx,
|
||||
double ry,
|
||||
double start_angle,
|
||||
double sweep_angle,
|
||||
double* curve);
|
||||
|
||||
//==============================================================bezier_arc
|
||||
//
|
||||
//
|
||||
// See implemantaion agg_bezier_arc.cpp
|
||||
//
|
||||
class bezier_arc
|
||||
{
|
||||
public:
|
||||
//--------------------------------------------------------------------
|
||||
bezier_arc() : m_vertex(26), m_num_vertices(0), m_cmd(path_cmd_line_to) {}
|
||||
bezier_arc(double x, double y,
|
||||
double rx, double ry,
|
||||
double start_angle,
|
||||
double sweep_angle)
|
||||
bezier_arc(): m_vertex(26), m_num_vertices(0), m_cmd(path_cmd_line_to)
|
||||
{
|
||||
}
|
||||
bezier_arc(double x,
|
||||
double y,
|
||||
double rx,
|
||||
double ry,
|
||||
double start_angle,
|
||||
double sweep_angle)
|
||||
{
|
||||
init(x, y, rx, ry, start_angle, sweep_angle);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
void init(double x, double y,
|
||||
double rx, double ry,
|
||||
double start_angle,
|
||||
double sweep_angle);
|
||||
void init(double x,
|
||||
double y,
|
||||
double rx,
|
||||
double ry,
|
||||
double start_angle,
|
||||
double sweep_angle);
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
void rewind(unsigned)
|
||||
@@ -64,67 +73,85 @@ namespace agg
|
||||
//--------------------------------------------------------------------
|
||||
unsigned vertex(double* x, double* y)
|
||||
{
|
||||
if(m_vertex >= m_num_vertices) return path_cmd_stop;
|
||||
if (m_vertex >= m_num_vertices)
|
||||
return path_cmd_stop;
|
||||
*x = m_vertices[m_vertex];
|
||||
*y = m_vertices[m_vertex + 1];
|
||||
m_vertex += 2;
|
||||
return (m_vertex == 2) ? unsigned(path_cmd_move_to) : m_cmd;
|
||||
}
|
||||
|
||||
// Supplemantary functions. num_vertices() actually returns doubled
|
||||
// Supplemantary functions. num_vertices() actually returns doubled
|
||||
// number of vertices. That is, for 1 vertex it returns 2.
|
||||
//--------------------------------------------------------------------
|
||||
unsigned num_vertices() const { return m_num_vertices; }
|
||||
const double* vertices() const { return m_vertices; }
|
||||
double* vertices() { return m_vertices; }
|
||||
|
||||
unsigned num_vertices() const
|
||||
{
|
||||
return m_num_vertices;
|
||||
}
|
||||
const double* vertices() const
|
||||
{
|
||||
return m_vertices;
|
||||
}
|
||||
double* vertices()
|
||||
{
|
||||
return m_vertices;
|
||||
}
|
||||
|
||||
private:
|
||||
unsigned m_vertex;
|
||||
unsigned m_num_vertices;
|
||||
double m_vertices[26];
|
||||
double m_vertices[26];
|
||||
unsigned m_cmd;
|
||||
};
|
||||
|
||||
|
||||
|
||||
//==========================================================bezier_arc_svg
|
||||
// Compute an SVG-style bezier arc.
|
||||
// Compute an SVG-style bezier arc.
|
||||
//
|
||||
// Computes an elliptical arc from (x1, y1) to (x2, y2). The size and
|
||||
// orientation of the ellipse are defined by two radii (rx, ry)
|
||||
// and an x-axis-rotation, which indicates how the ellipse as a whole
|
||||
// is rotated relative to the current coordinate system. The center
|
||||
// (cx, cy) of the ellipse is calculated automatically to satisfy the
|
||||
// constraints imposed by the other parameters.
|
||||
// large-arc-flag and sweep-flag contribute to the automatic calculations
|
||||
// Computes an elliptical arc from (x1, y1) to (x2, y2). The size and
|
||||
// orientation of the ellipse are defined by two radii (rx, ry)
|
||||
// and an x-axis-rotation, which indicates how the ellipse as a whole
|
||||
// is rotated relative to the current coordinate system. The center
|
||||
// (cx, cy) of the ellipse is calculated automatically to satisfy the
|
||||
// constraints imposed by the other parameters.
|
||||
// large-arc-flag and sweep-flag contribute to the automatic calculations
|
||||
// and help determine how the arc is drawn.
|
||||
class bezier_arc_svg
|
||||
{
|
||||
public:
|
||||
//--------------------------------------------------------------------
|
||||
bezier_arc_svg() : m_arc(), m_radii_ok(false) {}
|
||||
bezier_arc_svg(): m_arc(), m_radii_ok(false) {}
|
||||
|
||||
bezier_arc_svg(double x1, double y1,
|
||||
double rx, double ry,
|
||||
double angle,
|
||||
bool large_arc_flag,
|
||||
bool sweep_flag,
|
||||
double x2, double y2) :
|
||||
m_arc(), m_radii_ok(false)
|
||||
bezier_arc_svg(double x1,
|
||||
double y1,
|
||||
double rx,
|
||||
double ry,
|
||||
double angle,
|
||||
bool large_arc_flag,
|
||||
bool sweep_flag,
|
||||
double x2,
|
||||
double y2):
|
||||
m_arc(),
|
||||
m_radii_ok(false)
|
||||
{
|
||||
init(x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
void init(double x1, double y1,
|
||||
double rx, double ry,
|
||||
double angle,
|
||||
bool large_arc_flag,
|
||||
bool sweep_flag,
|
||||
double x2, double y2);
|
||||
void init(double x1,
|
||||
double y1,
|
||||
double rx,
|
||||
double ry,
|
||||
double angle,
|
||||
bool large_arc_flag,
|
||||
bool sweep_flag,
|
||||
double x2,
|
||||
double y2);
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
bool radii_ok() const { return m_radii_ok; }
|
||||
bool radii_ok() const
|
||||
{
|
||||
return m_radii_ok;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
void rewind(unsigned)
|
||||
@@ -138,22 +165,27 @@ namespace agg
|
||||
return m_arc.vertex(x, y);
|
||||
}
|
||||
|
||||
// Supplemantary functions. num_vertices() actually returns doubled
|
||||
// Supplemantary functions. num_vertices() actually returns doubled
|
||||
// number of vertices. That is, for 1 vertex it returns 2.
|
||||
//--------------------------------------------------------------------
|
||||
unsigned num_vertices() const { return m_arc.num_vertices(); }
|
||||
const double* vertices() const { return m_arc.vertices(); }
|
||||
double* vertices() { return m_arc.vertices(); }
|
||||
unsigned num_vertices() const
|
||||
{
|
||||
return m_arc.num_vertices();
|
||||
}
|
||||
const double* vertices() const
|
||||
{
|
||||
return m_arc.vertices();
|
||||
}
|
||||
double* vertices()
|
||||
{
|
||||
return m_arc.vertices();
|
||||
}
|
||||
|
||||
private:
|
||||
bezier_arc m_arc;
|
||||
bool m_radii_ok;
|
||||
bool m_radii_ok;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
// Anti-Grain Geometry - Version 2.4
|
||||
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
|
||||
//
|
||||
// Permission to copy, use, modify, sell and distribute this software
|
||||
// is granted provided this copyright notice appears in all copies.
|
||||
// Permission to copy, use, modify, sell and distribute this software
|
||||
// is granted provided this copyright notice appears in all copies.
|
||||
// This software is provided "as is" without express or implied
|
||||
// warranty, and with no claim as to its suitability for any purpose.
|
||||
//
|
||||
@@ -20,19 +20,20 @@
|
||||
|
||||
namespace agg
|
||||
{
|
||||
|
||||
|
||||
class bitset_iterator
|
||||
{
|
||||
public:
|
||||
bitset_iterator(const int8u* bits, unsigned offset = 0) :
|
||||
bitset_iterator(const int8u* bits, unsigned offset = 0):
|
||||
m_bits(bits + (offset >> 3)),
|
||||
m_mask(0x80 >> (offset & 7))
|
||||
{}
|
||||
{
|
||||
}
|
||||
|
||||
void operator ++ ()
|
||||
void operator++()
|
||||
{
|
||||
m_mask >>= 1;
|
||||
if(m_mask == 0)
|
||||
if (m_mask == 0)
|
||||
{
|
||||
++m_bits;
|
||||
m_mask = 0x80;
|
||||
@@ -46,7 +47,7 @@ namespace agg
|
||||
|
||||
private:
|
||||
const int8u* m_bits;
|
||||
int8u m_mask;
|
||||
int8u m_mask;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user