mirror of
https://github.com/WerWolv/ImHex.git
synced 2026-03-28 15:57:03 -05:00
Compare commits
2825 Commits
m1_cross_c
...
v1.38.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
83650c908d | ||
|
|
afa297bb53 | ||
|
|
00986d0ea8 | ||
|
|
633914316a | ||
|
|
205bb81a0a | ||
|
|
60a69e3a54 | ||
|
|
5c629494da | ||
|
|
95f010395c | ||
|
|
d575d0f724 | ||
|
|
bdbdb46005 | ||
|
|
efc28a3177 | ||
|
|
5d50653495 | ||
|
|
24c55beb9c | ||
|
|
04547ad6af | ||
|
|
d2951d06b2 | ||
|
|
926910bf6e | ||
|
|
6652750044 | ||
|
|
ab3853eb9d | ||
|
|
4f4af83699 | ||
|
|
df3200f936 | ||
|
|
7374a06faa | ||
|
|
22b13f5ba6 | ||
|
|
031301e1bb | ||
|
|
3ad508c6fc | ||
|
|
c3421aef8c | ||
|
|
f2e8d402dd | ||
|
|
ab54acb176 | ||
|
|
7585e191d0 | ||
|
|
a4f6795a44 | ||
|
|
3529bce009 | ||
|
|
bc3afbb271 | ||
|
|
a0d0621725 | ||
|
|
c2d70dbd50 | ||
|
|
e2fdd91956 | ||
|
|
2a84534ced | ||
|
|
94b53592d9 | ||
|
|
09006588fc | ||
|
|
9d5cdaeb33 | ||
|
|
d4df465633 | ||
|
|
da0c1674a6 | ||
|
|
18aa11117a | ||
|
|
ed32439645 | ||
|
|
5c890e710e | ||
|
|
d15b7862b8 | ||
|
|
0e5136196a | ||
|
|
46fdbd5bc0 | ||
|
|
da755ec75b | ||
|
|
d610f787b9 | ||
|
|
1ab1f7ada0 | ||
|
|
56cb1f2747 | ||
|
|
413c6b5116 | ||
|
|
f4753a5bd8 | ||
|
|
980438008c | ||
|
|
8f57dd86af | ||
|
|
a2ce89af32 | ||
|
|
67008288e2 | ||
|
|
4caa0ce570 | ||
|
|
4e2dcef7d7 | ||
|
|
f47a248768 | ||
|
|
862462c5bb | ||
|
|
375471160f | ||
|
|
4000e7c886 | ||
|
|
48095671c3 | ||
|
|
c96b47f345 | ||
|
|
b250172bb5 | ||
|
|
257b248f34 | ||
|
|
a8fe63ee93 | ||
|
|
d359a21a66 | ||
|
|
e5cdf22753 | ||
|
|
c33d53b728 | ||
|
|
e5829a316b | ||
|
|
569bf474bd | ||
|
|
06ecd5d571 | ||
|
|
9ae233a41c | ||
|
|
989f7f7678 | ||
|
|
a75947e611 | ||
|
|
1d4233514f | ||
|
|
fa780e9706 | ||
|
|
cba93e87eb | ||
|
|
f3a2fe5b0d | ||
|
|
ebee8ff0a6 | ||
|
|
34971162cb | ||
|
|
58eec483c9 | ||
|
|
c57f071f0c | ||
|
|
b30e2bcfa4 | ||
|
|
b56c3c5a46 | ||
|
|
120c4202b4 | ||
|
|
1f257290ab | ||
|
|
4d585d17de | ||
|
|
2c7da65242 | ||
|
|
95ff52b025 | ||
|
|
b1e2185966 | ||
|
|
5d77402211 | ||
|
|
f762cc2906 | ||
|
|
7ca2e558c9 | ||
|
|
e388d0c5e8 | ||
|
|
05f8d9302d | ||
|
|
8f277f00a4 | ||
|
|
59f9da59e2 | ||
|
|
8d4415fe15 | ||
|
|
fd54b2b803 | ||
|
|
ba6953fda4 | ||
|
|
c0f667ce20 | ||
|
|
c93c15563a | ||
|
|
d0340c13dc | ||
|
|
c6caa1d067 | ||
|
|
2f0efa1197 | ||
|
|
a76eae2c11 | ||
|
|
b82c1f051c | ||
|
|
1b6a150624 | ||
|
|
265360229f | ||
|
|
98e9729267 | ||
|
|
cfe16ee2c5 | ||
|
|
c9f856b219 | ||
|
|
3c167c3306 | ||
|
|
fedbce6f9e | ||
|
|
28be4cea97 | ||
|
|
05fb2bfd23 | ||
|
|
3905335c53 | ||
|
|
4dc3f9e033 | ||
|
|
07a6a9b7d4 | ||
|
|
fac7dff77f | ||
|
|
60c7ced335 | ||
|
|
8f981e7707 | ||
|
|
725cc10a92 | ||
|
|
d3896ccfda | ||
|
|
de3e532a5c | ||
|
|
98369600c3 | ||
|
|
d9aaef29d2 | ||
|
|
48f4410a2a | ||
|
|
ca0b232ada | ||
|
|
75efe39298 | ||
|
|
84342f7a7b | ||
|
|
67efea6444 | ||
|
|
f08b182bf2 | ||
|
|
3c83a62aef | ||
|
|
821db4d2a1 | ||
|
|
3c661842a2 | ||
|
|
920578003e | ||
|
|
22aadcc1ae | ||
|
|
efc65479c6 | ||
|
|
dcbba9cbfc | ||
|
|
6169078c04 | ||
|
|
955f48f532 | ||
|
|
d7a830ca95 | ||
|
|
96b27645d6 | ||
|
|
8b6346ae41 | ||
|
|
c1619820c7 | ||
|
|
88ccb0e075 | ||
|
|
12564dd78f | ||
|
|
b0c4db7a64 | ||
|
|
310ca6c6dc | ||
|
|
32e3a4e74f | ||
|
|
be66e3fe79 | ||
|
|
d794734f1d | ||
|
|
8661b6551d | ||
|
|
a0326c4371 | ||
|
|
b039bc14c6 | ||
|
|
d08853df8c | ||
|
|
d8dd287cdf | ||
|
|
d62b64c27a | ||
|
|
52952652de | ||
|
|
790c19a1cd | ||
|
|
9659381378 | ||
|
|
4598fc098d | ||
|
|
2f6fde1e61 | ||
|
|
16dc199431 | ||
|
|
715e970d99 | ||
|
|
53535ab9be | ||
|
|
24f9df90b8 | ||
|
|
4cfdbb8095 | ||
|
|
fe4cb8575f | ||
|
|
06ac7eb85f | ||
|
|
0e14ff5a3d | ||
|
|
c65015fcc7 | ||
|
|
c8caf6124e | ||
|
|
76bb0e420d | ||
|
|
d2c1b2a31b | ||
|
|
e30f073809 | ||
|
|
e1079d751a | ||
|
|
a9d45d837f | ||
|
|
bcbe5eb105 | ||
|
|
6ab1f8e4e2 | ||
|
|
90f26d53d3 | ||
|
|
281921d1de | ||
|
|
9135153dc9 | ||
|
|
c70b505b3a | ||
|
|
cde9dc37e5 | ||
|
|
ab1e5eb359 | ||
|
|
aec9f7a145 | ||
|
|
bf08ed563a | ||
|
|
ff70518882 | ||
|
|
72364db768 | ||
|
|
92fa72eac7 | ||
|
|
9e2c1de0f5 | ||
|
|
57ac73b9d4 | ||
|
|
2757c577e4 | ||
|
|
704af30421 | ||
|
|
1e8a005d0e | ||
|
|
8a04d2f477 | ||
|
|
a7c37bfb93 | ||
|
|
d1801ea438 | ||
|
|
f6f856cd56 | ||
|
|
8515cd43fa | ||
|
|
8a4cdbb371 | ||
|
|
7fef133505 | ||
|
|
5f206a33e2 | ||
|
|
228385ceaa | ||
|
|
bd9e9a7dcf | ||
|
|
abffb8c138 | ||
|
|
e353802e9f | ||
|
|
130055af22 | ||
|
|
db573840b0 | ||
|
|
e0fccacc32 | ||
|
|
18890f47b6 | ||
|
|
204cc1ccb3 | ||
|
|
a063eb96c6 | ||
|
|
145c8ff804 | ||
|
|
f0d2f94aef | ||
|
|
0c12cb683a | ||
|
|
56b5d026df | ||
|
|
40ccbd0d86 | ||
|
|
c1a14cb4d4 | ||
|
|
df2448e121 | ||
|
|
ca323c392b | ||
|
|
395dd37d33 | ||
|
|
e91689a715 | ||
|
|
861988f8dc | ||
|
|
f26f1298cf | ||
|
|
66efcf91d3 | ||
|
|
0178ba014a | ||
|
|
254bd88e6b | ||
|
|
3808b78487 | ||
|
|
a80c35aa94 | ||
|
|
d0f51d0462 | ||
|
|
013fa85c1c | ||
|
|
fcda856198 | ||
|
|
e385487a6b | ||
|
|
f8fa029ee3 | ||
|
|
d1a0f8ec97 | ||
|
|
d02e147dc3 | ||
|
|
5c481d4247 | ||
|
|
f4cbdde8f6 | ||
|
|
0ac09fc57b | ||
|
|
99c28c93b4 | ||
|
|
0e800723f5 | ||
|
|
fc2ed47676 | ||
|
|
5c2309bcf7 | ||
|
|
ba71a300ec | ||
|
|
393451eed5 | ||
|
|
b0b20bcb9b | ||
|
|
8e8c553da4 | ||
|
|
c83173098c | ||
|
|
16c52f4008 | ||
|
|
d207d98a82 | ||
|
|
5a1f3d40a7 | ||
|
|
a667a1b6a9 | ||
|
|
cfe3c5b6df | ||
|
|
b49e2eeac4 | ||
|
|
d012ad08f8 | ||
|
|
b83f3d6cbf | ||
|
|
a8be74ebb7 | ||
|
|
b5bf9f1486 | ||
|
|
b3d07b4573 | ||
|
|
b602fcc485 | ||
|
|
0908d040fa | ||
|
|
530bd6dac4 | ||
|
|
441dcea705 | ||
|
|
c5e0951def | ||
|
|
4bea8f4c65 | ||
|
|
7f5ae41d8a | ||
|
|
35a357f1a8 | ||
|
|
8b384ef1f9 | ||
|
|
7588a84e86 | ||
|
|
d8f8e61a11 | ||
|
|
3c9aa97f6c | ||
|
|
6c28adbd24 | ||
|
|
cf5b9da45e | ||
|
|
01f24d2f2f | ||
|
|
592eea1bfd | ||
|
|
16a4a67886 | ||
|
|
dd3b6a47d2 | ||
|
|
fa8102f93d | ||
|
|
ef3678bfaf | ||
|
|
599b339e5d | ||
|
|
682aae1497 | ||
|
|
4ade751caf | ||
|
|
9f24b35b1f | ||
|
|
769087d139 | ||
|
|
3b1f32d68d | ||
|
|
4fc1f0491e | ||
|
|
89b94ebbf9 | ||
|
|
5666baf2bc | ||
|
|
9d05f487e6 | ||
|
|
8b72ea81c0 | ||
|
|
23085372a1 | ||
|
|
1761033cee | ||
|
|
48af5eb10a | ||
|
|
d2233af8a0 | ||
|
|
a411d489c1 | ||
|
|
3b48f537f1 | ||
|
|
7755e95db0 | ||
|
|
ac66f80a0d | ||
|
|
13111e2940 | ||
|
|
d0af46b175 | ||
|
|
18e6a5d6d2 | ||
|
|
1f1d127822 | ||
|
|
8a0639ced2 | ||
|
|
762eacb7c8 | ||
|
|
0ebe4150ae | ||
|
|
e8f799d010 | ||
|
|
926cddd69f | ||
|
|
ec2a01dfae | ||
|
|
f921742dcc | ||
|
|
ce0c97e6d5 | ||
|
|
1c54e7e38b | ||
|
|
9928439f4f | ||
|
|
3ed7834945 | ||
|
|
5853cb5ad5 | ||
|
|
1b476e235b | ||
|
|
ef8f5c67bd | ||
|
|
0664937c1e | ||
|
|
aada2c1fe6 | ||
|
|
870bce2bf8 | ||
|
|
908d879a1e | ||
|
|
5147d8ab63 | ||
|
|
8a1531fc71 | ||
|
|
09918041f8 | ||
|
|
165d00dad3 | ||
|
|
fa99069951 | ||
|
|
babd9584a6 | ||
|
|
20df023137 | ||
|
|
fbde2942de | ||
|
|
d920718b44 | ||
|
|
4ca429e389 | ||
|
|
49c56e28b4 | ||
|
|
3ec4f086ec | ||
|
|
3cb5dd226c | ||
|
|
6a1aa2c13e | ||
|
|
4b73e1a184 | ||
|
|
5fa9aaa6a6 | ||
|
|
63711f652f | ||
|
|
d07b4417d7 | ||
|
|
95ae5a26ed | ||
|
|
d8ad23630a | ||
|
|
c03d9301e2 | ||
|
|
6ec6851a8a | ||
|
|
a7d3a916cc | ||
|
|
e1d1c4acca | ||
|
|
bd17e0edc1 | ||
|
|
6e88d08c17 | ||
|
|
278babe7f2 | ||
|
|
b23f33ab6c | ||
|
|
50b25882cd | ||
|
|
28bfceab6c | ||
|
|
6febe9982b | ||
|
|
b5a3a8b4c2 | ||
|
|
25c8f4b588 | ||
|
|
09b2e20a3d | ||
|
|
e9d95c78f6 | ||
|
|
ad2a36676c | ||
|
|
43da36a957 | ||
|
|
71e9f7b239 | ||
|
|
b566d31f28 | ||
|
|
c4d167f8d4 | ||
|
|
50f1fe2b2d | ||
|
|
75e73ddcd9 | ||
|
|
3616c3ad7b | ||
|
|
23d673f920 | ||
|
|
8c9f3fa569 | ||
|
|
80003a4843 | ||
|
|
12785c00bd | ||
|
|
8f94b46149 | ||
|
|
73a59fe5c1 | ||
|
|
5028b354cc | ||
|
|
3e98d0a0f8 | ||
|
|
902c8dcd8d | ||
|
|
66e407549e | ||
|
|
0870ab4d3c | ||
|
|
6be0eeff72 | ||
|
|
9246d040ad | ||
|
|
549866bfd9 | ||
|
|
d81f0668a1 | ||
|
|
6b4fef806c | ||
|
|
4e5b2675a0 | ||
|
|
f3d9f224b7 | ||
|
|
ae8a12fa27 | ||
|
|
de7d549fc6 | ||
|
|
d925c8216d | ||
|
|
e6f46747b6 | ||
|
|
c30830a8ff | ||
|
|
45b08b6010 | ||
|
|
c88fc43032 | ||
|
|
08a08c2b3a | ||
|
|
411e971ba7 | ||
|
|
dbc5819bc4 | ||
|
|
93a71120d4 | ||
|
|
d683c04519 | ||
|
|
a403980976 | ||
|
|
5c3dfa08b2 | ||
|
|
fd2d50508b | ||
|
|
14ee688629 | ||
|
|
9e4557d90d | ||
|
|
d9810982ad | ||
|
|
282d950423 | ||
|
|
cd5b16cce5 | ||
|
|
cc1ac95af6 | ||
|
|
b14fa24836 | ||
|
|
59c6d3090b | ||
|
|
1e809214b2 | ||
|
|
56ec07e316 | ||
|
|
ce66f3a98a | ||
|
|
5d180bdbfb | ||
|
|
d922dbe04c | ||
|
|
1fc6ec28c2 | ||
|
|
ec6ff1d7d5 | ||
|
|
ad87f005fe | ||
|
|
df1e97af0a | ||
|
|
82ceb2e11f | ||
|
|
9698232f69 | ||
|
|
b1867aac92 | ||
|
|
09bc5b92f6 | ||
|
|
725462b222 | ||
|
|
a9faba5cec | ||
|
|
5a318da8ca | ||
|
|
5bc8366749 | ||
|
|
6200036014 | ||
|
|
38b891bd62 | ||
|
|
a22c606e42 | ||
|
|
dc0473e48d | ||
|
|
71f5373ea8 | ||
|
|
bd4ce72800 | ||
|
|
d39d33de32 | ||
|
|
7c07f70afd | ||
|
|
de67d5942b | ||
|
|
f358069cc1 | ||
|
|
cf87294a8c | ||
|
|
40b48f6460 | ||
|
|
31322bcc76 | ||
|
|
abe13d9ff9 | ||
|
|
064b21a264 | ||
|
|
5be6297bac | ||
|
|
dda32ef0f9 | ||
|
|
9cff9043ee | ||
|
|
d429424f67 | ||
|
|
750f91dbbc | ||
|
|
c0ee243d64 | ||
|
|
e05825b9f4 | ||
|
|
018c61890c | ||
|
|
263c5f6830 | ||
|
|
a27b10f69a | ||
|
|
3cf7622707 | ||
|
|
327195573e | ||
|
|
baebfe96ba | ||
|
|
5b06702dee | ||
|
|
95465e2fc3 | ||
|
|
388f5354a1 | ||
|
|
c3cd4edbf9 | ||
|
|
b9c36cfd2f | ||
|
|
b3deeb29b3 | ||
|
|
136cabedb4 | ||
|
|
9fc9eb1425 | ||
|
|
71a39ff2fd | ||
|
|
3d01b78ba0 | ||
|
|
452e7d7c5f | ||
|
|
1a8e09d549 | ||
|
|
ea072296cf | ||
|
|
56d1e2670e | ||
|
|
bc953592f0 | ||
|
|
b2f188fa4b | ||
|
|
7575f85bdf | ||
|
|
685a2e3cf2 | ||
|
|
2db85ced59 | ||
|
|
693a0f2516 | ||
|
|
b81328ac1a | ||
|
|
2440acda07 | ||
|
|
29354f0bcb | ||
|
|
a9eb7b2d25 | ||
|
|
05a06fe7a3 | ||
|
|
f73866b86e | ||
|
|
1e18abc598 | ||
|
|
a2c4aefced | ||
|
|
bb6ea5f1e5 | ||
|
|
0e855e10db | ||
|
|
1594c712a8 | ||
|
|
7b6d5d2686 | ||
|
|
44f12587f3 | ||
|
|
fd8bdbdc90 | ||
|
|
9557041c3a | ||
|
|
1804caba02 | ||
|
|
c1f0d60f49 | ||
|
|
83d92dde35 | ||
|
|
ac98e4e0b5 | ||
|
|
5c99974202 | ||
|
|
280dea23d0 | ||
|
|
6fcc3e8cb3 | ||
|
|
ec9461741c | ||
|
|
896e05331c | ||
|
|
4c930b190e | ||
|
|
6ab3353a15 | ||
|
|
a31760eecb | ||
|
|
4c89a79dc3 | ||
|
|
2c3d8d4c0b | ||
|
|
e71e026da0 | ||
|
|
f239b0c6d7 | ||
|
|
8a7f232198 | ||
|
|
a3c71b3955 | ||
|
|
46b13b6606 | ||
|
|
a40c420b70 | ||
|
|
8470334d6d | ||
|
|
f42ae97f14 | ||
|
|
c7b2f26bd5 | ||
|
|
ec424ac16e | ||
|
|
72501edc9a | ||
|
|
9554889964 | ||
|
|
7ff1e72093 | ||
|
|
3d3674d405 | ||
|
|
d08152a824 | ||
|
|
12087b51cb | ||
|
|
66ec1de625 | ||
|
|
7f09d61eb8 | ||
|
|
f5c24cee67 | ||
|
|
2abedbe4ad | ||
|
|
80eb72c5f9 | ||
|
|
88da6c10e0 | ||
|
|
49771766e7 | ||
|
|
9b20092428 | ||
|
|
e3551b3045 | ||
|
|
68d7e99a80 | ||
|
|
a8d61ed534 | ||
|
|
a67788ac52 | ||
|
|
bc644e324a | ||
|
|
8782be593d | ||
|
|
2998cc0fd7 | ||
|
|
e85216d9a6 | ||
|
|
e22923a980 | ||
|
|
be6a90675b | ||
|
|
94527345b9 | ||
|
|
c1545b57c9 | ||
|
|
8f3d07ea69 | ||
|
|
68804a357d | ||
|
|
78a449d6d3 | ||
|
|
366c631e26 | ||
|
|
da8be3ec3c | ||
|
|
820b833bbc | ||
|
|
574c039cc8 | ||
|
|
e0180b718f | ||
|
|
ca82fafac5 | ||
|
|
a9ce71c481 | ||
|
|
2e200a2ab8 | ||
|
|
0e720a1e02 | ||
|
|
601b13cf42 | ||
|
|
f6860015eb | ||
|
|
99a9752ee9 | ||
|
|
518ada6dae | ||
|
|
3c1c9c13d8 | ||
|
|
baa4e82b92 | ||
|
|
116f5a57eb | ||
|
|
4c8c383378 | ||
|
|
e5e867db22 | ||
|
|
2b72d08e39 | ||
|
|
32adb99f3d | ||
|
|
799175c94e | ||
|
|
e79116499e | ||
|
|
e1a91d179a | ||
|
|
e0910cd2f4 | ||
|
|
295c751b60 | ||
|
|
851f7b4b8c | ||
|
|
9b3a157b41 | ||
|
|
8f2638be30 | ||
|
|
0634b41092 | ||
|
|
2ce5acb8d3 | ||
|
|
48980a1e0c | ||
|
|
b68d0704e7 | ||
|
|
af7eaae399 | ||
|
|
a3eb057215 | ||
|
|
59695dcad6 | ||
|
|
aa6e461340 | ||
|
|
737d71ee13 | ||
|
|
2b7fe26bf1 | ||
|
|
8593bf5f55 | ||
|
|
7bfc3f44c9 | ||
|
|
b9f79833b6 | ||
|
|
9bed8f792a | ||
|
|
e18d583a00 | ||
|
|
244f7b55ee | ||
|
|
ee6d72562b | ||
|
|
90c2667028 | ||
|
|
9c6926a1fb | ||
|
|
22c9d77909 | ||
|
|
55b3b3a188 | ||
|
|
c93e5ba183 | ||
|
|
5df8ec78aa | ||
|
|
cc6590d780 | ||
|
|
9ce18d1a42 | ||
|
|
9ff8d42143 | ||
|
|
1ff838daa7 | ||
|
|
17ab429a8c | ||
|
|
5df50ef380 | ||
|
|
8da007af6c | ||
|
|
f053b94f68 | ||
|
|
d02ea09529 | ||
|
|
79333593bf | ||
|
|
c635bca43d | ||
|
|
de62a4c71e | ||
|
|
24732b304b | ||
|
|
5744ad588f | ||
|
|
5ea021d57a | ||
|
|
38c5868029 | ||
|
|
4725bf7271 | ||
|
|
de9efe6c4d | ||
|
|
88ce3a2490 | ||
|
|
2c47e1a135 | ||
|
|
7454221b3b | ||
|
|
fcc4709ed9 | ||
|
|
aeb77559a7 | ||
|
|
9acaf33410 | ||
|
|
e13b679650 | ||
|
|
4146047cdb | ||
|
|
18e02fbf5c | ||
|
|
b94519362c | ||
|
|
1e59a82c59 | ||
|
|
d570ab04b8 | ||
|
|
830be0b0d3 | ||
|
|
1570f379df | ||
|
|
e7714df79f | ||
|
|
bdc108d021 | ||
|
|
a89fb542b0 | ||
|
|
26de4c11e1 | ||
|
|
01d0f03fdd | ||
|
|
58d0d09eae | ||
|
|
e7a2729d36 | ||
|
|
5782236379 | ||
|
|
88de5f6be4 | ||
|
|
4520637aed | ||
|
|
aa8235c279 | ||
|
|
2432462ff3 | ||
|
|
8c59684c14 | ||
|
|
82c318f91d | ||
|
|
3c16adf169 | ||
|
|
2ab54baa2c | ||
|
|
da2aa85a8a | ||
|
|
e58ce527c6 | ||
|
|
d1840a2184 | ||
|
|
fa62a675dc | ||
|
|
1aa52c634f | ||
|
|
cfc364e4f1 | ||
|
|
f2b6af8bdc | ||
|
|
c71411a527 | ||
|
|
42256a5c2f | ||
|
|
f589d898ac | ||
|
|
af70234519 | ||
|
|
df58afe1a1 | ||
|
|
6c8d87520c | ||
|
|
9d0ea9f6c0 | ||
|
|
053f7655c3 | ||
|
|
288f8ee42f | ||
|
|
2a8dd0873b | ||
|
|
bd8b3f8a29 | ||
|
|
57c89b4481 | ||
|
|
a4ced46628 | ||
|
|
0d2ea2f8c0 | ||
|
|
4245cd2ad9 | ||
|
|
6f42c4b3b3 | ||
|
|
4c20ceb94e | ||
|
|
df3b85765d | ||
|
|
2b352c6d7a | ||
|
|
92832d7e14 | ||
|
|
10957dbbb9 | ||
|
|
88eecf6624 | ||
|
|
755a53f821 | ||
|
|
ea4d71b26c | ||
|
|
a4c0d38c53 | ||
|
|
58228e0af4 | ||
|
|
1d69d8fb6a | ||
|
|
3445d09390 | ||
|
|
78b3d3d001 | ||
|
|
d8f0120698 | ||
|
|
3e25bceb0c | ||
|
|
1ca40481bb | ||
|
|
fe1309fb3d | ||
|
|
12d59ce3e4 | ||
|
|
224fa83c65 | ||
|
|
f591ac8780 | ||
|
|
11e70511e6 | ||
|
|
c1e4121d1e | ||
|
|
03884ddd05 | ||
|
|
ac67e985af | ||
|
|
9d12cd64d3 | ||
|
|
702b5f2888 | ||
|
|
a5eef3f34d | ||
|
|
1bc9277e3c | ||
|
|
b33cb07dc0 | ||
|
|
ce74915c14 | ||
|
|
f341413248 | ||
|
|
ed3e2f65f8 | ||
|
|
6e5878b5d6 | ||
|
|
39242097dd | ||
|
|
0aec3fffe1 | ||
|
|
38ef00548a | ||
|
|
c78c8072e9 | ||
|
|
7c98411abe | ||
|
|
e22516662f | ||
|
|
24c1f48522 | ||
|
|
69b07d40e4 | ||
|
|
b96692b1ba | ||
|
|
53afb7cba0 | ||
|
|
8e0953af1e | ||
|
|
724f9aa524 | ||
|
|
7067ffafe7 | ||
|
|
145c88db31 | ||
|
|
56615d6c06 | ||
|
|
d26bcc1abe | ||
|
|
04f817c042 | ||
|
|
b58f97c1f1 | ||
|
|
96dc386694 | ||
|
|
c6c70daa5e | ||
|
|
de16375903 | ||
|
|
c6548d5ad1 | ||
|
|
bd8c4e807c | ||
|
|
553549302c | ||
|
|
c69a7012c5 | ||
|
|
7acc5fc02e | ||
|
|
39bc165f36 | ||
|
|
707a92281b | ||
|
|
823013a3d9 | ||
|
|
7089561b21 | ||
|
|
0f0bff1685 | ||
|
|
b6387c3f64 | ||
|
|
ff0bcfb7da | ||
|
|
f729d36214 | ||
|
|
d5a07b6a5b | ||
|
|
bda0b3ce18 | ||
|
|
14d95a7e46 | ||
|
|
2ef2cdd874 | ||
|
|
57c2d84122 | ||
|
|
d263962a06 | ||
|
|
e32c5784af | ||
|
|
1496a6e755 | ||
|
|
6dab1063a1 | ||
|
|
ff286f3e05 | ||
|
|
6f112c2d16 | ||
|
|
8f222dab99 | ||
|
|
828951ffe9 | ||
|
|
616f34e210 | ||
|
|
fa3ed7e618 | ||
|
|
a207969dec | ||
|
|
7fde40b04e | ||
|
|
1bce588cdd | ||
|
|
5a095cc993 | ||
|
|
431eab47a2 | ||
|
|
e9e3d25315 | ||
|
|
e2735e283e | ||
|
|
3e9cb57dd6 | ||
|
|
5c4cf7379f | ||
|
|
8cd961596e | ||
|
|
d2344418d6 | ||
|
|
33aa2248d2 | ||
|
|
feb5b209ed | ||
|
|
34722404f4 | ||
|
|
b78a234fe1 | ||
|
|
f19478374f | ||
|
|
51a01c860b | ||
|
|
eedd044716 | ||
|
|
0a327f4ad3 | ||
|
|
eec6a5da0a | ||
|
|
fc87bc0cf1 | ||
|
|
1f213408a1 | ||
|
|
bac6fd803f | ||
|
|
5a74d7e3e2 | ||
|
|
e289380c39 | ||
|
|
8081dff6b6 | ||
|
|
7dcf09118b | ||
|
|
4b9a3d121d | ||
|
|
cd24cba240 | ||
|
|
d33fad9d23 | ||
|
|
b02aa51e09 | ||
|
|
36eeee5f9c | ||
|
|
4883ed0e5a | ||
|
|
78ad0d2592 | ||
|
|
f6def74b29 | ||
|
|
be44676b01 | ||
|
|
60c1c22a73 | ||
|
|
02cadc264e | ||
|
|
a0ca5b8072 | ||
|
|
31fdb73b0e | ||
|
|
d2caa1859d | ||
|
|
f6c25b30ae | ||
|
|
379d826f18 | ||
|
|
96afccc46c | ||
|
|
c0a222644b | ||
|
|
653173945f | ||
|
|
7d09cc6d25 | ||
|
|
a4360dfe76 | ||
|
|
9887117e7a | ||
|
|
9be7eafa39 | ||
|
|
774eb18a42 | ||
|
|
4e582d02f5 | ||
|
|
38d11dacb7 | ||
|
|
e17490ee04 | ||
|
|
f3a9ca6d6f | ||
|
|
2653740a36 | ||
|
|
335042ec08 | ||
|
|
f6944b15f3 | ||
|
|
d7960dccb4 | ||
|
|
c974c4257d | ||
|
|
40d74dd633 | ||
|
|
602c85b57d | ||
|
|
f96fa596b3 | ||
|
|
8c13d0096e | ||
|
|
7879f8b6a4 | ||
|
|
4c0e8bc1d6 | ||
|
|
6644df3958 | ||
|
|
2b5551d719 | ||
|
|
137063dd21 | ||
|
|
ca403869ab | ||
|
|
daf676b277 | ||
|
|
66bbdbe6ec | ||
|
|
d3c2516f5f | ||
|
|
c39ae84922 | ||
|
|
a83843fdab | ||
|
|
2d48da1c4a | ||
|
|
af0c15f69d | ||
|
|
7898df9c2c | ||
|
|
48abdeaf6b | ||
|
|
99a4979b65 | ||
|
|
d8beff4f6b | ||
|
|
ccaf1e33c0 | ||
|
|
3f119b957e | ||
|
|
abf97212fe | ||
|
|
b81c3d2f75 | ||
|
|
5651c4d95c | ||
|
|
c83a5cc1b7 | ||
|
|
0499807597 | ||
|
|
f846afd8a9 | ||
|
|
b822c82d18 | ||
|
|
e4de551008 | ||
|
|
5333d0180f | ||
|
|
658d4c4d72 | ||
|
|
efa50a8c39 | ||
|
|
677dc6192d | ||
|
|
1ed56c1b1d | ||
|
|
983be04722 | ||
|
|
1bd9c918f6 | ||
|
|
0ba16485bb | ||
|
|
1d9934830b | ||
|
|
806d6148eb | ||
|
|
e484587778 | ||
|
|
1e4b5104b7 | ||
|
|
676d2e2ef5 | ||
|
|
6122d44bd9 | ||
|
|
eb9f0cdf0c | ||
|
|
01f4595aab | ||
|
|
bf10d333cd | ||
|
|
267ef37cb6 | ||
|
|
879e4c9d58 | ||
|
|
67340e1526 | ||
|
|
6ec8f9efe5 | ||
|
|
c2b0560d91 | ||
|
|
388071557e | ||
|
|
f6e3ede178 | ||
|
|
a907550567 | ||
|
|
c75a15dc3b | ||
|
|
83904aa1f1 | ||
|
|
7d527fd2a6 | ||
|
|
007e04bf37 | ||
|
|
caff49504e | ||
|
|
aad38beaf5 | ||
|
|
bdad733331 | ||
|
|
bc26ade57e | ||
|
|
ee52ff3b11 | ||
|
|
40b95f02e4 | ||
|
|
8777a85630 | ||
|
|
870aeb34fc | ||
|
|
b03be212b3 | ||
|
|
c8f7dbf85e | ||
|
|
9e826b4c8b | ||
|
|
05d528b39a | ||
|
|
6828c7c077 | ||
|
|
54f3bc0262 | ||
|
|
e232a2b33d | ||
|
|
73a3b217a4 | ||
|
|
19f925c60b | ||
|
|
5fb488236b | ||
|
|
c84786f9ee | ||
|
|
c1925ddf8d | ||
|
|
cf194e332c | ||
|
|
d8877e7d8b | ||
|
|
8b2184f8e3 | ||
|
|
a42e4c5299 | ||
|
|
419787e17c | ||
|
|
2d6da52a86 | ||
|
|
b46deb3fa0 | ||
|
|
b70120a248 | ||
|
|
3a6a4011d0 | ||
|
|
999c4d07b7 | ||
|
|
44b182c6ae | ||
|
|
de7bec547a | ||
|
|
5542c0bc00 | ||
|
|
83e0ce0042 | ||
|
|
4685dea075 | ||
|
|
599f63bc67 | ||
|
|
199f2aea77 | ||
|
|
bff9b8b4b1 | ||
|
|
a83610bc06 | ||
|
|
b3d208e6e6 | ||
|
|
e8b391c0f6 | ||
|
|
02b5df03ab | ||
|
|
e1580e51cf | ||
|
|
3a7578879f | ||
|
|
ea3d4b41a9 | ||
|
|
e0c2a39ce7 | ||
|
|
1fa27b7f09 | ||
|
|
f980f1dae2 | ||
|
|
b81ad53449 | ||
|
|
a9727171e2 | ||
|
|
a1634fb337 | ||
|
|
94a2f9460e | ||
|
|
18cd39270a | ||
|
|
72c2bca363 | ||
|
|
4c153dc76d | ||
|
|
e63606f6bb | ||
|
|
ed6da7fe14 | ||
|
|
a588c96440 | ||
|
|
4c284b224e | ||
|
|
96afa650d1 | ||
|
|
f17d0d3ae1 | ||
|
|
930d2b4280 | ||
|
|
f67b78bd91 | ||
|
|
540e8ed602 | ||
|
|
99cb51e813 | ||
|
|
db000c4b12 | ||
|
|
0cd557a686 | ||
|
|
6142bf859b | ||
|
|
b6498b5c2d | ||
|
|
c15030e96e | ||
|
|
cd2acd73b4 | ||
|
|
cfe06ea1b6 | ||
|
|
ca5c3e0e94 | ||
|
|
6252fd399a | ||
|
|
de571e2c2a | ||
|
|
0cbd052b91 | ||
|
|
aa3ec3ece8 | ||
|
|
6b11028b72 | ||
|
|
269c3e7398 | ||
|
|
08335041f5 | ||
|
|
d75b9cf942 | ||
|
|
b55c40523f | ||
|
|
99a2dee7a2 | ||
|
|
c94265c77b | ||
|
|
7ddfba1b4c | ||
|
|
9ecdd28eea | ||
|
|
d8b36242f6 | ||
|
|
3f470aabe9 | ||
|
|
1e8dd54b3e | ||
|
|
0a6681ccb7 | ||
|
|
0140e24822 | ||
|
|
9fb38922ea | ||
|
|
7752354598 | ||
|
|
497670c4c3 | ||
|
|
84954cd2f1 | ||
|
|
8b6eab401e | ||
|
|
71c11a5923 | ||
|
|
f345edb252 | ||
|
|
be40fd9563 | ||
|
|
5ee2ebfb4f | ||
|
|
cfa6b706a8 | ||
|
|
42f2a62d62 | ||
|
|
41b6ef930a | ||
|
|
948cbe0a9c | ||
|
|
18669f3230 | ||
|
|
4e9f944204 | ||
|
|
fe18cbaa41 | ||
|
|
ed3712e1b9 | ||
|
|
20dc4f31f0 | ||
|
|
19f9296a40 | ||
|
|
06c019387c | ||
|
|
645b43e9cc | ||
|
|
ed37a3711f | ||
|
|
a3460de9dc | ||
|
|
5084009d62 | ||
|
|
e5c003d726 | ||
|
|
327a02b87d | ||
|
|
e9bf1a9f7a | ||
|
|
0c6fa768ea | ||
|
|
483468a6c7 | ||
|
|
8039ae1b90 | ||
|
|
466b372d41 | ||
|
|
3f6b5203ca | ||
|
|
8d1352ddff | ||
|
|
e6ab2c3b7e | ||
|
|
e603c75bd3 | ||
|
|
4f28f97141 | ||
|
|
d0b32e5224 | ||
|
|
2062a23347 | ||
|
|
8c9236a066 | ||
|
|
2f981ef91e | ||
|
|
6725c170ea | ||
|
|
c8cf6e7c08 | ||
|
|
e0b4acee12 | ||
|
|
803ebe34ed | ||
|
|
e981eff1e6 | ||
|
|
aee7a09b6c | ||
|
|
e74e4e92a0 | ||
|
|
6dba15defd | ||
|
|
fee7a16692 | ||
|
|
141030344b | ||
|
|
4fa9586206 | ||
|
|
fbbc430b7c | ||
|
|
bfc68c4d28 | ||
|
|
53fc018ada | ||
|
|
d45dd45720 | ||
|
|
19a9786bbf | ||
|
|
b8caf41423 | ||
|
|
0b3866a56a | ||
|
|
53a7577416 | ||
|
|
f5515417d6 | ||
|
|
24e7c2f3db | ||
|
|
6e6c5bbc67 | ||
|
|
f4403ff480 | ||
|
|
098da20761 | ||
|
|
ef2373e8c0 | ||
|
|
b2c8ed17d5 | ||
|
|
bb594a459f | ||
|
|
7340a30650 | ||
|
|
403104dda1 | ||
|
|
8334fbb236 | ||
|
|
0a0323ce5d | ||
|
|
726d36ba3d | ||
|
|
8bb1521963 | ||
|
|
9457c1f2b9 | ||
|
|
2b24330f9f | ||
|
|
9329170e59 | ||
|
|
98f3de828a | ||
|
|
3f38f42259 | ||
|
|
058a8cdc15 | ||
|
|
d0c1213ea0 | ||
|
|
30967bac6d | ||
|
|
09c9bcb046 | ||
|
|
93f1f5d076 | ||
|
|
93e5d62782 | ||
|
|
4d7021ece1 | ||
|
|
f976988c75 | ||
|
|
1eee31fdbb | ||
|
|
048c483903 | ||
|
|
b646ece14b | ||
|
|
35e8acd69d | ||
|
|
de4135d1ad | ||
|
|
a44959ce1b | ||
|
|
f4bad0053a | ||
|
|
26af5987a5 | ||
|
|
9cf3250751 | ||
|
|
acc77205bb | ||
|
|
a6b4f62d75 | ||
|
|
69c5d553b5 | ||
|
|
637cdd7084 | ||
|
|
8978e193db | ||
|
|
242b100aa3 | ||
|
|
3a888d48df | ||
|
|
721de39dbb | ||
|
|
07e29f2030 | ||
|
|
c117d9b3e5 | ||
|
|
16eae89151 | ||
|
|
95cb6d8ee6 | ||
|
|
af27c09204 | ||
|
|
5e3532267c | ||
|
|
7c0331df65 | ||
|
|
04ab87cd8e | ||
|
|
91f5e84250 | ||
|
|
b1edd95ebc | ||
|
|
758738da5c | ||
|
|
41c8be275b | ||
|
|
117eb1e2a7 | ||
|
|
3129d6e8fd | ||
|
|
2ba7db184b | ||
|
|
2cb0df4080 | ||
|
|
3adc2c44e6 | ||
|
|
6d3ff64894 | ||
|
|
cf84ad6196 | ||
|
|
6259190ad9 | ||
|
|
181be1a58e | ||
|
|
771e191f28 | ||
|
|
d4d6893eb3 | ||
|
|
9e75562662 | ||
|
|
2b3168163b | ||
|
|
252c06eb12 | ||
|
|
2a51d8169a | ||
|
|
7405c4b411 | ||
|
|
309ae7b619 | ||
|
|
64ef56a0df | ||
|
|
fbfe7b0d25 | ||
|
|
8c7e1a3b2d | ||
|
|
bf249cdafe | ||
|
|
59ba6f50cc | ||
|
|
8d6e7c7d44 | ||
|
|
52934ae166 | ||
|
|
56c4f2aa47 | ||
|
|
a1d8cbd7ba | ||
|
|
63a219a32b | ||
|
|
14fb256a6a | ||
|
|
95df7a23c3 | ||
|
|
bb17690cf5 | ||
|
|
a943b02e43 | ||
|
|
199f78347f | ||
|
|
d3d9a42d57 | ||
|
|
1fa45a8c84 | ||
|
|
0b6316ea23 | ||
|
|
466a843263 | ||
|
|
b6ade8b101 | ||
|
|
ff66b97e90 | ||
|
|
c604ec8fb9 | ||
|
|
7564651dd5 | ||
|
|
cad17ddefd | ||
|
|
25d2f209e5 | ||
|
|
8d660c3ffe | ||
|
|
209055d0b0 | ||
|
|
599b55965a | ||
|
|
69a9af5322 | ||
|
|
0303cd0ad0 | ||
|
|
8eb7e9fb05 | ||
|
|
6a1de5fc4e | ||
|
|
a4af55cb66 | ||
|
|
1e17422f5e | ||
|
|
8abaafab79 | ||
|
|
71e1465524 | ||
|
|
3d2ea3753b | ||
|
|
88530eff8b | ||
|
|
df3decf71b | ||
|
|
565ee4cb2d | ||
|
|
40fc325ba9 | ||
|
|
6aca16102d | ||
|
|
cb11b57ab1 | ||
|
|
d504937d50 | ||
|
|
6bfdb7ca4e | ||
|
|
e1637824c6 | ||
|
|
e36f2f2bcb | ||
|
|
1a54e08f11 | ||
|
|
ecc86ee429 | ||
|
|
185a593bc2 | ||
|
|
4a916ebb89 | ||
|
|
1c305ca762 | ||
|
|
17fff56fa0 | ||
|
|
ec1b1c2b7d | ||
|
|
7bae22f56f | ||
|
|
21e5eeef16 | ||
|
|
bf5eea80f6 | ||
|
|
9f9a6d9827 | ||
|
|
ae622e6d75 | ||
|
|
68fbff631f | ||
|
|
6cdce75095 | ||
|
|
f699e76c56 | ||
|
|
a729329cd4 | ||
|
|
d5020ce9bb | ||
|
|
126868c251 | ||
|
|
b206e9fc95 | ||
|
|
4b6ff68464 | ||
|
|
b23a0febb5 | ||
|
|
05ad547341 | ||
|
|
f10af882a7 | ||
|
|
98f32ebcad | ||
|
|
e2c302836f | ||
|
|
f1d9642cf6 | ||
|
|
5c58e5b545 | ||
|
|
803cb335e1 | ||
|
|
ae4dde8255 | ||
|
|
cb34f68b1b | ||
|
|
96ef983cfb | ||
|
|
d8c3d67dfe | ||
|
|
5de5153663 | ||
|
|
1e747b6831 | ||
|
|
fbe9d16073 | ||
|
|
d02c0073a0 | ||
|
|
1090b9879c | ||
|
|
5a6af976cd | ||
|
|
55e39a5d30 | ||
|
|
c9b1ddfb59 | ||
|
|
f7dd696ffc | ||
|
|
70f210ac5d | ||
|
|
cad1c11f8b | ||
|
|
f7fa305e82 | ||
|
|
f96c51e854 | ||
|
|
c19705d3e5 | ||
|
|
1190511994 | ||
|
|
69ee7ef63c | ||
|
|
fc95e5a9a8 | ||
|
|
6ecc495d43 | ||
|
|
6e861001cf | ||
|
|
c56af08c7e | ||
|
|
e68abefe48 | ||
|
|
fd0635cb82 | ||
|
|
baa3cfb354 | ||
|
|
aea9bab853 | ||
|
|
48de609f53 | ||
|
|
71f4f87288 | ||
|
|
48b202c56b | ||
|
|
d975019a7b | ||
|
|
6009b5013b | ||
|
|
24979d7fbd | ||
|
|
b4bf42e377 | ||
|
|
f94819351a | ||
|
|
8da69c11d9 | ||
|
|
635a825095 | ||
|
|
bbffdbf56f | ||
|
|
1c30533d19 | ||
|
|
dcd80fe6ad | ||
|
|
525ab8d945 | ||
|
|
d8fb3f526a | ||
|
|
a55df1d111 | ||
|
|
2cf32ba38d | ||
|
|
c82907153e | ||
|
|
165403da67 | ||
|
|
0e4d94946e | ||
|
|
9f9c5abf35 | ||
|
|
6a3b10111f | ||
|
|
0a55f4bf83 | ||
|
|
493d66d991 | ||
|
|
268b495a29 | ||
|
|
180f4926f8 | ||
|
|
c853349b78 | ||
|
|
ee555e0da9 | ||
|
|
3dec4cc698 | ||
|
|
d7b2b94cec | ||
|
|
c9e88586aa | ||
|
|
1d641504b1 | ||
|
|
655e068b9b | ||
|
|
67a9f314cc | ||
|
|
ff2b58e8a3 | ||
|
|
a1482cb40e | ||
|
|
89111059f9 | ||
|
|
0ae823716a | ||
|
|
dab3f722e8 | ||
|
|
0dc1af0747 | ||
|
|
021206e052 | ||
|
|
cb09cf3734 | ||
|
|
f0525d6463 | ||
|
|
e22424ffa4 | ||
|
|
6e666c64e8 | ||
|
|
5f5f6ac539 | ||
|
|
3024c79f4f | ||
|
|
ba96d86dc2 | ||
|
|
40ec7195d1 | ||
|
|
f10dfa0c20 | ||
|
|
6a5473f6fe | ||
|
|
f79de6fbe8 | ||
|
|
ec4ee3132b | ||
|
|
1298f2b688 | ||
|
|
534a2f1d28 | ||
|
|
c8e95cf3c3 | ||
|
|
c4918a963c | ||
|
|
bf6f738d2e | ||
|
|
1605904eb1 | ||
|
|
138517f116 | ||
|
|
d4a4cb2e80 | ||
|
|
9a9dc328e3 | ||
|
|
50eea0a4f1 | ||
|
|
528a8b5b46 | ||
|
|
0db0bc53fa | ||
|
|
0297c267e9 | ||
|
|
5af85f24f6 | ||
|
|
5110a7578e | ||
|
|
5af28670f0 | ||
|
|
efa2b781dd | ||
|
|
979f151181 | ||
|
|
6f125f18c3 | ||
|
|
edba7051f0 | ||
|
|
fa1ae8d746 | ||
|
|
a476617432 | ||
|
|
ffac13bfef | ||
|
|
f877bf21ba | ||
|
|
4bc4882b1f | ||
|
|
084c17dc26 | ||
|
|
26c39d6822 | ||
|
|
aefc173227 | ||
|
|
bf44a1cce6 | ||
|
|
a76c6c653d | ||
|
|
f11205bba7 | ||
|
|
72d9c5019c | ||
|
|
58d66e3e97 | ||
|
|
43c88a2fab | ||
|
|
9ce64ec6e1 | ||
|
|
c749d6a7dc | ||
|
|
f3e6d35c98 | ||
|
|
0be539b8a5 | ||
|
|
0454a369e5 | ||
|
|
010025cbfa | ||
|
|
61cae0a9f8 | ||
|
|
9e83d9e68c | ||
|
|
248acd5e26 | ||
|
|
42c1f5601a | ||
|
|
9c1a673047 | ||
|
|
99b90f90ac | ||
|
|
6ead8d8b49 | ||
|
|
9b12232e9f | ||
|
|
c1ed1baaad | ||
|
|
ab34312089 | ||
|
|
a25d92fbb7 | ||
|
|
6005af1595 | ||
|
|
9a4329807a | ||
|
|
8e01da4c12 | ||
|
|
eb8ea520c7 | ||
|
|
512fcd361b | ||
|
|
aad6f6bcbe | ||
|
|
0af21505d7 | ||
|
|
2ae69e8e72 | ||
|
|
9274fac8e1 | ||
|
|
e2f82c60e6 | ||
|
|
bfddf24204 | ||
|
|
382599dcf6 | ||
|
|
5f2c07f2d8 | ||
|
|
914024c0b5 | ||
|
|
c5d3387962 | ||
|
|
7cc99c6fc9 | ||
|
|
a29b502a33 | ||
|
|
20cb74364f | ||
|
|
1c5a50c8d8 | ||
|
|
470523cc86 | ||
|
|
f6bc3d4650 | ||
|
|
41b1228d31 | ||
|
|
2cb4462274 | ||
|
|
810cd40ccd | ||
|
|
f931beb49a | ||
|
|
1c3dfc9b2f | ||
|
|
a1d4545e29 | ||
|
|
8865db2007 | ||
|
|
d2056d9409 | ||
|
|
74e74ddc38 | ||
|
|
5fcb737559 | ||
|
|
9303025427 | ||
|
|
680985fc13 | ||
|
|
5a360eb614 | ||
|
|
4a74bd78fd | ||
|
|
0f53656952 | ||
|
|
9ca40d3651 | ||
|
|
ab12503f62 | ||
|
|
b446d7fd4a | ||
|
|
fd46d85762 | ||
|
|
fa421afb00 | ||
|
|
a79d3e28ca | ||
|
|
fbb4f65735 | ||
|
|
00c62c90f6 | ||
|
|
384aa6e6a9 | ||
|
|
1c755249ec | ||
|
|
2c303b5bf2 | ||
|
|
415e3b4a93 | ||
|
|
8d9b056c8c | ||
|
|
a527a7f0b0 | ||
|
|
d78d955d11 | ||
|
|
9375a60cd9 | ||
|
|
bb99b9a0ef | ||
|
|
313e59d7f9 | ||
|
|
e34e0e62f2 | ||
|
|
212f75f1cb | ||
|
|
a07c79efcb | ||
|
|
89090b25e3 | ||
|
|
721164e562 | ||
|
|
b8ba980a20 | ||
|
|
79ded38434 | ||
|
|
f52db884a9 | ||
|
|
ee4bb33b0a | ||
|
|
caf8fa8e25 | ||
|
|
c46dea4c9e | ||
|
|
002b7b4f87 | ||
|
|
0a6a8c671f | ||
|
|
36014b706d | ||
|
|
df5e01d4eb | ||
|
|
c6f1525f55 | ||
|
|
5511259f2d | ||
|
|
f2ea7ca5d1 | ||
|
|
6184bbeae2 | ||
|
|
21506578f5 | ||
|
|
f39f395393 | ||
|
|
ed0a94659e | ||
|
|
7f75706584 | ||
|
|
3f316e42f2 | ||
|
|
4a331c0331 | ||
|
|
6a28de100c | ||
|
|
992f18b94b | ||
|
|
040a606b39 | ||
|
|
13e079d1b8 | ||
|
|
d9a7f40eb4 | ||
|
|
8d123da847 | ||
|
|
093310a9e5 | ||
|
|
21b315b97e | ||
|
|
c70cc3a6f1 | ||
|
|
1e71d8afc0 | ||
|
|
cb6b74b269 | ||
|
|
a1e399aa1a | ||
|
|
e1dfdd9400 | ||
|
|
6ab2e81f1c | ||
|
|
cf09029847 | ||
|
|
d02e170dac | ||
|
|
2b715bb0de | ||
|
|
2dcaf2c77b | ||
|
|
1b9f4f33de | ||
|
|
3c73f88a52 | ||
|
|
8acdc19be4 | ||
|
|
22252d9044 | ||
|
|
5948a74ad1 | ||
|
|
e46d9d7650 | ||
|
|
813276c907 | ||
|
|
7032473ecf | ||
|
|
807f1fb561 | ||
|
|
296f80ffe5 | ||
|
|
d45e0d1cac | ||
|
|
4b8f9984d5 | ||
|
|
7623610704 | ||
|
|
a7fe384a31 | ||
|
|
485ce887ea | ||
|
|
2a0bb79513 | ||
|
|
21ae88702f | ||
|
|
0ff1bb392c | ||
|
|
01af2f364c | ||
|
|
a639dddd19 | ||
|
|
71ec6c5061 | ||
|
|
8c4c4f5e8b | ||
|
|
2c2d3b2de3 | ||
|
|
caae5c9711 | ||
|
|
72822d03aa | ||
|
|
9de3dd89c5 | ||
|
|
bcb69b9855 | ||
|
|
6d2761f141 | ||
|
|
05c25b6aff | ||
|
|
9be9eb90f6 | ||
|
|
71f2f3a5fc | ||
|
|
862b1d407c | ||
|
|
5da0da48c8 | ||
|
|
3f1a51e350 | ||
|
|
d167e43252 | ||
|
|
fe9eecd031 | ||
|
|
ded8cff415 | ||
|
|
3497716a00 | ||
|
|
c78b4a3343 | ||
|
|
17359be58a | ||
|
|
382a62343d | ||
|
|
7e0f60615b | ||
|
|
e1a49b38a7 | ||
|
|
4333b8c351 | ||
|
|
6464377a89 | ||
|
|
4fcf732814 | ||
|
|
0d4f3e5735 | ||
|
|
1f2e453e20 | ||
|
|
5236c7b468 | ||
|
|
1738e8883f | ||
|
|
cc4563afb0 | ||
|
|
4b3bf2f358 | ||
|
|
80084f5c5a | ||
|
|
6d14b3f6bd | ||
|
|
592f613a61 | ||
|
|
3739bcc40c | ||
|
|
101c7a36fb | ||
|
|
21be959cba | ||
|
|
b3a0ebe7b6 | ||
|
|
96a588bd86 | ||
|
|
866b956680 | ||
|
|
d88252c6fd | ||
|
|
414e7d36a0 | ||
|
|
e0b4931a54 | ||
|
|
a587c5ff74 | ||
|
|
0b2eca3066 | ||
|
|
fa28052958 | ||
|
|
54f5bd1d80 | ||
|
|
4b3bbb4a97 | ||
|
|
187d90e8f2 | ||
|
|
2f60f61c15 | ||
|
|
057543da15 | ||
|
|
3c060cc57a | ||
|
|
928b4c6c4c | ||
|
|
871a0d535c | ||
|
|
87db9def32 | ||
|
|
04763eaeea | ||
|
|
b6c08a1a11 | ||
|
|
811c995047 | ||
|
|
7011df2ced | ||
|
|
a24692b4be | ||
|
|
0e7a32470b | ||
|
|
212d2f9db4 | ||
|
|
0263d3538e | ||
|
|
63c6028522 | ||
|
|
075ece2da7 | ||
|
|
e9fb02285e | ||
|
|
5dfd8c89a3 | ||
|
|
e9f7908afb | ||
|
|
fafce72c01 | ||
|
|
c3d15157ad | ||
|
|
e0712f73c2 | ||
|
|
3dd5b2365a | ||
|
|
b523f55984 | ||
|
|
79b8b77b25 | ||
|
|
c6065808a7 | ||
|
|
d69ae39b6f | ||
|
|
35739d6d0d | ||
|
|
e726fce360 | ||
|
|
0a038fecff | ||
|
|
0184bf9a7d | ||
|
|
60663babc8 | ||
|
|
a7115d4300 | ||
|
|
29558c9910 | ||
|
|
7c1d643f97 | ||
|
|
b2fc80f970 | ||
|
|
efee128c1c | ||
|
|
c3ddd68866 | ||
|
|
3cde4472c8 | ||
|
|
4c38fe261d | ||
|
|
33f7191c0d | ||
|
|
cda9ad3b30 | ||
|
|
1a7bd49361 | ||
|
|
cf2e189049 | ||
|
|
d5f5ba941a | ||
|
|
9a973be7ba | ||
|
|
d8e1284946 | ||
|
|
ce26fe1db7 | ||
|
|
a8ad045248 | ||
|
|
d097f6ada0 | ||
|
|
1b26db40f7 | ||
|
|
602b946fc9 | ||
|
|
48fc1a7a1e | ||
|
|
416889f49d | ||
|
|
5ca3222e5b | ||
|
|
d49d82e982 | ||
|
|
a4d5679219 | ||
|
|
bead103f3d | ||
|
|
e50b6733c4 | ||
|
|
75e5dbaaa4 | ||
|
|
965113c2b4 | ||
|
|
3bddaf509d | ||
|
|
c1c51e0baf | ||
|
|
09b6c2ab5b | ||
|
|
13fd956039 | ||
|
|
b6f0ee90af | ||
|
|
90e11e1c5d | ||
|
|
fc40e8ba70 | ||
|
|
7652b4a5b8 | ||
|
|
fb249767f1 | ||
|
|
d7ed311bcf | ||
|
|
8422965d0b | ||
|
|
7975edade4 | ||
|
|
1e18935513 | ||
|
|
c311b5315f | ||
|
|
26a73e0fba | ||
|
|
07c259c9c1 | ||
|
|
9e1c2d5a2c | ||
|
|
d7fb1b737f | ||
|
|
84c9c69fa3 | ||
|
|
12ca4e29cf | ||
|
|
27b1a5dc98 | ||
|
|
de36cc8445 | ||
|
|
03d344c0a2 | ||
|
|
39f01538c7 | ||
|
|
28c57cf666 | ||
|
|
59d120537d | ||
|
|
66d18e9475 | ||
|
|
1f5e4ceb0c | ||
|
|
0cbc65a52f | ||
|
|
2b0367cca6 | ||
|
|
1f01f480e0 | ||
|
|
7a167962d6 | ||
|
|
dae028d25d | ||
|
|
88e2fa04e7 | ||
|
|
bb0a8047ea | ||
|
|
b652565b57 | ||
|
|
9aaf6f3105 | ||
|
|
c26eccfe28 | ||
|
|
9fd547112d | ||
|
|
14bfc8af72 | ||
|
|
20f3458e37 | ||
|
|
6326e2d141 | ||
|
|
23ca3c1d2d | ||
|
|
0656ab4b88 | ||
|
|
90bb5d187c | ||
|
|
75a62e2bde | ||
|
|
7cd36b80eb | ||
|
|
dd607621d7 | ||
|
|
2595febf14 | ||
|
|
dc058c4cf3 | ||
|
|
25824e1821 | ||
|
|
381c2d52ee | ||
|
|
4020ac9843 | ||
|
|
b3b7a19df4 | ||
|
|
313e3e748f | ||
|
|
09b9f26e6f | ||
|
|
01b9cc64d6 | ||
|
|
97bf1dc850 | ||
|
|
f94794fe3e | ||
|
|
68e528dd3a | ||
|
|
06ab1d34aa | ||
|
|
2f2717e9aa | ||
|
|
88d24c2a03 | ||
|
|
ec2a2a6fbb | ||
|
|
60b81e714b | ||
|
|
2cd8b13c1d | ||
|
|
4afedb5131 | ||
|
|
71880ad2ad | ||
|
|
a30cce4cbc | ||
|
|
08b4f60ead | ||
|
|
11498bd09b | ||
|
|
7384c88ad6 | ||
|
|
6f22d70d59 | ||
|
|
adc279d681 | ||
|
|
f90dc5d619 | ||
|
|
6fd594c1f4 | ||
|
|
b94a4288bf | ||
|
|
cbf415256b | ||
|
|
4b1884944d | ||
|
|
5ff752c9af | ||
|
|
0e331a7cd1 | ||
|
|
10970d170c | ||
|
|
ac1a28311c | ||
|
|
01d1938fea | ||
|
|
802694ec68 | ||
|
|
2aef5e4eef | ||
|
|
9a0a4d47dc | ||
|
|
96b7366d53 | ||
|
|
90ac96298a | ||
|
|
a6e5040e8f | ||
|
|
19e5aafc85 | ||
|
|
77301fd018 | ||
|
|
ed56b3dd12 | ||
|
|
91f6aae9ef | ||
|
|
b642c493d7 | ||
|
|
a950796306 | ||
|
|
8672a2cfe0 | ||
|
|
301e8c5a96 | ||
|
|
699a91c46b | ||
|
|
e43016735d | ||
|
|
d9cecbbb5f | ||
|
|
6e186e7d6a | ||
|
|
af3680649c | ||
|
|
82f1d08dd7 | ||
|
|
b1b54a5fe7 | ||
|
|
ced3af3935 | ||
|
|
e5c782ebe9 | ||
|
|
7d42742684 | ||
|
|
41820311cc | ||
|
|
e132adad5d | ||
|
|
2132e5adbf | ||
|
|
e2d55446fe | ||
|
|
1dfce6a5c2 | ||
|
|
a84db9821c | ||
|
|
ec080ad69f | ||
|
|
75cc9e4d84 | ||
|
|
d241a3ed5f | ||
|
|
682aab8b23 | ||
|
|
474862b4af | ||
|
|
dd02ec7a8e | ||
|
|
1eadb77722 | ||
|
|
95f71bcb10 | ||
|
|
e1a4707569 | ||
|
|
5a10613dd2 | ||
|
|
c6a569ed88 | ||
|
|
de24453fb9 | ||
|
|
d7c5c84110 | ||
|
|
95166ccfb8 | ||
|
|
c56667b0dd | ||
|
|
f754560bca | ||
|
|
b54bb6cd56 | ||
|
|
b03b159907 | ||
|
|
bb7e6c9775 | ||
|
|
4bc724791d | ||
|
|
ba7c10f4b1 | ||
|
|
c1561c7b6a | ||
|
|
91a0be2d78 | ||
|
|
1f27530241 | ||
|
|
e236872af3 | ||
|
|
3d301c4202 | ||
|
|
a5aaa60d29 | ||
|
|
d4a2de3b23 | ||
|
|
e85746ddba | ||
|
|
a002eb1bc1 | ||
|
|
7d4486f407 | ||
|
|
a9915579a0 | ||
|
|
65dfd4da0f | ||
|
|
b93fd523aa | ||
|
|
24621e6612 | ||
|
|
1b383bdcf1 | ||
|
|
f47b357b23 | ||
|
|
f9b778ecb8 | ||
|
|
f36d9831bb | ||
|
|
b60a262b58 | ||
|
|
beef0fff33 | ||
|
|
24f535474a | ||
|
|
2e3f523f32 | ||
|
|
c5f5973a9d | ||
|
|
5d59b8599d | ||
|
|
3bfb0096e6 | ||
|
|
ca5763650b | ||
|
|
bf7beab0ab | ||
|
|
9b594d81bd | ||
|
|
6a26c6002b | ||
|
|
4fa64500af | ||
|
|
085737af15 | ||
|
|
3e347fb6d4 | ||
|
|
80cb126200 | ||
|
|
f49715c7a0 | ||
|
|
deee76e455 | ||
|
|
33885b863a | ||
|
|
3ce9dbb278 | ||
|
|
bee4b906fb | ||
|
|
b3b79b3ee8 | ||
|
|
bd085dd495 | ||
|
|
bf518b3590 | ||
|
|
32a8fcb84d | ||
|
|
4fd65403c0 | ||
|
|
ecf871a6f1 | ||
|
|
531c049bb0 | ||
|
|
99716eff1e | ||
|
|
74205d5438 | ||
|
|
0136877978 | ||
|
|
fb7d40ddbe | ||
|
|
c761054805 | ||
|
|
55e24b5e23 | ||
|
|
9cff5b8af4 | ||
|
|
41b2523005 | ||
|
|
2ef256ee74 | ||
|
|
e954d49c29 | ||
|
|
041bf47ff4 | ||
|
|
53ced98529 | ||
|
|
cb475c471d | ||
|
|
bf82690c80 | ||
|
|
72a3a1acab | ||
|
|
18e2b0eaa2 | ||
|
|
b80a6152b3 | ||
|
|
ffe3dae7b2 | ||
|
|
d7845ec690 | ||
|
|
8531a67519 | ||
|
|
af59b9d2ca | ||
|
|
08bb69c048 | ||
|
|
6fb32d20b3 | ||
|
|
ea09bfe8ea | ||
|
|
c0dde570e4 | ||
|
|
6fd3fa77ed | ||
|
|
ff20f81cfd | ||
|
|
de8465a8f4 | ||
|
|
4540e1b561 | ||
|
|
789d469477 | ||
|
|
4797512207 | ||
|
|
348fe27a3c | ||
|
|
c217b1b100 | ||
|
|
0e757e5fb1 | ||
|
|
72d5707d33 | ||
|
|
a491b85737 | ||
|
|
d9d85cbfcc | ||
|
|
283fe46230 | ||
|
|
2c00aa5def | ||
|
|
984438e98d | ||
|
|
cf34c4bd95 | ||
|
|
bab1d2e27e | ||
|
|
d1b6a21e86 | ||
|
|
3049590b68 | ||
|
|
8a289d2e4f | ||
|
|
7a81fa7ac5 | ||
|
|
fbf59b6f0b | ||
|
|
0ab200f77f | ||
|
|
a91e40d731 | ||
|
|
e553fbc86c | ||
|
|
b4a810c374 | ||
|
|
0e97914d94 | ||
|
|
a5c250c811 | ||
|
|
08c2f3fc15 | ||
|
|
63f66662ce | ||
|
|
89eee104ab | ||
|
|
92b1234ddb | ||
|
|
0b0bf90e0b | ||
|
|
974c4ba040 | ||
|
|
4e2c1d20b4 | ||
|
|
e5b83d0ddf | ||
|
|
bdaf1e4151 | ||
|
|
751eff0edf | ||
|
|
666dc7dccb | ||
|
|
a172e89620 | ||
|
|
ecb9537c4e | ||
|
|
bba4cf9578 | ||
|
|
bfdb9b4019 | ||
|
|
bad37d0940 | ||
|
|
62f5640678 | ||
|
|
71c1bcde0d | ||
|
|
e9b492a287 | ||
|
|
9b9b1aa6cc | ||
|
|
2cb673fd81 | ||
|
|
d5eb6b5bbc | ||
|
|
1e48277566 | ||
|
|
ec748f4a64 | ||
|
|
22f1713739 | ||
|
|
f0e135530a | ||
|
|
125d6a3e2a | ||
|
|
d078f9d847 | ||
|
|
6b6a6ae5f0 | ||
|
|
1d6676f059 | ||
|
|
1e91505e6e | ||
|
|
9e2f228d9a | ||
|
|
7a1d163450 | ||
|
|
22e717d778 | ||
|
|
2546c042dc | ||
|
|
b54f46de30 | ||
|
|
94bc279bd8 | ||
|
|
2f7c2e79d2 | ||
|
|
2ed5381f5a | ||
|
|
964d98dd7b | ||
|
|
0571dae9b7 | ||
|
|
563bf78f03 | ||
|
|
cf480d95db | ||
|
|
44331506b2 | ||
|
|
f6953fd829 | ||
|
|
663b99ed64 | ||
|
|
0ef3be1851 | ||
|
|
0453a23b12 | ||
|
|
7a14e3dac4 | ||
|
|
275774a10a | ||
|
|
a6277533e8 | ||
|
|
1426424899 | ||
|
|
85fa1b2122 | ||
|
|
c28522b7ef | ||
|
|
d90a04990b | ||
|
|
027ff793ed | ||
|
|
c69d3bc7f4 | ||
|
|
ca17054a1e | ||
|
|
6a9e07729f | ||
|
|
ceeda6de3b | ||
|
|
17ab059b12 | ||
|
|
dedd99f30c | ||
|
|
add94c5926 | ||
|
|
a239edc759 | ||
|
|
ff569417fc | ||
|
|
240bb299f0 | ||
|
|
e2dd12416c | ||
|
|
2a726c7136 | ||
|
|
62aea46c61 | ||
|
|
09bffb6745 | ||
|
|
3c91cb09e3 | ||
|
|
881a379fb4 | ||
|
|
90a67af887 | ||
|
|
d727100304 | ||
|
|
543fcf5447 | ||
|
|
e9b140b75c | ||
|
|
92a9843ef7 | ||
|
|
12528d6e6e | ||
|
|
8fae55487a | ||
|
|
973af4650c | ||
|
|
5f192d5dc7 | ||
|
|
ec39546fed | ||
|
|
ea0cafa229 | ||
|
|
978fa17932 | ||
|
|
6602e800ac | ||
|
|
fdf9209605 | ||
|
|
8a3739ee1c | ||
|
|
89f360d1a7 | ||
|
|
d7ddf991a9 | ||
|
|
19c02be673 | ||
|
|
adbcc48de7 | ||
|
|
a5eb031401 | ||
|
|
10351c5bdc | ||
|
|
5bc60d4b63 | ||
|
|
32a659a477 | ||
|
|
40c4dbc20e | ||
|
|
f2b4e49ff3 | ||
|
|
39dd67af78 | ||
|
|
337ec6bca6 | ||
|
|
2994e69c08 | ||
|
|
49987b8793 | ||
|
|
0f5e125992 | ||
|
|
57857559f5 | ||
|
|
4eba620bee | ||
|
|
964a2e990e | ||
|
|
761bc941a8 | ||
|
|
aa5a3ed080 | ||
|
|
6fbbf899b0 | ||
|
|
1df0eea6c6 | ||
|
|
ef99e9d6f8 | ||
|
|
a685d2e97d | ||
|
|
df04acc1b9 | ||
|
|
f510faa1da | ||
|
|
3ad2c74519 | ||
|
|
0e58204501 | ||
|
|
f847807df5 | ||
|
|
81982aa821 | ||
|
|
08fc393451 | ||
|
|
a7033b68f7 | ||
|
|
3794aa425d | ||
|
|
a1ea8dfd84 | ||
|
|
79e1df1af2 | ||
|
|
fd61e757f0 | ||
|
|
7ec245925a | ||
|
|
f913cd742f | ||
|
|
cc7a0db35c | ||
|
|
6f11873d7e | ||
|
|
4b1b52caf0 | ||
|
|
e9ebfe36b0 | ||
|
|
43149498cf | ||
|
|
43070a1f5b | ||
|
|
f135bd86ac | ||
|
|
0bd8c5d115 | ||
|
|
9de10df90d | ||
|
|
46ed6e2487 | ||
|
|
d81d409051 | ||
|
|
5f75c8684f | ||
|
|
5d08499d20 | ||
|
|
4115184952 | ||
|
|
e6a14977b9 | ||
|
|
a449f7a5e3 | ||
|
|
51302cfd88 | ||
|
|
696612385a | ||
|
|
edf047dde8 | ||
|
|
166cd6c426 | ||
|
|
51010096bb | ||
|
|
4e5a7ba483 | ||
|
|
92803c1536 | ||
|
|
cc593fb6c4 | ||
|
|
aeabc0c436 | ||
|
|
32ad8ddb53 | ||
|
|
f084bc4147 | ||
|
|
cb1dcc2c9f | ||
|
|
8030de7af2 | ||
|
|
dd5ddbcc0f | ||
|
|
f587710d1c | ||
|
|
99142525b6 | ||
|
|
2d9ef1142d | ||
|
|
547169ea78 | ||
|
|
8d08ab20ec | ||
|
|
966a780432 | ||
|
|
99abc4e78a | ||
|
|
ce1d581c3f | ||
|
|
b31ae6e690 | ||
|
|
e984fde966 | ||
|
|
5d0b474a7e | ||
|
|
d09f2c4f26 | ||
|
|
dd20a16d3a | ||
|
|
7d22b71e86 | ||
|
|
567ccbfc3a | ||
|
|
ca40775678 | ||
|
|
4916e5542a | ||
|
|
ac8ec2b622 | ||
|
|
9b9f7e2a1d | ||
|
|
28ea91e6c3 | ||
|
|
0d58307e82 | ||
|
|
c8ca84ede9 | ||
|
|
ed2939c39e | ||
|
|
d36bd253e8 | ||
|
|
4615dce0a9 | ||
|
|
7ce8aa3638 | ||
|
|
9236b92dc1 | ||
|
|
05ffcab911 | ||
|
|
61b9c0970b | ||
|
|
3b3701135f | ||
|
|
f5987fde5a | ||
|
|
e56b34f174 | ||
|
|
0fb43ccc2b | ||
|
|
48db4df028 | ||
|
|
86a0693081 | ||
|
|
6295c1d0c3 | ||
|
|
35d29c8e30 | ||
|
|
ca78c4c2fc | ||
|
|
f276409cde | ||
|
|
682f7bee72 | ||
|
|
43bec6a636 | ||
|
|
6eb9c750a7 | ||
|
|
31c93c8c5c | ||
|
|
5aa1046541 | ||
|
|
0f4504476a | ||
|
|
3897245a7e | ||
|
|
373db3de95 | ||
|
|
a1437658af | ||
|
|
f4ec69021d | ||
|
|
6012f20fb3 | ||
|
|
95da957f73 | ||
|
|
642722bdb1 | ||
|
|
cbc31f3c18 | ||
|
|
f2309ba079 | ||
|
|
246ed15d6d | ||
|
|
88756c83c7 | ||
|
|
cf320266df | ||
|
|
47e7e80afe | ||
|
|
0d880babfb | ||
|
|
28ba34f1bf | ||
|
|
e786cb8180 | ||
|
|
458584d778 | ||
|
|
2c711ea206 | ||
|
|
7b25be51a5 | ||
|
|
45b05a4846 | ||
|
|
6972736abf | ||
|
|
3798654f92 | ||
|
|
fdf01dfb50 | ||
|
|
876f091244 | ||
|
|
2988561f01 | ||
|
|
fbfc319ac1 | ||
|
|
9b1417f32d | ||
|
|
c727762940 | ||
|
|
e3565d5bcb | ||
|
|
a3f550c585 | ||
|
|
c610d804b1 | ||
|
|
3d592dbc79 | ||
|
|
0186f2f456 | ||
|
|
d817a813b0 | ||
|
|
1d219ba511 | ||
|
|
285afb6d4b | ||
|
|
ca3708df71 | ||
|
|
c2aafb14c2 | ||
|
|
d4d1acb555 | ||
|
|
d1a59f8c1b | ||
|
|
2fd17f97b6 | ||
|
|
45a3bdffe0 | ||
|
|
f050c69ccd | ||
|
|
c31a2551f1 | ||
|
|
90e93492a7 | ||
|
|
54266bf63b | ||
|
|
ba12f7aec9 | ||
|
|
deafb6fe08 | ||
|
|
091be1440a | ||
|
|
030aee17f5 | ||
|
|
bbbf836374 | ||
|
|
f1b91ef360 | ||
|
|
f6c59b456f | ||
|
|
8f3f941600 | ||
|
|
e561f49e80 | ||
|
|
2ff884fd11 | ||
|
|
296af748ee | ||
|
|
0cb10fcc34 | ||
|
|
4a67ea0b29 | ||
|
|
8e94acc98f | ||
|
|
39cda3764b | ||
|
|
97f5175c84 | ||
|
|
78f8e5055e | ||
|
|
735d896260 | ||
|
|
cb7a6596ba | ||
|
|
fdaa56fd86 | ||
|
|
667b940feb | ||
|
|
bb3de7d510 | ||
|
|
7bdde15796 | ||
|
|
c412ba66d8 | ||
|
|
dd62bee264 | ||
|
|
f886eac7b5 | ||
|
|
623079ca40 | ||
|
|
ce9bd796d6 | ||
|
|
d5f323a2cd | ||
|
|
40592a93ac | ||
|
|
dc1a5a860c | ||
|
|
f7b431902d | ||
|
|
686d47a59e | ||
|
|
eaa4688182 | ||
|
|
72645aa800 | ||
|
|
7044fc8004 | ||
|
|
9e8c780d66 | ||
|
|
e1795d687f | ||
|
|
607f7cba8d | ||
|
|
2572e23928 | ||
|
|
60921031bd | ||
|
|
77550d902c | ||
|
|
41935781fb | ||
|
|
47362559ef | ||
|
|
032ef0722d | ||
|
|
6e32f03a6b | ||
|
|
5731dcf135 | ||
|
|
66e0f54d0e | ||
|
|
cadc9cecf1 | ||
|
|
491e2dfe56 | ||
|
|
29c7b342eb | ||
|
|
ea601a7d03 | ||
|
|
dac45659c0 | ||
|
|
4f72c60eb0 | ||
|
|
7434fdec6f | ||
|
|
c4f3ea901a | ||
|
|
58ad9f2ca8 | ||
|
|
3fa06cc7c0 | ||
|
|
d551e39a1c | ||
|
|
afede0ff9c | ||
|
|
d51b065723 | ||
|
|
752a2d2e8d | ||
|
|
b57eaca365 | ||
|
|
859574c014 | ||
|
|
0505b123a0 | ||
|
|
00b3d7809c | ||
|
|
ec69849749 | ||
|
|
8bf7aa9ceb | ||
|
|
ca0b6f2c6d | ||
|
|
5182a61fcc | ||
|
|
2f7b949bd1 | ||
|
|
4100e48fe2 | ||
|
|
132b211796 | ||
|
|
0d4d8efe4e | ||
|
|
393bea6d4b | ||
|
|
b2edb0441a | ||
|
|
9d02379583 | ||
|
|
3c365d65a4 | ||
|
|
2049852a80 | ||
|
|
be6a7490fd | ||
|
|
222d0b74d0 | ||
|
|
cdde0dedc8 | ||
|
|
6b14facd29 | ||
|
|
a7d6a4968e | ||
|
|
2173707925 | ||
|
|
75c03d56d2 | ||
|
|
85ec807417 | ||
|
|
e7df0d201f | ||
|
|
026713750d | ||
|
|
d19d62b1fc | ||
|
|
1f9d0181c9 | ||
|
|
4d91e7f347 | ||
|
|
9bfdfa149e | ||
|
|
214e542da4 | ||
|
|
daf74347a3 | ||
|
|
61fd327aa1 | ||
|
|
91dcfefc5c | ||
|
|
8059f22a32 | ||
|
|
a271658154 | ||
|
|
e6854d6a6a | ||
|
|
1ede41c778 | ||
|
|
ed905aa0ff | ||
|
|
e28b72e356 | ||
|
|
daf007fae7 | ||
|
|
684c339309 | ||
|
|
3a44b840be | ||
|
|
5db041adb7 | ||
|
|
ce704a7d92 | ||
|
|
0a9dca5be7 | ||
|
|
5ccb7a7b9a | ||
|
|
4bd24a4ffe | ||
|
|
56e7c15064 | ||
|
|
a2ffac9424 | ||
|
|
ca35c90cbb | ||
|
|
74d59705ad | ||
|
|
adc51d3773 | ||
|
|
218946d5de | ||
|
|
6b32fcef0f | ||
|
|
016d47b9d7 | ||
|
|
1bf1a56b01 | ||
|
|
0413302470 | ||
|
|
01c934f53a | ||
|
|
c1aac6c85e | ||
|
|
ed292a1e7a | ||
|
|
61b164a183 | ||
|
|
d196169bea | ||
|
|
a2284a5143 | ||
|
|
7486468537 | ||
|
|
e475e763db | ||
|
|
dfdd06b24c | ||
|
|
510ed25509 | ||
|
|
9f2f01c17d | ||
|
|
12ba05385b | ||
|
|
f113a2befe | ||
|
|
cc8a1ccc8b | ||
|
|
2f88994c37 | ||
|
|
e016c8a702 | ||
|
|
982d367b11 | ||
|
|
d70f7422b7 | ||
|
|
56b2e09b01 | ||
|
|
ee3d6ec24b | ||
|
|
03beca1099 | ||
|
|
588f8af966 | ||
|
|
eee5e9cd7f | ||
|
|
27a78a00fd | ||
|
|
0aae605ac4 | ||
|
|
5cfcca0bc4 | ||
|
|
daf4e5cad6 | ||
|
|
27b5d13733 | ||
|
|
5d405b4d10 | ||
|
|
4519e24297 | ||
|
|
2fd81c7ffd | ||
|
|
106c35344b | ||
|
|
12f64e5fde | ||
|
|
bcbcb1f23c | ||
|
|
4b20e35fd2 | ||
|
|
f332963c75 | ||
|
|
a5f6756659 | ||
|
|
ebe0276141 | ||
|
|
9d47ba9031 | ||
|
|
09dd25dc0a | ||
|
|
dfc249135f | ||
|
|
c3d755a3e2 | ||
|
|
1195d2f2e4 | ||
|
|
b05f478207 | ||
|
|
1c28d4f610 | ||
|
|
77baf6f522 | ||
|
|
f583df6c7d | ||
|
|
4093fadcae | ||
|
|
16adacb722 | ||
|
|
5e5714baeb | ||
|
|
f60986de8e | ||
|
|
a6f4d0cdec | ||
|
|
64d147bf96 | ||
|
|
fe3facfc95 | ||
|
|
3555fc01c5 | ||
|
|
ab02cb0a19 | ||
|
|
24815c0370 | ||
|
|
a03e8dd879 | ||
|
|
2ea0bbe5ca | ||
|
|
21e1d01394 | ||
|
|
ab842cbd73 | ||
|
|
e864c1aaac | ||
|
|
a80f9e9ca7 | ||
|
|
959a404e1c | ||
|
|
7546655695 | ||
|
|
be0e50f983 | ||
|
|
baaf84298c | ||
|
|
dfeb9dbc84 | ||
|
|
4fd4b3dfad | ||
|
|
7709f4e307 | ||
|
|
26eec66f89 | ||
|
|
e3c3233b3a | ||
|
|
f0a44e54d0 | ||
|
|
7a6ee756b8 | ||
|
|
944b3a5b6c | ||
|
|
4a9bac3cd5 | ||
|
|
2e630a48f7 | ||
|
|
baf1e88689 | ||
|
|
80953a2286 | ||
|
|
6393bfda37 | ||
|
|
d0bdfcd20b | ||
|
|
e7b615c7e7 | ||
|
|
2fd370f4ae | ||
|
|
6b86ef3015 | ||
|
|
10f6aa3e4e | ||
|
|
d5365fbf0c | ||
|
|
66d4034a4e | ||
|
|
f4d1049be4 | ||
|
|
c2ff6f4e6b | ||
|
|
79834b9566 | ||
|
|
5459be46a4 | ||
|
|
d584edf546 | ||
|
|
0cba735eb3 | ||
|
|
62978e5d34 | ||
|
|
3ea32212d7 | ||
|
|
ba6373daa4 | ||
|
|
18b717594f | ||
|
|
76e304c34e | ||
|
|
2e74a78f46 | ||
|
|
6a146e239a | ||
|
|
cecb8b8d31 | ||
|
|
339541a56f | ||
|
|
6709087760 | ||
|
|
069544eb93 | ||
|
|
17f769c40d | ||
|
|
ba20790ed2 | ||
|
|
cb3bace15e | ||
|
|
7c6f4d7bff | ||
|
|
f0a56b4201 | ||
|
|
d2a26017d7 | ||
|
|
61048757e6 | ||
|
|
25b4745997 | ||
|
|
7fec97561b | ||
|
|
1957d6f432 | ||
|
|
823881f7f1 | ||
|
|
11f75f72ee | ||
|
|
5747b72a41 | ||
|
|
44510b5b64 | ||
|
|
6a1a991c08 | ||
|
|
33637e92b5 | ||
|
|
4c06fd2fb8 | ||
|
|
f5c529b2b3 | ||
|
|
b7349e42c7 | ||
|
|
a4d6932ed8 | ||
|
|
d23d382038 | ||
|
|
bde476dfb7 | ||
|
|
6ae86ce906 | ||
|
|
b2121b25c1 | ||
|
|
a08afcf11a | ||
|
|
919110b024 | ||
|
|
9c25a1609e | ||
|
|
d86bf44e39 | ||
|
|
e61ee528ff | ||
|
|
82b56613e9 | ||
|
|
78723887e1 | ||
|
|
920b403ee3 | ||
|
|
390c1469b1 | ||
|
|
b605c463a1 | ||
|
|
00491c8d90 | ||
|
|
cc3a9f1e81 | ||
|
|
60e7362f4e | ||
|
|
f2bab005d0 | ||
|
|
7068a883ed | ||
|
|
3783ec6a23 | ||
|
|
0aaa02b347 | ||
|
|
1af3bf5da7 | ||
|
|
d5a57564fe | ||
|
|
2d92858193 | ||
|
|
f666751f5f | ||
|
|
58603ed12a | ||
|
|
d005b5d2d9 | ||
|
|
a13b5bf8c0 | ||
|
|
9d351317b8 | ||
|
|
f29d784e13 | ||
|
|
2e582e3a45 | ||
|
|
566147dfae | ||
|
|
3e5967c5a7 | ||
|
|
52fda5aeb7 | ||
|
|
a657a23aaa | ||
|
|
b32055290a | ||
|
|
cc97c0e525 | ||
|
|
ffb324f685 | ||
|
|
ad53a0bf4c | ||
|
|
2cc07f0e73 | ||
|
|
b3d3794e1d | ||
|
|
82a3017629 | ||
|
|
d511080814 | ||
|
|
db1373d572 | ||
|
|
ea7483f9a7 | ||
|
|
7441720a88 | ||
|
|
0d0dd7d57c | ||
|
|
e5c7e52d72 | ||
|
|
72f4331703 | ||
|
|
5f02320e8e | ||
|
|
3449525ead | ||
|
|
1c17ec5599 | ||
|
|
6611c865f7 | ||
|
|
016c93e795 | ||
|
|
f518bdadbd | ||
|
|
b408baf254 | ||
|
|
58441634d6 | ||
|
|
d5c8021b41 | ||
|
|
929b5176ce | ||
|
|
179a65ed8b | ||
|
|
dd9a2e1818 | ||
|
|
0b5656dcc4 | ||
|
|
037d77f28e | ||
|
|
301e95b708 | ||
|
|
874bac7de2 | ||
|
|
4668f429fb | ||
|
|
d43f25ec70 | ||
|
|
bdee628360 | ||
|
|
a35530f63b | ||
|
|
21d6c1326c | ||
|
|
bfafc692db | ||
|
|
3a068b9719 | ||
|
|
9530100455 | ||
|
|
cab329556c | ||
|
|
1c5d6cbe94 | ||
|
|
576bc80716 | ||
|
|
8042aa39bf | ||
|
|
409b3ccd6c | ||
|
|
c89d19cd27 | ||
|
|
f9ab16049b | ||
|
|
09300c209f | ||
|
|
d199e0fa0f | ||
|
|
89cab26888 | ||
|
|
31b900a71c | ||
|
|
76a58cd843 | ||
|
|
dbdc900e94 | ||
|
|
e3ec4ebd21 | ||
|
|
2ab529a3f5 | ||
|
|
a82fdcca4b | ||
|
|
0627b36bf6 | ||
|
|
e8a5b5ab9c | ||
|
|
a1edb1b896 | ||
|
|
b27e63586e | ||
|
|
d2bd5b5640 | ||
|
|
f91505ff09 | ||
|
|
464495987a | ||
|
|
27aef75e54 | ||
|
|
70e3b4dd1a | ||
|
|
556fd2bbc3 | ||
|
|
0097d1782e | ||
|
|
f03bdc5f45 | ||
|
|
ebf379f7c1 | ||
|
|
cd72ff1f84 | ||
|
|
eca41cac16 | ||
|
|
a8e2e132d1 | ||
|
|
499711b9af | ||
|
|
b0eec3a844 | ||
|
|
24e90f0f20 | ||
|
|
ff48d37598 | ||
|
|
c402d58685 | ||
|
|
ed8934882e | ||
|
|
62093a8dd8 | ||
|
|
4a5f1038e0 | ||
|
|
8cb833eca9 | ||
|
|
e2b7a69fc8 | ||
|
|
950eaea8af | ||
|
|
b22d90f9ca | ||
|
|
b76e7ff678 | ||
|
|
9c386e949d | ||
|
|
2b1688be31 | ||
|
|
3d9de1aaa6 | ||
|
|
5a0a5ad445 | ||
|
|
038b98eacf | ||
|
|
3592d17c93 | ||
|
|
4cbd84671c | ||
|
|
c3c9603ea1 | ||
|
|
af63b42eaf | ||
|
|
2f7da91a73 | ||
|
|
8fcf08132e | ||
|
|
db72ba295a | ||
|
|
2d7a6a7cb5 | ||
|
|
390b5a7925 | ||
|
|
5ca6ed30b4 | ||
|
|
9685b39969 | ||
|
|
03dc26d2d4 | ||
|
|
b64bb3bec9 | ||
|
|
8d3530a4f3 | ||
|
|
83b1416797 | ||
|
|
5adeac6bbc | ||
|
|
f44b44a881 | ||
|
|
1ed978f22e | ||
|
|
7ed06ae515 | ||
|
|
63042dbba8 | ||
|
|
144d8d8ed4 | ||
|
|
99ba47a554 | ||
|
|
0462dab170 | ||
|
|
258481b0ba | ||
|
|
cb35f456ed | ||
|
|
686f8f43c3 | ||
|
|
99dcd0a020 | ||
|
|
3c6f52f5ea | ||
|
|
874619f62e | ||
|
|
74b5c93caf | ||
|
|
ec45d1f564 | ||
|
|
42a75fe133 | ||
|
|
e414c1cf1e | ||
|
|
1cf692cecf | ||
|
|
af5b871383 | ||
|
|
37d60411bb | ||
|
|
d7ba2e7171 | ||
|
|
215be9255e | ||
|
|
9d0fd1f5b6 | ||
|
|
4e0a93fc20 | ||
|
|
a0fddd2953 | ||
|
|
40e66313a9 | ||
|
|
87155f98b3 | ||
|
|
483325990c | ||
|
|
83fa024fab | ||
|
|
96fe608d60 | ||
|
|
52192a3b26 | ||
|
|
75e575fc01 | ||
|
|
98bc89cb39 | ||
|
|
d2d244ebc7 | ||
|
|
9952854b53 | ||
|
|
3bb079216c | ||
|
|
b845dbb882 | ||
|
|
7eb92c68de | ||
|
|
24f8ce9d7f | ||
|
|
343e98c99a | ||
|
|
bc76eee847 | ||
|
|
91ae8ba410 | ||
|
|
e2489151f3 | ||
|
|
9066891ce2 | ||
|
|
65e2f1b5af | ||
|
|
020efefb25 | ||
|
|
83f8370e2a | ||
|
|
61accd9569 | ||
|
|
8a428df7df | ||
|
|
de6bb5dfb9 | ||
|
|
80561001b8 | ||
|
|
33d077e997 | ||
|
|
fe24db7c57 | ||
|
|
61bfe10bc2 | ||
|
|
84bfd10416 | ||
|
|
538e79183c | ||
|
|
ec64952cb4 | ||
|
|
b934ca6ad3 | ||
|
|
0da6c03a8f | ||
|
|
a54cbca6d2 | ||
|
|
ad8e3e38f0 | ||
|
|
ffc1aa6a91 | ||
|
|
6ee1e72021 | ||
|
|
5bc8e5c57c | ||
|
|
d48acf7fef | ||
|
|
72260b5323 | ||
|
|
e84b8cb96d | ||
|
|
adcaad791a | ||
|
|
b0490cfbbc | ||
|
|
86231d0154 | ||
|
|
6163f6c4a0 | ||
|
|
e3e117a14e | ||
|
|
e2ae567b9f | ||
|
|
a0c2dc43f7 | ||
|
|
f47163c4ad | ||
|
|
e951359a46 | ||
|
|
bf6b2db0cb | ||
|
|
1ea8269dec | ||
|
|
9bd1970371 | ||
|
|
5b3ae56912 | ||
|
|
2b5789631f | ||
|
|
a6025e72fb | ||
|
|
96db2074c6 | ||
|
|
c7ab4a4569 | ||
|
|
dd4be3b772 | ||
|
|
8fe490ed03 | ||
|
|
eb21a5992f | ||
|
|
a3f1a5b0a9 | ||
|
|
71763d108b | ||
|
|
dc9ab135c8 | ||
|
|
3dd33d0966 | ||
|
|
1cb2e0d765 | ||
|
|
b34fb2d225 | ||
|
|
4973556fc8 | ||
|
|
2948e57242 | ||
|
|
521ee5fe2d | ||
|
|
478d6118d8 | ||
|
|
1b43270ae9 | ||
|
|
ec4fdc44ef | ||
|
|
91f49e2c6e | ||
|
|
6bc4a7242e | ||
|
|
eeab529bfa | ||
|
|
d798713c60 | ||
|
|
edc4b18975 | ||
|
|
450c93e029 | ||
|
|
c1abbfad7d | ||
|
|
d2d36c2211 | ||
|
|
aaaa02dbd0 | ||
|
|
a844fb3731 | ||
|
|
8f83fe5135 | ||
|
|
978558649e | ||
|
|
3b5efb37e9 | ||
|
|
90abe982ed | ||
|
|
7a0680c2cb | ||
|
|
71dd349044 | ||
|
|
f2a795c51e | ||
|
|
7ad7ea061c | ||
|
|
a315ecb831 | ||
|
|
c3d99e29dc | ||
|
|
f90f4b00a8 | ||
|
|
b1aa4fd3f8 | ||
|
|
b5df20d7c6 | ||
|
|
b58463bbaf | ||
|
|
b71a776770 | ||
|
|
78ef5b0d07 | ||
|
|
c1f76be3b7 | ||
|
|
2ebd3c6f35 | ||
|
|
003f9619c3 | ||
|
|
710ceedf3d | ||
|
|
5b77f511d3 | ||
|
|
f000b6bc0a | ||
|
|
346f1362c6 | ||
|
|
92043a3d23 | ||
|
|
3bc5295eae | ||
|
|
5bcfe37b4e | ||
|
|
1a8a9e53e1 | ||
|
|
c32dad75cd | ||
|
|
045733d188 | ||
|
|
f618e634e9 | ||
|
|
1b457dae7d | ||
|
|
690b0df932 | ||
|
|
e080164305 | ||
|
|
1e4bb8c91e | ||
|
|
17a7621342 | ||
|
|
ce27cb11a5 | ||
|
|
b84b82c416 | ||
|
|
623e074ba0 | ||
|
|
91230ba438 | ||
|
|
cc4d61f8f5 | ||
|
|
7a4358a5ec | ||
|
|
e6796d1458 | ||
|
|
1ba34c233e | ||
|
|
ef7898ea8d | ||
|
|
e49c3182ce | ||
|
|
c58c3dd311 | ||
|
|
7738f8c831 | ||
|
|
27cd3cc83a | ||
|
|
2f5e04d07f | ||
|
|
15af0726f1 | ||
|
|
a60a45fb9d | ||
|
|
df03ba3883 | ||
|
|
09a148b8a5 | ||
|
|
350635d464 | ||
|
|
cf13404254 | ||
|
|
878f45dd80 | ||
|
|
48bc0985d9 | ||
|
|
e9bca123c2 | ||
|
|
6df3a9243f | ||
|
|
f1b40d0500 | ||
|
|
0cbaf40747 | ||
|
|
54c5d9debb | ||
|
|
411884966b | ||
|
|
ef25542220 | ||
|
|
b4813660b5 | ||
|
|
f08d1e265c | ||
|
|
470bc8a049 | ||
|
|
5c84ef5f72 | ||
|
|
8ab85a2af1 | ||
|
|
7f69f8bcdb | ||
|
|
3a016da549 | ||
|
|
7b3e13c748 | ||
|
|
f5cbcce112 | ||
|
|
5f8c813aa7 | ||
|
|
f68202a098 | ||
|
|
bfb2c6ab5f | ||
|
|
00a24bc84b | ||
|
|
9ba6d7ee1e | ||
|
|
60ff62d018 | ||
|
|
5d24f1b691 | ||
|
|
370ca740e3 | ||
|
|
ba8430d9e7 | ||
|
|
0b71568d97 | ||
|
|
37ac1b66dd | ||
|
|
1be9e8c5b1 | ||
|
|
c6b9b947fb | ||
|
|
a1ef567ecd | ||
|
|
2b22a15e8c | ||
|
|
760b8c7a88 | ||
|
|
13145bba03 | ||
|
|
f9a9ed4846 | ||
|
|
d5a40d46bc | ||
|
|
19f3da556c | ||
|
|
e8f0a3bd23 | ||
|
|
08fd09064a | ||
|
|
caee764af3 | ||
|
|
eae3cd99ee | ||
|
|
f71fa2f704 | ||
|
|
9afbfec64e | ||
|
|
ec7e89b5cf | ||
|
|
e6ad54b53b | ||
|
|
768982b67a | ||
|
|
4fd3167bb3 | ||
|
|
866cb5706d | ||
|
|
2cf642a2a4 | ||
|
|
f26076fb90 | ||
|
|
519d965a36 | ||
|
|
a50bb39978 | ||
|
|
8ee234e5a6 | ||
|
|
e370fdb0fc | ||
|
|
09904b77eb | ||
|
|
5e32b693f3 | ||
|
|
cceac20197 | ||
|
|
540e8458a5 | ||
|
|
80984f28ec | ||
|
|
56064df8d5 | ||
|
|
df7cc1fefd | ||
|
|
23fc232c47 | ||
|
|
37ce37862a | ||
|
|
75e26458cc | ||
|
|
e75fcadd8f | ||
|
|
2483c421d2 | ||
|
|
abf6e37938 | ||
|
|
eae73b3113 | ||
|
|
cbf82d7476 | ||
|
|
4ddd293210 | ||
|
|
813a95d283 | ||
|
|
c02c27b63d | ||
|
|
f6d4d5ab22 | ||
|
|
284f8534ab | ||
|
|
8e7716ebcc | ||
|
|
1b665fa1b3 | ||
|
|
9cbfaed5fe | ||
|
|
494223fff6 | ||
|
|
af77b8dfc4 | ||
|
|
47b6826ac4 | ||
|
|
64be4e692c | ||
|
|
8e8a926ad9 | ||
|
|
9306017f01 | ||
|
|
55c0170791 | ||
|
|
671b032125 | ||
|
|
f79fd0edbc | ||
|
|
8d20277a62 | ||
|
|
88032a85cd | ||
|
|
c821967633 | ||
|
|
7e660450ed | ||
|
|
e5f36ca08d | ||
|
|
d8249b3a7c | ||
|
|
3c36ef2c69 | ||
|
|
b050039e35 | ||
|
|
920c6f6507 | ||
|
|
96a3a74e08 | ||
|
|
fb00f688a8 | ||
|
|
d6d379108b | ||
|
|
d34ad33c3c | ||
|
|
8bdb39983e | ||
|
|
59b363d9b2 | ||
|
|
71df45a347 | ||
|
|
0b06b1e1e8 | ||
|
|
45a3ea18d0 | ||
|
|
951d74e24b | ||
|
|
445dba85ac | ||
|
|
d50533bbaf | ||
|
|
eafeac4e7b | ||
|
|
58c3b95c84 | ||
|
|
5a58ed5114 | ||
|
|
b619744093 | ||
|
|
32276b820f | ||
|
|
74e246feed | ||
|
|
de4ea4081a | ||
|
|
af18501726 | ||
|
|
ae24ccdfe6 | ||
|
|
095da62250 | ||
|
|
909f4b7fe8 | ||
|
|
c89a870fe9 | ||
|
|
fc23efdb25 | ||
|
|
3da209b562 | ||
|
|
9e0b02f86e | ||
|
|
a4e14497a5 | ||
|
|
5daf725ee3 | ||
|
|
ffbf409174 | ||
|
|
8b3c297514 | ||
|
|
2f8481f5e2 | ||
|
|
448d792988 | ||
|
|
1e98e641bb | ||
|
|
4b13cd666b | ||
|
|
836d66a150 | ||
|
|
de3e92e21b | ||
|
|
f9073ee8ee | ||
|
|
bd59bcda2c | ||
|
|
0e9302ff08 | ||
|
|
69bdebeb98 | ||
|
|
7b25d97ea2 | ||
|
|
9a33110ac3 | ||
|
|
99aae87cd2 | ||
|
|
ee681b5053 | ||
|
|
981ae5067c | ||
|
|
60b640d9f5 | ||
|
|
7a1efa8b9a | ||
|
|
a3f74098f2 | ||
|
|
8f4839d8ff | ||
|
|
3b01dcf230 | ||
|
|
37f9f5619c | ||
|
|
331716dd48 | ||
|
|
14f728ab76 | ||
|
|
1249eb3261 | ||
|
|
98e0a62e6e | ||
|
|
2d45dce075 | ||
|
|
e7bfa483f8 | ||
|
|
36a352b096 | ||
|
|
1f05deddc8 | ||
|
|
cec925bcdc | ||
|
|
3bd779a607 | ||
|
|
4a44cddcea | ||
|
|
bf53ee8246 | ||
|
|
f75d5dba84 | ||
|
|
2036dc91e6 | ||
|
|
39252dfe48 | ||
|
|
77c326d300 | ||
|
|
164e52207e | ||
|
|
1f7e2f5ed3 | ||
|
|
0bace013a1 | ||
|
|
1df8d19399 | ||
|
|
75df797b41 | ||
|
|
1136556a0d | ||
|
|
1331b0691f | ||
|
|
21057d51e1 | ||
|
|
f00daf171b | ||
|
|
22eee94436 | ||
|
|
0105ed447f | ||
|
|
dd2ecb3dd9 | ||
|
|
a51f9fd90c | ||
|
|
e32def409a | ||
|
|
657744cc28 | ||
|
|
a561cee54b | ||
|
|
2c0553f8fd | ||
|
|
13b72c8f93 | ||
|
|
73454905e8 | ||
|
|
8e58f469b0 | ||
|
|
5ec7826273 | ||
|
|
1f109ff59b | ||
|
|
10217b5530 | ||
|
|
43f1cc7bd0 | ||
|
|
5e523f4cd8 | ||
|
|
b78435c881 | ||
|
|
33e20df511 | ||
|
|
53c04a934e | ||
|
|
46d3402705 | ||
|
|
1ff4d76ae7 | ||
|
|
273573ce68 | ||
|
|
d3ed34d5eb | ||
|
|
375c74abe5 | ||
|
|
e0264a3459 | ||
|
|
1f73a87327 | ||
|
|
27f420c8ea | ||
|
|
29dd3d5fc3 | ||
|
|
0e671b1569 | ||
|
|
2c374e9761 | ||
|
|
f0465c63ed | ||
|
|
b04cb7648e | ||
|
|
46b1b0ba17 | ||
|
|
60e3a657f0 | ||
|
|
3d04669ef0 | ||
|
|
9fb60a8ab0 | ||
|
|
17540b0120 | ||
|
|
af77819913 | ||
|
|
1c8af096de | ||
|
|
7f35d81722 | ||
|
|
26f873a364 | ||
|
|
b101d11821 | ||
|
|
50a1956d92 | ||
|
|
5a4f31bfa5 | ||
|
|
7405219fb8 | ||
|
|
30ce4b6e3c | ||
|
|
7d53636e10 | ||
|
|
aa93bcb142 | ||
|
|
2073793fcd | ||
|
|
388523a4ea | ||
|
|
ec4942174b | ||
|
|
01f7a09012 | ||
|
|
c35ea228e4 | ||
|
|
498d8c1d65 | ||
|
|
3aacf0f1fb | ||
|
|
4fc2fb7a6f | ||
|
|
d12f5016e4 | ||
|
|
f1e0960a26 | ||
|
|
0f5d659ce2 | ||
|
|
a64aa6941d | ||
|
|
66cac8350e | ||
|
|
384c2a7701 | ||
|
|
ad4e7c3355 | ||
|
|
ea5d4ca3ae | ||
|
|
87e7f817c1 | ||
|
|
3af1840c6a | ||
|
|
e5ff04be29 | ||
|
|
da851c3c10 | ||
|
|
d160aeec4b | ||
|
|
e18275c1c0 | ||
|
|
1ca71ec30d | ||
|
|
759351cec0 | ||
|
|
ef320b74b0 | ||
|
|
6e6c5c4cb7 | ||
|
|
669e1921a4 | ||
|
|
924b4a9436 | ||
|
|
f49b5efac4 | ||
|
|
8581ab9eb3 | ||
|
|
7efe9acefb | ||
|
|
94f3664dbc | ||
|
|
d1f8053fbb | ||
|
|
713ce86e24 | ||
|
|
7efdcfd888 | ||
|
|
988a674617 | ||
|
|
4e4cdcdf61 | ||
|
|
0388bbdc6d | ||
|
|
30d47fd51b | ||
|
|
2e45069882 | ||
|
|
3b2cf5b851 | ||
|
|
4d456f1bc0 | ||
|
|
d6ba41c2d9 | ||
|
|
c9a728c318 | ||
|
|
4c2fe8e03c | ||
|
|
ec95c260bb | ||
|
|
e7eaa2b194 | ||
|
|
fe59ce3e60 | ||
|
|
45fb046a9a | ||
|
|
055e18058f | ||
|
|
fa5e32496c | ||
|
|
44a1efffa0 | ||
|
|
c839ee7d13 |
@@ -65,4 +65,5 @@ readability-*,
|
||||
-readability-redundant-access-specifiers,
|
||||
-readability-function-cognitive-complexity,
|
||||
-readability-identifier-naming,
|
||||
-readability-qualified-auto'
|
||||
*-include-cleaner,
|
||||
-readability-qualified-auto'
|
||||
|
||||
5
.dockerignore
Normal file
5
.dockerignore
Normal file
@@ -0,0 +1,5 @@
|
||||
cmake-build-*/
|
||||
build*/
|
||||
|
||||
local/
|
||||
**/Dockerfile
|
||||
10
.gdbinit
10
.gdbinit
@@ -6,4 +6,12 @@ skip -rfu ^__gnu_debug::
|
||||
skip -rfu ^ImGui::
|
||||
|
||||
# Trigger breakpoint when execution reaches triggerSafeShutdown()
|
||||
break triggerSafeShutdown
|
||||
break triggerSafeShutdown
|
||||
break __glibcxx_assert_fail
|
||||
|
||||
# Print backtrace after execution jumped to an invalid address
|
||||
define fixbt
|
||||
set $pc = *(void **)$rsp
|
||||
set $rsp = $rsp + 8
|
||||
bt
|
||||
end
|
||||
5
.gitattributes
vendored
5
.gitattributes
vendored
@@ -1 +1,4 @@
|
||||
lib/external/** linguist-vendored
|
||||
lib/external/** linguist-vendored
|
||||
|
||||
dist/*.sh eol=lf
|
||||
dist/**/*Dockerfile eol=lf
|
||||
5
.github/codecov.yml
vendored
Normal file
5
.github/codecov.yml
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
comment: false
|
||||
ignore:
|
||||
- "lib/third_party" # Third party libraries should be ignored
|
||||
- "lib/external" # Our own libraries should be checked in their own repositories
|
||||
- "tests" # https://about.codecov.io/blog/should-i-include-test-files-in-code-coverage-calculations/
|
||||
29
.github/workflows/analysis.yml
vendored
29
.github/workflows/analysis.yml
vendored
@@ -8,7 +8,7 @@ on:
|
||||
jobs:
|
||||
codeql:
|
||||
name: 🐛 CodeQL
|
||||
runs-on: ubuntu-22.04
|
||||
runs-on: ubuntu-24.04
|
||||
permissions:
|
||||
actions: read
|
||||
contents: read
|
||||
@@ -16,7 +16,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: 🧰 Checkout
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
@@ -26,14 +26,14 @@ jobs:
|
||||
languages: 'cpp'
|
||||
|
||||
- name: 📜 Setup ccache
|
||||
uses: hendrikmuhs/ccache-action@v1.2
|
||||
uses: hendrikmuhs/ccache-action@v1
|
||||
with:
|
||||
key: ${{ runner.os }}-analysis-build-${{ github.run_id }}
|
||||
restore-keys: ${{ runner.os }}-analysis-build
|
||||
max-size: 50M
|
||||
|
||||
- name: 📜 Restore CMakeCache
|
||||
uses: actions/cache@v3
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: |
|
||||
build/CMakeCache.txt
|
||||
@@ -46,18 +46,21 @@ jobs:
|
||||
|
||||
- name: 🛠️ Build
|
||||
run: |
|
||||
set -x
|
||||
mkdir -p build
|
||||
cd build
|
||||
CC=gcc-12 CXX=g++-12 cmake \
|
||||
-DCMAKE_BUILD_TYPE=$BUILD_TYPE \
|
||||
-DCMAKE_INSTALL_PREFIX="$PWD/install" \
|
||||
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_C_FLAGS="-fuse-ld=lld" \
|
||||
-DCMAKE_CXX_FLAGS="-fuse-ld=lld" \
|
||||
-DIMHEX_PATTERNS_PULL_MASTER=ON \
|
||||
CC=gcc-14 CXX=g++-14 cmake \
|
||||
-DCMAKE_BUILD_TYPE=$BUILD_TYPE \
|
||||
-DCMAKE_INSTALL_PREFIX="$PWD/install" \
|
||||
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_C_FLAGS="-fuse-ld=lld" \
|
||||
-DCMAKE_CXX_FLAGS="-fuse-ld=lld" \
|
||||
-DIMHEX_PATTERNS_PULL_MASTER=ON \
|
||||
-DIMHEX_EXCLUDE_PLUGINS="script_loader" \
|
||||
-G Ninja \
|
||||
..
|
||||
make -j 4 install
|
||||
ninja install
|
||||
|
||||
- name: 🗯️ Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v2
|
||||
1165
.github/workflows/build.yml
vendored
1165
.github/workflows/build.yml
vendored
File diff suppressed because it is too large
Load Diff
79
.github/workflows/build_web.yml
vendored
79
.github/workflows/build_web.yml
vendored
@@ -1,79 +0,0 @@
|
||||
name: Build for the web
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: ["*"]
|
||||
pull_request:
|
||||
workflow_dispatch:
|
||||
|
||||
env:
|
||||
BUILD_TYPE: Release
|
||||
|
||||
permissions:
|
||||
pages: write
|
||||
id-token: write
|
||||
actions: write
|
||||
|
||||
jobs:
|
||||
|
||||
build:
|
||||
runs-on: ubuntu-22.04
|
||||
name: 🌍 WebAssembly
|
||||
steps:
|
||||
- name: 🧰 Checkout
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: 📁 Restore docker /cache
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: cache
|
||||
key: build-web-cache
|
||||
|
||||
- name: 🐳 Inject /cache into docker
|
||||
uses: reproducible-containers/buildkit-cache-dance@v2.1.2
|
||||
with:
|
||||
cache-source: cache
|
||||
cache-target: /cache
|
||||
|
||||
- name: 🛠️ Build using docker
|
||||
run: |
|
||||
docker buildx build . -f dist/web/Dockerfile --progress=plain --build-arg 'JOBS=4' --output out
|
||||
|
||||
- name: 🔨 Fix permissions
|
||||
run: |
|
||||
chmod -c -R +rX "out/" | while read line; do
|
||||
echo "::warning title=Invalid file permissions automatically fixed::$line"
|
||||
done
|
||||
|
||||
- name: ⬆️ Upload artifacts
|
||||
uses: actions/upload-pages-artifact@v2
|
||||
with:
|
||||
path: out/
|
||||
|
||||
# See https://github.com/actions/cache/issues/342#issuecomment-1711054115
|
||||
- name: 🗑️ Delete old cache
|
||||
continue-on-error: true
|
||||
env:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
run: |
|
||||
gh extension install actions/gh-actions-cache
|
||||
gh actions-cache delete "build-web-cache" --confirm
|
||||
|
||||
|
||||
deploy:
|
||||
environment:
|
||||
name: github-pages
|
||||
url: ${{ steps.deployment.outputs.page_url }}
|
||||
|
||||
name: 📃 Deploy to GitHub Pages
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
if: ${{ github.ref == 'refs/heads/master' && github.event.repository.fork == false }}
|
||||
needs: build
|
||||
|
||||
steps:
|
||||
- name: 🌍 Deploy
|
||||
id: deployment
|
||||
uses: actions/deploy-pages@v2
|
||||
128
.github/workflows/nightly_release.yml
vendored
Normal file
128
.github/workflows/nightly_release.yml
vendored
Normal file
@@ -0,0 +1,128 @@
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
name: Nightly Release
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 0 * * *'
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
nightly-release:
|
||||
runs-on: ubuntu-24.04
|
||||
name: 🌃 Update Nightly Release
|
||||
steps:
|
||||
- name: 🧰 Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
path: ImHex
|
||||
fetch-depth: 0
|
||||
fetch-tags: true
|
||||
|
||||
- name: 🌃 Check for new commits
|
||||
id: check_commits
|
||||
run: |
|
||||
cd ImHex
|
||||
git config --global --add safe.directory $(pwd)
|
||||
if [ -z "$(git log nightly..HEAD --oneline)" ]; then
|
||||
echo "No new commits since last nightly. Exiting."
|
||||
echo "::set-output name=should_run::false"
|
||||
else
|
||||
echo "::set-output name=should_run::true"
|
||||
fi
|
||||
|
||||
- name: 📜 Set version variable
|
||||
if: ${{ steps.check_commits.outputs.should_run == 'true' }}
|
||||
run: |
|
||||
project_version=`cat ImHex/VERSION`
|
||||
echo "IMHEX_VERSION=$project_version" >> $GITHUB_ENV
|
||||
|
||||
- name: ⬇️ Download artifacts from latest workflow
|
||||
uses: dawidd6/action-download-artifact@v6
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
workflow: build.yml
|
||||
branch: ${{ github.event.release.target_commitish }}
|
||||
workflow_conclusion: success
|
||||
skip_unpack: true
|
||||
|
||||
- name: 🗜️ Unzip files when needed
|
||||
if: ${{ steps.check_commits.outputs.should_run == 'true' }}
|
||||
run: |
|
||||
set -x
|
||||
for zipfile in ./*.zip
|
||||
do
|
||||
if [ `zipinfo -1 "$zipfile" | wc -l` -eq 1 ];
|
||||
then
|
||||
echo "unzipping $zipfile"
|
||||
unzip "$zipfile"
|
||||
rm "$zipfile"
|
||||
else
|
||||
echo "keeping $zipfile zipped"
|
||||
fi
|
||||
done
|
||||
|
||||
- name: 🟩 Rename artifacts when needed
|
||||
if: ${{ steps.check_commits.outputs.should_run == 'true' }}
|
||||
run: |
|
||||
mv "Windows Portable x86_64.zip" imhex-${{ env.IMHEX_VERSION }}-Windows-Portable-x86_64.zip
|
||||
mv "Windows Portable arm64.zip" imhex-${{ env.IMHEX_VERSION }}-Windows-Portable-arm64.zip
|
||||
mv "Windows Portable NoGPU x86_64.zip" imhex-${{ env.IMHEX_VERSION }}-Windows-Portable-NoGPU-x86_64.zip
|
||||
mv "ImHex Web.zip" imhex-${{ env.IMHEX_VERSION }}-Web.zip
|
||||
rm artifact.tar || true
|
||||
|
||||
- name: 📖 Generate Release Notes
|
||||
if: ${{ steps.check_commits.outputs.should_run == 'true' }}
|
||||
id: release_notes
|
||||
continue-on-error: true
|
||||
run: |
|
||||
cd ImHex
|
||||
echo "## Nightly ${GITHUB_SHA::7} Changelog" > changelog.md
|
||||
git fetch --tags --recurse-submodules=no
|
||||
git log nightly..origin/master --oneline --no-merges --pretty=format:'* %s' >> changelog.md
|
||||
|
||||
- name: 📦 Update Pre-Release
|
||||
if: ${{ steps.check_commits.outputs.should_run == 'true' }}
|
||||
run: |
|
||||
set -e
|
||||
|
||||
cd ImHex
|
||||
|
||||
# Move nightly tag to latest commit
|
||||
git tag -f nightly origin/master
|
||||
git push origin nightly --force
|
||||
|
||||
# Auth for GitHub CLI
|
||||
echo "${{ github.token }}" | gh auth login --with-token
|
||||
|
||||
# Delete existing assets
|
||||
for asset in $(gh release view nightly --json assets --jq '.assets[].name'); do
|
||||
gh release delete-asset nightly "$asset" --yes
|
||||
done
|
||||
|
||||
# Update release notes
|
||||
gh release edit nightly --notes-file changelog.md
|
||||
|
||||
# Upload new assets
|
||||
gh release upload nightly ../*.* --clobber
|
||||
|
||||
- name: ⬆️ Publish x86_64 Snap package
|
||||
if: ${{ steps.check_commits.outputs.should_run == 'true' }}
|
||||
continue-on-error: true
|
||||
uses: snapcore/action-publish@v1
|
||||
env:
|
||||
SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAP_STORE_LOGIN }}
|
||||
with:
|
||||
snap: imhex-${{ env.IMHEX_VERSION }}-x86_64.snap
|
||||
release: edge
|
||||
|
||||
- name: ⬆️ Publish arm64 Snap package
|
||||
if: ${{ steps.check_commits.outputs.should_run == 'true' }}
|
||||
continue-on-error: true
|
||||
uses: snapcore/action-publish@v1
|
||||
env:
|
||||
SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAP_STORE_LOGIN }}
|
||||
with:
|
||||
snap: imhex-${{ env.IMHEX_VERSION }}-arm64.snap
|
||||
release: edge
|
||||
65
.github/workflows/release.yml
vendored
65
.github/workflows/release.yml
vendored
@@ -10,17 +10,18 @@ on:
|
||||
|
||||
jobs:
|
||||
release-update-repos:
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-24.04
|
||||
name: Release Update Repos
|
||||
|
||||
steps:
|
||||
- name: 🧰 Checkout
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
path: ImHex
|
||||
|
||||
- name: 📜 Verify version and set version variable
|
||||
run: |
|
||||
set -x
|
||||
project_version=`cat ImHex/VERSION`
|
||||
tag_version="${{github.event.release.tag_name}}"
|
||||
tag_version="${tag_version:1}"
|
||||
@@ -51,19 +52,30 @@ jobs:
|
||||
repo: ImHex-Patterns
|
||||
token: ${{ secrets.RELEASE_TOKEN }}
|
||||
|
||||
- name: 🎫 Create imhex-download-sdk release
|
||||
uses: ncipollo/release-action@v1
|
||||
env:
|
||||
RELEASE_TOKEN: ${{ secrets.RELEASE_TOKEN }}
|
||||
if: "${{ env.RELEASE_TOKEN != '' }}"
|
||||
with:
|
||||
tag: v${{ env.IMHEX_VERSION }}
|
||||
repo: imhex-download-sdk
|
||||
token: ${{ secrets.RELEASE_TOKEN }}
|
||||
|
||||
release-upload-artifacts:
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-24.04
|
||||
name: Release Upload Artifacts
|
||||
|
||||
steps:
|
||||
- name: 🧰 Checkout
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
path: ImHex
|
||||
submodules: recursive
|
||||
|
||||
- name: 📜 Verify version and set version variable
|
||||
run: |
|
||||
set -x
|
||||
project_version=`cat ImHex/VERSION`
|
||||
tag_version="${{github.event.release.tag_name}}"
|
||||
tag_version="${tag_version:1}"
|
||||
@@ -78,16 +90,17 @@ jobs:
|
||||
run: tar --exclude-vcs -czvf Full.Sources.tar.gz ImHex
|
||||
|
||||
- name: ⬇️ Download artifacts from latest workflow
|
||||
uses: dawidd6/action-download-artifact@v2
|
||||
uses: dawidd6/action-download-artifact@v6
|
||||
with:
|
||||
github_token: ${{secrets.GITHUB_TOKEN}}
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
workflow: build.yml
|
||||
branch: ${{ github.event.release.target_commitish }}
|
||||
workflow_conclusion: success
|
||||
skip_unpack: true
|
||||
|
||||
- name: 🗜️ Unzip files when needed
|
||||
run: |
|
||||
run: |
|
||||
set -x
|
||||
for zipfile in ./*.zip
|
||||
do
|
||||
if [ `zipinfo -1 "$zipfile" | wc -l` -eq 1 ];
|
||||
@@ -103,15 +116,19 @@ jobs:
|
||||
- name: 🟩 Rename artifacts when needed
|
||||
run: |
|
||||
mv "Windows Portable x86_64.zip" imhex-${{ env.IMHEX_VERSION }}-Windows-Portable-x86_64.zip
|
||||
mv "Windows Portable arm64.zip" imhex-${{ env.IMHEX_VERSION }}-Windows-Portable-arm64.zip
|
||||
mv "Windows Portable NoGPU x86_64.zip" imhex-${{ env.IMHEX_VERSION }}-Windows-Portable-NoGPU-x86_64.zip
|
||||
mv "ImHex Web.zip" imhex-${{ env.IMHEX_VERSION }}-Web.zip
|
||||
rm artifact.tar || true
|
||||
|
||||
- name: ⬆️ Upload everything to release
|
||||
uses: softprops/action-gh-release@v1
|
||||
uses: softprops/action-gh-release@4634c16e79c963813287e889244c50009e7f0981
|
||||
with:
|
||||
files: '*'
|
||||
|
||||
- name: ✒️ Prepare PKGBUILD
|
||||
run: |
|
||||
set -x
|
||||
cp ImHex/dist/Arch/PKGBUILD .
|
||||
|
||||
hash=`md5sum imhex-${{ env.IMHEX_VERSION }}-ArchLinux-x86_64.pkg.tar.zst | cut -d ' ' -f 1`
|
||||
@@ -133,7 +150,7 @@ jobs:
|
||||
commit_email: itrooz@protonmail.com
|
||||
ssh_private_key: ${{ secrets.AUR_SSH_PRIVATE_KEY }}
|
||||
commit_message: Bump to version ${{ env.IMHEX_VERSION }}
|
||||
ssh_keyscan_types: rsa,dsa,ecdsa,ed25519
|
||||
ssh_keyscan_types: rsa,ecdsa,ed25519
|
||||
|
||||
release-update-winget:
|
||||
name: Release update winget package
|
||||
@@ -157,3 +174,33 @@ jobs:
|
||||
if ($version -notmatch "-") {
|
||||
.\wingetcreate.exe submit .\manifests\w\WerWolv\ImHex\${version}\ --token $env:WINGET_GITHUB_TOKEN
|
||||
}
|
||||
|
||||
release-update-snapstore:
|
||||
name: Release update snapstore package
|
||||
needs: release-upload-artifacts
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- name: ⬇️ Download artifacts
|
||||
run: |
|
||||
tagname=${GITHUB_REF#refs/tags/}
|
||||
version=${tagname#v}
|
||||
wget https://github.com/WerWolv/ImHex/releases/download/${tagname}/imhex-${version}-x86_64.snap
|
||||
wget https://github.com/WerWolv/ImHex/releases/download/${tagname}/imhex-${version}-arm64.snap
|
||||
|
||||
- name: ⬆️ Publish x86_64 Snap package
|
||||
continue-on-error: true
|
||||
uses: snapcore/action-publish@v1
|
||||
env:
|
||||
SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAP_STORE_LOGIN }}
|
||||
with:
|
||||
snap: imhex-${{ env.IMHEX_VERSION }}-x86_64.snap
|
||||
release: stable
|
||||
|
||||
- name: ⬆️ Publish arm64 Snap package
|
||||
continue-on-error: true
|
||||
uses: snapcore/action-publish@v1
|
||||
env:
|
||||
SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAP_STORE_LOGIN }}
|
||||
with:
|
||||
snap: imhex-${{ env.IMHEX_VERSION }}-arm64.snap
|
||||
release: stable
|
||||
31
.github/workflows/stale_issues.yml
vendored
Normal file
31
.github/workflows/stale_issues.yml
vendored
Normal file
@@ -0,0 +1,31 @@
|
||||
name: Close inactive issues
|
||||
on:
|
||||
schedule:
|
||||
- cron: "30 1 * * 0"
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
close-issues:
|
||||
if: false # Disabled for now until I actually have time to take care of all these issues
|
||||
runs-on: ubuntu-24.04
|
||||
permissions:
|
||||
issues: write
|
||||
pull-requests: write
|
||||
steps:
|
||||
- uses: actions/stale@v5
|
||||
with:
|
||||
operations-per-run: '200'
|
||||
ascending: true
|
||||
days-before-issue-stale: 334
|
||||
days-before-issue-close: 30
|
||||
stale-issue-label: "stale"
|
||||
stale-issue-message: |
|
||||
This issue is marked stale as it has been open for 11 months without activity.
|
||||
Please try the latest ImHex version. (Avaiable here: https://imhex.download/ for release and https://imhex.download/#nightly for development version)
|
||||
If the issue persists on the latest version, please make a comment on this issue again
|
||||
|
||||
Without response, this issue will be closed in one month.
|
||||
close-issue-message: ""
|
||||
days-before-pr-stale: -1
|
||||
days-before-pr-close: -1
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
84
.github/workflows/tests.yml
vendored
84
.github/workflows/tests.yml
vendored
@@ -2,15 +2,21 @@ name: "Unit Tests"
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ master ]
|
||||
branches:
|
||||
- 'master'
|
||||
- 'releases/**'
|
||||
- 'tests/**'
|
||||
- 'feature/**'
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
branches:
|
||||
- 'master'
|
||||
- 'releases/**'
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
tests:
|
||||
name: 🧪 Unit Tests
|
||||
runs-on: ubuntu-22.04
|
||||
runs-on: ubuntu-24.04
|
||||
permissions:
|
||||
actions: read
|
||||
contents: read
|
||||
@@ -18,25 +24,17 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: 🧰 Checkout
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: 📜 Setup ccache
|
||||
uses: hendrikmuhs/ccache-action@v1.2
|
||||
uses: hendrikmuhs/ccache-action@v1
|
||||
with:
|
||||
key: ${{ runner.os }}-tests-build-${{ github.run_id }}
|
||||
restore-keys: ${{ runner.os }}-tests-build
|
||||
max-size: 50M
|
||||
|
||||
|
||||
- name: 📜 Restore CMakeCache
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
build/CMakeCache.txt
|
||||
key: ${{ runner.os }}-tests-build-${{ hashFiles('**/CMakeLists.txt') }}
|
||||
|
||||
- name: ⬇️ Install dependencies
|
||||
run: |
|
||||
sudo apt update
|
||||
@@ -44,19 +42,63 @@ jobs:
|
||||
|
||||
- name: 🛠️ Build
|
||||
run: |
|
||||
set -x
|
||||
mkdir -p build
|
||||
cd build
|
||||
CC=gcc-12 CXX=g++-12 cmake \
|
||||
-DCMAKE_BUILD_TYPE=Debug \
|
||||
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_C_FLAGS="-fuse-ld=lld -fsanitize=address,leak,undefined -fno-sanitize-recover=all" \
|
||||
-DCMAKE_CXX_FLAGS="-fuse-ld=lld -fsanitize=address,leak,undefined -fno-sanitize-recover=all" \
|
||||
-DIMHEX_OFFLINE_BUILD=ON \
|
||||
CC=gcc-14 CXX=g++-14 cmake \
|
||||
-DCMAKE_BUILD_TYPE=Debug \
|
||||
-DIMHEX_ENABLE_UNIT_TESTS=ON \
|
||||
-DIMHEX_ENABLE_PLUGIN_TESTS=ON \
|
||||
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_C_FLAGS="-fuse-ld=lld -fsanitize=address,leak,undefined -fno-sanitize-recover=all --coverage" \
|
||||
-DCMAKE_CXX_FLAGS="-fuse-ld=lld -fsanitize=address,leak,undefined -fno-sanitize-recover=all --coverage" \
|
||||
-DIMHEX_OFFLINE_BUILD=ON \
|
||||
-G Ninja \
|
||||
..
|
||||
make -j4 unit_tests
|
||||
ninja unit_tests
|
||||
ninja imhex_all
|
||||
|
||||
- name: 🧪 Perform plcli Integration Tests
|
||||
run: |
|
||||
cd lib/external/pattern_language
|
||||
python tests/integration/integration.py ../../../build/imhex --pl
|
||||
|
||||
- name: 🧪 Perform Unit Tests
|
||||
run: |
|
||||
cd build
|
||||
ctest --output-on-failure
|
||||
|
||||
# Generate report from all gcov .gcda files
|
||||
#- name: 🧪 Generate coverage report
|
||||
# run: |
|
||||
# sudo apt install python3-pip python3-venv
|
||||
# python3 -m venv venv
|
||||
# . venv/bin/activate
|
||||
# pip3 install gcovr
|
||||
# cd build
|
||||
# gcovr --gcov-executable /usr/bin/gcov-14 --exclude '.*/yara_rules/' --exclude '.*/third_party/' --exclude '.*/external/' --root .. --xml coverage_report.xml --verbose --gcov-ignore-errors all
|
||||
#
|
||||
#- name: Upload coverage reports to Codecov
|
||||
# env:
|
||||
# CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
||||
# if: ${{ env.CODECOV_TOKEN }}
|
||||
# uses: codecov/codecov-action@v4
|
||||
# with:
|
||||
# fail_ci_if_error: true
|
||||
# token: ${{ secrets.CODECOV_TOKEN }}
|
||||
# file: build/coverage_report.xml
|
||||
|
||||
langs:
|
||||
name: 🧪 Langs
|
||||
runs-on: ubuntu-22.04
|
||||
|
||||
steps:
|
||||
- name: 🧰 Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Check langs
|
||||
run:
|
||||
python3 tests/check_langs.py
|
||||
|
||||
25
.gitignore
vendored
25
.gitignore
vendored
@@ -1,11 +1,24 @@
|
||||
.vscode/
|
||||
.idea/
|
||||
/.vscode/
|
||||
/.idea/
|
||||
/.kdev4/
|
||||
/.vs/
|
||||
.venv/
|
||||
|
||||
cmake-build-*/
|
||||
build*/
|
||||
venv/
|
||||
/cmake-build-*/
|
||||
/build*/
|
||||
/local/
|
||||
/venv/
|
||||
/.cache/
|
||||
/install/
|
||||
/out/
|
||||
|
||||
/dist/ImHex.run.xml
|
||||
|
||||
*.mgc
|
||||
*.kdev4
|
||||
imgui.ini
|
||||
.DS_Store
|
||||
./CMakeUserPresets.json
|
||||
CMakeUserPresets.json
|
||||
Brewfile.lock.json
|
||||
|
||||
vcpkg.json
|
||||
|
||||
43
.gitmodules
vendored
43
.gitmodules
vendored
@@ -1,27 +1,31 @@
|
||||
[submodule "lib/external/nativefiledialog"]
|
||||
path = lib/external/nativefiledialog
|
||||
[submodule "lib/third_party/nativefiledialog"]
|
||||
path = lib/third_party/nativefiledialog
|
||||
url = https://github.com/btzy/nativefiledialog-extended
|
||||
ignore = dirty
|
||||
[submodule "lib/external/yara/yara"]
|
||||
path = lib/external/yara/yara
|
||||
[submodule "lib/third_party/yara/yara"]
|
||||
path = lib/third_party/yara/yara
|
||||
url = https://github.com/VirusTotal/yara
|
||||
ignore = dirty
|
||||
[submodule "lib/external/xdgpp"]
|
||||
path = lib/external/xdgpp
|
||||
url = https://git.sr.ht/~danyspin97/xdgpp
|
||||
[submodule "lib/third_party/xdgpp"]
|
||||
path = lib/third_party/xdgpp
|
||||
url = https://github.com/WerWolv/xdgpp
|
||||
ignore = dirty
|
||||
[submodule "lib/external/fmt"]
|
||||
path = lib/external/fmt
|
||||
[submodule "lib/third_party/fmt"]
|
||||
path = lib/third_party/fmt
|
||||
url = https://github.com/fmtlib/fmt
|
||||
ignore = dirty
|
||||
[submodule "lib/external/capstone"]
|
||||
path = lib/external/capstone
|
||||
[submodule "lib/third_party/capstone"]
|
||||
path = lib/third_party/capstone
|
||||
url = https://github.com/capstone-engine/capstone
|
||||
ignore = dirty
|
||||
[submodule "lib/external/jthread/jthread"]
|
||||
path = lib/external/jthread/jthread
|
||||
url = https://github.com/josuttis/jthread
|
||||
ignore = dirty
|
||||
[submodule "lib/third_party/edlib"]
|
||||
path = lib/third_party/edlib
|
||||
url = https://github.com/Martinsos/edlib
|
||||
ignore = dirty
|
||||
[submodule "lib/third_party/lunasvg"]
|
||||
path = lib/third_party/lunasvg
|
||||
url = https://github.com/sammycage/lunasvg
|
||||
ignore = dirty
|
||||
|
||||
[submodule "lib/external/libromfs"]
|
||||
path = lib/external/libromfs
|
||||
@@ -33,3 +37,12 @@
|
||||
path = lib/external/libwolv
|
||||
url = https://github.com/WerWolv/libwolv
|
||||
|
||||
[submodule "lib/third_party/HashLibPlus"]
|
||||
path = lib/third_party/HashLibPlus
|
||||
url = https://github.com/WerWolv/HashLibPlus
|
||||
[submodule "lib/external/disassembler"]
|
||||
path = lib/external/disassembler
|
||||
url = https://github.com/WerWolv/Disassembler
|
||||
[submodule "lib/third_party/md4c"]
|
||||
path = lib/third_party/md4c
|
||||
url = https://github.com/mity/md4c
|
||||
103
CMakeLists.txt
103
CMakeLists.txt
@@ -1,67 +1,100 @@
|
||||
cmake_minimum_required(VERSION 3.20)
|
||||
cmake_minimum_required(VERSION 3.25)
|
||||
|
||||
# Options
|
||||
option(IMHEX_PLUGINS_IN_SHARE "Put the plugins in share/imhex/plugins instead of lib[..]/imhex/plugins" OFF)
|
||||
option(IMHEX_STRIP_RELEASE "Strip the release builds" ON)
|
||||
option(IMHEX_OFFLINE_BUILD "Enable offline build" OFF)
|
||||
option(IMHEX_IGNORE_BAD_CLONE "Disable the bad clone prevention checks" OFF)
|
||||
option(IMHEX_PATTERNS_PULL_MASTER "Download latest files from master branch of the ImHex-Patterns repo" OFF)
|
||||
option(IMHEX_IGNORE_BAD_COMPILER "Allow compiling with an unsupported compiler" OFF)
|
||||
option(IMHEX_USE_GTK_FILE_PICKER "Use GTK file picker instead of xdg-desktop-portals" OFF)
|
||||
option(IMHEX_DISABLE_STACKTRACE "Disables support for printing stack traces" OFF)
|
||||
option(IMHEX_BUNDLE_DOTNET "Bundle .NET runtime" ON)
|
||||
option(IMHEX_ENABLE_LTO "Enables Link Time Optimizations if possible" OFF)
|
||||
option(IMHEX_USE_DEFAULT_BUILD_SETTINGS "Use default build settings" OFF)
|
||||
option(IMHEX_STRICT_WARNINGS "Enable most available warnings and treat them as errors" ON)
|
||||
option(IMHEX_STATIC_LINK_PLUGINS "Statically link all plugins into the main executable" OFF)
|
||||
option(IMHEX_PLUGINS_IN_SHARE "Put the plugins in share/imhex/plugins instead of lib[..]/imhex/plugins (Linux only)" OFF)
|
||||
option(IMHEX_STRIP_RELEASE "Strip the release builds" ON )
|
||||
option(IMHEX_OFFLINE_BUILD "Enable offline build" OFF)
|
||||
option(IMHEX_IGNORE_BAD_CLONE "Disable the bad clone prevention checks" OFF)
|
||||
option(IMHEX_PATTERNS_PULL_MASTER "Download latest files from master branch of the ImHex-Patterns repo" OFF)
|
||||
option(IMHEX_IGNORE_BAD_COMPILER "Allow compiling with an unsupported compiler" OFF)
|
||||
option(IMHEX_USE_GTK_FILE_PICKER "Use GTK file picker instead of xdg-desktop-portals (Linux only)" OFF)
|
||||
option(IMHEX_DISABLE_STACKTRACE "Disables support for printing stack traces" OFF)
|
||||
option(IMHEX_BUNDLE_DOTNET "Bundle .NET runtime" ON )
|
||||
option(IMHEX_ENABLE_LTO "Enables Link Time Optimizations if possible" OFF)
|
||||
option(IMHEX_USE_DEFAULT_BUILD_SETTINGS "Use default build settings" OFF)
|
||||
option(IMHEX_STRICT_WARNINGS "Enable most available warnings and treat them as errors" ON )
|
||||
option(IMHEX_BUILD_HARDENING "Enable hardening flags for build" ON )
|
||||
option(IMHEX_STATIC_LINK_PLUGINS "Statically link all plugins into the main executable" OFF)
|
||||
option(IMHEX_GENERATE_PACKAGE "Specify if a native package should be built. (Windows and MacOS only)" OFF)
|
||||
option(IMHEX_ENABLE_UNITY_BUILD "Enables building ImHex as a unity build." OFF)
|
||||
option(IMHEX_GENERATE_PDBS "Enable generating PDB files in non-debug builds (Windows only)" OFF)
|
||||
option(IMHEX_REPLACE_DWARF_WITH_PDB "Remove DWARF information from binaries when generating PDBS (Windows only)" OFF)
|
||||
option(IMHEX_ENABLE_STD_ASSERTS "Enable debug asserts in the C++ std library. (Breaks Plugin ABI!)" OFF)
|
||||
option(IMHEX_ENABLE_UNIT_TESTS "Enable building unit tests" ON )
|
||||
option(IMHEX_ENABLE_PLUGIN_TESTS "Enable building plugin tests" ON )
|
||||
option(IMHEX_ENABLE_IMGUI_TEST_ENGINE "Enable the ImGui Test Engine" OFF)
|
||||
option(IMHEX_ENABLE_PRECOMPILED_HEADERS "Enable precompiled headers" OFF)
|
||||
option(IMHEX_COMPRESS_DEBUG_INFO "Compress debug information" ON )
|
||||
option(IMHEX_ENABLE_CXX_MODULES "Enable C++20 Module compilation. Testing only!" OFF)
|
||||
option(IMHEX_ENABLE_CPPCHECK "Enable cppcheck static analysis" OFF)
|
||||
option(IMHEX_BUNDLE_PLUGIN_SDK "Enable bundling of Plugin SDK into install package" ON )
|
||||
|
||||
set(IMHEX_BASE_FOLDER "${CMAKE_CURRENT_SOURCE_DIR}")
|
||||
set(CMAKE_MODULE_PATH "${IMHEX_BASE_FOLDER}/cmake/modules")
|
||||
|
||||
# Optional IDE support
|
||||
include("${IMHEX_BASE_FOLDER}/cmake/ide_helpers.cmake")
|
||||
|
||||
# Basic compiler and cmake configurations
|
||||
set(CMAKE_CXX_STANDARD 23)
|
||||
set(CMAKE_CXX_SCAN_FOR_MODULES ${IMHEX_ENABLE_CXX_MODULES})
|
||||
set(CMAKE_INCLUDE_DIRECTORIES_BEFORE ON)
|
||||
set(IMHEX_BASE_FOLDER ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
set(CMAKE_MODULE_PATH "${IMHEX_BASE_FOLDER}/cmake/modules")
|
||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||
include("${IMHEX_BASE_FOLDER}/cmake/build_helpers.cmake")
|
||||
|
||||
# Setup project
|
||||
loadVersion(IMHEX_VERSION)
|
||||
loadVersion(IMHEX_VERSION IMHEX_VERSION_PLAIN)
|
||||
setVariableInParent(IMHEX_VERSION ${IMHEX_VERSION})
|
||||
|
||||
configureCMake()
|
||||
project(imhex
|
||||
LANGUAGES C CXX VERSION ${IMHEX_VERSION}
|
||||
DESCRIPTION "The ImHex Hex Editor"
|
||||
HOMEPAGE_URL "https://imhex.werwolv.net"
|
||||
project(ImHex
|
||||
LANGUAGES C CXX
|
||||
VERSION ${IMHEX_VERSION_PLAIN}
|
||||
DESCRIPTION "The ImHex Hex Editor"
|
||||
HOMEPAGE_URL "https://imhex.werwolv.net"
|
||||
)
|
||||
configureProject()
|
||||
|
||||
# Add ImHex sources
|
||||
add_custom_target(imhex_all ALL)
|
||||
|
||||
# Make sure project is configured correctly
|
||||
setDefaultBuiltTypeIfUnset()
|
||||
detectBadClone()
|
||||
verifyCompiler()
|
||||
|
||||
# List plugin names here. Project name must match folder name
|
||||
set(PLUGINS
|
||||
builtin
|
||||
windows
|
||||
script_loader
|
||||
)
|
||||
detectBundledPlugins()
|
||||
|
||||
# Add various defines
|
||||
detectOS()
|
||||
detectArch()
|
||||
addDefines()
|
||||
|
||||
# Configure packaging and install targets
|
||||
configurePackingResources()
|
||||
setUninstallTarget()
|
||||
addBundledLibraries()
|
||||
|
||||
# Add ImHex sources
|
||||
add_custom_target(imhex_all ALL)
|
||||
|
||||
add_subdirectory(lib/libimhex)
|
||||
add_subdirectory(main)
|
||||
addPluginDirectories()
|
||||
add_subdirectory(lib/trace)
|
||||
|
||||
# Add unit tests
|
||||
enable_testing()
|
||||
add_subdirectory(tests EXCLUDE_FROM_ALL)
|
||||
if (IMHEX_ENABLE_UNIT_TESTS)
|
||||
if (NOT TARGET unit_tests)
|
||||
enable_testing()
|
||||
add_custom_target(unit_tests)
|
||||
add_subdirectory(tests EXCLUDE_FROM_ALL)
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
# Configure packaging
|
||||
# Configure more resources that will be added to the install package
|
||||
if (IMHEX_BUNDLE_PLUGIN_SDK)
|
||||
generateSDKDirectory()
|
||||
endif()
|
||||
|
||||
# Handle package generation
|
||||
createPackage()
|
||||
generatePDBs()
|
||||
|
||||
# Accommodate IDEs with FOLDER support
|
||||
tweakTargetsForIDESupport()
|
||||
|
||||
@@ -28,7 +28,47 @@
|
||||
"displayName": "x86_64 Build",
|
||||
"description": "x86_64 build",
|
||||
"inherits": [ "base" ]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "xcode",
|
||||
"inherits": [ "base" ],
|
||||
|
||||
"displayName": "Xcode",
|
||||
"description": "Xcode with external compiler override",
|
||||
"generator": "Xcode",
|
||||
|
||||
"cacheVariables": {
|
||||
"CMAKE_C_COMPILER": "clang",
|
||||
|
||||
"CMAKE_CXX_COMPILER": "clang++",
|
||||
"CMAKE_CXX_FLAGS": "-fexperimental-library -Wno-shorten-64-to-32 -Wno-deprecated-declarations",
|
||||
|
||||
"IMHEX_IDE_HELPERS_OVERRIDE_XCODE_COMPILER": "ON"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "vs2022",
|
||||
"displayName": "Visual Studio 2022",
|
||||
"generator": "Ninja",
|
||||
"binaryDir": "${sourceDir}/build/${presetName}",
|
||||
"cacheVariables": {
|
||||
"CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake",
|
||||
"VCPKG_MANIFEST_DIR": "${sourceDir}/dist"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "vs2022-x86",
|
||||
"displayName": "Visual Studio 2022 x86",
|
||||
"generator": "Ninja",
|
||||
"binaryDir": "${sourceDir}/build/${presetName}",
|
||||
"cacheVariables": {
|
||||
"CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake",
|
||||
"VCPKG_MANIFEST_DIR": "${sourceDir}/dist"
|
||||
},
|
||||
"environment": {
|
||||
"VSCMD_ARG_TGT_ARCH": "x86"
|
||||
}
|
||||
}
|
||||
],
|
||||
"buildPresets": [
|
||||
{
|
||||
|
||||
@@ -10,9 +10,7 @@ This document is a guide for developers who want to contribute to ImHex in any w
|
||||
|
||||
If you'd like to add new features, the best way to start is by joining our Discord and telling us about your idea. We can then discuss the best way to implement it and how it should be integrated into ImHex or if it should be done in a separate plugin.
|
||||
|
||||
There are standalone plugin templates that use ImHex as a submodule. You can find them here:
|
||||
- https://github.com/WerWolv/ImHex-Cpp-Plugin-Template
|
||||
- https://github.com/WerWolv/ImHex-Rust-Plugin-Template
|
||||
There are standalone plugin templates that use ImHex as a submodule. You can find them located in the README's [Plugin Development](README.md#plugin-development) section.
|
||||
|
||||
### Adding a new language
|
||||
|
||||
@@ -32,18 +30,18 @@ ImHex is written in C++ and usually uses the latest compiler and standard librar
|
||||
### Structure
|
||||
|
||||
- `main`: Contains the main application code
|
||||
- Important to understand here is that the main ImHex application is basically just an empty shell.
|
||||
- Important to understand here is that the main ImHex application is basically just an empty shell.
|
||||
- All it does is create a Window and a OpenGL context using GLFW, load all available plugins, properly configure ImGui and render it to the screen.
|
||||
- Everything else is done inside of plugins. ImHex comes with a few plugins by default, most notably the `builtin` plugin which contains the majority of the application code.
|
||||
- In most cases, this code doesn't need to be modified. Most features should be self-contained inside a plugin.
|
||||
- `lib`
|
||||
- `libimhex`: Contains all helper utilities as well as various APIs for plugins to interact with ImHex.
|
||||
- The library's main purpose is for Dependency Inversion. The ImHex main application as well as libimhex do not know about the existence of plugins at build time. Plugins and the main application instead link against libimhex and use it as a common API to interact with each other.
|
||||
- Since libimhex is a doesn't know about the existence of plugins, it cannot depend on any of them. This includes localizations and things that get registered by plugins after launch.
|
||||
- Since libimhex itself doesn't know about the existence of plugins, it cannot depend on any of them. This includes localizations and things that get registered by plugins after launch.
|
||||
- Even if the builtin plugin is technically always available, it is still a plugin and should be treated that way.
|
||||
- All important APIs can be found in the `hex/api` include directory and are documented in the respective header file.
|
||||
- `external`: All libraries that need custom patches or aren't typically available in package managers go into here.
|
||||
- If you'd like to add new features to the Pattern language, please make a PR to https://github.com/WerWolv/PatternLanguage instead. ImHex usually depends on the latest commit of the master branch of this repo.
|
||||
- If you'd like to add new features to the Pattern language, please make a PR to https://github.com/WerWolv/PatternLanguage instead. ImHex usually depends on the latest commit of the master branch of this repo.
|
||||
- `plugins`
|
||||
- `builtin`: The builtin plugin. Contains the majority of the application code.
|
||||
- It's the heart of ImHex's functionality. It contains most of the default views, providers, etc. so if you want to add new functionality to ImHex, this is the place to start.
|
||||
|
||||
@@ -32,6 +32,13 @@ To install the Flatpak, make sure you have the Flathub repository added to your
|
||||
|
||||
```bash
|
||||
flatpak install flathub net.werwolv.ImHex
|
||||
# or install the file directly
|
||||
flatpak install ./imhex-*.flatpak
|
||||
```
|
||||
|
||||
#### Snap
|
||||
```bash
|
||||
snap install ./imhex-*.snap
|
||||
```
|
||||
|
||||
#### Ubuntu DEB Package
|
||||
|
||||
8
PRIVACY.md
Normal file
8
PRIVACY.md
Normal file
@@ -0,0 +1,8 @@
|
||||
# Privacy Policy
|
||||
|
||||
ImHex collects **anonymous** user statistics based on the user's preferences which are set on first launch and can be opted in or out at any moment through the settings interface.
|
||||
These statistics contain basic system information such as: ImHex Version, System Architecture, OS, OS Version or Linux Distro version of the GPU in use. This information is linked to a randomly generated ID which cannot be used to identify a specific user.
|
||||
|
||||
Additionally, we allow uploading of anonymized crash log files in case of an error. These are never uploaded automatically but only after explicit consent by the user. This decision is not saved so logs can be uploaded on a per-error basis.
|
||||
|
||||
Information collected may be analyzed by members of our development team and will never be shared with third parties outside of the team. We may occasionally share general usage statistics publically in a summarized manner (For example a graph stating 70% of users are using a specific OS). We will never share information about individual users, even if they are anonymous.
|
||||
454
README.md
454
README.md
@@ -1,42 +1,30 @@
|
||||
<a href="https://imhex.werwolv.net">
|
||||
<h1 align="center">
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="./resources/projects/logo_text_light.svg">
|
||||
<img height="100px" src="./resources/projects/logo_text_dark.svg">
|
||||
<img height="300px" style="margin: 0; padding: 0" src="./resources/dist/common/logo/ImHexLogoSVGBG.svg">
|
||||
</picture>
|
||||
</h1>
|
||||
</a>
|
||||
|
||||
<p align="center">A Hex Editor for Reverse Engineers, Programmers and people who value their retinas when working at 3 AM.</p>
|
||||
|
||||
<p align="center">
|
||||
<a title="'Build' workflow Status" href="https://github.com/WerWolv/ImHex/actions?query=workflow%3ABuild">
|
||||
<img alt="'Build' workflow Status" src="https://img.shields.io/github/actions/workflow/status/WerWolv/ImHex/build.yml?longCache=true&style=for-the-badge&label=Build&logoColor=fff&logo=GitHub%20Actions&branch=master">
|
||||
</a>
|
||||
<a title="Discord Server" href="https://discord.gg/X63jZ36xBY">
|
||||
<img alt="Discord Server" src="https://img.shields.io/discord/789833418631675954?label=Discord&logo=Discord&logoColor=fff&style=for-the-badge">
|
||||
</a>
|
||||
<a title="Total Downloads" href="https://github.com/WerWolv/ImHex/releases/latest">
|
||||
<img alt="Total Downloads" src="https://img.shields.io/github/downloads/WerWolv/ImHex/total?longCache=true&style=for-the-badge&label=Downloads&logoColor=fff&logo=GitHub">
|
||||
</a>
|
||||
<a title="Code Quality" href="https://www.codefactor.io/repository/github/werwolv/imhex">
|
||||
<img alt="Code Quality" src="https://img.shields.io/codefactor/grade/github/WerWolv/ImHex?longCache=true&style=for-the-badge&label=Code%20Quality&logoColor=fff&logo=CodeFactor&branch=master">
|
||||
</a>
|
||||
<a title="Translation" href="https://weblate.werwolv.net/projects/imhex/">
|
||||
<img alt="Translation" src="https://img.shields.io/weblate/progress/imhex?logo=weblate&logoColor=%23FFFFFF&server=https%3A%2F%2Fweblate.werwolv.net&style=for-the-badge">
|
||||
</a>
|
||||
<a title="Documentation" href="https://imhex.werwolv.net/docs">
|
||||
<img alt="Documentation" src="https://img.shields.io/badge/Docs-Available-brightgreen?logo=gitbook&logoColor=%23FFFFFF&style=for-the-badge">
|
||||
</a>
|
||||
<a title="Plugins" href="https://github.com/WerWolv/ImHex/blob/master/PLUGINS.md">
|
||||
<img alt="Plugins" src="https://img.shields.io/badge/Plugins-Supported-brightgreen?logo=stackedit&logoColor=%23FFFFFF&style=for-the-badge">
|
||||
</a>
|
||||
A Hex Editor for Reverse Engineers, Programmers and people who value their retinas when working at 3 AM.
|
||||
<br>
|
||||
<a href="https://itinerarium.github.io/phoneme-synthesis/?w=/'ˈɪmhɛks/"><strong>/ˈɪmhɛks/</strong></a>
|
||||
</p>
|
||||
<p align="center">
|
||||
<a title="'Build' workflow Status" href="https://github.com/WerWolv/ImHex/actions?query=workflow%3ABuild"><img alt="'Build' workflow Status" src="https://img.shields.io/github/actions/workflow/status/WerWolv/ImHex/build.yml?longCache=true&style=for-the-badge&label=Build&logoColor=fff&logo=GitHub%20Actions&branch=master"></a>
|
||||
<a title="Discord Server" href="https://discord.gg/X63jZ36xBY"><img alt="Discord Server" src="https://img.shields.io/discord/789833418631675954?label=Discord&logo=Discord&logoColor=fff&style=for-the-badge"></a>
|
||||
<a title="Total Downloads" href="https://github.com/WerWolv/ImHex/releases/latest"><img alt="Total Downloads" src="https://img.shields.io/github/downloads/WerWolv/ImHex/total?longCache=true&style=for-the-badge&label=Downloads&logoColor=fff&logo=GitHub"></a>
|
||||
<a title="Code Quality" href="https://www.codefactor.io/repository/github/werwolv/imhex"><img alt="Code Quality" src="https://img.shields.io/codefactor/grade/github/WerWolv/ImHex?longCache=true&style=for-the-badge&label=Code%20Quality&logoColor=fff&logo=CodeFactor&branch=master"></a>
|
||||
<a title="Translation" href="https://weblate.werwolv.net/projects/imhex/"><img alt="Translation" src="https://img.shields.io/weblate/progress/imhex?logo=weblate&logoColor=%23FFFFFF&server=https%3A%2F%2Fweblate.werwolv.net&style=for-the-badge"></a>
|
||||
<a title="Plugins" href="https://github.com/WerWolv/ImHex/blob/master/PLUGINS.md"><img alt="Plugins" src="https://img.shields.io/badge/Plugins-Supported-brightgreen?logo=stackedit&logoColor=%23FFFFFF&style=for-the-badge"></a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a title="Use the Web version of ImHex right in your browser!" href="https://web.imhex.werwolv.net">
|
||||
<img alt="Use the Web version of ImHex right in your browser!" src="resources/dist/common/try_online_banner.png">
|
||||
</a>
|
||||
<a title="Download the latest version of ImHex" href="https://imhex.download"><img alt="Download the latest version of ImHex!" src="resources/dist/common/get_release_banner.png"></a>
|
||||
<a title="Download the latest nightly pre-release version of ImHex" href="https://imhex.download/#nightly"><img alt="Download the latest nightly pre-release version of ImHex" src="resources/dist/common/get_nightly_banner.png"></a>
|
||||
<a title="Use the Web version of ImHex right in your browser!" href="https://web.imhex.werwolv.net"><img alt="Use the Web version of ImHex right in your browser!" src="resources/dist/common/try_online_banner.png"></a>
|
||||
<a title="Read the documentation of ImHex!" href="https://docs.werwolv.net"><img alt="Read the documentation of ImHex!" src="resources/dist/common/read_docs_banner.png"></a>
|
||||
</p>
|
||||
|
||||
## Supporting
|
||||
@@ -44,93 +32,282 @@
|
||||
If you like my work, please consider supporting me on GitHub Sponsors, Patreon or PayPal. Thanks a lot!
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/sponsors/WerWolv"><img src="https://werwolv.net/assets/github_banner.png" alt="GitHub donate button" /> </a>
|
||||
<a href="https://www.patreon.com/werwolv"><img src="https://c5.patreon.com/external/logo/become_a_patron_button.png" alt="Patreon donate button" /> </a>
|
||||
<a href="https://werwolv.net/donate"><img src="https://werwolv.net/assets/paypal_banner.png" alt="PayPal donate button" /> </a>
|
||||
<a href="https://github.com/sponsors/WerWolv"><img src="https://werwolv.net/assets/github_banner.png" alt="GitHub donate button" /></a>
|
||||
<a href="https://www.patreon.com/werwolv"><img src="https://c5.patreon.com/external/logo/become_a_patron_button.png" alt="Patreon donate button" /></a>
|
||||
<a href="https://werwolv.net/donate"><img src="https://werwolv.net/assets/paypal_banner.png" alt="PayPal donate button" /></a>
|
||||
</p>
|
||||
|
||||
## Screenshots
|
||||
### Notable Sponsors
|
||||
| | |
|
||||
|:---------------------------------------------------------------------------------------------------:|-----------------------------------------------------------------------------------|
|
||||
| [](https://www.jetbrains.com) | JetBrains, providing us with free All Products Pack licenses for development |
|
||||
| [](https://signpath.io/) | SignPath, providing us with free Code Signing Certificates for our Windows builds |
|
||||
| [](https://aws.amazon.com) | Amazon, providing us with free AWS Cloud Credits for our CI |
|
||||
|
||||

|
||||

|
||||
Would you like to appear here as well? Contact us at [imhex@werwolv.net](mailto:imhex@werwolv.net)!
|
||||
|
||||
## Screenshots
|
||||

|
||||

|
||||
|
||||
<details>
|
||||
<summary><strong>More Screenshots</strong></summary>
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
</details>
|
||||
|
||||
## Features
|
||||
|
||||
- Featureful hex view
|
||||
<details>
|
||||
<summary><strong>Featureful hex view</strong></summary>
|
||||
|
||||
- Byte patching
|
||||
- Patch management
|
||||
- Copy bytes as feature
|
||||
- Infinite Undo/Redo
|
||||
- "Copy bytes as..."
|
||||
- Bytes
|
||||
- Hex string
|
||||
- C, C++, C#, Rust, Python, Java & JavaScript array
|
||||
- ASCII-Art hex view
|
||||
- HTML self-contained div
|
||||
- String and hex search
|
||||
- Colorful highlighting
|
||||
- Simple string and hex search
|
||||
- Goto from start, end and current cursor position
|
||||
- Custom C++-like pattern language for parsing highlighting a file's content
|
||||
- Automatic loading based on MIME type
|
||||
- arrays, pointers, structs, unions, enums, bitfields, namespaces, little and big endian support, conditionals and much more!
|
||||
- Colorful highlighting
|
||||
- Configurable foreground highlighting rules
|
||||
- Background highlighting using patterns, find results and bookmarks
|
||||
- Displaying data as a list of many different types
|
||||
- Hexadecimal integers (8, 16, 32, 64 bit)
|
||||
- Signed and unsigned decimal integers (8, 16, 32, 64 bit)
|
||||
- Floats (16, 32, 64 bit)
|
||||
- RGBA8 Colors
|
||||
- HexII
|
||||
- Binary
|
||||
- Decoding data as ASCII and custom encodings
|
||||
- Built-in support for UTF-8, UTF-16, ShiftJIS, most Windows encodings and many more
|
||||
- Paged data view
|
||||
</details>
|
||||
<details>
|
||||
<summary><strong>Custom C++-like pattern language for parsing highlighting a file's content</strong></summary>
|
||||
|
||||
- Automatic loading based on MIME types and magic values
|
||||
- Arrays, pointers, structs, unions, enums, bitfields, namespaces, little and big endian support, conditionals and much more!
|
||||
- Useful error messages, syntax highlighting and error marking
|
||||
- Doesn't burn out your retinas when used in late-night sessions
|
||||
- Dark mode by default, but a light mode is available as well
|
||||
- Data importing
|
||||
- Support for visualizing many different types of data
|
||||
- Images
|
||||
- Audio
|
||||
- 3D Models
|
||||
- Coordinates
|
||||
- Time stamps
|
||||
</details>
|
||||
<details>
|
||||
<summary><strong>Theming support</strong></summary>
|
||||
|
||||
- Doesn't burn out your retinas when used in late-night sessions
|
||||
- Dark mode by default, but a light mode is available as well
|
||||
- Customizable colors and styles for all UI elements through shareable theme files
|
||||
- Support for custom fonts
|
||||
</details>
|
||||
<details>
|
||||
<summary><strong>Importing and Exporting data</strong></summary>
|
||||
|
||||
- Base64 files
|
||||
- IPS and IPS32 patches
|
||||
- Data exporting
|
||||
- IPS and IPS32 patches
|
||||
- Data inspector allowing interpretation of data as many different types (little and big endian)
|
||||
- Huge file support with fast and efficient loading
|
||||
- String search
|
||||
- Copying of strings
|
||||
- Copying of demangled strings
|
||||
- File hashing support
|
||||
- CRC16 and CRC32 with custom initial values and polynomials
|
||||
- MD4, MD5
|
||||
- SHA-1, SHA-224, SHA-256, SHA-384, SHA-512
|
||||
- Disassembler supporting many architectures (frontend for Capstone)
|
||||
- ARM32 (ARM, Thumb, Cortex-M, AArch32)
|
||||
- ARM64
|
||||
- MIPS (MIPS32, MIPS64, MIPS32R6, Micro)
|
||||
- x86 (16-bit, 32-bit, 64-bit)
|
||||
- PowerPC (32-bit, 64-bit)
|
||||
- SPARC
|
||||
- IBM SystemZ
|
||||
- xCORE
|
||||
- M68K
|
||||
- TMS320C64X
|
||||
- M680X
|
||||
- Ethereum
|
||||
- RISC-V
|
||||
- WebAssembly
|
||||
- MOS65XX
|
||||
- Berkeley Packet Filter
|
||||
- Bookmarks
|
||||
- Region highlighting
|
||||
- Comments
|
||||
- Data Analyzer
|
||||
- Markdown reports
|
||||
- Binary arrays for various programming languages
|
||||
</details>
|
||||
<details>
|
||||
<summary><strong>Data Inspector</strong></summary>
|
||||
|
||||
- Interpreting data as many different types with endianness, decimal, hexadecimal and octal support and bit inversion
|
||||
- Unsigned and signed integers (8, 16, 24, 32, 48, 64 bit)
|
||||
- Floats (16, 32, 64 bit)
|
||||
- Signed and Unsigned LEB128
|
||||
- ASCII, Wide and UTF-8 characters and strings
|
||||
- time32_t, time64_t, DOS date and time
|
||||
- GUIDs
|
||||
- RGBA8 and RGB65 Colors
|
||||
- Copying and modifying bytes through the inspector
|
||||
- Adding new data types through the pattern language
|
||||
- Support for hiding rows that aren't used
|
||||
</details>
|
||||
<details>
|
||||
<summary><strong>Node-based data pre-processor</strong></summary>
|
||||
|
||||
- Modify, decrypt and decode data before it's being displayed in the hex editor
|
||||
- Modify data without touching the underlying source
|
||||
- Support for adding custom nodes
|
||||
</details>
|
||||
<details>
|
||||
<summary><strong>Loading data from many different data sources</strong></summary>
|
||||
|
||||
- Local Files
|
||||
- Support for huge files with fast and efficient loading
|
||||
- Raw Disks
|
||||
- Loading data from raw disks and partitions
|
||||
- GDB Server
|
||||
- Access the RAM of a running process or embedded devices through GDB
|
||||
- Intel Hex and Motorola SREC data
|
||||
- Base64 encoded data
|
||||
- UDP Packets
|
||||
- Support for displaying raw data received over UDP
|
||||
- Process Memory
|
||||
- Inspect the entire address space of a running process
|
||||
- Remote Files over SSH with SFTP
|
||||
- Support for loading files from remote servers using SSH and SFTP
|
||||
</details>
|
||||
<details>
|
||||
<summary><strong>Data searching</strong></summary>
|
||||
|
||||
- Support for searching the entire file or only a selection
|
||||
- String extraction
|
||||
- Option to specify minimum length and character set (lower case, upper case, digits, symbols)
|
||||
- Option to specify encoding (ASCII, UTF-8, UTF-16 big and little endian)
|
||||
- Sequence search
|
||||
- Search for a sequence of bytes or characters
|
||||
- Option to ignore character case
|
||||
- Regex search
|
||||
- Search for strings using regular expressions
|
||||
- Binary Pattern
|
||||
- Search for sequences of bytes with optional wildcards
|
||||
- Numeric Value search
|
||||
- Search for signed/unsigned integers and floats
|
||||
- Search for ranges of values
|
||||
- Option to specify size and endianness
|
||||
- Option to ignore unaligned values
|
||||
</details>
|
||||
<details>
|
||||
<summary><strong>Data hashing support</strong></summary>
|
||||
|
||||
- Many different algorithms available
|
||||
- CRC8, CRC16 and CRC32 with custom initial values and polynomials
|
||||
- Many default polynomials available
|
||||
- MD5
|
||||
- SHA-1, SHA-224, SHA-256, SHA-384, SHA-512
|
||||
- Adler32
|
||||
- AP
|
||||
- BKDR
|
||||
- Bernstein, Bernstein1
|
||||
- DEK, DJB, ELF, FNV1, FNV1a, JS, PJW, RS, SDBM
|
||||
- OneAtTime, Rotating, ShiftAndXor, SuperFast
|
||||
- Murmur2_32, MurmurHash3_x86_32, MurmurHash3_x86_128, MurmurHash3_x64_128
|
||||
- SipHash64, SipHash128
|
||||
- XXHash32, XXHash64
|
||||
- Tiger, Tiger2
|
||||
- Blake2B, Blake2S
|
||||
- Hashing of specific regions of the loaded data
|
||||
- Hashing of arbitrary strings
|
||||
</details>
|
||||
<details>
|
||||
<summary><strong>Diffing support</strong></summary>
|
||||
|
||||
- Compare data of different data sources
|
||||
- Difference highlighting
|
||||
- Table view of differences
|
||||
</details>
|
||||
<details>
|
||||
<summary><strong>Integrated disassembler</strong></summary>
|
||||
|
||||
- Support for all architectures supported by Capstone
|
||||
- ARM32 (ARM, Thumb, Cortex-M, AArch32)
|
||||
- ARM64
|
||||
- MIPS (MIPS32, MIPS64, MIPS32R6, Micro)
|
||||
- x86 (16-bit, 32-bit, 64-bit)
|
||||
- PowerPC (32-bit, 64-bit)
|
||||
- SPARC
|
||||
- IBM SystemZ
|
||||
- xCORE
|
||||
- M68K
|
||||
- TMS320C64X
|
||||
- M680X
|
||||
- Ethereum
|
||||
- RISC-V
|
||||
- WebAssembly
|
||||
- MOS65XX
|
||||
- Berkeley Packet Filter
|
||||
- Support for writing custom disassemblers for your own architectures
|
||||
</details>
|
||||
<details>
|
||||
<summary><strong>Bookmarks</strong></summary>
|
||||
|
||||
- Support for bookmarks with custom names and colors
|
||||
- Highlighting of bookmarked region in the hex editor
|
||||
- Jump to bookmarks
|
||||
- Open content of bookmark in a new tab
|
||||
- Add comments to bookmarks
|
||||
</details>
|
||||
<details>
|
||||
<summary><strong>Featureful data analyzer and visualizer</strong></summary>
|
||||
|
||||
- File magic-based file parser and MIME type database
|
||||
- Byte distribution graph
|
||||
- Byte type distribution graph
|
||||
- Entropy graph
|
||||
- Highest and average entropy
|
||||
- Encrypted / Compressed file detection
|
||||
- Built-in Content Store
|
||||
- Download all files found in the database directly from within ImHex
|
||||
- Yara Rules support
|
||||
- Quickly scan a file for vulnerabilities with official yara rules
|
||||
- Helpful tools
|
||||
- Itanium and MSVC demangler
|
||||
- Digram and Layered distribution graphs
|
||||
</details>
|
||||
<details>
|
||||
<summary><strong>YARA Rule support</strong></summary>
|
||||
|
||||
- Scan a file for vulnerabilities with official yara rules
|
||||
- Highlight matches in the hex editor
|
||||
- Jump to matches
|
||||
- Apply multiple rules at once
|
||||
</details>
|
||||
<details>
|
||||
<summary><strong>Helpful tools</strong></summary>
|
||||
|
||||
- Itanium, MSVC, Rust and D-Lang demangler based on LLVM
|
||||
- ASCII table
|
||||
- Regex replacer
|
||||
- Mathematical expression evaluator (Calculator)
|
||||
- Hexadecimal Color picker
|
||||
- Graphing calculator
|
||||
- Hexadecimal Color picker with support for many different formats
|
||||
- Base converter
|
||||
- Byte swapper
|
||||
- UNIX Permissions calculator
|
||||
- Wikipedia term definition finder
|
||||
- File utilities
|
||||
- File splitter
|
||||
- File combiner
|
||||
- File shredder
|
||||
- IEEE754 Float visualizer
|
||||
- Division by invariant multiplication calculator
|
||||
- TCP Client/Server
|
||||
- Euclidean algorithm calculator
|
||||
- HTTP Requests
|
||||
</details>
|
||||
<details>
|
||||
<summary><strong>Built-in Content updater</strong></summary>
|
||||
|
||||
- Download all files found in the database directly from within ImHex
|
||||
- Pattern files for decoding various file formats
|
||||
- Libraries for the pattern language
|
||||
- Magic files for file type detection
|
||||
- Custom data processor nodes
|
||||
- Custom encodings
|
||||
- Custom themes
|
||||
- Yara rules
|
||||
</details>
|
||||
<details>
|
||||
<summary><strong>Modern Interface</strong></summary>
|
||||
|
||||
- Support for multiple workspaces
|
||||
- Support for custom layouts
|
||||
- Detachable windows
|
||||
</details>
|
||||
<details>
|
||||
<summary><strong>Easy to get started</strong></summary>
|
||||
|
||||
- Support for many different languages
|
||||
- Simplified mode for beginners
|
||||
- Extensive documentation
|
||||
- Many example files available on [the Database](https://github.com/WerWolv/ImHex-Patterns)
|
||||
- Achievements guiding you through the features of ImHex
|
||||
- Interactive tutorials
|
||||
</details>
|
||||
|
||||
## Pattern Language
|
||||
|
||||
@@ -148,22 +325,34 @@ For format patterns, libraries, magic and constant files, check out the [ImHex-P
|
||||
|
||||
## Requirements
|
||||
|
||||
To use ImHex, the following minimal system requirements need to be met:
|
||||
To use ImHex, the following minimal system requirements need to be met.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> ImHex requires a GPU with OpenGL 3.0 support in general.
|
||||
> There are releases available (with the `-NoGPU` suffix) that are software rendered and don't require a GPU, however these can be a lot slower than the GPU accelerated versions.
|
||||
>
|
||||
> If possible at all, make ImHex use the dedicated GPU on your system instead of the integrated one.
|
||||
> ImHex will usually run fine with integrated GPUs as well but certain Intel HD GPU drivers on Windows are known to cause graphical artifacts.
|
||||
|
||||
- **OS**:
|
||||
- **Windows**: Windows 7 or higher (Windows 10/11 recommended)
|
||||
- **macOS**: macOS 11 (Big Sur) or higher,
|
||||
- **Linux**: "Modern" Linux. The following distributions have official releases available. Other distros are supported through the AppImage and Flatpak releases.
|
||||
- Ubuntu 22.04/23.04
|
||||
- Fedora 36/37
|
||||
- RHEL/AlmaLinux 9
|
||||
- **macOS**: macOS 15 (Sequoia) or higher,
|
||||
- Lower versions should still work too, but you'll need to compile ImHex yourself. The release binaries will NOT work due to GitHub not having any macOS 15 or lower CI runners available.
|
||||
- The macOS build is not signed and will require you to manually allow them in the Security & Privacy settings.
|
||||
- **Linux**: "Modern" Linux. The following distributions have official releases available. Other distros are supported through the AppImage, Flatpak and Snap releases.
|
||||
- Ubuntu and Debian
|
||||
- Fedora
|
||||
- RHEL/AlmaLinux
|
||||
- Arch Linux
|
||||
- **CPU**: x86_64 (64 Bit)
|
||||
- Basically any other distro will work as well when compiling ImHex from sources.
|
||||
- **FreeBSD**: Tested on FreeBSD 14.3
|
||||
- Other versions will most likely work too but are untested
|
||||
- **CPU**: Officially supported are x86, AMD64 and ARM64, though any Little Endian CPU should work.
|
||||
- **GPU**: OpenGL 3.0 or higher
|
||||
- Intel HD drivers are really buggy and often cause graphic artifacts
|
||||
- Integrated Intel HD iGPUs are supported, however certain drivers are known to cause various graphical artifacts, especially on Windows. Use at your own risk.
|
||||
- In case you don't have a GPU available, there are software rendered releases available for Windows and macOS
|
||||
- **RAM**: 256MB, more may be required for more complicated analysis
|
||||
- **Storage**: 100MB
|
||||
- **RAM**: ~50MiB, more is required for more complex analysis
|
||||
- **Storage**: ~100MiB
|
||||
|
||||
## Installing
|
||||
|
||||
@@ -172,44 +361,87 @@ Information on how to install ImHex can be found in the [Install](/INSTALL.md) g
|
||||
## Compiling
|
||||
|
||||
To compile ImHex on any platform, GCC (or Clang) is required with a version that supports C++23 or higher.
|
||||
On macOS, Clang is also required to compile some ObjC code.
|
||||
All releases are being built using latest available GCC.
|
||||
Windows and Linux releases are being built using latest available GCC.
|
||||
MacOS releases are being built using latest available LLVM Clang.
|
||||
|
||||
Many dependencies are bundled into the repository using submodules so make sure to clone it using the `--recurse-submodules` option.
|
||||
All dependencies that aren't bundled, can be installed using the dependency installer scripts found in the `/dist` folder.
|
||||
Important to note is, the MSVC and AppleClang compilers are both **NOT** supported since they're both generally severely outdated and lack features GCC and LLVM Clang have.
|
||||
|
||||
> [!NOTE]
|
||||
> Many dependencies are bundled into the repository using submodules so make sure to clone it using the `--recurse-submodules` option.
|
||||
> All dependencies that aren't bundled, can be installed using the dependency installer scripts found in the `/dist` folder.
|
||||
|
||||
For more information, check out the [Compiling](/dist/compiling) guide.
|
||||
|
||||
## Contributing
|
||||
See [Contributing](/CONTRIBUTING.md)
|
||||
|
||||
## Plugin development
|
||||
|
||||
To develop plugins for ImHex, use one of the following two templates projects to get started. You then have access to the entirety of libimhex as well as the ImHex API and the Content Registry to interact with ImHex or to add new content.
|
||||
- [C++ Plugin Template](https://github.com/WerWolv/ImHex-Cpp-Plugin-Template)
|
||||
- [Rust Plugin Template](https://github.com/WerWolv/ImHex-Rust-Plugin-Template)
|
||||
## Plugin development
|
||||
To develop plugins for ImHex, use the following template project to get started. You then have access to the entirety of libimhex as well as the ImHex API and the Content Registry to interact with ImHex or to add new content.
|
||||
To build a plugin, you will need to use our SDK
|
||||
|
||||
### Getting the SDK locally
|
||||
You can build the SDK by compiling ImHex like this:
|
||||
- `cmake -G Ninja -DIMHEX_BUNDLE_PLUGIN_SDK=ON -B build`
|
||||
- `cd build`
|
||||
- `DESTDIR=install ninja install`
|
||||
The SDK will then be available at `install/usr/local/share/imhex/sdk`. You will need to set the variable `IMHEX_SDK_PATH` to that (absolute) path.
|
||||
|
||||
### Getting the SDK in a Github Actions CI
|
||||
You can use [this action](https://github.com/WerWolv/imhex-download-sdk) to automatically download the SDK to your Github Runner
|
||||
- [ImHex Plugin Template](https://github.com/WerWolv/ImHex-Plugin-Template)
|
||||
|
||||
|
||||
## Credits
|
||||
|
||||
### Contributors
|
||||
|
||||
- [Mary](https://github.com/marysaka) for her immense help porting ImHex to MacOS and help during development
|
||||
- [AxCut](https://github.com/paxcut) for a gigantic amount of contributions to the Pattern Text Editor and tons of other parts of ImHex
|
||||
- [iTrooz](https://github.com/iTrooz) for getting ImHex onto the Web as well as hundreds of contributions in every part of the project
|
||||
- [jumanji144](https://github.com/jumanji144) for huge contributions to the Pattern Language and ImHex's infrastructure
|
||||
- [Mary](https://github.com/marysaka) for her immense help porting ImHex to macOS and help during development
|
||||
- [Roblabla](https://github.com/Roblabla) for adding MSI Installer support to ImHex
|
||||
- [jam1garner](https://github.com/jam1garner) and [raytwo](https://github.com/raytwo) for their help with adding Rust support to plugins
|
||||
- [Mailaender](https://github.com/Mailaender) for getting ImHex onto Flathub
|
||||
- [iTrooz](https://github.com/iTrooz) for many improvements related to release packaging and the GitHub Action runners.
|
||||
- Everybody else who has reported issues on Discord or GitHub that I had great conversations with :)
|
||||
|
||||
### Dependencies
|
||||
|
||||
- Thanks a lot to ocornut for their amazing [Dear ImGui](https://github.com/ocornut/imgui) which is used for building the entire interface
|
||||
- Thanks to ocornut as well for their hex editor view used as base for this project.
|
||||
- Thanks to BalazsJako for their incredible [ImGuiColorTextEdit](https://github.com/BalazsJako/ImGuiColorTextEdit) used for the pattern language syntax highlighting
|
||||
- Thanks to nlohmann for their [json](https://github.com/nlohmann/json) library used for project files
|
||||
- Thanks to aquynh for [capstone](https://github.com/aquynh/capstone) which is the base of the disassembly window
|
||||
- Thanks to epezent for [ImPlot](https://github.com/epezent/implot) used to plot data in various places
|
||||
- Thanks to Nelarius for [ImNodes](https://github.com/Nelarius/imnodes) used as base for the data processor
|
||||
- Thanks to BalazsJako for [ImGuiColorTextEdit](https://github.com/BalazsJako/ImGuiColorTextEdit) used for the pattern language syntax highlighting
|
||||
- Thanks to nlohmann for their [json](https://github.com/nlohmann/json) library used for configuration files
|
||||
- Thanks to vitaut for their [libfmt](https://github.com/fmtlib/fmt) library which makes formatting and logging so much better
|
||||
- Thanks to btzy for [nativefiledialog-extended](https://github.com/btzy/nativefiledialog-extended) and their great support, used for handling file dialogs on all platforms
|
||||
- Thanks to danyspin97 for [xdgpp](https://sr.ht/~danyspin97/xdgpp) used to handle folder paths on Linux
|
||||
- Thanks to aquynh for [capstone](https://github.com/aquynh/capstone) which is the base of the disassembly window
|
||||
- Thanks to rxi for [microtar](https://github.com/rxi/microtar) used for extracting downloaded store assets
|
||||
- Thanks to btzy for [nativefiledialog-extended](https://github.com/btzy/nativefiledialog-extended)
|
||||
- Thanks to danyspin97 for [xdgpp](https://sr.ht/~danyspin97/xdgpp)
|
||||
- Thanks to VirusTotal for [Yara](https://github.com/VirusTotal/yara) used by the Yara plugin
|
||||
- Thanks to Martinsos for [edlib](https://github.com/Martinsos/edlib) used for sequence searching in the diffing view
|
||||
- Thanks to ron4fun for [HashLibPlus](https://github.com/ron4fun/HashLibPlus) which implements every hashing algorithm under the sun
|
||||
- Thanks to mackron for [miniaudio](https://github.com/mackron/miniaudio) used to play audio files
|
||||
- Thanks to all other groups and organizations whose libraries are used in ImHex
|
||||
|
||||
### License
|
||||
|
||||
The biggest part of ImHex is under the GPLv2-only license.
|
||||
Notable exceptions to this are the following parts which are under the LGPLv2.1 license:
|
||||
- **/lib/libimhex**: The library that allows Plugins to interact with ImHex.
|
||||
- **/plugins/ui**: The UI plugin library that contains some common UI elements that can be used by other plugins
|
||||
|
||||
The reason for this is to allow for proprietary plugins to be developed for ImHex.
|
||||
|
||||
### Code Signing Policy
|
||||
|
||||
Free code signing provided by [SignPath.io](https://about.signpath.io/),
|
||||
certificate by [SignPath Foundation](https://signpath.org/).
|
||||
|
||||
This program will not transfer any information to other networked systems
|
||||
unless specifically requested by the user or the person installing or
|
||||
operating it.
|
||||
|
||||
#### People with direct push access
|
||||
- [WerWolv](https://github.com/WerWolv)
|
||||
- [iTrooz](https://github.com/iTrooz)
|
||||
- [jumanji144](https://github.com/jumanji144)
|
||||
- [AxCut](https://github.com/paxcut)
|
||||
|
||||
@@ -7,4 +7,4 @@ If you built ImHex yourself and experience issues that are not present in the ve
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
Any critical vulnerabilities can be reported through Discord @WerWolv#1337
|
||||
Any critical vulnerabilities can be reported through Discord (@werwolv).
|
||||
|
||||
0
changelog.md
Normal file
0
changelog.md
Normal file
File diff suppressed because it is too large
Load Diff
149
cmake/ide_helpers.cmake
Normal file
149
cmake/ide_helpers.cmake
Normal file
@@ -0,0 +1,149 @@
|
||||
|
||||
option(IMHEX_IDE_HELPERS_OVERRIDE_XCODE_COMPILER "Enable choice of compiler for Xcode builds, despite CMake's best efforts" OFF)
|
||||
option(IMHEX_IDE_HELPERS_INTRUSIVE_IDE_TWEAKS "Enable intrusive CMake tweaks to better support IDEs with folder support" OFF)
|
||||
|
||||
# The CMake infrastructure silently ignores the CMAKE_<>_COMPILER settings when
|
||||
# using the `Xcode` generator.
|
||||
#
|
||||
# A particularly nasty (and potentially only) way of getting around this is to
|
||||
# temporarily lie about the generator being used, while CMake determines and
|
||||
# locks in the compiler to use.
|
||||
#
|
||||
# Needless to say, this is hacky and fragile. Use at your own risk!
|
||||
if (IMHEX_IDE_HELPERS_OVERRIDE_XCODE_COMPILER AND CMAKE_GENERATOR STREQUAL "Xcode")
|
||||
set(CMAKE_GENERATOR "Unknown")
|
||||
enable_language(C CXX)
|
||||
|
||||
set(CMAKE_GENERATOR "Xcode")
|
||||
|
||||
set(CMAKE_XCODE_ATTRIBUTE_CC "${CMAKE_C_COMPILER}")
|
||||
set(CMAKE_XCODE_ATTRIBUTE_CXX "${CMAKE_CXX_COMPILER}")
|
||||
|
||||
if (CLANG)
|
||||
set(CMAKE_XCODE_ATTRIBUTE_LD "${CMAKE_C_COMPILER}")
|
||||
set(CMAKE_XCODE_ATTRIBUTE_LDPLUSPLUS "${CMAKE_CXX_COMPILER}")
|
||||
endif()
|
||||
|
||||
# By default Xcode passes a `-index-store-path=<...>` parameter to the compiler
|
||||
# during builds to build code completion indexes. This is not supported by
|
||||
# anything other than AppleClang
|
||||
set(CMAKE_XCODE_ATTRIBUTE_COMPILER_INDEX_STORE_ENABLE "NO")
|
||||
endif()
|
||||
|
||||
# Generate a launch/build scheme for all targets
|
||||
set(CMAKE_XCODE_GENERATE_SCHEME YES)
|
||||
|
||||
# Utility function that helps avoid messing with non-standard targets
|
||||
macro(returnIfTargetIsNonTweakable target)
|
||||
get_target_property(targetIsAliased ${target} ALIASED_TARGET)
|
||||
get_target_property(targetIsImported ${target} IMPORTED)
|
||||
|
||||
if (targetIsAliased OR targetIsImported)
|
||||
return()
|
||||
endif()
|
||||
|
||||
get_target_property(targetType ${target} TYPE)
|
||||
if (targetType MATCHES "INTERFACE_LIBRARY|UNKNOWN_LIBRARY")
|
||||
return()
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
# Targets usually don't specify their private headers, nor group their source files
|
||||
# which results in very spotty coverage by IDEs with folders support
|
||||
#
|
||||
# Unfortunately, CMake does not have a `target_source_group` like construct yet, therefore
|
||||
# we have to play by the limitations of `source_group`.
|
||||
#
|
||||
# A particularly problematic part is that the function must be called within the directoryies
|
||||
# scope for the grouping to take effect.
|
||||
#
|
||||
# See: https://discourse.cmake.org/t/topic/7388
|
||||
function(tweakTargetForIDESupport target)
|
||||
returnIfTargetIsNonTweakable(${target})
|
||||
|
||||
# Don't assume directory structure of third parties
|
||||
get_target_property(targetSourceDir ${target} SOURCE_DIR)
|
||||
if (targetSourceDir MATCHES "third_party")
|
||||
return()
|
||||
endif()
|
||||
|
||||
# Add headers to target
|
||||
get_target_property(targetSourceDir ${target} SOURCE_DIR)
|
||||
if (targetSourceDir)
|
||||
file(GLOB_RECURSE targetPrivateHeaders CONFIGURE_DEPENDS "${targetSourceDir}/include/*.hpp")
|
||||
|
||||
target_sources(${target} PRIVATE "${targetPrivateHeaders}")
|
||||
endif()
|
||||
|
||||
# Organize target sources into directory tree
|
||||
get_target_property(sources ${target} SOURCES)
|
||||
foreach(file IN LISTS sources)
|
||||
get_filename_component(path "${file}" ABSOLUTE)
|
||||
|
||||
if (NOT path MATCHES "^${targetSourceDir}")
|
||||
continue()
|
||||
endif()
|
||||
|
||||
source_group(TREE "${targetSourceDir}" PREFIX "Source Tree" FILES "${file}")
|
||||
endforeach()
|
||||
endfunction()
|
||||
|
||||
if (IMHEX_IDE_HELPERS_INTRUSIVE_IDE_TWEAKS)
|
||||
# See tweakTargetForIDESupport for rationale
|
||||
|
||||
function(add_library target)
|
||||
_add_library(${target} ${ARGN})
|
||||
|
||||
tweakTargetForIDESupport(${target})
|
||||
endfunction()
|
||||
|
||||
function(add_executable target)
|
||||
_add_executable(${target} ${ARGN})
|
||||
|
||||
tweakTargetForIDESupport(${target})
|
||||
endfunction()
|
||||
endif()
|
||||
|
||||
# Adjust target's FOLDER property, which is an IDE only preference
|
||||
function(_tweakTarget target path)
|
||||
get_target_property(targetType ${target} TYPE)
|
||||
|
||||
if (TARGET generator-${target})
|
||||
set_target_properties(generator-${target} PROPERTIES FOLDER "romfs/${target}")
|
||||
endif()
|
||||
if (TARGET romfs_file_packer-${target})
|
||||
set_target_properties(romfs_file_packer-${target} PROPERTIES FOLDER "romfs/${target}")
|
||||
endif()
|
||||
if (TARGET libromfs-${target})
|
||||
set_target_properties(libromfs-${target} PROPERTIES FOLDER "romfs/${target}")
|
||||
endif()
|
||||
|
||||
if (${targetType} MATCHES "EXECUTABLE|LIBRARY")
|
||||
set_target_properties(${target} PROPERTIES FOLDER "${path}")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
macro(_tweakTargetsRecursive dir)
|
||||
get_property(subdirectories DIRECTORY ${dir} PROPERTY SUBDIRECTORIES)
|
||||
foreach(subdir IN LISTS subdirectories)
|
||||
_tweakTargetsRecursive("${subdir}")
|
||||
endforeach()
|
||||
|
||||
if(${dir} STREQUAL ${CMAKE_SOURCE_DIR})
|
||||
return()
|
||||
endif()
|
||||
|
||||
get_property(targets DIRECTORY "${dir}" PROPERTY BUILDSYSTEM_TARGETS)
|
||||
file(RELATIVE_PATH rdir ${CMAKE_SOURCE_DIR} "${dir}/..")
|
||||
|
||||
foreach(target ${targets})
|
||||
_tweakTarget(${target} "${rdir}")
|
||||
endforeach()
|
||||
endmacro()
|
||||
|
||||
# Tweak all targets this CMake build is aware about
|
||||
function(tweakTargetsForIDESupport)
|
||||
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
||||
|
||||
_tweakTargetsRecursive("${CMAKE_SOURCE_DIR}")
|
||||
endfunction()
|
||||
8
cmake/modules/FindCapstone.cmake
Normal file
8
cmake/modules/FindCapstone.cmake
Normal file
@@ -0,0 +1,8 @@
|
||||
find_path(CAPSTONE_INCLUDE_DIR capstone.h PATH_SUFFIXES capstone)
|
||||
find_library(CAPSTONE_LIBRARY NAMES capstone)
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
|
||||
find_package_handle_standard_args(Capstone DEFAULT_MSG CAPSTONE_LIBRARY CAPSTONE_INCLUDE_DIR)
|
||||
|
||||
mark_as_advanced(CAPSTONE_INCLUDE_DIR CAPSTONE_LIBRARY)
|
||||
@@ -11,12 +11,20 @@ if (UNIX)
|
||||
set(CORECLR_SUBARCH "arm64")
|
||||
endif()
|
||||
endif()
|
||||
if (APPLE)
|
||||
if (CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64")
|
||||
set(CORECLR_ARCH "osx-arm64")
|
||||
set(CORECLR_SUBARCH "arm64")
|
||||
else()
|
||||
set(CORECLR_ARCH "osx-x64")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if (NOT DOTNET_EXECUTABLE)
|
||||
set(DOTNET_EXECUTABLE dotnet)
|
||||
endif ()
|
||||
|
||||
set(CORECLR_VERSION "7.0")
|
||||
set(CORECLR_VERSION "8.0")
|
||||
|
||||
execute_process(COMMAND ${DOTNET_EXECUTABLE} "--list-runtimes" OUTPUT_VARIABLE CORECLR_LIST_RUNTIMES_OUTPUT OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
if (CORECLR_LIST_RUNTIMES_OUTPUT STREQUAL "")
|
||||
@@ -49,13 +57,16 @@ endif()
|
||||
set(CoreClrEmbed_ROOT_PATH "${CORECLR_RUNTIME_ROOT_PATH}")
|
||||
|
||||
|
||||
file(GLOB _CORECLR_HOST_ARCH_PATH "${CORECLR_RUNTIME_ROOT_PATH}/packs/Microsoft.NETCore.App.Host.*-${CORECLR_SUBARCH}")
|
||||
if (_CORECLR_HOST_ARCH_PATH)
|
||||
get_filename_component(_CORECLR_HOST_ARCH_FILENAME ${_CORECLR_HOST_ARCH_PATH} NAME)
|
||||
string(REPLACE "Microsoft.NETCore.App.Host." "" _CORECLR_COMPUTED_ARCH "${_CORECLR_HOST_ARCH_FILENAME}")
|
||||
if (_CORECLR_COMPUTED_ARCH)
|
||||
set(CORECLR_ARCH "${_CORECLR_COMPUTED_ARCH}")
|
||||
endif()
|
||||
file(GLOB _CORECLR_HOST_ARCH_PATH_LIST "${CORECLR_RUNTIME_ROOT_PATH}/packs/Microsoft.NETCore.App.Host.*-${CORECLR_SUBARCH}")
|
||||
if (_CORECLR_HOST_ARCH_PATH_LIST)
|
||||
foreach(_CORECLR_HOST_ARCH_PATH ${_CORECLR_HOST_ARCH_PATH_LIST})
|
||||
get_filename_component(_CORECLR_HOST_ARCH_FILENAME ${_CORECLR_HOST_ARCH_PATH} NAME)
|
||||
string(REPLACE "Microsoft.NETCore.App.Host." "" _CORECLR_COMPUTED_ARCH "${_CORECLR_HOST_ARCH_FILENAME}")
|
||||
if (_CORECLR_COMPUTED_ARCH)
|
||||
set(CORECLR_ARCH "${_CORECLR_COMPUTED_ARCH}")
|
||||
break()
|
||||
endif()
|
||||
endforeach()
|
||||
endif()
|
||||
|
||||
set(CORECLR_HOST_BASE_PATH "${CORECLR_RUNTIME_ROOT_PATH}/packs/Microsoft.NETCore.App.Host.${CORECLR_ARCH}/${CORECLR_RUNTIME_VERSION_FULL}")
|
||||
@@ -75,7 +86,8 @@ find_file(CoreClrEmbed_SHARED_LIBRARY nethost.dll nethost.so libnethost.so netho
|
||||
|
||||
if (CoreClrEmbed_INCLUDE_DIR AND CoreClrEmbed_LIBRARY)
|
||||
set(CoreClrEmbed_FOUND TRUE)
|
||||
set(CoreClrEmbed_LIBRARIES "${CoreClrEmbed_LIBRARY}")
|
||||
set(CoreClrEmbed_SHARED_LIBRARIES "${CoreClrEmbed_SHARED_LIBRARY}")
|
||||
set(CoreClrEmbed_INCLUDE_DIRS "${CoreClrEmbed_INCLUDE_DIR}")
|
||||
set(CoreClrEmbed_LIBRARIES "${CoreClrEmbed_LIBRARY}" CACHE STRING "CoreClrEmbed libraries" FORCE)
|
||||
set(CoreClrEmbed_SHARED_LIBRARIES "${CoreClrEmbed_SHARED_LIBRARY}" CACHE STRING "CoreClrEmbed shared libraries" FORCE)
|
||||
set(CoreClrEmbed_INCLUDE_DIRS "${CoreClrEmbed_INCLUDE_DIR}" CACHE STRING "CoreClrEmbed include directories" FORCE)
|
||||
set(CoreClrEmbed_VERSION "${CORECLR_RUNTIME_VERSION_FULL}" CACHE STRING "CoreClrEmbed version" FORCE)
|
||||
endif()
|
||||
139
cmake/modules/FindGLFW.cmake
Normal file
139
cmake/modules/FindGLFW.cmake
Normal file
@@ -0,0 +1,139 @@
|
||||
#.rst:
|
||||
# Find GLFW
|
||||
# ---------
|
||||
#
|
||||
# Finds the GLFW library using its cmake config if that exists, otherwise
|
||||
# falls back to finding it manually. This module defines:
|
||||
#
|
||||
# GLFW_FOUND - True if GLFW library is found
|
||||
# GLFW::GLFW - GLFW imported target
|
||||
#
|
||||
# Additionally, in case the config was not found, these variables are defined
|
||||
# for internal usage:
|
||||
#
|
||||
# GLFW_LIBRARY - GLFW library
|
||||
# GLFW_DLL_DEBUG - GLFW debug DLL on Windows, if found
|
||||
# GLFW_DLL_RELEASE - GLFW release DLL on Windows, if found
|
||||
# GLFW_INCLUDE_DIR - Root include dir
|
||||
#
|
||||
|
||||
#
|
||||
# This file is part of Magnum.
|
||||
#
|
||||
# Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019,
|
||||
# 2020, 2021, 2022 Vladimír Vondruš <mosra@centrum.cz>
|
||||
# Copyright © 2016 Jonathan Hale <squareys@googlemail.com>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the "Software"),
|
||||
# to deal in the Software without restriction, including without limitation
|
||||
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
# and/or sell copies of the Software, and to permit persons to whom the
|
||||
# Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
# DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
# GLFW installs cmake package config files which handles dependencies in case
|
||||
# GLFW is built statically. Try to find first, quietly, so it doesn't print
|
||||
# loud messages when it's not found, since that's okay. If the glfw target
|
||||
# already exists, it means we're using it through a CMake subproject -- don't
|
||||
# attempt to find the package in that case.
|
||||
if(NOT TARGET glfw)
|
||||
find_package(glfw3 CONFIG QUIET)
|
||||
endif()
|
||||
|
||||
# If either a glfw config file was found or we have a subproject, point
|
||||
# GLFW::GLFW to that and exit -- nothing else to do here.
|
||||
if(TARGET glfw)
|
||||
if(NOT TARGET GLFW::GLFW)
|
||||
# Aliases of (global) targets are only supported in CMake 3.11, so we
|
||||
# work around it by this. This is easier than fetching all possible
|
||||
# properties (which are impossible to track of) and then attempting to
|
||||
# rebuild them into a new target.
|
||||
add_library(GLFW::GLFW INTERFACE IMPORTED)
|
||||
set_target_properties(GLFW::GLFW PROPERTIES INTERFACE_LINK_LIBRARIES glfw)
|
||||
endif()
|
||||
|
||||
# Just to make FPHSA print some meaningful location, nothing else
|
||||
get_target_property(_GLFW_INTERFACE_INCLUDE_DIRECTORIES glfw INTERFACE_INCLUDE_DIRECTORIES)
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args("GLFW" DEFAULT_MSG
|
||||
_GLFW_INTERFACE_INCLUDE_DIRECTORIES)
|
||||
|
||||
if(CORRADE_TARGET_WINDOWS)
|
||||
# .dll is in LOCATION, .lib is in IMPLIB. Yay, useful!
|
||||
get_target_property(GLFW_DLL_DEBUG glfw IMPORTED_LOCATION_DEBUG)
|
||||
get_target_property(GLFW_DLL_RELEASE glfw IMPORTED_LOCATION_RELEASE)
|
||||
endif()
|
||||
|
||||
return()
|
||||
endif()
|
||||
|
||||
if(CORRADE_TARGET_WINDOWS)
|
||||
if(MSVC)
|
||||
if(MSVC_VERSION VERSION_LESS 1910)
|
||||
set(_GLFW_LIBRARY_PATH_SUFFIX lib-vc2015)
|
||||
elseif(MSVC_VERSION VERSION_LESS 1920)
|
||||
set(_GLFW_LIBRARY_PATH_SUFFIX lib-vc2017)
|
||||
elseif(MSVC_VERSION VERSION_LESS 1930)
|
||||
set(_GLFW_LIBRARY_PATH_SUFFIX lib-vc2019)
|
||||
elseif(MSVC_VERSION VERSION_LESS 1940)
|
||||
set(_GLFW_LIBRARY_PATH_SUFFIX lib-vc2022)
|
||||
else()
|
||||
message(FATAL_ERROR "Unsupported MSVC version")
|
||||
endif()
|
||||
elseif(MINGW)
|
||||
set(_GLFW_LIBRARY_PATH_SUFFIX lib-mingw-w64)
|
||||
else()
|
||||
message(FATAL_ERROR "Unsupported compiler")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# In case no config file was found, try manually finding the library. Prefer
|
||||
# the glfw3dll as it's a dynamic library.
|
||||
find_library(GLFW_LIBRARY
|
||||
NAMES glfw glfw3dll glfw3
|
||||
PATH_SUFFIXES ${_GLFW_LIBRARY_PATH_SUFFIX})
|
||||
|
||||
if(CORRADE_TARGET_WINDOWS AND GLFW_LIBRARY MATCHES "glfw3dll.(lib|a)$")
|
||||
# TODO: debug?
|
||||
find_file(GLFW_DLL_RELEASE
|
||||
NAMES glfw3.dll
|
||||
PATH_SUFFIXES ${_GLFW_LIBRARY_PATH_SUFFIX})
|
||||
endif()
|
||||
|
||||
# Include dir
|
||||
find_path(GLFW_INCLUDE_DIR
|
||||
NAMES GLFW/glfw3.h)
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args("GLFW" DEFAULT_MSG
|
||||
GLFW_LIBRARY
|
||||
GLFW_INCLUDE_DIR)
|
||||
|
||||
if(NOT TARGET GLFW::GLFW)
|
||||
add_library(GLFW::GLFW UNKNOWN IMPORTED)
|
||||
|
||||
# Work around BUGGY framework support on macOS
|
||||
# https://cmake.org/Bug/view.php?id=14105
|
||||
if(CORRADE_TARGET_APPLE AND GLFW_LIBRARY MATCHES "\\.framework$")
|
||||
set_property(TARGET GLFW::GLFW PROPERTY IMPORTED_LOCATION ${GLFW_LIBRARY}/GLFW)
|
||||
else()
|
||||
set_property(TARGET GLFW::GLFW PROPERTY IMPORTED_LOCATION ${GLFW_LIBRARY})
|
||||
endif()
|
||||
|
||||
set_property(TARGET GLFW::GLFW PROPERTY
|
||||
INTERFACE_INCLUDE_DIRECTORIES ${GLFW_INCLUDE_DIR})
|
||||
endif()
|
||||
|
||||
mark_as_advanced(GLFW_LIBRARY GLFW_INCLUDE_DIR)
|
||||
60
cmake/modules/FindLZ4.cmake
Normal file
60
cmake/modules/FindLZ4.cmake
Normal file
@@ -0,0 +1,60 @@
|
||||
find_path(LZ4_INCLUDE_DIR
|
||||
NAMES lz4.h
|
||||
HINTS "${LZ4_INCLUDEDIR}" "${LZ4_HINTS}/include"
|
||||
PATHS
|
||||
/usr/local/include
|
||||
/usr/include
|
||||
)
|
||||
|
||||
find_library(LZ4_LIBRARY
|
||||
NAMES lz4 liblz4
|
||||
HINTS "${LZ4_LIBDIR}" "${LZ4_HINTS}/lib"
|
||||
PATHS
|
||||
/usr/local/lib
|
||||
/usr/lib
|
||||
)
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args( LZ4 DEFAULT_MSG LZ4_LIBRARY LZ4_INCLUDE_DIR )
|
||||
|
||||
if( LZ4_FOUND )
|
||||
include( CheckIncludeFile )
|
||||
include( CMakePushCheckState )
|
||||
|
||||
set( LZ4_INCLUDE_DIRS ${LZ4_INCLUDE_DIR} )
|
||||
set( LZ4_LIBRARIES ${LZ4_LIBRARY} )
|
||||
|
||||
cmake_push_check_state()
|
||||
set( CMAKE_REQUIRED_INCLUDES ${LZ4_INCLUDE_DIRS} )
|
||||
check_include_file( lz4frame.h HAVE_LZ4FRAME_H )
|
||||
cmake_pop_check_state()
|
||||
|
||||
if (WIN32)
|
||||
set ( LZ4_DLL_DIR "${LZ4_HINTS}/bin"
|
||||
CACHE PATH "Path to LZ4 DLL"
|
||||
)
|
||||
file( GLOB _lz4_dll RELATIVE "${LZ4_DLL_DIR}"
|
||||
"${LZ4_DLL_DIR}/lz4*.dll"
|
||||
)
|
||||
set ( LZ4_DLL ${_lz4_dll}
|
||||
# We're storing filenames only. Should we use STRING instead?
|
||||
CACHE FILEPATH "LZ4 DLL file name"
|
||||
)
|
||||
file( GLOB _lz4_pdb RELATIVE "${LZ4_DLL_DIR}"
|
||||
"${LZ4_DLL_DIR}/lz4*.pdb"
|
||||
)
|
||||
set ( LZ4_PDB ${_lz4_pdb}
|
||||
CACHE FILEPATH "LZ4 PDB file name"
|
||||
)
|
||||
mark_as_advanced( LZ4_DLL_DIR LZ4_DLL LZ4_PDB )
|
||||
endif()
|
||||
else()
|
||||
set( LZ4_INCLUDE_DIRS )
|
||||
set( LZ4_LIBRARIES )
|
||||
endif()
|
||||
|
||||
mark_as_advanced( LZ4_LIBRARIES LZ4_INCLUDE_DIRS )
|
||||
|
||||
add_library( LZ4::lz4 INTERFACE IMPORTED )
|
||||
set_property( TARGET LZ4::lz4 PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${LZ4_INCLUDE_DIRS} )
|
||||
set_property( TARGET LZ4::lz4 PROPERTY INTERFACE_LINK_LIBRARIES ${LZ4_LIBRARIES} )
|
||||
18
cmake/modules/FindMagic.cmake
Normal file
18
cmake/modules/FindMagic.cmake
Normal file
@@ -0,0 +1,18 @@
|
||||
find_path(LIBMAGIC_INCLUDE_DIR magic.h)
|
||||
|
||||
find_library(LIBMAGIC_LIBRARY NAMES magic)
|
||||
|
||||
if (LIBMAGIC_INCLUDE_DIR AND LIBMAGIC_LIBRARY)
|
||||
set(LIBMAGIC_FOUND TRUE)
|
||||
endif (LIBMAGIC_INCLUDE_DIR AND LIBMAGIC_LIBRARY)
|
||||
|
||||
find_package_handle_standard_args("libmagic" DEFAULT_MSG
|
||||
LIBMAGIC_LIBRARY
|
||||
LIBMAGIC_INCLUDE_DIR
|
||||
)
|
||||
|
||||
mark_as_advanced(
|
||||
LIBMAGIC_INCLUDE_DIR
|
||||
LIBMAGIC_LIBRARY
|
||||
LIBMAGIC_FOUND
|
||||
)
|
||||
4
cmake/modules/FindYara.cmake
Normal file
4
cmake/modules/FindYara.cmake
Normal file
@@ -0,0 +1,4 @@
|
||||
find_library(YARA_LIBRARIES NAMES yara)
|
||||
find_file(yara.h YARA_INCLUDE_DIRS)
|
||||
|
||||
mark_as_advanced(YARA_LIBRARIES YARA_INCLUDE_DIRS)
|
||||
45
cmake/modules/FindZSTD.cmake
Normal file
45
cmake/modules/FindZSTD.cmake
Normal file
@@ -0,0 +1,45 @@
|
||||
# Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
#
|
||||
# - Try to find Facebook zstd library
|
||||
# This will define
|
||||
# ZSTD_FOUND
|
||||
# ZSTD_INCLUDE_DIR
|
||||
# ZSTD_LIBRARY
|
||||
#
|
||||
|
||||
find_path(ZSTD_INCLUDE_DIR NAMES zstd.h)
|
||||
|
||||
find_library(ZSTD_LIBRARY_DEBUG NAMES zstdd zstd_staticd)
|
||||
find_library(ZSTD_LIBRARY_RELEASE NAMES zstd zstd_static)
|
||||
|
||||
include(SelectLibraryConfigurations)
|
||||
SELECT_LIBRARY_CONFIGURATIONS(ZSTD)
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(
|
||||
ZSTD DEFAULT_MSG
|
||||
ZSTD_LIBRARY ZSTD_INCLUDE_DIR
|
||||
)
|
||||
|
||||
if (ZSTD_FOUND)
|
||||
message(STATUS "Found Zstd: ${ZSTD_LIBRARY}")
|
||||
endif()
|
||||
|
||||
mark_as_advanced(ZSTD_INCLUDE_DIR ZSTD_LIBRARY)
|
||||
|
||||
add_library(ZSTD::zstd INTERFACE IMPORTED)
|
||||
set_property(TARGET ZSTD::zstd PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${ZSTD_INCLUDE_DIR})
|
||||
set_property(TARGET ZSTD::zstd PROPERTY INTERFACE_LINK_LIBRARIES ${ZSTD_LIBRARY})
|
||||
15
cmake/modules/Findlibssh2.cmake
Normal file
15
cmake/modules/Findlibssh2.cmake
Normal file
@@ -0,0 +1,15 @@
|
||||
find_path(LIBSSH2_INCLUDE_DIR libssh2.h)
|
||||
|
||||
find_library(LIBSSH2_LIBRARY NAMES ssh2 libssh2)
|
||||
|
||||
if(LIBSSH2_INCLUDE_DIR)
|
||||
file(STRINGS "${LIBSSH2_INCLUDE_DIR}/libssh2.h" libssh2_version_str REGEX "^#define[\t ]+LIBSSH2_VERSION[\t ]+\"(.*)\"")
|
||||
string(REGEX REPLACE "^.*\"([^\"]+)\"" "\\1" LIBSSH2_VERSION "${libssh2_version_str}")
|
||||
endif()
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(LibSSH2
|
||||
REQUIRED_VARS LIBSSH2_LIBRARY LIBSSH2_INCLUDE_DIR
|
||||
VERSION_VAR LIBSSH2_VERSION)
|
||||
|
||||
mark_as_advanced(LIBSSH2_INCLUDE_DIR LIBSSH2_LIBRARY)
|
||||
@@ -26,8 +26,9 @@ SET(MBEDTLS_FIND_QUIETLY TRUE)
|
||||
FIND_LIBRARY(MBEDTLS_LIBRARY NAMES mbedtls libmbedtls libmbedx509)
|
||||
FIND_LIBRARY(MBEDX509_LIBRARY NAMES mbedx509 libmbedx509)
|
||||
FIND_LIBRARY(MBEDCRYPTO_LIBRARY NAMES mbedcrypto libmbedcrypto)
|
||||
FIND_LIBRARY(TFPSACRYPTO_LIBRARY NAMES libtfpsacrypto tfpsacrypto)
|
||||
|
||||
IF(MBEDTLS_INCLUDE_DIR AND MBEDTLS_LIBRARY AND MBEDX509_LIBRARY AND MBEDCRYPTO_LIBRARY)
|
||||
IF(MBEDTLS_INCLUDE_DIR AND MBEDTLS_LIBRARY AND MBEDX509_LIBRARY AND (MBEDCRYPTO_LIBRARY OR TFPSACRYPTO_LIBRARY))
|
||||
SET(MBEDTLS_FOUND TRUE)
|
||||
ENDIF()
|
||||
|
||||
@@ -37,10 +38,25 @@ IF(MBEDTLS_FOUND)
|
||||
GET_FILENAME_COMPONENT(MBEDTLS_LIBRARY_FILE ${MBEDTLS_LIBRARY} NAME_WE)
|
||||
GET_FILENAME_COMPONENT(MBEDX509_LIBRARY_FILE ${MBEDX509_LIBRARY} NAME_WE)
|
||||
GET_FILENAME_COMPONENT(MBEDCRYPTO_LIBRARY_FILE ${MBEDCRYPTO_LIBRARY} NAME_WE)
|
||||
GET_FILENAME_COMPONENT(TFPSACRYPTO_LIBRARY_FILE ${TFPSACRYPTO_LIBRARY} NAME_WE)
|
||||
STRING(REGEX REPLACE "^lib" "" MBEDTLS_LIBRARY_FILE ${MBEDTLS_LIBRARY_FILE})
|
||||
STRING(REGEX REPLACE "^lib" "" MBEDX509_LIBRARY_FILE ${MBEDX509_LIBRARY_FILE})
|
||||
STRING(REGEX REPLACE "^lib" "" MBEDCRYPTO_LIBRARY_FILE ${MBEDCRYPTO_LIBRARY_FILE})
|
||||
SET(MBEDTLS_LIBRARIES "-L${MBEDTLS_LIBRARY_DIR} -l${MBEDTLS_LIBRARY_FILE} -l${MBEDX509_LIBRARY_FILE} -l${MBEDCRYPTO_LIBRARY_FILE}")
|
||||
STRING(REGEX REPLACE "^lib" "" TFPSACRYPTO_LIBRARY_FILE ${TFPSACRYPTO_LIBRARY_FILE})
|
||||
|
||||
if (TFPSACRYPTO_LIBRARY)
|
||||
SET(MBEDTLS_CRYPTO_LIBRARY_FILE ${TFPSACRYPTO_LIBRARY_FILE})
|
||||
elseif (MBEDCRYPTO_LIBRARY)
|
||||
SET(MBEDTLS_CRYPTO_LIBRARY_FILE ${MBEDCRYPTO_LIBRARY_FILE})
|
||||
else ()
|
||||
MESSAGE(FATAL_ERROR "Could not find mbedTLS Crypto library")
|
||||
endif()
|
||||
|
||||
if (MSVC)
|
||||
SET(MBEDTLS_LIBRARIES ${MBEDTLS_LIBRARY_FILE}.lib ${MBEDX509_LIBRARY_FILE}.lib ${MBEDTLS_CRYPTO_LIBRARY_FILE}.lib)
|
||||
else()
|
||||
SET(MBEDTLS_LIBRARIES "-L${MBEDTLS_LIBRARY_DIR} -l${MBEDTLS_LIBRARY_FILE} -l${MBEDX509_LIBRARY_FILE} -l${MBEDTLS_CRYPTO_LIBRARY_FILE}")
|
||||
endif()
|
||||
|
||||
IF(NOT MBEDTLS_FIND_QUIETLY)
|
||||
MESSAGE(STATUS "Found mbedTLS:")
|
||||
@@ -55,9 +71,9 @@ IF(MBEDTLS_FOUND)
|
||||
MESSAGE(STATUS " Crypto: ${MBEDCRYPTO_LIBRARY}")
|
||||
ENDIF(NOT MBEDTLS_FIND_QUIETLY)
|
||||
ELSE(MBEDTLS_FOUND)
|
||||
IF(MBEDTLS_FIND_REQUIRED)
|
||||
IF(mbedTLS_FIND_REQUIRED)
|
||||
MESSAGE(FATAL_ERROR "Could not find mbedTLS")
|
||||
ENDIF(MBEDTLS_FIND_REQUIRED)
|
||||
ENDIF(mbedTLS_FIND_REQUIRED)
|
||||
ENDIF(MBEDTLS_FOUND)
|
||||
|
||||
MARK_AS_ADVANCED(
|
||||
@@ -67,4 +83,4 @@ MARK_AS_ADVANCED(
|
||||
MBEDTLS_LIBRARY
|
||||
MBEDX509_LIBRARY
|
||||
MBEDCRYPTO_LIBRARY
|
||||
)
|
||||
)
|
||||
|
||||
@@ -1,10 +1,16 @@
|
||||
macro(add_imhex_plugin)
|
||||
setSDKPaths()
|
||||
# Parse arguments
|
||||
set(options "")
|
||||
set(oneValueArgs NAME)
|
||||
set(multiValueArgs SOURCES INCLUDES LIBRARIES)
|
||||
set(options LIBRARY_PLUGIN)
|
||||
set(oneValueArgs NAME IMHEX_VERSION)
|
||||
set(multiValueArgs SOURCES INCLUDES LIBRARIES FEATURES)
|
||||
cmake_parse_arguments(IMHEX_PLUGIN "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
|
||||
|
||||
if (IMHEX_PLUGIN_IMHEX_VERSION)
|
||||
message(STATUS "Compiling plugin ${IMHEX_PLUGIN_NAME} for ImHex Version ${IMHEX_PLUGIN_IMHEX_VERSION}")
|
||||
set(IMHEX_VERSION_STRING "${IMHEX_PLUGIN_IMHEX_VERSION}")
|
||||
endif()
|
||||
|
||||
if (IMHEX_STATIC_LINK_PLUGINS)
|
||||
set(IMHEX_PLUGIN_LIBRARY_TYPE STATIC)
|
||||
|
||||
@@ -12,51 +18,162 @@ macro(add_imhex_plugin)
|
||||
|
||||
configure_file(${CMAKE_SOURCE_DIR}/dist/web/plugin-bundle.cpp.in ${CMAKE_CURRENT_BINARY_DIR}/plugin-bundle.cpp @ONLY)
|
||||
target_sources(main PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/plugin-bundle.cpp)
|
||||
set(IMHEX_PLUGIN_SUFFIX ".hexplug")
|
||||
else()
|
||||
set(IMHEX_PLUGIN_LIBRARY_TYPE SHARED)
|
||||
if (IMHEX_PLUGIN_LIBRARY_PLUGIN)
|
||||
set(IMHEX_PLUGIN_LIBRARY_TYPE SHARED)
|
||||
set(IMHEX_PLUGIN_SUFFIX ".hexpluglib")
|
||||
else()
|
||||
set(IMHEX_PLUGIN_LIBRARY_TYPE MODULE)
|
||||
set(IMHEX_PLUGIN_SUFFIX ".hexplug")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if (IMHEX_PLUGIN_LIBRARY_PLUGIN)
|
||||
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include/" DESTINATION "${SDK_PATH}/lib/plugins/${IMHEX_PLUGIN_NAME}")
|
||||
endif()
|
||||
|
||||
# Define new project for plugin
|
||||
project(${IMHEX_PLUGIN_NAME})
|
||||
|
||||
# Create a new shared library for the plugin source code
|
||||
add_library(${IMHEX_PLUGIN_NAME} ${IMHEX_PLUGIN_LIBRARY_TYPE} ${IMHEX_PLUGIN_SOURCES})
|
||||
if (IMHEX_PLUGIN_IMPORTED)
|
||||
add_library(${IMHEX_PLUGIN_NAME} SHARED IMPORTED GLOBAL)
|
||||
|
||||
# Add include directories and link libraries
|
||||
target_include_directories(${IMHEX_PLUGIN_NAME} PUBLIC ${IMHEX_PLUGIN_INCLUDES})
|
||||
target_link_libraries(${IMHEX_PLUGIN_NAME} PRIVATE libimhex ${FMT_LIBRARIES} ${IMHEX_PLUGIN_LIBRARIES})
|
||||
if (WIN32)
|
||||
set_target_properties(${IMHEX_PLUGIN_NAME} PROPERTIES
|
||||
IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/${IMHEX_PLUGIN_NAME}${IMHEX_PLUGIN_SUFFIX}"
|
||||
IMPORTED_IMPLIB "${CMAKE_CURRENT_SOURCE_DIR}/../lib${IMHEX_PLUGIN_NAME}.dll.a"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/include/include")
|
||||
elseif (APPLE)
|
||||
set_target_properties(${IMHEX_PLUGIN_NAME} PROPERTIES
|
||||
IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/../../../../MacOS/plugins/${IMHEX_PLUGIN_NAME}${IMHEX_PLUGIN_SUFFIX}"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/include/include")
|
||||
else()
|
||||
set_target_properties(${IMHEX_PLUGIN_NAME} PROPERTIES
|
||||
IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/${IMHEX_PLUGIN_NAME}${IMHEX_PLUGIN_SUFFIX}"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/include/include")
|
||||
endif()
|
||||
else()
|
||||
# Create a new shared library for the plugin source code
|
||||
add_library(${IMHEX_PLUGIN_NAME} ${IMHEX_PLUGIN_LIBRARY_TYPE} ${IMHEX_PLUGIN_SOURCES})
|
||||
|
||||
# Add IMHEX_PROJECT_NAME and IMHEX_VERSION define
|
||||
target_compile_definitions(${IMHEX_PLUGIN_NAME} PRIVATE IMHEX_PROJECT_NAME="${IMHEX_PLUGIN_NAME}")
|
||||
target_compile_definitions(${IMHEX_PLUGIN_NAME} PRIVATE IMHEX_VERSION="${IMHEX_VERSION_STRING}")
|
||||
target_compile_definitions(${IMHEX_PLUGIN_NAME} PRIVATE IMHEX_PLUGIN_NAME=${IMHEX_PLUGIN_NAME})
|
||||
# Add include directories and link libraries
|
||||
target_include_directories(${IMHEX_PLUGIN_NAME} PUBLIC ${IMHEX_PLUGIN_INCLUDES})
|
||||
target_link_libraries(${IMHEX_PLUGIN_NAME} PUBLIC ${IMHEX_PLUGIN_LIBRARIES})
|
||||
target_link_libraries(${IMHEX_PLUGIN_NAME} PRIVATE libimhex ${FMT_LIBRARIES} imgui_all_includes libwolv)
|
||||
addIncludesFromLibrary(${IMHEX_PLUGIN_NAME} libpl)
|
||||
addIncludesFromLibrary(${IMHEX_PLUGIN_NAME} libpl-gen)
|
||||
|
||||
# Enable required compiler flags
|
||||
set_target_properties(${IMHEX_PLUGIN_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON)
|
||||
setupCompilerFlags(${IMHEX_PLUGIN_NAME})
|
||||
precompileHeaders(${IMHEX_PLUGIN_NAME} "${CMAKE_CURRENT_SOURCE_DIR}/include")
|
||||
|
||||
# Configure build properties
|
||||
set_target_properties(${IMHEX_PLUGIN_NAME}
|
||||
PROPERTIES
|
||||
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/plugins
|
||||
CXX_STANDARD 23
|
||||
PREFIX ""
|
||||
SUFFIX ".hexplug"
|
||||
)
|
||||
# Add IMHEX_PROJECT_NAME and IMHEX_VERSION define
|
||||
target_compile_definitions(${IMHEX_PLUGIN_NAME} PRIVATE IMHEX_PROJECT_NAME="${IMHEX_PLUGIN_NAME}")
|
||||
target_compile_definitions(${IMHEX_PLUGIN_NAME} PRIVATE IMHEX_VERSION="${IMHEX_VERSION_STRING}")
|
||||
target_compile_definitions(${IMHEX_PLUGIN_NAME} PRIVATE IMHEX_PLUGIN_NAME=${IMHEX_PLUGIN_NAME})
|
||||
|
||||
# Setup a romfs for the plugin
|
||||
list(APPEND LIBROMFS_RESOURCE_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/romfs)
|
||||
set(LIBROMFS_PROJECT_NAME ${IMHEX_PLUGIN_NAME})
|
||||
add_subdirectory(${IMHEX_BASE_FOLDER}/lib/external/libromfs ${CMAKE_CURRENT_BINARY_DIR}/libromfs)
|
||||
set_target_properties(${LIBROMFS_LIBRARY} PROPERTIES POSITION_INDEPENDENT_CODE ON)
|
||||
target_link_libraries(${IMHEX_PLUGIN_NAME} PRIVATE ${LIBROMFS_LIBRARY})
|
||||
# Enable required compiler flags
|
||||
enableUnityBuild(${IMHEX_PLUGIN_NAME})
|
||||
setupCompilerFlags(${IMHEX_PLUGIN_NAME})
|
||||
addCppCheck(${IMHEX_PLUGIN_NAME})
|
||||
|
||||
# Add the new plugin to the main dependency list so it gets built by default
|
||||
add_dependencies(imhex_all ${IMHEX_PLUGIN_NAME})
|
||||
# Configure build properties
|
||||
set_target_properties(${IMHEX_PLUGIN_NAME}
|
||||
PROPERTIES
|
||||
RUNTIME_OUTPUT_DIRECTORY "${IMHEX_MAIN_OUTPUT_DIRECTORY}/plugins"
|
||||
CXX_STANDARD 23
|
||||
PREFIX ""
|
||||
SUFFIX ${IMHEX_PLUGIN_SUFFIX}
|
||||
)
|
||||
|
||||
# Set rpath of plugin libraries to the plugins folder
|
||||
if (WIN32)
|
||||
if (IMHEX_PLUGIN_LIBRARY_PLUGIN)
|
||||
set_target_properties(${IMHEX_PLUGIN_NAME} PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
|
||||
endif()
|
||||
elseif (APPLE)
|
||||
set_target_properties(${IMHEX_PLUGIN_NAME} PROPERTIES BUILD_RPATH "@executable_path/../Frameworks;@executable_path/plugins")
|
||||
endif()
|
||||
|
||||
# Setup a romfs for the plugin
|
||||
list(APPEND LIBROMFS_RESOURCE_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/romfs)
|
||||
set(LIBROMFS_PROJECT_NAME ${IMHEX_PLUGIN_NAME})
|
||||
add_subdirectory(${IMHEX_BASE_FOLDER}/lib/external/libromfs ${CMAKE_CURRENT_BINARY_DIR}/libromfs)
|
||||
target_link_libraries(${IMHEX_PLUGIN_NAME} PRIVATE ${LIBROMFS_LIBRARY})
|
||||
|
||||
set(FEATURE_DEFINE_CONTENT)
|
||||
|
||||
if (IMHEX_PLUGIN_FEATURES)
|
||||
list(LENGTH IMHEX_PLUGIN_FEATURES IMHEX_FEATURE_COUNT)
|
||||
math(EXPR IMHEX_FEATURE_COUNT "${IMHEX_FEATURE_COUNT} - 1" OUTPUT_FORMAT DECIMAL)
|
||||
foreach(index RANGE 0 ${IMHEX_FEATURE_COUNT} 2)
|
||||
list(SUBLIST IMHEX_PLUGIN_FEATURES ${index} 2 IMHEX_PLUGIN_FEATURE)
|
||||
list(GET IMHEX_PLUGIN_FEATURE 0 feature_define)
|
||||
list(GET IMHEX_PLUGIN_FEATURE 1 feature_description)
|
||||
|
||||
string(TOUPPER ${feature_define} feature_define)
|
||||
add_definitions(-DIMHEX_PLUGIN_${IMHEX_PLUGIN_NAME}_FEATURE_${feature_define}=0)
|
||||
set(FEATURE_DEFINE_CONTENT "${FEATURE_DEFINE_CONTENT}{ \"${feature_description}\", IMHEX_FEATURE_ENABLED(${feature_define}) },")
|
||||
endforeach()
|
||||
endif()
|
||||
|
||||
target_compile_options(${IMHEX_PLUGIN_NAME} PRIVATE -DIMHEX_PLUGIN_FEATURES_CONTENT=${FEATURE_DEFINE_CONTENT})
|
||||
|
||||
# Add the new plugin to the main dependency list so it gets built by default
|
||||
if (TARGET imhex_all)
|
||||
add_dependencies(imhex_all ${IMHEX_PLUGIN_NAME})
|
||||
endif()
|
||||
|
||||
if (IMHEX_EXTERNAL_PLUGIN_BUILD)
|
||||
install(TARGETS ${IMHEX_PLUGIN_NAME} DESTINATION ".")
|
||||
endif()
|
||||
|
||||
# Fix rpath
|
||||
if (APPLE)
|
||||
set_target_properties(
|
||||
${IMHEX_PLUGIN_NAME}
|
||||
PROPERTIES
|
||||
INSTALL_RPATH "@executable_path/../Frameworks;@executable_path/plugins"
|
||||
)
|
||||
elseif (UNIX)
|
||||
set(PLUGIN_RPATH "")
|
||||
list(APPEND PLUGIN_RPATH "$ORIGIN")
|
||||
|
||||
if (IMHEX_PLUGIN_ADD_INSTALL_PREFIX_TO_RPATH)
|
||||
list(APPEND PLUGIN_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
|
||||
endif()
|
||||
|
||||
set_target_properties(
|
||||
${IMHEX_PLUGIN_NAME}
|
||||
PROPERTIES
|
||||
INSTALL_RPATH_USE_ORIGIN ON
|
||||
INSTALL_RPATH "${PLUGIN_RPATH}"
|
||||
)
|
||||
endif()
|
||||
|
||||
if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/tests/CMakeLists.txt AND IMHEX_ENABLE_UNIT_TESTS AND IMHEX_ENABLE_PLUGIN_TESTS)
|
||||
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/tests)
|
||||
target_link_libraries(${IMHEX_PLUGIN_NAME} PUBLIC ${IMHEX_PLUGIN_NAME}_tests)
|
||||
target_compile_definitions(${IMHEX_PLUGIN_NAME}_tests PRIVATE IMHEX_PROJECT_NAME="${IMHEX_PLUGIN_NAME}-tests")
|
||||
endif()
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
macro(add_romfs_resource input output)
|
||||
if (NOT EXISTS ${input})
|
||||
message(WARNING "Resource file ${input} does not exist")
|
||||
endif()
|
||||
|
||||
configure_file(${input} ${CMAKE_CURRENT_BINARY_DIR}/romfs/${output} COPYONLY)
|
||||
|
||||
list(APPEND LIBROMFS_RESOURCE_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/romfs)
|
||||
endmacro()
|
||||
endmacro()
|
||||
|
||||
macro (enable_plugin_feature feature)
|
||||
string(TOUPPER ${feature} feature)
|
||||
if (NOT (feature IN_LIST IMHEX_PLUGIN_FEATURES))
|
||||
message(FATAL_ERROR "Feature ${feature} is not enabled for plugin ${IMHEX_PLUGIN_NAME}")
|
||||
endif()
|
||||
|
||||
remove_definitions(-DIMHEX_PLUGIN_${IMHEX_PLUGIN_NAME}_FEATURE_${feature}=0)
|
||||
add_definitions(-DIMHEX_PLUGIN_${IMHEX_PLUGIN_NAME}_FEATURE_${feature}=1)
|
||||
endmacro()
|
||||
|
||||
@@ -14,41 +14,47 @@ if(CMAKE_GENERATOR)
|
||||
# Being called as include(PostprocessBundle), so define a helper function.
|
||||
set(_POSTPROCESS_BUNDLE_MODULE_LOCATION "${CMAKE_CURRENT_LIST_FILE}")
|
||||
function(postprocess_bundle out_target in_target)
|
||||
add_custom_command(TARGET ${out_target} POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -DBUNDLE_PATH="$<TARGET_FILE_DIR:${in_target}>/../.."
|
||||
-DCODE_SIGN_CERTIFICATE_ID="${CODE_SIGN_CERTIFICATE_ID}"
|
||||
-DEXTRA_BUNDLE_LIBRARY_PATHS="${EXTRA_BUNDLE_LIBRARY_PATHS}"
|
||||
-P "${_POSTPROCESS_BUNDLE_MODULE_LOCATION}"
|
||||
)
|
||||
|
||||
install(CODE "set(BUNDLE_PATH ${CMAKE_INSTALL_PREFIX}/${BUNDLE_NAME})")
|
||||
install(CODE "set(CODE_SIGN_CERTIFICATE_ID ${CODE_SIGN_CERTIFICATE_ID})")
|
||||
install(CODE "set(EXTRA_BUNDLE_LIBRARY_PATHS ${EXTRA_BUNDLE_LIBRARY_PATHS})")
|
||||
install(SCRIPT ${_POSTPROCESS_BUNDLE_MODULE_LOCATION})
|
||||
endfunction()
|
||||
return()
|
||||
endif()
|
||||
|
||||
# IMHEX PATCH BEGIN
|
||||
# The function defined above doesn't keep in mind that if we are cross-compiling to MacOS, APPLE must be 1,
|
||||
# so we force it here (where else would this script be run anyway ? This seems to be MacOS-specific code)
|
||||
SET(APPLE 1)
|
||||
# IMHEX PATCHE END
|
||||
|
||||
get_filename_component(BUNDLE_PATH "${BUNDLE_PATH}" ABSOLUTE)
|
||||
message(STATUS "Fixing up application bundle: ${BUNDLE_PATH}")
|
||||
|
||||
|
||||
# Make sure to fix up any included ImHex plugin.
|
||||
file(GLOB_RECURSE extra_libs "${BUNDLE_PATH}/Contents/MacOS/plugins/*.hexplug")
|
||||
file(GLOB_RECURSE plugins "${BUNDLE_PATH}/Contents/MacOS/plugins/*.hexplug")
|
||||
|
||||
|
||||
# BundleUtilities doesn't support DYLD_FALLBACK_LIBRARY_PATH behavior, which
|
||||
# makes it sometimes break on libraries that do weird things with @rpath. Specify
|
||||
# equivalent search directories until https://gitlab.kitware.com/cmake/cmake/issues/16625
|
||||
# is fixed and in our minimum CMake version.
|
||||
set(extra_dirs "/usr/local/lib" "/lib" "/usr/lib" ${EXTRA_BUNDLE_LIBRARY_PATHS})
|
||||
set(extra_dirs "/usr/local/lib" "/lib" "/usr/lib" ${EXTRA_BUNDLE_LIBRARY_PATHS} "${BUNDLE_PATH}/Contents/MacOS/plugins" "${BUNDLE_PATH}/Contents/Frameworks")
|
||||
message(STATUS "Fixing up application bundle: ${extra_dirs}")
|
||||
|
||||
# BundleUtilities is overly verbose, so disable most of its messages
|
||||
function(message)
|
||||
if(NOT ARGV MATCHES "^STATUS;")
|
||||
_message(${ARGV})
|
||||
endif()
|
||||
endfunction()
|
||||
#function(message)
|
||||
# if(NOT ARGV MATCHES "^STATUS;")
|
||||
# _message(${ARGV})
|
||||
# endif()
|
||||
#endfunction()
|
||||
|
||||
include(BundleUtilities)
|
||||
set(BU_CHMOD_BUNDLE_ITEMS ON)
|
||||
fixup_bundle("${BUNDLE_PATH}" "${extra_libs}" "${extra_dirs}")
|
||||
|
||||
fixup_bundle("${BUNDLE_PATH}" "${plugins}" "${extra_dirs}")
|
||||
|
||||
if (CODE_SIGN_CERTIFICATE_ID)
|
||||
# Hack around Apple Silicon signing bugs by copying the real app, signing it and moving it back.
|
||||
@@ -60,4 +66,13 @@ if (CODE_SIGN_CERTIFICATE_ID)
|
||||
endif()
|
||||
|
||||
# Add a necessary rpath to the imhex binary
|
||||
get_bundle_main_executable("${BUNDLE_PATH}" IMHEX_EXECUTABLE)
|
||||
get_bundle_main_executable("${BUNDLE_PATH}" IMHEX_EXECUTABLE)
|
||||
|
||||
file(GLOB_RECURSE plugin_libs "${BUNDLE_PATH}/Contents/MacOS/*.hexpluglib")
|
||||
foreach(plugin_lib ${plugin_libs})
|
||||
get_filename_component(plugin_lib_name ${plugin_lib} NAME)
|
||||
set(plugin_lib_dest "${BUNDLE_PATH}/Contents/MacOS/plugins/${plugin_lib_name}")
|
||||
|
||||
configure_file(${plugin_lib} "${plugin_lib_dest}" COPYONLY)
|
||||
message(STATUS "Copying plugin library: ${plugin_lib} to ${plugin_lib_dest}")
|
||||
endforeach ()
|
||||
73
cmake/sdk/CMakeLists.txt
Normal file
73
cmake/sdk/CMakeLists.txt
Normal file
@@ -0,0 +1,73 @@
|
||||
cmake_minimum_required(VERSION 3.20)
|
||||
project(ImHexSDK)
|
||||
|
||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules")
|
||||
set(CMAKE_POSITION_INDEPENDENT_CODE ON CACHE BOOL "" FORCE)
|
||||
include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/build_helpers.cmake")
|
||||
|
||||
set(IMHEX_BASE_FOLDER ${CMAKE_CURRENT_SOURCE_DIR} PARENT_SCOPE)
|
||||
include(ImHexPlugin)
|
||||
|
||||
function(add_subdirectory_if_exists folder)
|
||||
if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${folder}/CMakeLists.txt")
|
||||
add_subdirectory("${folder}" EXCLUDE_FROM_ALL)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
set(IMHEX_EXTERNAL_PLUGIN_BUILD ON PARENT_SCOPE)
|
||||
set(IMHEX_EXTERNAL_PLUGIN_BUILD ON)
|
||||
add_custom_target(imhex_all)
|
||||
|
||||
add_subdirectory(lib/third_party/imgui EXCLUDE_FROM_ALL)
|
||||
|
||||
set(FMT_INSTALL OFF CACHE BOOL "" FORCE)
|
||||
add_subdirectory_if_exists(lib/third_party/fmt)
|
||||
set(FMT_LIBRARIES fmt::fmt-header-only PARENT_SCOPE)
|
||||
set(FMT_LIBRARIES fmt::fmt-header-only)
|
||||
|
||||
add_subdirectory_if_exists(lib/third_party/nlohmann_json)
|
||||
set(NLOHMANN_JSON_LIBRARIES nlohmann_json PARENT_SCOPE)
|
||||
set(NLOHMANN_JSON_LIBRARIES nlohmann_json)
|
||||
|
||||
add_subdirectory_if_exists(lib/third_party/boost)
|
||||
set(BOOST_LIBRARIES boost::regex PARENT_SCOPE)
|
||||
set(BOOST_LIBRARIES boost::regex)
|
||||
|
||||
add_subdirectory(lib/external/libwolv EXCLUDE_FROM_ALL)
|
||||
|
||||
set(LIBPL_ENABLE_CLI OFF CACHE BOOL "" FORCE)
|
||||
add_subdirectory(lib/external/pattern_language EXCLUDE_FROM_ALL)
|
||||
|
||||
set(IMHEX_PLUGIN_IMPORTED ON)
|
||||
|
||||
add_subdirectory(lib/libimhex)
|
||||
add_subdirectory(lib/trace)
|
||||
add_subdirectory(lib/fonts)
|
||||
add_subdirectory(lib/ui)
|
||||
|
||||
set(IMHEX_PLUGIN_IMPORTED OFF)
|
||||
|
||||
if (WIN32)
|
||||
set_target_properties(libimhex PROPERTIES
|
||||
IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/../libimhex.dll"
|
||||
IMPORTED_IMPLIB "${CMAKE_CURRENT_SOURCE_DIR}/lib/liblibimhex.dll.a"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/lib/libimhex/include")
|
||||
set_target_properties(tracing PROPERTIES
|
||||
IMPORTED_IMPLIB "${CMAKE_CURRENT_SOURCE_DIR}/lib/libtracing.a"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/lib/trace/include")
|
||||
elseif (APPLE)
|
||||
file(GLOB LIBIMHEX_DYLIB "${CMAKE_CURRENT_SOURCE_DIR}/../../Frameworks/libimhex.*.dylib")
|
||||
set_target_properties(libimhex PROPERTIES
|
||||
IMPORTED_LOCATION "${LIBIMHEX_DYLIB}"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/lib/libimhex/include")
|
||||
set_target_properties(tracing PROPERTIES
|
||||
IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/../libtracing.a"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/lib/trace/include")
|
||||
else()
|
||||
set_target_properties(libimhex PROPERTIES
|
||||
IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/../../../lib/libimhex.so"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/lib/libimhex/include")
|
||||
set_target_properties(tracing PROPERTIES
|
||||
IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/lib/libtracing.a"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/lib/trace/include")
|
||||
endif()
|
||||
60
cmake/sdk/template/CMakeLists.txt
Normal file
60
cmake/sdk/template/CMakeLists.txt
Normal file
@@ -0,0 +1,60 @@
|
||||
# ImHex Plugin Template
|
||||
# =====================
|
||||
|
||||
# This is the official CMake template for making your own ImHex plugins
|
||||
# To use this template, copy the file into its own directory and modify it to your needs
|
||||
# For the most part, this is a regular CMake project with some extra functions provided by the ImHex SDK
|
||||
#
|
||||
# [NOTE FOR NON-C++ PLUGINS]
|
||||
# The template is laid out for a C++ plugin, however you can write your plugin in any language you want
|
||||
# and just make the plugin statically link against your code. The only thing that's required is a .cpp file with
|
||||
# the IMHEX_PLUGIN_SETUP() macro used in it. This macro is used to setup the plugin and register it with ImHex
|
||||
#
|
||||
# [CMAKE FUNCTIONS]
|
||||
# add_imhex_plugin(): Registers a new plugin
|
||||
# NAME: The name of the plugin
|
||||
# IMHEX_VERSION: The ImHex version this plugin is compatible with. If unset, the plugin will be loaded on all versions (this may not work though)
|
||||
# SOURCES: Source files of the plugin
|
||||
# INCLUDES: Include directories of the plugin
|
||||
# LIBRARIES: Libraries to link against
|
||||
# FEATURES: Optional features that can be enabled or disabled
|
||||
# LIBRARY_PLUGIN: If set, turns this plugin into a library plugin. Library plugins can be linked against by other plugins
|
||||
#
|
||||
# add_romfs_resource(filePath romfsPath): Adds a file to the romfs of the plugin
|
||||
# The RomFS is a virtual filesystem whose files can be accessed by the plugin using the functions in the `romfs::` namespace
|
||||
# This function is used to add a single file to the romfs. You can however also simply create a `romfs` directory in your plugin directory and place your files and folders in there
|
||||
# filePath: The path to the file on the disk
|
||||
# romfsPath: The path to the file in the romfs
|
||||
#
|
||||
# enable_plugin_feature(feature): Enables a plugin feature
|
||||
# Features are optional parts of the plugin that may or may not be available depending on build settings
|
||||
# When a feature is enabled, `IMHEX_FEATURE_ENABLED(feature)` will be defined to true. Otherwise, it will be defined to false
|
||||
# Use the `IMHEX_PLUGIN_FEATURES` macro in the main plugin file to define names to each feature and have them be listed in the plugin list
|
||||
# feature: The name of the feature to enable
|
||||
|
||||
cmake_minimum_required(VERSION 3.20)
|
||||
project(ImHexPlugin)
|
||||
|
||||
# Include the ImHex SDK
|
||||
# For this to work, you need to set the IMHEX_SDK_PATH environment variable to the path of the ImHex SDK
|
||||
#
|
||||
# On Windows, the SDK is next to the ImHex executable
|
||||
# On Linux, the SDK is usually in /usr/share/imhex/sdk but this may vary depending on your distribution
|
||||
# On MacOS, the SDK is located inside of the ImHex.app bundle under ImHex.app/Contents/Resources/sdk
|
||||
if (NOT EXISTS $ENV{IMHEX_SDK_PATH})
|
||||
message(FATAL_ERROR "The IMHEX_SDK_PATH environment variable is not set")
|
||||
endif()
|
||||
add_subdirectory($ENV{IMHEX_SDK_PATH} ImHexSDK)
|
||||
|
||||
# Register the plugin
|
||||
# This will configure everything you need to make your plugin work
|
||||
# Modify the arguments to your needs. Right now it defines a plugin called `example_plugin`
|
||||
# with a single source file called `example_plugin.cpp` in the `source` directory
|
||||
# By default you have access to the libimhex library to interact with ImHex
|
||||
# as well as libwolv, libromfs, libfmt and ImGui, but you can link against any libraries you want
|
||||
add_imhex_plugin(
|
||||
NAME
|
||||
example_plugin
|
||||
SOURCES
|
||||
source/example_plugin.cpp
|
||||
)
|
||||
11
cmake/sdk/template/source/example_plugin.cpp
Normal file
11
cmake/sdk/template/source/example_plugin.cpp
Normal file
@@ -0,0 +1,11 @@
|
||||
#include <hex/plugin.hpp>
|
||||
|
||||
// Browse through the headers in lib/libimhex/include/hex/api/ to see what you can do with the API.
|
||||
// Most important ones are the things under imhex_api and content_registry
|
||||
|
||||
// This is the main entry point of your plugin. The code in the body of this construct will be executed
|
||||
// when ImHex starts up and loads the plugin.
|
||||
// The strings in the header are used to display information about the plugin in the UI.
|
||||
IMHEX_PLUGIN_SETUP("Example Plugin", "Author", "Description") {
|
||||
// Put your init code here
|
||||
}
|
||||
146
dist/AppImage/AppImageBuilder.yml
vendored
Normal file
146
dist/AppImage/AppImageBuilder.yml
vendored
Normal file
@@ -0,0 +1,146 @@
|
||||
# appimage-builder recipe see https://appimage-builder.readthedocs.io for details
|
||||
version: 1
|
||||
AppDir:
|
||||
path: .AppDir
|
||||
app_info:
|
||||
id: imhex
|
||||
name: ImHex
|
||||
icon: imhex
|
||||
version: "{{VERSION}}"
|
||||
exec: usr/bin/imhex
|
||||
exec_args: $@
|
||||
apt:
|
||||
arch:
|
||||
- all
|
||||
- "{{ARCHITECTURE_PACKAGE}}"
|
||||
allow_unauthenticated: true
|
||||
sources:
|
||||
- sourceline: 'deb [arch=amd64] http://us.archive.ubuntu.com/ubuntu/ noble main restricted universe multiverse'
|
||||
- sourceline: 'deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ noble main restricted universe multiverse'
|
||||
include:
|
||||
- libgdk-pixbuf2.0-0
|
||||
- libgdk-pixbuf2.0-common
|
||||
- shared-mime-info
|
||||
- librsvg2-common
|
||||
- libbz2-1.0
|
||||
- libcap2
|
||||
- libdbus-1-3
|
||||
- libfontconfig1
|
||||
- libgpg-error0
|
||||
- liblzma5
|
||||
- libnss-mdns
|
||||
- libpcre3
|
||||
- libselinux1
|
||||
- libtinfo6
|
||||
- libmd4c-dev
|
||||
- libmd4c-html0-dev
|
||||
files:
|
||||
include:
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libLLVM-13.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libOpenGL.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libX11.so.6"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libXau.so.6"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libXcomposite.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libXcursor.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libXdamage.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libXdmcp.so.6"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libXext.so.6"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libXfixes.so.3"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libXi.so.6"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libXinerama.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libXrandr.so.2"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libXrender.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libXxf86vm.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libatk-1.0.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libatk-bridge-2.0.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libatspi.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libblkid.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libbrotlicommon.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libbrotlidec.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libbsd.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libcairo-gobject.so.2"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libcairo.so.2"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libcurl-gnutls.so.4"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libdatrie.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libedit.so.2"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libelf.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libepoxy.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libffi.so.8"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libfontconfig.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libfreetype.so.6"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libfribidi.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libgcrypt.so.20"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libgdk-3.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libgdk_pixbuf-2.0.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libgio-2.0.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libglfw.so.3"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libglib-2.0.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libgmodule-2.0.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libgmp.so.10"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libgnutls.so.30"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libgobject-2.0.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libgraphite2.so.3"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libharfbuzz.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libhogweed.so.6"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libicudata.so.70"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libicuuc.so.70"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libidn2.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libjpeg.so.8"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/liblber-2.5.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libldap-2.5.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/liblz4.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libmagic.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libmbedcrypto.so.7"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libmbedtls.so.14"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libmbedx509.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libmd.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libmount.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libnettle.so.8"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libp11-kit.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libpango-1.0.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libpangocairo-1.0.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libpangoft2-1.0.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libpcre2-8.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libpixman-1.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libpng16.so.16"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libsasl2.so.2"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libsensors.so.5"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libstdc++.so.6"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libsystemd.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libtasn1.so.6"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libthai.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libunistring.so.2"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libuuid.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libvulkan.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libwayland-client.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libwayland-cursor.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libwayland-egl.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libxcb-dri2.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libxcb-dri3.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libxcb-present.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libxcb-sync.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libxkbcommon.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libxml2.so.2"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libxshmfence.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libzstd.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libmd4c.so"
|
||||
exclude:
|
||||
- usr/share/man
|
||||
- usr/share/doc/*/README.*
|
||||
- usr/share/doc/*/changelog.*
|
||||
- usr/share/doc/*/NEWS.*
|
||||
- usr/share/doc/*/TODO.*
|
||||
|
||||
runtime:
|
||||
env:
|
||||
APPDIR_LIBRARY_PATH: '$APPDIR/usr/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu:$APPDIR/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu:$APPDIR/usr/lib:$APPDIR/usr/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders'
|
||||
GTK_EXE_PREFIX: $APPDIR/usr
|
||||
GTK_DATA_PREFIX: $APPDIR
|
||||
XDG_DATA_DIRS: '/usr/local/share:/usr/share:$APPDIR/usr/share:$XDG_DATA_DIRS:$APPDIR/usr/local/share:$APPDIR/usr/local/lib:$APPDIR/usr/local/share'
|
||||
XDG_CONFIG_DIRS: '$XDG_CONFIG_DIRS:$APPDIR/usr/local/share'
|
||||
|
||||
AppImage:
|
||||
arch: "{{ARCHITECTURE_APPIMAGE_BUILDER}}"
|
||||
comp: zstd
|
||||
update-information: gh-releases-zsync|WerWolv|ImHex|latest|imhex-*-{{ARCHITECTURE_FILE_NAME}}.AppImage.zsync
|
||||
file_name: imhex-{{VERSION}}-{{ARCHITECTURE_FILE_NAME}}.AppImage
|
||||
@@ -1,4 +1,4 @@
|
||||
FROM ubuntu:22.04 as build
|
||||
FROM ubuntu:24.04 as build
|
||||
|
||||
# Used to invalidate layer cache but not mount cache
|
||||
# See https://github.com/moby/moby/issues/41715#issuecomment-733976493
|
||||
@@ -14,24 +14,13 @@ apt update
|
||||
# general deps
|
||||
apt install -y ccache git wget
|
||||
# appimage tools deps
|
||||
apt install -y python3-pip python3-setuptools desktop-file-utils libgdk-pixbuf2.0-dev fuse ninja-build
|
||||
apt install -y python3-pip python3-venv python3-setuptools desktop-file-utils libgdk-pixbuf2.0-dev fuse ninja-build
|
||||
apt install -y squashfs-tools zsync
|
||||
|
||||
# imhex deps
|
||||
/tmp/get_deps_debian.sh
|
||||
EOF
|
||||
|
||||
RUN --mount=type=cache,target=/cache <<EOF
|
||||
# Download appimage-builder
|
||||
set -xe
|
||||
|
||||
mkdir -p /cache/bin
|
||||
wget -nc https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage -O /cache/bin/appimagetool || true
|
||||
chmod +x /cache/bin/appimagetool
|
||||
|
||||
pip3 install git+https://github.com/AppImageCrafters/appimage-builder@f38699e
|
||||
EOF
|
||||
|
||||
ENV PATH="/cache/bin/:${PATH}"
|
||||
|
||||
# Copy Imhex source
|
||||
@@ -41,19 +30,24 @@ ARG LTO=ON
|
||||
ARG BUILD_TYPE=RelWithDebInfo
|
||||
ARG GIT_COMMIT_HASH
|
||||
ARG GIT_BRANCH
|
||||
ARG ARCHITECTURE_PACKAGE
|
||||
ARG ARCHITECTURE_FILE_NAME
|
||||
ARG ARCHITECTURE_APPIMAGE_BUILDER
|
||||
WORKDIR /build
|
||||
SHELL ["bash", "-c"] # Ubuntu sh doesnt support string substitution
|
||||
|
||||
# Ubuntu sh doesnt support string substitution
|
||||
SHELL ["bash", "-c"]
|
||||
|
||||
RUN <<EOF
|
||||
# Prepare ImHex build
|
||||
set -xe
|
||||
|
||||
CC=gcc-12 CXX=g++-12 cmake -G "Ninja" \
|
||||
CC=gcc-14 CXX=g++-14 cmake -G "Ninja" \
|
||||
-DCMAKE_BUILD_TYPE=${BUILD_TYPE} \
|
||||
-DCMAKE_INSTALL_PREFIX="/usr" \
|
||||
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
|
||||
-DIMHEX_PATTERNS_PULL_MASTER=ON \
|
||||
-DIMHEX_COMMIT_HASH_SHORT="${GIT_COMMIT_HASH::7}" \
|
||||
-DIMHEX_COMMIT_HASH_LONG="${GIT_COMMIT_HASH}" \
|
||||
-DIMHEX_COMMIT_BRANCH="${GIT_BRANCH}" \
|
||||
-DIMHEX_ENABLE_LTO=${LTO} \
|
||||
@@ -72,11 +66,23 @@ ccache -s
|
||||
EOF
|
||||
|
||||
RUN <<EOF
|
||||
# Package ImHex as AppImage
|
||||
# Download appimage-builder
|
||||
set -xe
|
||||
|
||||
mkdir -p /cache/bin
|
||||
wget -nc https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage -O /cache/bin/appimagetool || true
|
||||
chmod +x /cache/bin/appimagetool
|
||||
|
||||
python3 -m venv venv
|
||||
. venv/bin/activate
|
||||
pip3 install git+https://github.com/AppImageCrafters/appimage-builder@e995e8e
|
||||
|
||||
# Package ImHex as AppImage
|
||||
export VERSION=$(cat /imhex/VERSION)
|
||||
appimage-builder --recipe /imhex/dist/AppImageBuilder.yml
|
||||
export ARCHITECTURE_PACKAGE=${ARCHITECTURE_PACKAGE}
|
||||
export ARCHITECTURE_FILE_NAME=${ARCHITECTURE_FILE_NAME}
|
||||
export ARCHITECTURE_APPIMAGE_BUILDER=${ARCHITECTURE_APPIMAGE_BUILDER}
|
||||
appimage-builder --recipe /imhex/dist/AppImage/AppImageBuilder.yml
|
||||
EOF
|
||||
|
||||
FROM scratch
|
||||
137
dist/AppImageBuilder.yml
vendored
137
dist/AppImageBuilder.yml
vendored
@@ -1,137 +0,0 @@
|
||||
# appimage-builder recipe see https://appimage-builder.readthedocs.io for details
|
||||
version: 1
|
||||
AppDir:
|
||||
path: .AppDir
|
||||
app_info:
|
||||
id: imhex
|
||||
name: ImHex
|
||||
icon: imhex
|
||||
version: "{{VERSION}}"
|
||||
exec: usr/bin/imhex
|
||||
exec_args: $@
|
||||
apt:
|
||||
arch:
|
||||
- amd64
|
||||
allow_unauthenticated: true
|
||||
sources:
|
||||
- sourceline: deb http://us.archive.ubuntu.com/ubuntu/ jammy main restricted
|
||||
- sourceline: deb http://us.archive.ubuntu.com/ubuntu/ jammy-updates main restricted
|
||||
- sourceline: deb http://us.archive.ubuntu.com/ubuntu/ jammy universe
|
||||
- sourceline: deb http://us.archive.ubuntu.com/ubuntu/ jammy-updates universe
|
||||
- sourceline: deb http://us.archive.ubuntu.com/ubuntu/ jammy multiverse
|
||||
- sourceline: deb http://us.archive.ubuntu.com/ubuntu/ jammy-updates multiverse
|
||||
- sourceline: deb http://us.archive.ubuntu.com/ubuntu/ jammy-backports main restricted
|
||||
universe multiverse
|
||||
- sourceline: deb http://security.ubuntu.com/ubuntu jammy-security main restricted
|
||||
- sourceline: deb http://security.ubuntu.com/ubuntu jammy-security universe
|
||||
- sourceline: deb http://security.ubuntu.com/ubuntu jammy-security multiverse
|
||||
include:
|
||||
- librsvg2-common
|
||||
- libbz2-1.0:amd64
|
||||
- libcap2:amd64
|
||||
- libdbus-1-3:amd64
|
||||
- libgpg-error0:amd64
|
||||
- liblzma5:amd64
|
||||
- libnss-mdns:amd64
|
||||
- libpcre3:amd64
|
||||
- libselinux1:amd64
|
||||
- libtinfo6:amd64
|
||||
files:
|
||||
include:
|
||||
- /lib/x86_64-linux-gnu/libLLVM-13.so.1
|
||||
- /lib/x86_64-linux-gnu/libOpenGL.so.0
|
||||
- /lib/x86_64-linux-gnu/libX11.so.6
|
||||
- /lib/x86_64-linux-gnu/libXau.so.6
|
||||
- /lib/x86_64-linux-gnu/libXcomposite.so.1
|
||||
- /lib/x86_64-linux-gnu/libXcursor.so.1
|
||||
- /lib/x86_64-linux-gnu/libXdamage.so.1
|
||||
- /lib/x86_64-linux-gnu/libXdmcp.so.6
|
||||
- /lib/x86_64-linux-gnu/libXext.so.6
|
||||
- /lib/x86_64-linux-gnu/libXfixes.so.3
|
||||
- /lib/x86_64-linux-gnu/libXi.so.6
|
||||
- /lib/x86_64-linux-gnu/libXinerama.so.1
|
||||
- /lib/x86_64-linux-gnu/libXrandr.so.2
|
||||
- /lib/x86_64-linux-gnu/libXrender.so.1
|
||||
- /lib/x86_64-linux-gnu/libXxf86vm.so.1
|
||||
- /lib/x86_64-linux-gnu/libatk-1.0.so.0
|
||||
- /lib/x86_64-linux-gnu/libatk-bridge-2.0.so.0
|
||||
- /lib/x86_64-linux-gnu/libatspi.so.0
|
||||
- /lib/x86_64-linux-gnu/libblkid.so.1
|
||||
- /lib/x86_64-linux-gnu/libbrotlicommon.so.1
|
||||
- /lib/x86_64-linux-gnu/libbrotlidec.so.1
|
||||
- /lib/x86_64-linux-gnu/libbsd.so.0
|
||||
- /lib/x86_64-linux-gnu/libcairo-gobject.so.2
|
||||
- /lib/x86_64-linux-gnu/libcairo.so.2
|
||||
- /lib/x86_64-linux-gnu/libcurl-gnutls.so.4
|
||||
- /lib/x86_64-linux-gnu/libdatrie.so.1
|
||||
- /lib/x86_64-linux-gnu/libedit.so.2
|
||||
- /lib/x86_64-linux-gnu/libelf.so.1
|
||||
- /lib/x86_64-linux-gnu/libepoxy.so.0
|
||||
- /lib/x86_64-linux-gnu/libffi.so.8
|
||||
- /lib/x86_64-linux-gnu/libfontconfig.so.1
|
||||
- /lib/x86_64-linux-gnu/libfreetype.so.6
|
||||
- /lib/x86_64-linux-gnu/libfribidi.so.0
|
||||
- /lib/x86_64-linux-gnu/libgcrypt.so.20
|
||||
- /lib/x86_64-linux-gnu/libgdk-3.so.0
|
||||
- /lib/x86_64-linux-gnu/libgdk_pixbuf-2.0.so.0
|
||||
- /lib/x86_64-linux-gnu/libgio-2.0.so.0
|
||||
- /lib/x86_64-linux-gnu/libglfw.so.3
|
||||
- /lib/x86_64-linux-gnu/libglib-2.0.so.0
|
||||
- /lib/x86_64-linux-gnu/libgmodule-2.0.so.0
|
||||
- /lib/x86_64-linux-gnu/libgmp.so.10
|
||||
- /lib/x86_64-linux-gnu/libgnutls.so.30
|
||||
- /lib/x86_64-linux-gnu/libgobject-2.0.so.0
|
||||
- /lib/x86_64-linux-gnu/libgraphite2.so.3
|
||||
- /lib/x86_64-linux-gnu/libharfbuzz.so.0
|
||||
- /lib/x86_64-linux-gnu/libhogweed.so.6
|
||||
- /lib/x86_64-linux-gnu/libicudata.so.70
|
||||
- /lib/x86_64-linux-gnu/libicuuc.so.70
|
||||
- /lib/x86_64-linux-gnu/libidn2.so.0
|
||||
- /lib/x86_64-linux-gnu/libjpeg.so.8
|
||||
- /lib/x86_64-linux-gnu/liblber-2.5.so.0
|
||||
- /lib/x86_64-linux-gnu/libldap-2.5.so.0
|
||||
- /lib/x86_64-linux-gnu/liblz4.so.1
|
||||
- /lib/x86_64-linux-gnu/libmagic.so.1
|
||||
- /lib/x86_64-linux-gnu/libmbedcrypto.so.7
|
||||
- /lib/x86_64-linux-gnu/libmbedtls.so.14
|
||||
- /lib/x86_64-linux-gnu/libmbedx509.so.1
|
||||
- /lib/x86_64-linux-gnu/libmd.so.0
|
||||
- /lib/x86_64-linux-gnu/libmount.so.1
|
||||
- /lib/x86_64-linux-gnu/libnettle.so.8
|
||||
- /lib/x86_64-linux-gnu/libp11-kit.so.0
|
||||
- /lib/x86_64-linux-gnu/libpango-1.0.so.0
|
||||
- /lib/x86_64-linux-gnu/libpangocairo-1.0.so.0
|
||||
- /lib/x86_64-linux-gnu/libpangoft2-1.0.so.0
|
||||
- /lib/x86_64-linux-gnu/libpcre2-8.so.0
|
||||
- /lib/x86_64-linux-gnu/libpixman-1.so.0
|
||||
- /lib/x86_64-linux-gnu/libpng16.so.16
|
||||
- /lib/x86_64-linux-gnu/libsasl2.so.2
|
||||
- /lib/x86_64-linux-gnu/libsensors.so.5
|
||||
- /lib/x86_64-linux-gnu/libstdc++.so.6
|
||||
- /lib/x86_64-linux-gnu/libsystemd.so.0
|
||||
- /lib/x86_64-linux-gnu/libtasn1.so.6
|
||||
- /lib/x86_64-linux-gnu/libthai.so.0
|
||||
- /lib/x86_64-linux-gnu/libunistring.so.2
|
||||
- /lib/x86_64-linux-gnu/libuuid.so.1
|
||||
- /lib/x86_64-linux-gnu/libvulkan.so.1
|
||||
- /lib/x86_64-linux-gnu/libwayland-client.so.0
|
||||
- /lib/x86_64-linux-gnu/libwayland-cursor.so.0
|
||||
- /lib/x86_64-linux-gnu/libwayland-egl.so.1
|
||||
- /lib/x86_64-linux-gnu/libxcb-dri2.so.0
|
||||
- /lib/x86_64-linux-gnu/libxcb-dri3.so.0
|
||||
- /lib/x86_64-linux-gnu/libxcb-present.so.0
|
||||
- /lib/x86_64-linux-gnu/libxcb-sync.so.1
|
||||
- /lib/x86_64-linux-gnu/libxkbcommon.so.0
|
||||
- /lib/x86_64-linux-gnu/libxml2.so.2
|
||||
- /lib/x86_64-linux-gnu/libxshmfence.so.1
|
||||
- /lib/x86_64-linux-gnu/libzstd.so.1
|
||||
exclude:
|
||||
- usr/share/man
|
||||
- usr/share/doc/*/README.*
|
||||
- usr/share/doc/*/changelog.*
|
||||
- usr/share/doc/*/NEWS.*
|
||||
- usr/share/doc/*/TODO.*
|
||||
AppImage:
|
||||
arch: x86_64
|
||||
update-information: gh-releases-zsync|WerWolv|ImHex|latest|imhex-*-x86_64.AppImage.zsync
|
||||
file_name: imhex-{{VERSION}}-x86_64.AppImage
|
||||
5
dist/Dockerfile → dist/Arch/Dockerfile
vendored
5
dist/Dockerfile → dist/Arch/Dockerfile
vendored
@@ -13,10 +13,13 @@ RUN pacman -S --needed --noconfirm \
|
||||
glfw-x11 \
|
||||
file \
|
||||
mbedtls \
|
||||
fontconfig \
|
||||
freetype2 \
|
||||
curl \
|
||||
dbus \
|
||||
xdg-desktop-portal
|
||||
xdg-desktop-portal \
|
||||
libssh2 \
|
||||
md4c
|
||||
|
||||
# Clone ImHex
|
||||
RUN git clone https://github.com/WerWolv/ImHex --recurse-submodules /root/ImHex
|
||||
9
dist/Arch/PKGBUILD
vendored
9
dist/Arch/PKGBUILD
vendored
@@ -8,8 +8,8 @@ pkgdesc="A Hex Editor for Reverse Engineers, Programmers and people who value th
|
||||
arch=("x86_64")
|
||||
url="https://github.com/WerWolv/ImHex"
|
||||
license=('GPL2')
|
||||
depends=(glfw mbedtls freetype2 libglvnd dbus gtk3 curl fmt yara nlohmann-json)
|
||||
makedepends=(git)
|
||||
depends=(glfw mbedtls fontconfig freetype2 libglvnd dbus gtk3 curl fmt yara zlib bzip2 xz zstd libssh2)
|
||||
makedepends=(git nlohmann-json)
|
||||
provides=(imhex)
|
||||
conflicts=(imhex)
|
||||
source=("$url/releases/download/v$pkgver/imhex-$pkgver-ArchLinux-x86_64.pkg.tar.zst")
|
||||
@@ -17,13 +17,14 @@ md5sums=(SKIP)
|
||||
|
||||
package() {
|
||||
install -Dm755 "$srcdir/usr/bin/imhex" "$pkgdir/usr/bin/imhex"
|
||||
install -Dm755 "$srcdir/usr/bin/imhex-updater" "$pkgdir/usr/bin/imhex-updater"
|
||||
install -Dm644 "$srcdir/usr/lib/libimhex.so.$pkgver" "$pkgdir/usr/lib/libimhex.so.$pkgver"
|
||||
|
||||
for plugin in "$srcdir/usr/lib/imhex/plugins/"*.hexplug; do
|
||||
for plugin in "$srcdir/usr/lib/imhex/plugins/"*.hexplug*; do
|
||||
install -Dm644 "$plugin" "$pkgdir/usr/lib/imhex/plugins/${plugin##*/}"
|
||||
done
|
||||
|
||||
install -d "$pkgdir/usr/share/imhex"
|
||||
cp -r "$srcdir/usr/share/imhex/"{constants,encodings,includes,magic,patterns} "$pkgdir/usr/share/imhex"
|
||||
cp -r "$srcdir/usr/share/"{applications,licenses,pixmaps} "$pkgdir/usr/share"
|
||||
cp -r "$srcdir/usr/share/"{applications,licenses,pixmaps,mime} "$pkgdir/usr/share"
|
||||
}
|
||||
|
||||
2
dist/DEBIAN/control.in
vendored
2
dist/DEBIAN/control.in
vendored
@@ -4,7 +4,7 @@ Section: editors
|
||||
Priority: optional
|
||||
Architecture: amd64
|
||||
License: GNU GPL-2
|
||||
Depends: libglfw3, libmagic1, libmbedtls14, libfreetype6, libopengl0, libdbus-1-3, xdg-desktop-portal
|
||||
Depends: libfontconfig1, libglfw3 | libglfw3-wayland, libmagic1, libmbedtls14, libfreetype6, libopengl0, libdbus-1-3, xdg-desktop-portal, libssh2-1, md4c
|
||||
Maintainer: WerWolv <hey@werwolv.net>
|
||||
Description: ImHex Hex Editor
|
||||
A Hex Editor for Reverse Engineers, Programmers and
|
||||
|
||||
18
dist/ImHex-9999.ebuild
vendored
18
dist/ImHex-9999.ebuild
vendored
@@ -20,9 +20,17 @@ DEPEND=""
|
||||
RDEPEND="${DEPEND}
|
||||
media-libs/glfw
|
||||
sys-apps/file
|
||||
dev-libs/mbedtls
|
||||
dev-cpp/nlohmann_json
|
||||
dbus
|
||||
xdg-desktop-portal
|
||||
net-libs/mbedtls
|
||||
sys-apps/dbus
|
||||
sys-apps/xdg-desktop-portal
|
||||
sys-libs/zlib
|
||||
app-arch/bzip2
|
||||
app-arch/lzma
|
||||
app-arch/zstd
|
||||
app-arch/lz4
|
||||
net-libs/libssh2
|
||||
dev-libs/md4c
|
||||
"
|
||||
BDEPEND="${DEPEND}
|
||||
dev-cpp/nlohmann_json
|
||||
"
|
||||
BDEPEND="${DEPEND}"
|
||||
|
||||
13
dist/ImHex.run.xml
vendored
Normal file
13
dist/ImHex.run.xml
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="ImHex" type="CMakeRunConfiguration" factoryName="Application" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" WORKING_DIR="file://$CMakeCurrentBuildDir$" PASS_PARENT_ENVS_2="true" PROJECT_NAME="ImHex" TARGET_NAME="imhex_all" CONFIG_NAME="Debug" RUN_TARGET_PROJECT_NAME="ImHex" RUN_TARGET_NAME="main">
|
||||
<envs>
|
||||
<env name="NO_DEBUG_BANNER" value="1" />
|
||||
</envs>
|
||||
<method v="2">
|
||||
<option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
<configuration default="false" name="CMake Debug" type="CMakeListConfigurationType" factoryName="CMakeListConfigurationFactory">
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
</component>
|
||||
3
dist/cli/imhex.bat
vendored
Normal file
3
dist/cli/imhex.bat
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
@echo off
|
||||
|
||||
start "" "%~dp0..\imhex.exe" %*
|
||||
5
dist/cli/imhex.sh
vendored
Normal file
5
dist/cli/imhex.sh
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
script_path=$(readlink -f "$0")
|
||||
script_dir=$(dirname "${script_path}")
|
||||
"${script_dir}/../imhex" "$@" > /dev/null 2>&1 &
|
||||
49
dist/compiling/docker.md
vendored
Normal file
49
dist/compiling/docker.md
vendored
Normal file
@@ -0,0 +1,49 @@
|
||||
For a TLDR of commands see [How to build](#How-to-build)
|
||||
|
||||
# Introduction
|
||||
|
||||
The original CI we used (vanilla Github Actions) was great for specifying what steps to execute to build packages. It could even do some custom steps with reusable actions. But it had problem: no local reproducibility. This meant that:
|
||||
- We couldn't test code properly locally, we were dependent on GitHub to do it
|
||||
- If something was wrong and we had to debug the build script, it was *long and painful* because we had to wait for Github runners to finish builds, and couldn't quickly iterate
|
||||
|
||||
To solve this, we are now trying to move the CI build script to docker containers (so using Dockerfiles)
|
||||
|
||||
# How to build
|
||||
|
||||
Commands are available in the [CI](../../.github/workflows/build.yml) and you should prefer copying them from there.
|
||||
But here is a general command that should work for every build we have:
|
||||
```
|
||||
docker buildx build . -f <DOCKERFILE_PATH> --progress plain --build-arg 'JOBS=4' --build-arg 'BUILD_TYPE=Debug' --build-context imhex=$(pwd) --output local
|
||||
```
|
||||
|
||||
where `<DOCKERFILE_PATH>` should be replaced by the wanted Dockerfile base d on the build you want to do:
|
||||
|
||||
| Wanted build | Dockerfile path | Target |
|
||||
|--------------|-----------------------------|--------|
|
||||
| MacOS M1 | dist/macOS/arm64.Dockerfile | - |
|
||||
| AppImage | dist/appimage/Dockerfile | - |
|
||||
| Web version | dist/web/Dockerfile | raw |
|
||||
|
||||
We'll explain this command in the next section
|
||||
|
||||
# Useful knowledge about Docker builds
|
||||
|
||||
Docker-based builds work with a Dockerfile. You run the Dockerfile, it builds the package.
|
||||
|
||||
We are using a base environment (often given to us by dockerhub) (e.g. ubuntu:22.04) which is really just a root filesystem, and we then run shell commands in that env, just like a shell script
|
||||
|
||||
Docker-based builds have two kind of caches used:
|
||||
- layer cache, which mean that if a layer (instruction) hasn't been changed, and previous layers haven't changed, it will not be run again
|
||||
- a `COPY` layer will be invalidated if one of the file copied has changed
|
||||
- mount cache, which are per-instructions mounts that will be cached and restored in the next run. Mounts on different folders will not collide
|
||||
|
||||
Docker cache tends to grow very quickly when constantly making changes in the Dockerfile and rebuilding (a.k.a debugging what's going on), you can clear it with something like `docker system prune -a`
|
||||
|
||||
In the command saw earlier:
|
||||
- `.` is the base folder that the Dockerfile will be allowed to see
|
||||
- `-f <path>` is to specify the Dockerfile path
|
||||
- `--progress plain` is to allow you to see the output of instructions
|
||||
- `--build-arg <key>=<value>` is to allow to specify arguments to the build (like -DKEY=VALUE in CMake)
|
||||
- `--build-context key=<folder>` is to specify folders other than the base folder that the Dockerfile is allowed to see
|
||||
- `--output <path>` is the path to write the output package to. If not specified, Docker will create an image as the output (probably not what you want)
|
||||
- `--target <target>` specifies which docker target to build
|
||||
13
dist/compiling/linux.md
vendored
13
dist/compiling/linux.md
vendored
@@ -9,17 +9,12 @@ On Linux, ImHex is built through regular GCC (or optionally Clang).
|
||||
cd ImHex
|
||||
mkdir -p build
|
||||
cd build
|
||||
CC=gcc-12 CXX=g++-12 cmake \
|
||||
CC=gcc-14 CXX=g++-14 \
|
||||
cmake -G "Ninja" \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_INSTALL_PREFIX="/usr" \
|
||||
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_C_FLAGS="-fuse-ld=lld" \
|
||||
-DCMAKE_CXX_FLAGS="-fuse-ld=lld" \
|
||||
-DCMAKE_OBJC_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_OBJCXX_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_INSTALL_PREFIX="/usr" \
|
||||
..
|
||||
make -j 4 install
|
||||
ninja install
|
||||
```
|
||||
|
||||
All paths follow the XDG Base Directories standard, and can thus be modified
|
||||
|
||||
24
dist/compiling/macos.md
vendored
24
dist/compiling/macos.md
vendored
@@ -3,30 +3,20 @@
|
||||
On macOS, ImHex is built through regular GCC and LLVM clang.
|
||||
|
||||
1. Clone the repo using `git clone https://github.com/WerWolv/ImHex --recurse-submodules`
|
||||
2. Install all the dependencies using `brew bundle --no-lock --file dist/Brewfile`
|
||||
2. Install all the dependencies using `brew bundle --no-lock --file dist/macOS/Brewfile`
|
||||
3. Build ImHex itself using the following commands:
|
||||
```sh
|
||||
cd ImHex
|
||||
mkdir -p build
|
||||
cd build
|
||||
CC=$(brew --prefix gcc@12)/bin/gcc-12 \
|
||||
CXX=$(brew --prefix gcc@12)/bin/g++-12 \
|
||||
CC=$(brew --prefix llvm)/bin/clang \
|
||||
CXX=$(brew --prefix llvm)/bin/clang++ \
|
||||
OBJC=$(brew --prefix llvm)/bin/clang \
|
||||
OBJCXX=$(brew --prefix llvm)/bin/clang++ \
|
||||
PKG_CONFIG_PATH="$(brew --prefix openssl)/lib/pkgconfig":"$(brew --prefix)/lib/pkgconfig" \
|
||||
MACOSX_DEPLOYMENT_TARGET="10.15" \
|
||||
cmake \
|
||||
cmake -G "Ninja" \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DCREATE_BUNDLE=ON \
|
||||
-DCREATE_PACKAGE=ON \
|
||||
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_OBJC_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_OBJCXX_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_INSTALL_PREFIX="./install" \
|
||||
-DIMHEX_GENERATE_PACKAGE=ON \
|
||||
..
|
||||
make -j4 package
|
||||
ninja install
|
||||
```
|
||||
|
||||
If the build fails while trying to find the macOS libraries, make sure you have
|
||||
Xcode installed with `xcode-select --install`. Homebrew will also help get the
|
||||
most recent SDK installed and configured with `brew doctor`.
|
||||
|
||||
2
dist/compiling/windows.md
vendored
2
dist/compiling/windows.md
vendored
@@ -14,7 +14,7 @@ mkdir build
|
||||
cd build
|
||||
cmake -G "Ninja" \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_INSTALL_PREFIX="$PWD/install" \
|
||||
-DCMAKE_INSTALL_PREFIX="./install" \
|
||||
-DIMHEX_USE_DEFAULT_BUILD_SETTINGS=ON \
|
||||
..
|
||||
ninja install
|
||||
|
||||
20
dist/cppcheck.supp
vendored
Normal file
20
dist/cppcheck.supp
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
missingIncludeSystem
|
||||
constParameter
|
||||
unusedFunction
|
||||
preprocessorErrorDirective
|
||||
checkersReport
|
||||
noExplicitConstructor
|
||||
unmatchedSuppression
|
||||
useInitializationList
|
||||
useStlAlgorithm
|
||||
knownConditionTrueFalse
|
||||
internalAstError
|
||||
unsignedPositive
|
||||
variableScope
|
||||
unusedPrivateFunction
|
||||
constParameterCallback
|
||||
|
||||
*:*/lib/third_party/*
|
||||
*:*/external/pattern_language/external/*
|
||||
*:*/external/disassembler/external/*
|
||||
*:*/lib/libimhex/source/ui/imgui_imhex_extensions.cpp
|
||||
54
dist/flake.nix
vendored
Normal file
54
dist/flake.nix
vendored
Normal file
@@ -0,0 +1,54 @@
|
||||
{
|
||||
description = "ImHex";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||
};
|
||||
|
||||
outputs = { self, nixpkgs }:
|
||||
let
|
||||
supportedSystems = [ "x86_64-linux" "aarch64-linux" "aarch64-darwin" "x86_64-darwin" ];
|
||||
forAllSystems = f: nixpkgs.lib.genAttrs supportedSystems (system: f system);
|
||||
in {
|
||||
devShells = forAllSystems (system:
|
||||
let
|
||||
pkgs = import nixpkgs { inherit system; };
|
||||
in
|
||||
{
|
||||
default = pkgs.mkShell {
|
||||
buildInputs = [
|
||||
pkgs.cmake
|
||||
pkgs.clang
|
||||
pkgs.lld
|
||||
|
||||
pkgs.nghttp3
|
||||
pkgs.pkg-config
|
||||
pkgs.glfw
|
||||
pkgs.fontconfig
|
||||
pkgs.file
|
||||
pkgs.mbedtls
|
||||
pkgs.freetype
|
||||
pkgs.dbus
|
||||
pkgs.gtk3
|
||||
pkgs.curl
|
||||
pkgs.fmt
|
||||
pkgs.yara
|
||||
pkgs.nlohmann_json
|
||||
pkgs.ninja
|
||||
pkgs.zlib
|
||||
pkgs.bzip2
|
||||
pkgs.xz
|
||||
pkgs.zstd
|
||||
pkgs.lz4
|
||||
pkgs.libssh2
|
||||
pkgs.md4c
|
||||
];
|
||||
|
||||
shellHook = ''
|
||||
export CC=${pkgs.clang}/bin/clang
|
||||
export CXX=${pkgs.clang}/bin/clang++
|
||||
'';
|
||||
};
|
||||
});
|
||||
};
|
||||
}
|
||||
138
dist/flatpak/net.werwolv.ImHex.yaml
vendored
Normal file
138
dist/flatpak/net.werwolv.ImHex.yaml
vendored
Normal file
@@ -0,0 +1,138 @@
|
||||
app-id: net.werwolv.ImHex
|
||||
runtime: org.freedesktop.Platform
|
||||
runtime-version: '24.08'
|
||||
sdk: org.freedesktop.Sdk
|
||||
command: imhex
|
||||
rename-desktop-file: imhex.desktop
|
||||
|
||||
finish-args:
|
||||
- --share=ipc
|
||||
- --share=network
|
||||
- --socket=wayland
|
||||
- --socket=fallback-x11
|
||||
- --filesystem=host
|
||||
- --device=dri
|
||||
|
||||
modules:
|
||||
- name: glfw
|
||||
buildsystem: cmake-ninja
|
||||
builddir: true
|
||||
config-opts:
|
||||
- -DBUILD_SHARED_LIBS=ON
|
||||
- -DGLFW_BUILD_EXAMPLES=OFF
|
||||
- -DGLFW_BUILD_TESTS=OFF
|
||||
- -DGLFW_BUILD_DOCS=OFF
|
||||
sources:
|
||||
- type: archive
|
||||
url: https://github.com/glfw/glfw/releases/download/3.4/glfw-3.4.zip
|
||||
sha256: b5ec004b2712fd08e8861dc271428f048775200a2df719ccf575143ba749a3e9
|
||||
cleanup:
|
||||
- /include
|
||||
- /lib/pkgconfig
|
||||
- /lib/pkgconfig
|
||||
- /lib64/pkgconfig
|
||||
- /lib/cmake
|
||||
- /lib64/cmake
|
||||
|
||||
- name: mbedtls
|
||||
buildsystem: cmake-ninja
|
||||
config-opts:
|
||||
- -DCMAKE_C_FLAGS=-fPIC
|
||||
- -DENABLE_TESTING=OFF
|
||||
- -DENABLE_PROGRAMS=OFF
|
||||
sources:
|
||||
- type: archive
|
||||
url: https://github.com/ARMmbed/mbedtls/archive/refs/tags/v3.4.0.tar.gz
|
||||
sha256: 1b899f355022e8d02c4d313196a0a16af86c5a692456fa99d302915b8cf0320a
|
||||
cleanup:
|
||||
- /include
|
||||
- /lib/pkgconfig
|
||||
- /lib64/pkgconfig
|
||||
- /lib/cmake
|
||||
- /lib64/cmake
|
||||
|
||||
- name: fmt
|
||||
buildsystem: cmake-ninja
|
||||
config-opts:
|
||||
- -DBUILD_SHARED_LIBS=ON
|
||||
- -DFMT_TEST=OFF
|
||||
sources:
|
||||
- type: archive
|
||||
url: https://github.com/fmtlib/fmt/releases/download/10.0.0/fmt-10.0.0.zip
|
||||
sha256: 4943cb165f3f587f26da834d3056ee8733c397e024145ca7d2a8a96bb71ac281
|
||||
cleanup:
|
||||
- /include
|
||||
- /lib/pkgconfig
|
||||
- /lib64/pkgconfig
|
||||
- /lib/cmake
|
||||
- /lib64/cmake
|
||||
|
||||
- name: yara
|
||||
buildsystem: autotools
|
||||
sources:
|
||||
- type: git
|
||||
url: https://github.com/VirusTotal/yara.git
|
||||
tag: v4.3.1
|
||||
commit: a6f6ce1d6d74a03c396660db25765f2a794d9e30
|
||||
cleanup:
|
||||
- /include
|
||||
- /lib/pkgconfig
|
||||
- /lib64/pkgconfig
|
||||
- /lib/cmake
|
||||
- /lib64/cmake
|
||||
|
||||
- name: libssh2
|
||||
buildsystem: cmake-ninja
|
||||
config-opts:
|
||||
- -DBUILD_SHARED_LIBS=ON
|
||||
- -DENABLE_ZLIB_COMPRESSION=OFF
|
||||
- -DENABLE_MANUAL=OFF
|
||||
- -DENABLE_EXAMPLES=OFF
|
||||
- -DENABLE_TESTING=OFF
|
||||
sources:
|
||||
- type: git
|
||||
url: https://github.com/libssh2/libssh2.git
|
||||
tag: libssh2-1.11.1
|
||||
cleanup:
|
||||
- /include
|
||||
- /lib/pkgconfig
|
||||
- /lib64/pkgconfig
|
||||
- /lib/cmake
|
||||
- /lib64/cmake
|
||||
|
||||
- name: md4c
|
||||
buildsystem: cmake-ninja
|
||||
config-opts:
|
||||
- -DBUILD_SHARED_LIBS=ON
|
||||
- -DMD4C_BUILD_TESTS=OFF
|
||||
- -DMD4C_BUILD_EXAMPLES=OFF
|
||||
- -DMD4C_BUILD_DOCS=OFF
|
||||
sources:
|
||||
- type: git
|
||||
url: https://github.com/mity/md4c.git
|
||||
tag: release-0.5.2
|
||||
|
||||
- name: imhex
|
||||
buildsystem: cmake-ninja
|
||||
builddir: true
|
||||
config-opts:
|
||||
- -DUSE_SYSTEM_CURL=ON
|
||||
- -DUSE_SYSTEM_FMT=ON
|
||||
- -DUSE_SYSTEM_YARA=ON
|
||||
- -DIMHEX_OFFLINE_BUILD=ON
|
||||
- -DCMAKE_INSTALL_LIBDIR=lib
|
||||
- -DCMAKE_INSTALL_RPATH='$ORIGIN/../lib:$ORIGIN/../lib64'
|
||||
sources:
|
||||
- type: dir
|
||||
path: ../..
|
||||
- type: git
|
||||
url: https://github.com/WerWolv/ImHex-Patterns.git
|
||||
tag: master
|
||||
dest: ImHex-Patterns
|
||||
x-checker-data:
|
||||
type: git
|
||||
tag-pattern: ^ImHex-v([\d.]+)$
|
||||
post-install:
|
||||
- mkdir -p ${FLATPAK_DEST}/share/icons/hicolor/scalable/apps
|
||||
- cp ${FLATPAK_DEST}/share/pixmaps/imhex.svg ${FLATPAK_DEST}/share/icons/hicolor/scalable/apps/${FLATPAK_ID}.svg
|
||||
- desktop-file-edit --set-key="Icon" --set-value="${FLATPAK_ID}" "${FLATPAK_DEST}/share/applications/imhex.desktop"
|
||||
69
dist/fonts/move_private_use_area.py
vendored
Normal file
69
dist/fonts/move_private_use_area.py
vendored
Normal file
@@ -0,0 +1,69 @@
|
||||
from fontTools.ttLib import TTFont
|
||||
from fontTools.ttLib.tables._c_m_a_p import CmapSubtable
|
||||
import argparse
|
||||
|
||||
# Default PUAs
|
||||
SOURCE_PUA_START = 0xEA00
|
||||
SOURCE_PUA_END = 0x100F2
|
||||
TARGET_PUA_START = 0xF0000
|
||||
|
||||
def move_pua_glyphs(input_font_path, output_font_path):
|
||||
font = TTFont(input_font_path)
|
||||
|
||||
cmap_table = font['cmap']
|
||||
glyph_set = font.getGlyphSet()
|
||||
|
||||
# Track moved glyphs
|
||||
moved = 0
|
||||
new_mapping = {}
|
||||
|
||||
# Collect original mappings in the PUA
|
||||
for cmap in cmap_table.tables:
|
||||
if cmap.isUnicode():
|
||||
for codepoint, glyph_name in cmap.cmap.items():
|
||||
if SOURCE_PUA_START <= codepoint <= SOURCE_PUA_END:
|
||||
offset = codepoint - SOURCE_PUA_START
|
||||
new_codepoint = TARGET_PUA_START + offset
|
||||
new_mapping[new_codepoint] = glyph_name
|
||||
moved += 1
|
||||
|
||||
if moved == 0:
|
||||
print("No glyphs found in the source Private Use Area.")
|
||||
return
|
||||
|
||||
# Remove old PUA entries from existing cmap subtables
|
||||
for cmap in cmap_table.tables:
|
||||
if cmap.isUnicode():
|
||||
cmap.cmap = {
|
||||
cp: gn for cp, gn in cmap.cmap.items()
|
||||
if not (SOURCE_PUA_START <= cp <= SOURCE_PUA_END)
|
||||
}
|
||||
|
||||
# Create or update a format 12 cmap subtable
|
||||
found_format12 = False
|
||||
for cmap in cmap_table.tables:
|
||||
if cmap.format == 12 and cmap.platformID == 3 and cmap.platEncID in (10, 1):
|
||||
cmap.cmap.update(new_mapping)
|
||||
found_format12 = True
|
||||
break
|
||||
|
||||
if not found_format12:
|
||||
# Create a new format 12 subtable
|
||||
cmap12 = CmapSubtable.newSubtable(12)
|
||||
cmap12.platformID = 3
|
||||
cmap12.platEncID = 10 # UCS-4
|
||||
cmap12.language = 0
|
||||
cmap12.cmap = new_mapping
|
||||
cmap_table.tables.append(cmap12)
|
||||
|
||||
print(f"Moved {moved} glyphs from U+{SOURCE_PUA_START:X}–U+{SOURCE_PUA_END:X} to U+{TARGET_PUA_START:X}+")
|
||||
font.save(output_font_path)
|
||||
print(f"Saved modified font to {output_font_path}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description="Move PUA glyphs in a TTF file to another Unicode range.")
|
||||
parser.add_argument("input", help="Input TTF file path")
|
||||
parser.add_argument("output", help="Output TTF file path")
|
||||
|
||||
args = parser.parse_args()
|
||||
move_pua_glyphs(args.input, args.output)
|
||||
60
dist/fonts/ttf_to_header_file.py
vendored
Normal file
60
dist/fonts/ttf_to_header_file.py
vendored
Normal file
@@ -0,0 +1,60 @@
|
||||
import argparse
|
||||
from fontTools.ttLib import TTFont
|
||||
import os
|
||||
|
||||
def unicode_to_utf8_escape(codepoint):
|
||||
return ''.join([f'\\x{b:02x}' for b in chr(codepoint).encode('utf-8')])
|
||||
|
||||
def format_macro_name(prefix, glyph_name):
|
||||
# Convert names like 'repo-forked' -> 'ICON_VS_REPO_FORKED'
|
||||
return "ICON_" + prefix + "_" + glyph_name.upper().replace('-', '_')
|
||||
|
||||
def generate_font_header(font_path, output_path, font_macro_name, font_file_macro):
|
||||
font = TTFont(font_path)
|
||||
|
||||
# Use cmap to get Unicode to glyph mapping
|
||||
codepoint_to_names = {}
|
||||
for table in font["cmap"].tables:
|
||||
if table.isUnicode():
|
||||
for codepoint, glyph_name in table.cmap.items():
|
||||
codepoint_to_names.setdefault(codepoint, []).append(glyph_name)
|
||||
|
||||
if not codepoint_to_names:
|
||||
print("No Unicode-mapped glyphs found in the font.")
|
||||
return
|
||||
|
||||
# Remove any glyph that is lower than 0xFF
|
||||
codepoint_to_names = {cp: names for cp, names in codepoint_to_names.items() if cp >= 0xFF}
|
||||
|
||||
min_cp = min(codepoint_to_names)
|
||||
max_cp = max(codepoint_to_names)
|
||||
|
||||
with open(output_path, "w", encoding="utf-8") as out:
|
||||
out.write("#pragma once\n\n")
|
||||
out.write(f'#define FONT_ICON_FILE_NAME_{font_macro_name} "{font_file_macro}"\n\n')
|
||||
out.write(f"#define ICON_MIN_{font_macro_name} 0x{min_cp:04x}\n")
|
||||
out.write(f"#define ICON_MAX_16_{font_macro_name} 0x{max_cp:04x}\n")
|
||||
out.write(f"#define ICON_MAX_{font_macro_name} 0x{max_cp:04x}\n")
|
||||
|
||||
written = set()
|
||||
for codepoint in sorted(codepoint_to_names):
|
||||
utf8 = unicode_to_utf8_escape(codepoint)
|
||||
comment = f"// U+{codepoint:04X}"
|
||||
glyph_names = sorted(set(codepoint_to_names[codepoint]))
|
||||
for i, glyph_name in enumerate(glyph_names):
|
||||
macro = format_macro_name(font_macro_name, glyph_name)
|
||||
if macro in written:
|
||||
continue
|
||||
out.write(f"#define {macro} \"{utf8}\"\t{comment}\n")
|
||||
written.add(macro)
|
||||
|
||||
print(f"Header generated at {output_path}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description="Generate C header file from TTF glyphs.")
|
||||
parser.add_argument("font", help="Input .ttf font file")
|
||||
parser.add_argument("output", help="Output .h file")
|
||||
parser.add_argument("macro_name", help="Macro prefix")
|
||||
args = parser.parse_args()
|
||||
|
||||
generate_font_header(args.font, args.output, args.macro_name, os.path.basename(args.font))
|
||||
54
dist/gen_release_notes.py
vendored
Normal file
54
dist/gen_release_notes.py
vendored
Normal file
@@ -0,0 +1,54 @@
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
def get_commits(branch: str, start_tag: str, end_tag: str) -> list[str]:
|
||||
try:
|
||||
commits_raw = subprocess.check_output([ "git", "--no-pager", "log", branch, "--no-color", "--pretty=oneline", "--abbrev-commit", f"{start_tag}..{end_tag}"], stderr=subprocess.DEVNULL).decode("UTF-8").split("\n")
|
||||
except:
|
||||
return []
|
||||
|
||||
commits = []
|
||||
for line in commits_raw:
|
||||
commits.append(line[9:])
|
||||
|
||||
return commits
|
||||
|
||||
def main(args: list) -> int:
|
||||
if len(args) != 2:
|
||||
print(f"Usage: {args[0]} prev_minor")
|
||||
return 1
|
||||
|
||||
last_minor_version = f"v1.{args[1]}"
|
||||
|
||||
master_commits = get_commits("master", f"{last_minor_version}.0", "master")
|
||||
|
||||
for i in range(1, 100):
|
||||
branch_commits = get_commits(f"releases/{last_minor_version}.X", f"{last_minor_version}.0", f"{last_minor_version}.{i}")
|
||||
|
||||
if len(branch_commits) == 0:
|
||||
break
|
||||
|
||||
master_commits = [commit for commit in master_commits if commit not in branch_commits]
|
||||
|
||||
sorted_commits = {}
|
||||
for commit in master_commits:
|
||||
if commit == "":
|
||||
continue
|
||||
|
||||
try:
|
||||
category, commit_name = commit.split(":", 1)
|
||||
|
||||
if category not in sorted_commits:
|
||||
sorted_commits[category] = []
|
||||
sorted_commits[category].append(commit_name)
|
||||
except:
|
||||
print(f"Failed to parse commit: {commit}")
|
||||
|
||||
for category in sorted_commits:
|
||||
print(f"## {category}\n")
|
||||
for commit in sorted_commits[category]:
|
||||
print(f"- {commit}")
|
||||
print(f"\n")
|
||||
|
||||
if __name__ == "__main__":
|
||||
exit(main(sys.argv))
|
||||
34
dist/get_deps_archlinux.sh
vendored
34
dist/get_deps_archlinux.sh
vendored
@@ -1,17 +1,25 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
pacman -S $@ --needed \
|
||||
cmake \
|
||||
gcc \
|
||||
lld \
|
||||
glfw \
|
||||
file \
|
||||
mbedtls \
|
||||
freetype2 \
|
||||
dbus \
|
||||
gtk3 \
|
||||
curl \
|
||||
fmt \
|
||||
yara \
|
||||
cmake \
|
||||
gcc \
|
||||
lld \
|
||||
glfw \
|
||||
fontconfig \
|
||||
file \
|
||||
mbedtls \
|
||||
freetype2 \
|
||||
dbus \
|
||||
gtk3 \
|
||||
curl \
|
||||
fmt \
|
||||
yara \
|
||||
nlohmann-json \
|
||||
ninja
|
||||
ninja \
|
||||
zlib \
|
||||
bzip2 \
|
||||
xz \
|
||||
zstd \
|
||||
lz4 \
|
||||
libssh2 \
|
||||
md4c
|
||||
|
||||
15
dist/get_deps_debian.sh
vendored
15
dist/get_deps_debian.sh
vendored
@@ -8,8 +8,8 @@ fi
|
||||
|
||||
apt install -y \
|
||||
build-essential \
|
||||
gcc-12 \
|
||||
g++-12 \
|
||||
gcc-14 \
|
||||
g++-14 \
|
||||
lld \
|
||||
${PKGCONF:-} \
|
||||
cmake \
|
||||
@@ -18,8 +18,17 @@ apt install -y \
|
||||
libglm-dev \
|
||||
libmagic-dev \
|
||||
libmbedtls-dev \
|
||||
libfontconfig-dev \
|
||||
libfreetype-dev \
|
||||
libdbus-1-dev \
|
||||
libcurl4-gnutls-dev \
|
||||
libgtk-3-dev \
|
||||
ninja-build
|
||||
ninja-build \
|
||||
zlib1g-dev \
|
||||
libbz2-dev \
|
||||
liblzma-dev \
|
||||
libzstd-dev \
|
||||
liblz4-dev \
|
||||
libssh2-1-dev \
|
||||
libmd4c-dev \
|
||||
libmd4c-html0-dev
|
||||
|
||||
9
dist/get_deps_fedora.sh
vendored
9
dist/get_deps_fedora.sh
vendored
@@ -4,6 +4,7 @@ dnf install -y \
|
||||
cmake \
|
||||
dbus-devel \
|
||||
file-devel \
|
||||
fontconfig-devel \
|
||||
freetype-devel \
|
||||
libcurl-devel \
|
||||
gcc-c++ \
|
||||
@@ -12,4 +13,10 @@ dnf install -y \
|
||||
glfw-devel \
|
||||
lld \
|
||||
mbedtls-devel \
|
||||
gtk3-devel
|
||||
gtk3-devel \
|
||||
libzstd-devel \
|
||||
zlib-devel \
|
||||
bzip2-devel \
|
||||
xz-devel \
|
||||
lz4-devel \
|
||||
libssh2-devel
|
||||
|
||||
34
dist/get_deps_msys2.sh
vendored
34
dist/get_deps_msys2.sh
vendored
@@ -1,15 +1,23 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
pacman -S --needed --noconfirm \
|
||||
mingw-w64-x86_64-gcc \
|
||||
mingw-w64-x86_64-lld \
|
||||
mingw-w64-x86_64-cmake \
|
||||
mingw-w64-x86_64-ccache \
|
||||
mingw-w64-x86_64-glfw \
|
||||
mingw-w64-x86_64-file \
|
||||
mingw-w64-x86_64-curl-winssl \
|
||||
mingw-w64-x86_64-mbedtls \
|
||||
mingw-w64-x86_64-freetype \
|
||||
mingw-w64-x86_64-dlfcn \
|
||||
mingw-w64-x86_64-ninja \
|
||||
mingw-w64-x86_64-capstone
|
||||
pacman -S --needed --noconfirm pactoys unzip git
|
||||
pacboy -S --needed --noconfirm \
|
||||
gcc:p \
|
||||
lld:p \
|
||||
cmake:p \
|
||||
ccache:p \
|
||||
glfw:p \
|
||||
file:p \
|
||||
curl-winssl:p \
|
||||
mbedtls:p \
|
||||
freetype:p \
|
||||
dlfcn:p \
|
||||
ninja:p \
|
||||
capstone:p \
|
||||
zlib:p \
|
||||
bzip2:p \
|
||||
xz:p \
|
||||
zstd:p \
|
||||
lz4:p \
|
||||
libssh2-wincng:p \
|
||||
md4c:p
|
||||
|
||||
23
dist/get_deps_tumbleweed.sh
vendored
Executable file
23
dist/get_deps_tumbleweed.sh
vendored
Executable file
@@ -0,0 +1,23 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
zypper install \
|
||||
cmake \
|
||||
ninja \
|
||||
gcc14 \
|
||||
gcc14-c++ \
|
||||
fontconfig-devel \
|
||||
freetype2-devel \
|
||||
libcurl-devel \
|
||||
dbus-1-devel \
|
||||
file-devel \
|
||||
Mesa-libGL-devel \
|
||||
libglfw-devel \
|
||||
mbedtls-devel \
|
||||
gtk3-devel \
|
||||
libzstd-devel \
|
||||
zlib-devel \
|
||||
bzip3-devel \
|
||||
xz-devel \
|
||||
lz4-dev \
|
||||
libssh2-devel \
|
||||
md4c-devel
|
||||
8
dist/imhex.desktop
vendored
8
dist/imhex.desktop
vendored
@@ -1,4 +1,5 @@
|
||||
[Desktop Entry]
|
||||
Version=1.0
|
||||
Name=ImHex
|
||||
Comment=ImHex Hex Editor
|
||||
GenericName=Hex Editor
|
||||
@@ -8,3 +9,10 @@ Type=Application
|
||||
StartupNotify=true
|
||||
Categories=Development;IDE;
|
||||
StartupWMClass=imhex
|
||||
Keywords=static-analysis;reverse-engineering;disassembler;disassembly;hacking;forensics;hex-editor;cybersecurity;security;binary-analysis;
|
||||
MimeType=application/vnd.imhex.proj;
|
||||
Actions=NewFile;
|
||||
|
||||
[Desktop Action NewFile]
|
||||
Exec=imhex --new
|
||||
Name=Create New File
|
||||
8
dist/imhex.mime.xml
vendored
Normal file
8
dist/imhex.mime.xml
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
|
||||
<mime-type type="application/vnd.imhex.proj">
|
||||
<comment>ImHex Project</comment>
|
||||
<glob pattern="*.hexproj"/>
|
||||
</mime-type>
|
||||
</mime-info>
|
||||
239
dist/langtool.py
vendored
Normal file → Executable file
239
dist/langtool.py
vendored
Normal file → Executable file
@@ -1,104 +1,203 @@
|
||||
#!/usr/bin/env python3
|
||||
from pathlib import Path
|
||||
import sys
|
||||
import argparse
|
||||
import json
|
||||
|
||||
# This fixes a CJK full-width character input issue
|
||||
# which makes left halves of deleted characters displayed on screen
|
||||
# pylint: disable=unused-import
|
||||
import re
|
||||
import readline
|
||||
|
||||
DEFAULT_LANG = "en_US"
|
||||
DEFAULT_LANG_PATH = "plugins/*/romfs/lang/"
|
||||
INVALID_TRANSLATION = ""
|
||||
|
||||
|
||||
def handle_missing_key(command, lang_data, key, value):
|
||||
if command == "check":
|
||||
print(f"Error: Translation {lang_data['code']} is missing translation for key '{key}'")
|
||||
exit(2)
|
||||
elif command == "translate" or command == "create":
|
||||
print(f"Key \033[1m'{key}': '{value}'\033[0m is missing in translation '{lang_data['code']}'")
|
||||
new_value = input("Enter translation: ")
|
||||
lang_data["translations"][key] = new_value
|
||||
elif command == "update":
|
||||
lang_data["translations"][key] = INVALID_TRANSLATION
|
||||
|
||||
|
||||
def main():
|
||||
if len(sys.argv) < 3:
|
||||
print(f"Usage: {Path(sys.argv[0]).name} <check|translate|update|create> <lang folder path> <language>")
|
||||
parser = argparse.ArgumentParser(
|
||||
prog="langtool",
|
||||
description="ImHex translate tool",
|
||||
)
|
||||
parser.add_argument(
|
||||
"command",
|
||||
choices=[
|
||||
"check",
|
||||
"translate",
|
||||
"update",
|
||||
"create",
|
||||
"retranslate",
|
||||
"untranslate",
|
||||
"fmtzh",
|
||||
],
|
||||
)
|
||||
parser.add_argument(
|
||||
"-c", "--langdir", default=DEFAULT_LANG_PATH, help="Language folder glob"
|
||||
)
|
||||
parser.add_argument("-l", "--lang", default="", help="Language to translate")
|
||||
parser.add_argument(
|
||||
"-r", "--reflang", default="", help="Language for reference when translating"
|
||||
)
|
||||
parser.add_argument(
|
||||
"-k", "--keys", help="Keys to re-translate (only in re/untranslate mode)"
|
||||
)
|
||||
args = parser.parse_args()
|
||||
|
||||
command = args.command
|
||||
lang = args.lang
|
||||
|
||||
print(f"Running in {command} mode")
|
||||
lang_files_glob = f"{lang}.json" if lang != "" else "*.json"
|
||||
|
||||
lang_folders = set(Path(".").glob(args.langdir))
|
||||
if len(lang_folders) == 0:
|
||||
print(f"Error: {args.langdir} matches nothing")
|
||||
return 1
|
||||
|
||||
command = sys.argv[1]
|
||||
if command not in ["check", "translate", "update", "create"]:
|
||||
print(f"Unknown command: {command}")
|
||||
return 1
|
||||
for lang_folder in lang_folders:
|
||||
if not lang_folder.is_dir():
|
||||
print(f"Error: {lang_folder} is not a folder")
|
||||
return 1
|
||||
|
||||
print(f"Using langtool in {command} mode")
|
||||
default_lang_data = {}
|
||||
default_lang_path = lang_folder / Path(DEFAULT_LANG + ".json")
|
||||
if not default_lang_path.exists():
|
||||
print(
|
||||
f"Error: Default language file {default_lang_path} does not exist in {lang_folder}"
|
||||
)
|
||||
return 1
|
||||
with default_lang_path.open("r", encoding="utf-8") as file:
|
||||
default_lang_data = json.load(file)
|
||||
|
||||
lang_folder_path = Path(sys.argv[2])
|
||||
if not lang_folder_path.exists():
|
||||
print(f"Error: {lang_folder_path} does not exist")
|
||||
return 1
|
||||
|
||||
if not lang_folder_path.is_dir():
|
||||
print(f"Error: {lang_folder_path} is not a folder")
|
||||
return 1
|
||||
|
||||
lang = sys.argv[3] if len(sys.argv) > 3 else ""
|
||||
|
||||
print(f"Processing language files in {lang_folder_path}...")
|
||||
|
||||
default_lang_file_path = lang_folder_path / Path(DEFAULT_LANG + ".json")
|
||||
if not default_lang_file_path.exists():
|
||||
print(f"Error: Default language file {default_lang_file_path} does not exist")
|
||||
return 1
|
||||
|
||||
print(f"Using file '{default_lang_file_path.name}' as template language file")
|
||||
|
||||
with default_lang_file_path.open("r", encoding="utf-8") as default_lang_file:
|
||||
default_lang_data = json.load(default_lang_file)
|
||||
reference_lang_data = None
|
||||
reference_lang_path = lang_folder / Path(args.reflang + ".json")
|
||||
if reference_lang_path.exists():
|
||||
with reference_lang_path.open("r", encoding="utf-8") as file:
|
||||
reference_lang_data = json.load(file)
|
||||
|
||||
if command == "create" and lang != "":
|
||||
lang_file_path = lang_folder_path / Path(lang + ".json")
|
||||
lang_file_path = lang_folder / Path(lang + ".json")
|
||||
if lang_file_path.exists():
|
||||
print(f"Error: Language file {lang_file_path} already exists")
|
||||
return 1
|
||||
continue
|
||||
|
||||
print(f"Creating new language file '{lang_file_path.name}'")
|
||||
exist_lang_data = None
|
||||
for lang_folder1 in lang_folders:
|
||||
lang_file_path1 = lang_folder1 / Path(lang + ".json")
|
||||
if lang_file_path1.exists():
|
||||
with lang_file_path1.open("r", encoding="utf-8") as file:
|
||||
exist_lang_data = json.load(file)
|
||||
break
|
||||
|
||||
print(f"Creating new language file '{lang_file_path}'")
|
||||
|
||||
with lang_file_path.open("w", encoding="utf-8") as new_lang_file:
|
||||
new_lang_data = {
|
||||
"code": lang,
|
||||
"language": input("Enter language: "),
|
||||
"country": input("Enter country: "),
|
||||
"translations": {}
|
||||
|
||||
}
|
||||
json.dump(new_lang_data, new_lang_file, indent=4, ensure_ascii=False)
|
||||
|
||||
for additional_lang_file_path in lang_folder_path.glob("*.json"):
|
||||
if not lang == "" and not additional_lang_file_path.stem == lang:
|
||||
lang_files = set(lang_folder.glob(lang_files_glob))
|
||||
if len(lang_files) == 0:
|
||||
print(f"Warn: Language file for '{lang}' does not exist in '{lang_folder}'")
|
||||
for lang_file_path in lang_files:
|
||||
if (
|
||||
lang_file_path.stem == f"{DEFAULT_LANG}.json"
|
||||
or lang_file_path.stem == f"{args.reflang}.json"
|
||||
):
|
||||
continue
|
||||
|
||||
if additional_lang_file_path.name.startswith(DEFAULT_LANG):
|
||||
continue
|
||||
print(f"\nProcessing '{lang_file_path}'")
|
||||
if not (command == "update" or command == "create"):
|
||||
print("\n----------------------------\n")
|
||||
|
||||
print(f"\nProcessing file '{additional_lang_file_path.name}'\n----------------------------\n")
|
||||
with lang_file_path.open("r+", encoding="utf-8") as target_lang_file:
|
||||
lang_data = json.load(target_lang_file)
|
||||
|
||||
with additional_lang_file_path.open("r+", encoding="utf-8") as additional_lang_file:
|
||||
additional_lang_data = json.load(additional_lang_file)
|
||||
|
||||
for key, value in default_lang_data["translations"].items():
|
||||
if key not in additional_lang_data["translations"] or additional_lang_data["translations"][key] == INVALID_TRANSLATION:
|
||||
handle_missing_key(command, additional_lang_data, key, value)
|
||||
for key, value in default_lang_data.items():
|
||||
has_translation = (
|
||||
key in lang_data
|
||||
and lang_data[key] != INVALID_TRANSLATION
|
||||
)
|
||||
if (
|
||||
has_translation
|
||||
and not (
|
||||
(command == "retranslate" or command == "untranslate")
|
||||
and re.compile(args.keys).fullmatch(key)
|
||||
)
|
||||
and not command == "fmtzh"
|
||||
):
|
||||
continue
|
||||
if command == "check":
|
||||
print(
|
||||
f"Error: Translation {lang_file_path} is missing translation for key '{key}'"
|
||||
)
|
||||
elif (
|
||||
command == "translate"
|
||||
or command == "retranslate"
|
||||
or command == "untranslate"
|
||||
):
|
||||
if command == "untranslate" and not has_translation:
|
||||
continue
|
||||
reference_tranlsation = (
|
||||
" '%s'" % reference_lang_data[key]
|
||||
if (
|
||||
reference_lang_data
|
||||
and key in reference_lang_data
|
||||
)
|
||||
else ""
|
||||
)
|
||||
print(
|
||||
f"\033[1m'{key}' '{value}'{reference_tranlsation}\033[0m => ",
|
||||
end="",
|
||||
)
|
||||
if has_translation:
|
||||
translation = lang_data[key]
|
||||
print(f" <= \033[1m'{translation}'\033[0m")
|
||||
print() # for a new line
|
||||
if command == "untranslate":
|
||||
lang_data[key] = INVALID_TRANSLATION
|
||||
continue
|
||||
try:
|
||||
new_value = input("=> ")
|
||||
lang_data[key] = new_value
|
||||
except KeyboardInterrupt:
|
||||
break
|
||||
elif command == "update" or command == "create":
|
||||
lang_data[key] = INVALID_TRANSLATION
|
||||
elif command == "fmtzh":
|
||||
if has_translation:
|
||||
lang_data[key] = fmtzh(
|
||||
lang_data[key]
|
||||
)
|
||||
|
||||
keys_to_remove = []
|
||||
for key, value in additional_lang_data["translations"].items():
|
||||
if key not in default_lang_data["translations"]:
|
||||
for key, value in lang_data.items():
|
||||
if key not in default_lang_data:
|
||||
keys_to_remove.append(key)
|
||||
|
||||
for key in keys_to_remove:
|
||||
additional_lang_data["translations"].pop(key)
|
||||
print(f"Removed unused key '{key}' from translation '{additional_lang_data['code']}'")
|
||||
lang_data.pop(key)
|
||||
print(
|
||||
f"Removed unused key '{key}' from translation '{lang_file_path}'"
|
||||
)
|
||||
|
||||
additional_lang_file.seek(0)
|
||||
additional_lang_file.truncate()
|
||||
json.dump(additional_lang_data, additional_lang_file, indent=4, sort_keys=True, ensure_ascii=False)
|
||||
target_lang_file.seek(0)
|
||||
target_lang_file.truncate()
|
||||
json.dump(
|
||||
lang_data,
|
||||
target_lang_file,
|
||||
indent=4,
|
||||
sort_keys=True,
|
||||
ensure_ascii=False,
|
||||
)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
def fmtzh(text: str) -> str:
|
||||
text = re.sub(r"(\.{3}|\.{6})", "……", text)
|
||||
text = text.replace("!", "!")
|
||||
text = re.sub(r"([^\.\na-zA-Z\d])\.$", "\1。", text, flags=re.M)
|
||||
text = text.replace("?", "?")
|
||||
return text
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
exit(main())
|
||||
|
||||
9
dist/Brewfile → dist/macOS/Brewfile
vendored
9
dist/Brewfile → dist/macOS/Brewfile
vendored
@@ -6,7 +6,12 @@ brew "freetype2"
|
||||
brew "libmagic"
|
||||
brew "pkg-config"
|
||||
brew "curl"
|
||||
brew "gcc@12"
|
||||
brew "llvm"
|
||||
brew "glfw"
|
||||
brew "ninja"
|
||||
brew "ninja"
|
||||
brew "zlib"
|
||||
brew "xz"
|
||||
brew "bzip2"
|
||||
brew "zstd"
|
||||
brew "libssh2"
|
||||
brew "md4c"
|
||||
187
dist/macOS/arm64.Dockerfile
vendored
Normal file
187
dist/macOS/arm64.Dockerfile
vendored
Normal file
@@ -0,0 +1,187 @@
|
||||
# This base image is also known as "crosscompile". See arm64.crosscompile.Dockerfile
|
||||
FROM ghcr.io/werwolv/macos-crosscompile:4c4af2d1a6a102fab93cc9cd660280c2ec9d72af as build
|
||||
|
||||
ENV MACOSX_DEPLOYMENT_TARGET 13.0
|
||||
|
||||
# -- DOWNLOADING STUFF
|
||||
|
||||
# Update vcpkg
|
||||
RUN <<EOF
|
||||
cp /vcpkg/triplets/community/arm-osx-mytriplet.cmake /tmp/arm-osx-mytriplet.cmake
|
||||
git -C /vcpkg clean -ffdx
|
||||
git -C /vcpkg checkout origin/master
|
||||
git -C /vcpkg reset --hard
|
||||
git -C /vcpkg pull
|
||||
/vcpkg/bootstrap-vcpkg.sh
|
||||
cp /tmp/arm-osx-mytriplet.cmake /vcpkg/triplets/community/arm-osx-mytriplet.cmake
|
||||
EOF
|
||||
|
||||
## Install make
|
||||
RUN --mount=type=cache,target=/var/lib/apt/lists/ apt update && apt install -y make cmake
|
||||
|
||||
## fix environment
|
||||
### add install_name_tool for cmake command that won't have the right env set (see PostprocessBundle.cmake function postprocess_bundle())
|
||||
RUN cp /osxcross/build/cctools-port/cctools/misc/install_name_tool /usr/bin/install_name_tool
|
||||
### a cmake thing wants 'otool' and not '' apparently
|
||||
RUN cp /osxcross/target/bin/aarch64-apple-darwin24-otool /usr/bin/otool
|
||||
|
||||
## Clone glfw
|
||||
RUN <<EOF
|
||||
set -xe
|
||||
if [ "$CUSTOM_GLFW" ]; then
|
||||
git clone https://github.com/glfw/glfw /mnt/glfw
|
||||
fi
|
||||
EOF
|
||||
|
||||
RUN --mount=type=cache,target=/cache <<EOF
|
||||
## Download SDK is missing (it may have been removed from the image)
|
||||
set -xe
|
||||
if [ ! -d /osxcross/target/SDK/MacOSX15.0.sdk ]; then
|
||||
wget https://github.com/joseluisq/macosx-sdks/releases/download/15.0/MacOSX15.0.sdk.tar.xz -O /cache/MacOSX15.0.sdk.tar.xz -nc || true
|
||||
mkdir -p /osxcross/target/SDK
|
||||
tar -C /osxcross/target/SDK -xf /cache/MacOSX15.0.sdk.tar.xz
|
||||
fi
|
||||
EOF
|
||||
|
||||
|
||||
## Download libmagic
|
||||
### Clone libmagic
|
||||
RUN git clone --depth 1 --branch FILE5_46 https://github.com/file/file /mnt/file
|
||||
### Download libmagic dependencies
|
||||
RUN --mount=type=cache,target=/var/lib/apt/lists/ apt update && apt install -y libtool autoconf
|
||||
|
||||
# -- DOWNLOADING + BUILDING STUFF
|
||||
|
||||
ENV VCPKG_DEFAULT_BINARY_CACHE /cache/vcpkg
|
||||
RUN --mount=type=cache,target=/cache <<EOF
|
||||
## Install dependencies with vcpkg
|
||||
set -xe
|
||||
|
||||
mkdir -p $VCPKG_DEFAULT_BINARY_CACHE
|
||||
|
||||
vcpkg install --triplet=arm-osx-mytriplet curl
|
||||
vcpkg install --triplet=arm-osx-mytriplet mbedtls
|
||||
vcpkg install --triplet=arm-osx-mytriplet freetype
|
||||
vcpkg install --triplet=arm-osx-mytriplet josuttis-jthread
|
||||
vcpkg install --triplet=arm-osx-mytriplet zlib
|
||||
vcpkg install --triplet=arm-osx-mytriplet bzip2
|
||||
vcpkg install --triplet=arm-osx-mytriplet liblzma
|
||||
vcpkg install --triplet=arm-osx-mytriplet zstd
|
||||
vcpkg install --triplet=arm-osx-mytriplet openssl
|
||||
vcpkg install --triplet=arm-osx-mytriplet libssh2
|
||||
EOF
|
||||
|
||||
## Install glfw3 dep
|
||||
ARG CUSTOM_GLFW
|
||||
RUN --mount=type=cache,target=/cache <<EOF
|
||||
set -xe
|
||||
if [ "$CUSTOM_GLFW" ]; then
|
||||
echo "Flag confirmation: using custom GLFW for software rendering"
|
||||
else
|
||||
echo "Flag confirmation: using system GLFW"
|
||||
vcpkg install --triplet=arm-osx-mytriplet glfw3
|
||||
fi
|
||||
EOF
|
||||
|
||||
# -- BUILDING STUFF
|
||||
ARG JOBS 1
|
||||
ARG BUILD_TYPE Debug
|
||||
|
||||
## Build libmagic
|
||||
RUN --mount=type=cache,target=/cache <<EOF
|
||||
ccache -zs
|
||||
set -xe
|
||||
|
||||
cd /mnt/file
|
||||
autoreconf -is
|
||||
|
||||
# when cross-compiling, libmagic needs to have an the same version installed in the system.
|
||||
# So we install it normally first
|
||||
./configure --prefix /usr
|
||||
make -j $JOBS install
|
||||
|
||||
# Now, we cross-compile it and install it in the libraries folder
|
||||
CC=/osxcross/target/bin/aarch64-apple-darwin24-clang CXX=/osxcross/target/bin/aarch64-apple-darwin24-clang++ ./configure --prefix /vcpkg/installed/arm-osx-mytriplet --host $OSXCROSS_HOST
|
||||
make -j $JOBS
|
||||
make install
|
||||
|
||||
ccache -s
|
||||
|
||||
EOF
|
||||
|
||||
## Patch glfw
|
||||
COPY --from=imhex /dist/macOS/0001-glfw-SW.patch /tmp
|
||||
RUN <<EOF
|
||||
set -xe
|
||||
if [ "$CUSTOM_GLFW" ]; then
|
||||
cd /mnt/glfw
|
||||
git apply /tmp/0001-glfw-SW.patch
|
||||
fi
|
||||
EOF
|
||||
|
||||
RUN mkdir -p /vcpkg/installed/arm-osx-mytriplet/lib/pkgconfig
|
||||
RUN mkdir -p /osxcross/target/macports/pkgs/vcpkg/installed/arm-osx-mytriplet/lib/pkgconfig
|
||||
|
||||
## Build glfw
|
||||
RUN --mount=type=cache,target=/cache <<EOF
|
||||
set -xe
|
||||
if [ "$CUSTOM_GLFW" ]; then
|
||||
ccache -zs
|
||||
|
||||
cd /mnt/glfw
|
||||
mkdir build
|
||||
cd build
|
||||
CC=o64-clang CXX=o64-clang++ cmake -G "Ninja" \
|
||||
-DCMAKE_BUILD_TYPE=$BUILD_TYPE \
|
||||
-DBUILD_SHARED_LIBS=ON \
|
||||
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_OBJC_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_OBJCXX_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_INSTALL_PREFIX=/vcpkg/installed/arm-osx-mytriplet \
|
||||
-DVCPKG_TARGET_TRIPLET=arm-osx-mytriplet -DCMAKE_TOOLCHAIN_FILE=/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_CHAINLOAD_TOOLCHAIN_FILE=/osxcross/target/toolchain.cmake -DCMAKE_OSX_SYSROOT=/osxcross/target/SDK/MacOSX14.0.sdk -DCMAKE_OSX_DEPLOYMENT_TARGET=13.3 \
|
||||
..
|
||||
ninja -j $JOBS install
|
||||
|
||||
ccache -s
|
||||
fi
|
||||
EOF
|
||||
|
||||
# Build ImHex
|
||||
## Copy ImHex
|
||||
COPY --from=imhex / /mnt/ImHex
|
||||
## Patch ImHex with hacks
|
||||
# COPY toolchain.cmake.2 /osxcross/target/toolchain.cmake
|
||||
# Configure ImHex build
|
||||
RUN --mount=type=cache,target=/cache --mount=type=cache,target=/mnt/ImHex/build/_deps \
|
||||
cd /mnt/ImHex && \
|
||||
# compilers
|
||||
CC=o64-clang CXX=o64-clang++ OBJC=/osxcross/target/bin/aarch64-apple-darwin24-clang OBJCXX=/osxcross/target/bin/aarch64-apple-darwin24-clang++ \
|
||||
cmake -G "Ninja" \
|
||||
`# ccache flags` \
|
||||
-DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_OBJC_COMPILER_LAUNCHER=ccache -DCMAKE_OBJCXX_COMPILER_LAUNCHER=ccache \
|
||||
`# MacOS cross-compiling flags` \
|
||||
-DVCPKG_TARGET_TRIPLET=arm-osx-mytriplet -DCMAKE_TOOLCHAIN_FILE=/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_CHAINLOAD_TOOLCHAIN_FILE=/osxcross/target/toolchain.cmake -DCMAKE_OSX_SYSROOT=/osxcross/target/SDK/MacOSX14.0.sdk -DCMAKE_OSX_DEPLOYMENT_TARGET=13.3 \
|
||||
`# Override compilers for code generators` \
|
||||
-DNATIVE_CMAKE_C_COMPILER=/usr/bin/clang -DNATIVE_CMAKE_CXX_COMPILER=/usr/bin/clang++ \
|
||||
`# Normal ImHex flags` \
|
||||
-DIMHEX_GENERATE_PACKAGE=ON -DCMAKE_BUILD_TYPE=$BUILD_TYPE \
|
||||
`# other flags` \
|
||||
-DIMHEX_STRICT_WARNINGS=OFF \
|
||||
-DIMHEX_PATTERNS_PULL_MASTER=ON \
|
||||
-DCMAKE_INSTALL_PREFIX=/mnt/ImHex/build/install \
|
||||
-B build
|
||||
## Build ImHex
|
||||
RUN --mount=type=cache,target=/cache --mount=type=cache,target=/mnt/ImHex/build/_deps <<EOF
|
||||
ccache -zs
|
||||
set -xe
|
||||
|
||||
cd /mnt/ImHex
|
||||
cmake --build build --parallel $JOBS --target install
|
||||
|
||||
ccache -s
|
||||
EOF
|
||||
|
||||
|
||||
FROM scratch
|
||||
COPY --from=build /mnt/ImHex/build/install/imhex.app imhex.app
|
||||
83
dist/macOS/arm64.crosscompile.Dockerfile
vendored
Normal file
83
dist/macOS/arm64.crosscompile.Dockerfile
vendored
Normal file
@@ -0,0 +1,83 @@
|
||||
# This image is provided for reference, but a (probably more up to date) image should be available at https://github.com/iTrooz/macos-crosscompile
|
||||
FROM ubuntu:22.04
|
||||
|
||||
ENV PATH $PATH:/osxcross/target/bin
|
||||
ENV LD_LIBRARY_PATH /osxcross/target/lib
|
||||
ENV OSXCROSS_SDK /osxcross/target/SDK/MacOSX14.0.sdk
|
||||
ENV OSXCROSS_TARGET darwin24
|
||||
ENV OSXCROSS_TARGET_DIR /osxcross/target
|
||||
ENV OSXCROSS_HOST aarch64-apple-darwin24
|
||||
|
||||
# -- DOWNLOADING STUFF
|
||||
|
||||
# Install common stuff
|
||||
RUN --mount=type=cache,target=/var/lib/apt/lists/ export DEBIAN_FRONTEND=noninteractive &&\
|
||||
export TZ=Etc/UTC &&\
|
||||
dpkg --add-architecture i386 &&\
|
||||
apt update &&\
|
||||
apt -y install lsb-release build-essential python3 python3-pip git wget zip unzip pkg-config curl ninja-build software-properties-common gnupg libssl-dev ccache
|
||||
|
||||
# Install clang 17
|
||||
RUN --mount=type=cache,target=/var/lib/apt/lists/ wget https://apt.llvm.org/llvm.sh && chmod +x llvm.sh && ./llvm.sh 17 &&\
|
||||
ln -s /usr/bin/clang-17 /usr/bin/clang &&\
|
||||
ln -s /usr/bin/clang++-17 /usr/bin/clang++
|
||||
|
||||
# Install vcpkg
|
||||
RUN cd / &&\
|
||||
git clone --depth 1 https://github.com/Microsoft/vcpkg.git vcpkg &&\
|
||||
cd /vcpkg &&\
|
||||
./bootstrap-vcpkg.sh -disableMetrics &&\
|
||||
ln -s /vcpkg/vcpkg /usr/bin/ &&\
|
||||
vcpkg install vcpkg-cmake &&\
|
||||
ln -s /vcpkg/downloads/tools/cmake-*/cmake-*/bin/cmake /usr/bin/
|
||||
|
||||
RUN --mount=type=cache,target=/cache <<EOF
|
||||
## Clone osxcross
|
||||
set -xe
|
||||
git clone https://github.com/tpoechtrager/osxcross /cache/osxcross || true
|
||||
cd /cache/osxcross
|
||||
git pull
|
||||
cp -r /cache/osxcross /osxcross
|
||||
EOF
|
||||
|
||||
RUN --mount=type=cache,target=/cache <<EOF
|
||||
## Download SDK
|
||||
set -xe
|
||||
wget https://github.com/joseluisq/macosx-sdks/releases/download/14.0/MacOSX14.0.sdk.tar.xz -O /cache/MacOSX14.0.sdk.tar.xz -nc || true
|
||||
cp /cache/MacOSX14.0.sdk.tar.xz /osxcross/tarballs
|
||||
EOF
|
||||
|
||||
# Init stuff
|
||||
## setup ccache dir
|
||||
ENV CCACHE_DIR /cache/ccache
|
||||
|
||||
# Install triplet file
|
||||
COPY arm-osx-mytriplet.cmake /vcpkg/triplets/community
|
||||
|
||||
# -- BUILDING STUFF
|
||||
ARG JOBS 1
|
||||
|
||||
# Install osxcross
|
||||
## Build cross-compiler clang-17
|
||||
RUN --mount=type=cache,target=/cache <<EOF
|
||||
set -xe
|
||||
ccache -zs
|
||||
|
||||
cd /osxcross
|
||||
UNATTENDED=1 CC=/usr/lib/ccache/clang-17 CXX=/usr/lib/ccache/clang++-17 ./build.sh
|
||||
|
||||
ccache -s
|
||||
EOF
|
||||
|
||||
ARG DELETE_SDK=1
|
||||
RUN <<EOF
|
||||
# Conditionally delete the SDK from the image
|
||||
set -xe
|
||||
|
||||
if [ "$DELETE_SDK" ]; then
|
||||
rm -r /osxcross/target/SDK
|
||||
echo "Deleted the SDK from the image"
|
||||
else
|
||||
echo "NOT deleting the SDK from the image"
|
||||
fi
|
||||
EOF
|
||||
4
dist/macOS/macos_arm_toolchain.cmake
vendored
4
dist/macOS/macos_arm_toolchain.cmake
vendored
@@ -1,4 +0,0 @@
|
||||
set(CMAKE_SYSTEM_NAME Darwin)
|
||||
set(CMAKE_SYSTEM_PROCESSOR arm64)
|
||||
set(CMAKE_OSX_ARCHITECTURES arm64 CACHE INTERNAL "" FORCE)
|
||||
SET(CMAKE_OSX_SYSROOT macosx CACHE INTERNAL "" FORCE)
|
||||
8
dist/msys2/PKGBUILD
vendored
8
dist/msys2/PKGBUILD
vendored
@@ -16,7 +16,13 @@ makedepends=("${MINGW_PACKAGE_PREFIX}-gcc"
|
||||
"${MINGW_PACKAGE_PREFIX}-file"
|
||||
"${MINGW_PACKAGE_PREFIX}-mbedtls"
|
||||
"${MINGW_PACKAGE_PREFIX}-polly"
|
||||
"${MINGW_PACKAGE_PREFIX}-freetype")
|
||||
"${MINGW_PACKAGE_PREFIX}-freetype"
|
||||
"${MINGW_PACKAGE_PREFIX}-zlib"
|
||||
"${MINGW_PACKAGE_PREFIX}-bzip2"
|
||||
"${MINGW_PACKAGE_PREFIX}-xz"
|
||||
"${MINGW_PACKAGE_PREFIX}-zstd"
|
||||
"${MINGW_PACKAGE_PREFIX}-libssh2-wincng"
|
||||
"${MINGW_PACKAGE_PREFIX}-md4c")
|
||||
|
||||
source=()
|
||||
sha256sums=()
|
||||
|
||||
71
dist/net.werwolv.ImHex.metainfo.xml
vendored
Normal file
71
dist/net.werwolv.ImHex.metainfo.xml
vendored
Normal file
@@ -0,0 +1,71 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<component type="desktop">
|
||||
<id>net.werwolv.ImHex</id>
|
||||
<name>ImHex</name>
|
||||
<summary>Modern REing Hex Editor</summary>
|
||||
<description>
|
||||
<p>
|
||||
ImHex is a modern Hex Editor for Reverse Engineers, Developers, Malware Analysists and Hackers who value
|
||||
their retinas when working at 3 AM once again.
|
||||
</p>
|
||||
<p>
|
||||
Features:
|
||||
</p>
|
||||
<ul>
|
||||
<li>Featureful hex view</li>
|
||||
<li>Custom C++-like pattern language for parsing and highlighting a file's content</li>
|
||||
<li>Data importing and exporting</li>
|
||||
<li>Data inspector allowing interpretation of data as many different types</li>
|
||||
<li>Huge file support with fast and efficient loading</li>
|
||||
<li>Strings search</li>
|
||||
<li>File hashing support</li>
|
||||
<li>Disassembler supporting many different architectures: ARM, x86, PowerPC, MIPS, and more</li>
|
||||
<li>Bookmarks</li>
|
||||
<li>Data analyzer</li>
|
||||
<li>
|
||||
Helpful tools such as an Itanium and MSVC demangler, ASCII table, Regex
|
||||
replacer, mathematical expression evaluator (calculator), hexadecimal
|
||||
color picker and many more
|
||||
</li>
|
||||
<li>Doesn't burn out your retinas when used in late-night sessions</li>
|
||||
</ul>
|
||||
</description>
|
||||
<metadata_license>CC0-1.0</metadata_license>
|
||||
<project_license>GPL-2.0-only</project_license>
|
||||
<developer id="net.werwolv">
|
||||
<name>WerWolv</name>
|
||||
</developer>
|
||||
<url type="homepage">https://imhex.werwolv.net</url>
|
||||
<url type="bugtracker">https://github.com/WerWolv/ImHex/issues</url>
|
||||
<url type="help">https://docs.werwolv.net/imhex</url>
|
||||
<url type="donation">https://github.com/sponsors/WerWolv</url>
|
||||
<url type="contact">https://imhex.werwolv.net/discord</url>
|
||||
<url type="vcs-browser">https://github.com/WerWolv/ImHex</url>
|
||||
<url type="contribute">https://github.com/WerWolv/ImHex/blob/master/CONTRIBUTING.md</url>
|
||||
<launchable type="desktop-id">imhex.desktop</launchable>
|
||||
<screenshots>
|
||||
<screenshot type="default" width="1920" height="1017">
|
||||
<image type="source">https://raw.githubusercontent.com/flathub/net.werwolv.ImHex/master/screenshots/screenshot1.png</image>
|
||||
<caption>Using a pattern to parse and highlight different sections of an ELF executable file</caption>
|
||||
</screenshot>
|
||||
<screenshot type="default" width="1920" height="1017">
|
||||
<image type="source">https://raw.githubusercontent.com/flathub/net.werwolv.ImHex/master/screenshots/screenshot2.png</image>
|
||||
<caption>Managing bookmarks, diffing two files and decrypting a region of data using the data preprocessor</caption>
|
||||
</screenshot>
|
||||
</screenshots>
|
||||
<content_rating type="oars-1.1"/>
|
||||
<branding>
|
||||
<color type="primary" scheme_preference="light">#babec9</color>
|
||||
<color type="primary" scheme_preference="dark">#0f0f0f</color>
|
||||
</branding>
|
||||
<releases>
|
||||
<release version="1.0.0" date="2025-01-01">
|
||||
<description></description>
|
||||
</release>
|
||||
</releases>
|
||||
<update_contact>hey@werwolv.net</update_contact>
|
||||
<recommends>
|
||||
<control>keyboard</control>
|
||||
<control>pointing</control>
|
||||
</recommends>
|
||||
</component>
|
||||
61
dist/net.werwolv.ImHex.yaml
vendored
61
dist/net.werwolv.ImHex.yaml
vendored
@@ -1,61 +0,0 @@
|
||||
app-id: net.werwolv.ImHex
|
||||
runtime: org.freedesktop.Platform
|
||||
runtime-version: '20.08'
|
||||
default-branch: stable
|
||||
sdk: org.freedesktop.Sdk
|
||||
command: imhex
|
||||
|
||||
finish-args:
|
||||
- --share=ipc
|
||||
- --socket=x11
|
||||
- --filesystem=host
|
||||
- --device=all
|
||||
|
||||
modules:
|
||||
- name: libiconv
|
||||
sources:
|
||||
- type: archive
|
||||
url: https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.16.tar.gz
|
||||
sha256: e6a1b1b589654277ee790cce3734f07876ac4ccfaecbee8afa0b649cf529cc04
|
||||
|
||||
- name: glfw
|
||||
buildsystem: cmake-ninja
|
||||
builddir: true
|
||||
config-opts:
|
||||
- -DCMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
- -DBUILD_SHARED_LIBS:BOOL=ON
|
||||
sources:
|
||||
- type: archive
|
||||
url: https://github.com/glfw/glfw/releases/download/3.3.2/glfw-3.3.2.zip
|
||||
sha256: 08a33a512f29d7dbf78eab39bd7858576adcc95228c9efe8e4bc5f0f3261efc7
|
||||
cleanup:
|
||||
- /include
|
||||
- /lib/pkgconfig
|
||||
|
||||
- name: mbedtls
|
||||
buildsystem: cmake-ninja
|
||||
config-opts:
|
||||
- -DCMAKE_C_FLAGS=-fPIC
|
||||
sources:
|
||||
- type: archive
|
||||
url: https://github.com/ARMmbed/mbedtls/archive/refs/tags/v2.27.0.tar.gz
|
||||
sha256: 2a07856e541f0e5f6eaee4f78018c52f25bd244ed76f9020dea54a8b02cac6ea
|
||||
|
||||
- name: nlohmann-json
|
||||
buildsystem: cmake-ninja
|
||||
builddir: true
|
||||
config-opts:
|
||||
- -DCMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
- -DBUILD_TESTING=OFF
|
||||
|
||||
sources:
|
||||
- type: archive
|
||||
url: https://github.com/nlohmann/json/archive/v3.9.1.tar.gz
|
||||
sha256: 4cf0df69731494668bdd6460ed8cb269b68de9c19ad8c27abc24cd72605b2d5b
|
||||
|
||||
- name: imhex
|
||||
buildsystem: cmake
|
||||
|
||||
sources:
|
||||
- type: git
|
||||
url: https://github.com/WerWolv/ImHex.git
|
||||
34
dist/net.werwolv.imhex.metainfo.xml
vendored
34
dist/net.werwolv.imhex.metainfo.xml
vendored
@@ -1,34 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<component type="desktop-application">
|
||||
<id>imhex</id>
|
||||
<metadata_license>CC0-1.0</metadata_license>
|
||||
<project_license>GPL-2.0</project_license>
|
||||
<name>ImHex</name>
|
||||
<developer_name>WerWolv</developer_name>
|
||||
<update_contact>hey@werwolv.net</update_contact>
|
||||
<summary>A Hex Editor for Reverse Engineers, Programmers and people who value their retinas when working at 3 AM</summary>
|
||||
<description>
|
||||
<p>ImHex is a feature-rich Hex Editor aimed towards Reverse Engineers working with foreign data formats, malware, executables and raw memory.
|
||||
Besides all the features a common Hex Editor has, ImHex also features a custom scripting language used to declare and dissect data structures, support for running YARA rules, a node-based graphical data pre-processor and support for various data sources such as files, raw disks or GDB Servers.</p>
|
||||
</description>
|
||||
<launchable type="desktop-id">imhex.desktop</launchable>
|
||||
<url type="homepage">https://imhex.werwolv.net</url>
|
||||
<screenshots>
|
||||
<screenshot type="default">
|
||||
<image>https://user-images.githubusercontent.com/10835354/139717326-8044769d-527b-4d88-8adf-2d4ecafdca1f.png</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<image>https://user-images.githubusercontent.com/10835354/139717323-1f8c9d52-f7eb-4f43-9f11-097ac728ed6c.png</image>
|
||||
</screenshot>
|
||||
</screenshots>
|
||||
|
||||
<provides>
|
||||
<id>imhex.desktop</id>
|
||||
</provides>
|
||||
|
||||
<categories>
|
||||
<category>Development</category>
|
||||
</categories>
|
||||
|
||||
|
||||
</component>
|
||||
114
dist/rpm/imhex.spec
vendored
114
dist/rpm/imhex.spec
vendored
@@ -1,10 +1,12 @@
|
||||
%define source_date_epoch_from_changelog 0
|
||||
|
||||
Name: imhex
|
||||
Version: 1.26.2
|
||||
Version: VERSION
|
||||
Release: 0%{?dist}
|
||||
Summary: A hex editor for reverse engineers and programmers
|
||||
|
||||
License: GPL-2.0-only AND Zlib AND MIT AND Apache-2.0
|
||||
# imhex is gplv2. capstone is custom. nativefiledialog is Zlib.
|
||||
# imhex is gplv2. capstone is custom.
|
||||
# see license dir for full breakdown
|
||||
URL: https://imhex.werwolv.net/
|
||||
# We need the archive with deps bundled
|
||||
@@ -22,29 +24,41 @@ BuildRequires: libglvnd-devel
|
||||
BuildRequires: glfw-devel
|
||||
BuildRequires: json-devel
|
||||
BuildRequires: libcurl-devel
|
||||
BuildRequires: libarchive-devel
|
||||
BuildRequires: libzstd-devel
|
||||
BuildRequires: zlib-devel
|
||||
BuildRequires: bzip2-devel
|
||||
BuildRequires: xz-devel
|
||||
BuildRequires: llvm-devel
|
||||
BuildRequires: mbedtls-devel
|
||||
BuildRequires: yara-devel
|
||||
BuildRequires: nativefiledialog-extended-devel
|
||||
BuildRequires: dotnet-sdk-7.0
|
||||
%if 0%{?rhel}
|
||||
BuildRequires: gcc-toolset-12
|
||||
BuildRequires: lz4-devel
|
||||
BuildRequires: libssh2-devel
|
||||
%if 0%{?rhel} == 9
|
||||
BuildRequires: gcc-toolset-14
|
||||
%endif
|
||||
%if 0%{?fedora} || 0%{?rhel} > 9
|
||||
BuildRequires: capstone-devel
|
||||
%endif
|
||||
BuildRequires: lunasvg-devel
|
||||
|
||||
|
||||
Provides: bundled(gnulib)
|
||||
Provides: bundled(capstone) = 5.0-rc2
|
||||
Provides: bundled(imgui)
|
||||
%if 0%{?rhel} == 10
|
||||
Provides: bundled(capstone) = 5.0.1
|
||||
%endif
|
||||
Provides: bundled(imgui) = 1.90.8
|
||||
Provides: bundled(libromfs)
|
||||
Provides: bundled(microtar)
|
||||
Provides: bundled(libpl)
|
||||
Provides: bundled(libpl) = %{version}
|
||||
Provides: bundled(xdgpp)
|
||||
# working on packaging this, bundling for now as to now delay updates
|
||||
Provides: bundled(miniaudio) = 0.11.11
|
||||
|
||||
# ftbfs on these arches. armv7hl might compile when capstone 5.x
|
||||
# is released upstream and we can build against it
|
||||
# [7:02 PM] WerWolv: We're not supporting 32 bit anyways soooo
|
||||
# [11:38 AM] WerWolv: Officially supported are x86_64 and aarch64
|
||||
ExclusiveArch: x86_64 %{arm64} ppc64le
|
||||
|
||||
ExclusiveArch: x86_64 %{arm64}
|
||||
|
||||
%description
|
||||
ImHex is a Hex Editor, a tool to display, decode and analyze binary data to
|
||||
@@ -58,14 +72,31 @@ displayed, a disassembler, diffing support, bookmarks and much much more. At the
|
||||
same time ImHex is completely free and open source under the GPLv2 language.
|
||||
|
||||
|
||||
%package devel
|
||||
Summary: Development files for %{name}
|
||||
License: GPL-2.0-only
|
||||
%description devel
|
||||
%{summary}
|
||||
|
||||
|
||||
%prep
|
||||
%autosetup -n ImHex
|
||||
%autosetup -n ImHex -p1
|
||||
# remove bundled libs we aren't using
|
||||
rm -rf lib/external/{curl,fmt,llvm,nlohmann_json,yara}
|
||||
rm -rf lib/third_party/{curl,fmt,llvm,nlohmann_json,yara}
|
||||
%if 0%{?fedora} || 0%{?rhel} > 9
|
||||
rm -rf lib/third_party/capstone
|
||||
%endif
|
||||
|
||||
# rhel 9 doesn't support all of the new appstream metainfo tags
|
||||
%if 0%{?rhel} && 0%{?rhel} < 10
|
||||
sed -i -e '/url type="vcs-browser"/d' \
|
||||
-e '/url type="contribute"/d' \
|
||||
dist/net.werwolv.ImHex.metainfo.xml
|
||||
%endif
|
||||
|
||||
%build
|
||||
%if 0%{?rhel}
|
||||
. /opt/rh/gcc-toolset-12/enable
|
||||
%if 0%{?rhel} == 9
|
||||
. /opt/rh/gcc-toolset-14/enable
|
||||
%set_build_flags
|
||||
CXXFLAGS+=" -std=gnu++2b"
|
||||
%endif
|
||||
@@ -75,23 +106,27 @@ CXXFLAGS+=" -std=gnu++2b"
|
||||
-D IMHEX_OFFLINE_BUILD=ON \
|
||||
-D USE_SYSTEM_NLOHMANN_JSON=ON \
|
||||
-D USE_SYSTEM_FMT=ON \
|
||||
-D USE_SYSTEM_CURL=ON \
|
||||
-D USE_SYSTEM_LLVM=ON \
|
||||
-D USE_SYSTEM_MD4C=OFF \
|
||||
%if 0%{?fedora} || 0%{?rhel} > 9
|
||||
-D USE_SYSTEM_CAPSTONE=ON \
|
||||
%endif
|
||||
-D USE_SYSTEM_LUNASVG=ON \
|
||||
-D USE_SYSTEM_YARA=ON \
|
||||
-D USE_SYSTEM_NFD=ON \
|
||||
-D IMHEX_USE_GTK_FILE_PICKER=ON \
|
||||
-D IMHEX_BUNDLE_DOTNET=OFF \
|
||||
# when capstone >= 5.x is released we should be able to build against \
|
||||
# system libs of it \
|
||||
# -D USE_SYSTEM_CAPSTONE=ON
|
||||
-D IMHEX_ENABLE_UNIT_TESTS=ON \
|
||||
%if 0%{?rhel}
|
||||
-D IMHEX_BUILD_HARDENING=OFF
|
||||
%endif
|
||||
# disable built-in build hardening because it is already
|
||||
# done in rhel buildroots. adding the flags again from
|
||||
# upstream generates build errors
|
||||
|
||||
%cmake_build
|
||||
|
||||
|
||||
%check
|
||||
%if 0%{?rhel}
|
||||
. /opt/rh/gcc-toolset-12/enable
|
||||
%set_build_flags
|
||||
CXXFLAGS+=" -std=gnu++2b"
|
||||
%endif
|
||||
# build binaries required for tests
|
||||
%cmake_build --target unit_tests
|
||||
%ctest --exclude-regex '(Helpers/StoreAPI|Helpers/TipsAPI|Helpers/ContentAPI)'
|
||||
@@ -103,28 +138,33 @@ CXXFLAGS+=" -std=gnu++2b"
|
||||
desktop-file-validate %{buildroot}%{_datadir}/applications/%{name}.desktop
|
||||
|
||||
# this is a symlink for the old appdata name that we don't need
|
||||
rm -f %{buildroot}%{_metainfodir}/net.werwolv.%{name}.appdata.xml
|
||||
rm -f %{buildroot}%{_metainfodir}/net.werwolv.ImHex.appdata.xml
|
||||
|
||||
# AppData
|
||||
appstream-util validate-relax --nonet %{buildroot}%{_metainfodir}/net.werwolv.%{name}.metainfo.xml
|
||||
appstream-util validate-relax --nonet %{buildroot}%{_metainfodir}/net.werwolv.ImHex.metainfo.xml
|
||||
|
||||
# install licenses
|
||||
cp -a lib/external/nativefiledialog/LICENSE %{buildroot}%{_datadir}/licenses/%{name}/nativefiledialog-LICENSE
|
||||
cp -a lib/external/capstone/LICENSE.TXT %{buildroot}%{_datadir}/licenses/%{name}/capstone-LICENSE
|
||||
cp -a lib/external/capstone/suite/regress/LICENSE %{buildroot}%{_datadir}/licenses/%{name}/capstone-regress-LICENSE
|
||||
cp -a lib/external/microtar/LICENSE %{buildroot}%{_datadir}/licenses/%{name}/microtar-LICENSE
|
||||
cp -a lib/external/xdgpp/LICENSE %{buildroot}%{_datadir}/licenses/%{name}/xdgpp-LICENSE
|
||||
%if 0%{?rhel} == 9
|
||||
cp -a lib/third_party/capstone/LICENSES/LICENSE.TXT %{buildroot}%{_datadir}/licenses/%{name}/capstone-LICENSE
|
||||
%endif
|
||||
cp -a lib/third_party/microtar/LICENSE %{buildroot}%{_datadir}/licenses/%{name}/microtar-LICENSE
|
||||
cp -a lib/third_party/xdgpp/LICENSE %{buildroot}%{_datadir}/licenses/%{name}/xdgpp-LICENSE
|
||||
|
||||
|
||||
%files
|
||||
%license %{_datadir}/licenses/%{name}/
|
||||
%doc README.md
|
||||
%{_bindir}/imhex
|
||||
%{_datadir}/pixmaps/%{name}.png
|
||||
%{_datadir}/imhex/imhex
|
||||
%{_datadir}/pixmaps/%{name}.*
|
||||
%{_datadir}/applications/%{name}.desktop
|
||||
%{_libdir}/libimhex.so*
|
||||
%{_libdir}/libimhex.so.*
|
||||
%{_libdir}/%{name}/
|
||||
%{_metainfodir}/net.werwolv.%{name}.metainfo.xml
|
||||
%{_metainfodir}/net.werwolv.ImHex.metainfo.xml
|
||||
%exclude %{_bindir}/imhex-updater
|
||||
%{_datadir}/mime/packages/%{name}.xml
|
||||
|
||||
|
||||
%changelog
|
||||
%files devel
|
||||
%{_libdir}/libimhex.so
|
||||
%{_datadir}/%{name}/sdk/
|
||||
|
||||
91
dist/snap/snapcraft.yaml
vendored
Normal file
91
dist/snap/snapcraft.yaml
vendored
Normal file
@@ -0,0 +1,91 @@
|
||||
name: imhex
|
||||
title: ImHex
|
||||
base: core24
|
||||
version: ${IMHEX_VERSION_STRING}
|
||||
summary: Hex editor for reverse engineering
|
||||
description: ImHex is a hex editor for reverse engineering, reverse engineering, and analyzing binary files. It provides a powerful and flexible interface for working with binary data, including features like pattern matching, scripting, and a customizable user interface.
|
||||
grade: stable
|
||||
confinement: classic
|
||||
contact: https://github.com/WerWolv/ImHex/discussions
|
||||
issues: https://github.com/WerWolv/ImHex/issues
|
||||
source-code: https://github.com/WerWolv/ImHex
|
||||
website: https://imhex.werwolv.net
|
||||
donation: https://github.com/sponsors/WerWolv
|
||||
license: GPL-2.0-only
|
||||
icon: resources/icon.svg
|
||||
adopt-info: imhex
|
||||
|
||||
platforms:
|
||||
amd64:
|
||||
arm64:
|
||||
|
||||
apps:
|
||||
imhex:
|
||||
command: usr/local/bin/imhex
|
||||
desktop: usr/local/share/applications/imhex.desktop
|
||||
environment:
|
||||
LD_LIBRARY_PATH: '$SNAP/usr/local/lib:$SNAP/usr/local/lib/imhex:$SNAP/usr/lib/x86_64-linux-gnu:$SNAP/usr/lib/aarch64-linux-gnu:$LD_LIBRARY_PATH'
|
||||
XDG_DATA_DIRS: '$XDG_DATA_DIRS:$SNAP/usr/local/share:$SNAP/usr/local/lib:$SNAP/usr/local/share'
|
||||
XDG_CONFIG_DIRS: '$XDG_CONFIG_DIRS:$SNAP/usr/local/share'
|
||||
XDG_DATA_HOME: '$XDG_DATA_HOME:$SNAP_DATA'
|
||||
|
||||
parts:
|
||||
imhex:
|
||||
plugin: cmake
|
||||
source: .
|
||||
build-environment:
|
||||
- CC: /usr/bin/gcc-14
|
||||
- CXX: /usr/bin/g++-14
|
||||
cmake-parameters:
|
||||
- -DCMAKE_BUILD_TYPE=Release
|
||||
- -DCMAKE_C_COMPILER_LAUNCHER=${CCACHE}
|
||||
- -DCMAKE_CXX_COMPILER_LAUNCHER=${CCACHE}
|
||||
- -DIMHEX_PATTERNS_PULL_MASTER=ON
|
||||
cmake-generator: Ninja
|
||||
build-packages:
|
||||
- cmake
|
||||
- ninja-build
|
||||
- gcc-14
|
||||
- g++-14
|
||||
- git
|
||||
- pkg-config
|
||||
- libglfw3-dev
|
||||
- libmagic-dev
|
||||
- libmbedtls-dev
|
||||
- libfontconfig-dev
|
||||
- libfreetype-dev
|
||||
- libdbus-1-dev
|
||||
- libcurl4-gnutls-dev
|
||||
- libgtk-3-dev
|
||||
- zlib1g-dev
|
||||
- libbz2-dev
|
||||
- liblzma-dev
|
||||
- libzstd-dev
|
||||
- liblz4-dev
|
||||
- libssh2-1-dev
|
||||
- libmd4c-dev
|
||||
- libmd4c-html0-dev
|
||||
stage-packages:
|
||||
- libglfw3
|
||||
- libmagic1
|
||||
- libmbedtls14
|
||||
- libfontconfig1
|
||||
- libfreetype6
|
||||
- libdbus-1-3
|
||||
- libcurl4-gnutls-dev
|
||||
- libgtk-3-0
|
||||
- zlib1g
|
||||
- libbz2-1.0
|
||||
- liblzma5
|
||||
- libzstd1
|
||||
- liblz4-1
|
||||
- libssh2-1
|
||||
prime:
|
||||
- -usr/include/*
|
||||
- -usr/local/include/*
|
||||
- -usr/lib/**/*.a
|
||||
- -usr/local/lib/**/*.a
|
||||
- -usr/lib/**/*.la
|
||||
- -usr/local/lib/**/*.la
|
||||
- -usr/share/doc/*
|
||||
- -usr/share/man/*
|
||||
18
dist/vcpkg.json
vendored
Normal file
18
dist/vcpkg.json
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"name": "vcpkg",
|
||||
"version": "1.0.0",
|
||||
"builtin-baseline": "7e21420f775f72ae938bdeb5e6068f722088f06a",
|
||||
"dependencies": [
|
||||
"libmagic",
|
||||
"freetype",
|
||||
"mbedtls",
|
||||
"zlib",
|
||||
"bzip2",
|
||||
"liblzma",
|
||||
"zstd",
|
||||
"glfw3",
|
||||
"curl",
|
||||
"libssh2",
|
||||
"md4c"
|
||||
]
|
||||
}
|
||||
39
dist/web/Dockerfile
vendored
39
dist/web/Dockerfile
vendored
@@ -1,11 +1,11 @@
|
||||
FROM emscripten/emsdk:latest as build
|
||||
FROM emscripten/emsdk:4.0.21 AS build
|
||||
|
||||
# Used to invalidate layer cache but not mount cache
|
||||
# See https://github.com/moby/moby/issues/41715#issuecomment-733976493
|
||||
ARG UNIQUEKEY 1
|
||||
|
||||
RUN apt update
|
||||
RUN apt install -y git ccache autoconf automake libtool cmake pkg-config
|
||||
RUN apt install -y git ccache autoconf automake libtool pkg-config ninja-build
|
||||
|
||||
RUN <<EOF
|
||||
# Install vcpkg
|
||||
@@ -13,6 +13,7 @@ RUN <<EOF
|
||||
set -xe
|
||||
|
||||
git clone https://github.com/microsoft/vcpkg /vcpkg
|
||||
git -C /vcpkg pull
|
||||
/vcpkg/bootstrap-vcpkg.sh
|
||||
sed -i 's/vcpkg_install_make(${EXTRA_ARGS})/vcpkg_install_make(${EXTRA_ARGS} SUBPATH src)/g' /vcpkg/ports/libmagic/portfile.cmake
|
||||
EOF
|
||||
@@ -27,7 +28,7 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
|
||||
' >> /emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake
|
||||
EOF
|
||||
|
||||
ENV VCPKG_DEFAULT_BINARY_CACHE /cache/vcpkg
|
||||
ENV VCPKG_DEFAULT_BINARY_CACHE=/cache/vcpkg
|
||||
RUN --mount=type=cache,target=/cache <<EOF
|
||||
# Install dependencies with vcpkg
|
||||
set -xe
|
||||
@@ -37,11 +38,15 @@ mkdir -p $VCPKG_DEFAULT_BINARY_CACHE
|
||||
/vcpkg/vcpkg install --triplet=wasm32-emscripten libmagic
|
||||
/vcpkg/vcpkg install --triplet=wasm32-emscripten freetype
|
||||
/vcpkg/vcpkg install --triplet=wasm32-emscripten mbedtls
|
||||
/vcpkg/vcpkg install --triplet=wasm32-emscripten zlib
|
||||
/vcpkg/vcpkg install --triplet=wasm32-emscripten bzip2
|
||||
/vcpkg/vcpkg install --triplet=wasm32-emscripten liblzma
|
||||
/vcpkg/vcpkg install --triplet=wasm32-emscripten zstd
|
||||
EOF
|
||||
|
||||
# Build ImHex
|
||||
ARG JOBS=4
|
||||
ENV CCACHE_DIR /cache/ccache
|
||||
ENV CCACHE_DIR=/cache/ccache
|
||||
|
||||
RUN mkdir /build
|
||||
WORKDIR /build
|
||||
@@ -51,29 +56,38 @@ RUN --mount=type=cache,target=/cache \
|
||||
set -xe
|
||||
ccache -zs
|
||||
|
||||
cmake /imhex \
|
||||
/vcpkg/downloads/tools/cmake-*/cmake-*/bin/cmake /imhex \
|
||||
-G "Ninja" \
|
||||
-DIMHEX_OFFLINE_BUILD=ON \
|
||||
-DIMHEX_STATIC_LINK_PLUGINS=ON \
|
||||
-DIMHEX_EXCLUDE_PLUGINS="script_loader;remote" \
|
||||
-DIMHEX_COMPRESS_DEBUG_INFO=OFF \
|
||||
-DNATIVE_CMAKE_C_COMPILER=gcc \
|
||||
-DNATIVE_CMAKE_CXX_COMPILER=g++ \
|
||||
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_TOOLCHAIN_FILE=/vcpkg/scripts/buildsystems/vcpkg.cmake \
|
||||
-DVCPKG_CHAINLOAD_TOOLCHAIN_FILE=/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake \
|
||||
-DLIBROMFS_COMPRESS_RESOURCES=OFF \
|
||||
-DIMHEX_ENABLE_PLUGIN_TESTS=OFF \
|
||||
-DCMAKE_BUILD_TYPE=Release
|
||||
|
||||
make -j $JOBS
|
||||
ninja -j $JOBS
|
||||
|
||||
cp /imhex/dist/web/source/* /build
|
||||
ccache -s
|
||||
EOF
|
||||
|
||||
FROM scratch
|
||||
# Create a file dedicated to store wasm size, because I know no way to get the wasm content length if the web server uses compression
|
||||
# See https://stackoverflow.com/questions/41701849/cannot-modify-accept-encoding-with-fetch https://github.com/AnthumChris/fetch-progress-indicators/issues/13
|
||||
RUN du -b /build/imhex.wasm | cut -f1 > imhex.wasm.size
|
||||
|
||||
FROM scratch AS raw
|
||||
COPY --from=build [ \
|
||||
# ImHex \
|
||||
"/build/imhex.wasm", \
|
||||
"/build/imhex.wasm.size", \
|
||||
"/build/imhex.js", \
|
||||
"/build/imhex.worker.js", \
|
||||
\
|
||||
# Static files \
|
||||
"/build/index.html", \
|
||||
@@ -81,9 +95,14 @@ COPY --from=build [ \
|
||||
"/build/wasm-config.js", \
|
||||
"/build/enable-threads.js", \
|
||||
"/build/favicon.ico", \
|
||||
"/build/icon.png", \
|
||||
"/build/icon.svg", \
|
||||
"/build/manifest.json", \
|
||||
"/build/robots.txt", \
|
||||
"/build/sitemap.xml", \
|
||||
\
|
||||
# Destination \
|
||||
"./" \
|
||||
]
|
||||
]
|
||||
|
||||
FROM nginx
|
||||
COPY --from=raw . /usr/share/nginx/html
|
||||
|
||||
10
dist/web/compose.yml
vendored
Normal file
10
dist/web/compose.yml
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
# docker compose -f dist/web/compose.yml up --build
|
||||
version: '3'
|
||||
services:
|
||||
imhex_web:
|
||||
image: imhex_web:latest
|
||||
build:
|
||||
context: ../../ # ImHex folder
|
||||
dockerfile: ./dist/web/Dockerfile
|
||||
ports:
|
||||
- 8080:80
|
||||
4
dist/web/plugin-bundle.cpp.in
vendored
4
dist/web/plugin-bundle.cpp.in
vendored
@@ -2,10 +2,12 @@
|
||||
|
||||
extern "C" void forceLinkPlugin_@IMHEX_PLUGIN_NAME@();
|
||||
|
||||
namespace {
|
||||
struct StaticLoad {
|
||||
StaticLoad() {
|
||||
forceLinkPlugin_@IMHEX_PLUGIN_NAME@();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
static StaticLoad staticLoad;
|
||||
static StaticLoad staticLoad;
|
||||
|
||||
BIN
dist/web/source/favicon.ico
vendored
BIN
dist/web/source/favicon.ico
vendored
Binary file not shown.
|
Before Width: | Height: | Size: 122 KiB After Width: | Height: | Size: 162 KiB |
BIN
dist/web/source/icon.png
vendored
BIN
dist/web/source/icon.png
vendored
Binary file not shown.
|
Before Width: | Height: | Size: 157 KiB |
11
dist/web/source/icon.svg
vendored
Normal file
11
dist/web/source/icon.svg
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" version="1">
|
||||
<rect style="opacity:0.2" width="55" height="10" x="5" y="-60" rx="1.41" transform="rotate(90)"/>
|
||||
<rect style="fill:#2b50a1" width="55" height="10" x="4" y="-60" rx="1.41" transform="rotate(90)"/>
|
||||
<rect style="fill:#2b50a1" width="55" height="10" x="4" y="-14" rx="1.41" transform="rotate(90)"/>
|
||||
<rect style="fill:#2b50a1" width="55" height="10" x="4" y="-33" rx="1.41" transform="rotate(90)"/>
|
||||
<path style="opacity:0.2" d="M 5.3808594,5 C 4.6158118,5 4,5.6158118 4,6.3808594 V 13.619141 C 4,14.384188 4.6158118,15 5.3808594,15 H 31.619141 C 32.384188,15 33,14.384188 33,13.619141 V 6.3808594 C 33,5.6158118 32.384188,5 31.619141,5 Z M 40.400391,5 C 39.624791,5 39,5.6247906 39,6.4003906 V 13.599609 C 39,14.375209 39.624791,15 40.400391,15 H 58.599609 C 59.375209,15 60,14.375209 60,13.599609 V 6.4003906 C 60,5.6247906 59.375209,5 58.599609,5 Z M 5.3808594,50 C 4.6158118,50 4,50.615812 4,51.380859 v 7.238282 C 4,59.384188 4.6158118,60 5.3808594,60 H 31.619141 C 32.384188,60 33,59.384188 33,58.619141 V 51.380859 C 33,50.615812 32.384188,50 31.619141,50 Z"/>
|
||||
<rect style="fill:#3a6be0" width="29" height="10" x="4" y="4" rx="1.381"/>
|
||||
<rect style="fill:#3a6be0" width="21" height="10" x="39" y="4" rx="1.4"/>
|
||||
<rect style="fill:#3a6be0" width="29" height="10" x="4" y="49" rx="1.381"/>
|
||||
<path style="fill:#ffffff;opacity:0.1" d="M 5.3808594 4 C 4.6158118 4 4 4.6158118 4 5.3808594 L 4 6.3808594 C 4 5.6158118 4.6158118 5 5.3808594 5 L 31.619141 5 C 32.384188 5 33 5.6158118 33 6.3808594 L 33 5.3808594 C 33 4.6158118 32.384188 4 31.619141 4 L 5.3808594 4 z M 40.400391 4 C 39.624791 4 39 4.6247906 39 5.4003906 L 39 6.4003906 C 39 5.6247906 39.624791 5 40.400391 5 L 58.599609 5 C 59.375209 5 60 5.6247906 60 6.4003906 L 60 5.4003906 C 60 4.6247906 59.375209 4 58.599609 4 L 40.400391 4 z M 5.3808594 49 C 4.6158118 49 4 49.615812 4 50.380859 L 4 51.380859 C 4 50.615812 4.6158118 50 5.3808594 50 L 31.619141 50 C 32.384188 50 33 50.615812 33 51.380859 L 33 50.380859 C 33 49.615812 32.384188 49 31.619141 49 L 5.3808594 49 z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.1 KiB |
62
dist/web/source/index.html
vendored
62
dist/web/source/index.html
vendored
@@ -1,23 +1,22 @@
|
||||
<!doctype html>
|
||||
<html lang="en-us">
|
||||
<head>
|
||||
<link rel="manifest" href="manifest.json" />
|
||||
<meta charset="utf-8">
|
||||
<title>ImHex Web - Free Online Hex Editor for Reverse Engineers</title>
|
||||
|
||||
<link rel="manifest" href="manifest.json">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
|
||||
<!-- Primary Meta Tags -->
|
||||
<title>ImHex Web - Online Hex Editor</title>
|
||||
<meta name="title" content="ImHex">
|
||||
<meta name="description" content="A Hex Editor for Reverse Engineers, Programmers and people who value their retinas when working at 3 AM.">
|
||||
<meta name="description" content="Free and extremely powerful Online Hex Editor for your Web Browser. ImHex is a free and open source Hex Editor for Reverse Engineers and Developers and Data Analysts.">
|
||||
<link rel="icon" type="image/x-icon" href="favicon.ico">
|
||||
<link rel="apple-touch-icon" href="icon.svg">
|
||||
|
||||
<!-- Open Graph / Facebook -->
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:url" content="https://imhex.werwolv.net/">
|
||||
<meta property="og:title" content="ImHex Web - Online Hex Editor">
|
||||
<meta property="og:description">
|
||||
<meta name="description" content="A Hex Editor for Reverse Engineers, Programmers and people who value their retinas when working at 3 AM.">
|
||||
<meta property="og:image" content="https://imhex.werwolv.net/assets/splash_wasm.png">
|
||||
|
||||
<!-- Twitter -->
|
||||
@@ -28,9 +27,7 @@
|
||||
content="A Hex Editor for Reverse Engineers, Programmers and people who value their retinas when working at 3 AM.">
|
||||
<meta property="twitter:image" content="https://imhex.werwolv.net/assets/splash_wasm.png">
|
||||
|
||||
<meta name="viewport" content="width=device-width">
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="style.css" />
|
||||
<link rel="stylesheet" type="text/css" href="style.css">
|
||||
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
@@ -41,7 +38,7 @@
|
||||
"founder": "WerWolv",
|
||||
"slogan": "A Hex Editor for Reverse Engineers, Programmers and people who value their retinas when working at 3 AM.",
|
||||
"url": "https://imhex.werwolv.net",
|
||||
"logo": "https://imhex.werwolv.net/assets/logos/logo.png"
|
||||
"logo": "https://imhex.werwolv.net/assets/logos/logo.svg"
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -60,15 +57,48 @@
|
||||
}
|
||||
</script>
|
||||
|
||||
<title>ImHex Web</title>
|
||||
<script src="enable-threads.js"></script>
|
||||
<link rel="stylesheet" href="style.css">
|
||||
</head>
|
||||
<body>
|
||||
<p id="loading_text">ImHex is loading...</p>
|
||||
<canvas class="emscripten" id="canvas" oncontextmenu="event.preventDefault()"></canvas>
|
||||
<div id="loading" class="centered">
|
||||
<img src="https://raw.githubusercontent.com/WerWolv/ImHex/master/plugins/builtin/romfs/assets/dark/banner.svg" id="logo" alt="ImHex Logo">
|
||||
<h1>A Hex Editor for Reverse Engineers, Programmers and people who value their retinas when working at 3 AM.</h1>
|
||||
<h2>Available both natively and on the web</h2>
|
||||
<h5>ImHex runs directly in your web browser with the help of Emscripten and WebAssembly.</h5>
|
||||
|
||||
<script type="text/javascript" src="wasm-config.js"></script>
|
||||
<script async type="text/javascript" src="imhex.js"></script>
|
||||
<div style="height: 50%">
|
||||
<div style="height: 30%"> </div>
|
||||
<h2 id="not_working">
|
||||
Not loading in your Browser? <a href="https://imhex.werwolv.net">Try the native version</a>
|
||||
</h2>
|
||||
<div class="progress-bar-container">
|
||||
<div class="progress progress-moved">
|
||||
<div class="progress-bar" id="progress-bar-content">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="loading_ripple">
|
||||
<div class="lds-ripple"><div></div><div></div></div>
|
||||
</div>
|
||||
|
||||
<div style="height: 10%">
|
||||
</div>
|
||||
|
||||
<div class="footer">
|
||||
<a href="https://imhex.werwolv.net">Homepage</a>
|
||||
<p>Made with ♥️ by the ImHex Team</p>
|
||||
<a href="https://github.com/WerWolv/ImHex">GitHub</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<canvas class="emscripten" id="canvas" oncontextmenu="event.preventDefault()"></canvas>
|
||||
|
||||
<script src="wasm-config.js"></script>
|
||||
<script async src="imhex.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
4
dist/web/source/manifest.json
vendored
4
dist/web/source/manifest.json
vendored
@@ -10,8 +10,8 @@
|
||||
],
|
||||
"icons": [
|
||||
{
|
||||
"src": "icon.png",
|
||||
"type": "image/png",
|
||||
"src": "icon.svg",
|
||||
"type": "image/svg",
|
||||
"sizes": "640x640"
|
||||
}
|
||||
],
|
||||
|
||||
4
dist/web/source/robots.txt
vendored
Normal file
4
dist/web/source/robots.txt
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
User-agent: *
|
||||
Allow: /
|
||||
|
||||
Sitemap: https://imhex.werwolv.net/sitemap.xml
|
||||
67
dist/web/source/sitemap.xml
vendored
Normal file
67
dist/web/source/sitemap.xml
vendored
Normal file
@@ -0,0 +1,67 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<urlset
|
||||
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9
|
||||
http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
|
||||
|
||||
<url>
|
||||
<loc>https://web.imhex.werwolv.net/</loc>
|
||||
<lastmod>2024-01-02T11:44:00+00:00</lastmod>
|
||||
<priority>1.00</priority>
|
||||
</url>
|
||||
<url>
|
||||
<title>English</title>
|
||||
<loc>https://web.imhex.werwolv.net?lang=en-US</loc>
|
||||
<lastmod>2024-01-02T11:44:00+00:00</lastmod>
|
||||
<priority>1.00</priority>
|
||||
</url>
|
||||
<url>
|
||||
<title>Deutsch</title>
|
||||
<loc>https://web.imhex.werwolv.net?lang=de-DE</loc>
|
||||
<lastmod>2024-01-02T11:44:00+00:00</lastmod>
|
||||
<priority>1.00</priority>
|
||||
</url>
|
||||
<url>
|
||||
<title>Português</title>
|
||||
<loc>https://web.imhex.werwolv.net?lang=pt-BR</loc>
|
||||
<lastmod>2024-01-02T11:44:00+00:00</lastmod>
|
||||
</url>
|
||||
<url>
|
||||
<title>中国</title>
|
||||
<loc>https://web.imhex.werwolv.net?lang=zh-CN</loc>
|
||||
<lastmod>2024-01-02T11:44:00+00:00</lastmod>
|
||||
</url>
|
||||
<url>
|
||||
<title>國語</title>
|
||||
<loc>https://web.imhex.werwolv.net?lang=zh-TW</loc>
|
||||
<lastmod>2024-01-02T11:44:00+00:00</lastmod>
|
||||
</url>
|
||||
<url>
|
||||
<title>日本語</title>
|
||||
<loc>https://web.imhex.werwolv.net?lang=ja-JP</loc>
|
||||
<lastmod>2024-01-02T11:44:00+00:00</lastmod>
|
||||
</url>
|
||||
<url>
|
||||
<title>한국어</title>
|
||||
<loc>https://web.imhex.werwolv.net?lang=ko-KR</loc>
|
||||
<lastmod>2024-01-02T11:44:00+00:00</lastmod>
|
||||
</url>
|
||||
<url>
|
||||
<title>Español</title>
|
||||
<loc>https://web.imhex.werwolv.net?lang=es-ES</loc>
|
||||
<lastmod>2024-01-02T11:44:00+00:00</lastmod>
|
||||
</url>
|
||||
<url>
|
||||
<title>Italiano</title>
|
||||
<loc>https://web.imhex.werwolv.net?lang=it-IT</loc>
|
||||
<lastmod>2024-01-02T11:44:00+00:00</lastmod>
|
||||
</url>
|
||||
<url>
|
||||
<title>Русский</title>
|
||||
<loc>https://web.imhex.werwolv.net?lang=ru-RU</loc>
|
||||
<lastmod>2024-01-02T11:44:00+00:00</lastmod>
|
||||
</url>
|
||||
|
||||
|
||||
</urlset>
|
||||
176
dist/web/source/style.css
vendored
176
dist/web/source/style.css
vendored
@@ -1,6 +1,6 @@
|
||||
html, body {
|
||||
height: 100%;
|
||||
margin: 0px;
|
||||
margin: 0;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
@@ -16,21 +16,173 @@ body {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
display: none;
|
||||
border: 0px none;
|
||||
border: 0 none;
|
||||
image-rendering: smooth;
|
||||
}
|
||||
|
||||
.canvas_full_screen {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
}
|
||||
|
||||
#loading_text {
|
||||
h1, h2, h5 {
|
||||
color: #F0F0F0;
|
||||
font-size: 30px;
|
||||
font-size: 20px;
|
||||
font-family: monospace;
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
margin-top: 60px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
h2 {
|
||||
margin-top: 15px;
|
||||
font-size: 17px;
|
||||
}
|
||||
|
||||
h5 {
|
||||
margin-top: 0;
|
||||
font-size: 17px;
|
||||
}
|
||||
|
||||
#not_working {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
#not_working.visible {
|
||||
opacity: 1;
|
||||
transition: opacity 2s ease;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #7893ff;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
text-shadow: #3a4677 0 0 10px;
|
||||
}
|
||||
|
||||
.footer {
|
||||
width: 100%;
|
||||
height: 20px;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
text-align: center;
|
||||
color: #F0F0F0;
|
||||
background-color: #0A0A0A;
|
||||
padding: 10px;
|
||||
font-family: monospace;
|
||||
font-size: 15px;
|
||||
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
flex-direction: row;
|
||||
gap: 10%;
|
||||
}
|
||||
|
||||
.centered {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
|
||||
.lds-ripple {
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
width: 80px;
|
||||
height: 80px;
|
||||
}
|
||||
.lds-ripple div {
|
||||
position: absolute;
|
||||
border: 4px solid #fff;
|
||||
opacity: 1;
|
||||
border-radius: 50%;
|
||||
animation: lds-ripple 1s cubic-bezier(0, 0.2, 0.8, 1) infinite;
|
||||
}
|
||||
.lds-ripple div:nth-child(2) {
|
||||
animation-delay: -0.5s;
|
||||
}
|
||||
@keyframes lds-ripple {
|
||||
0% {
|
||||
top: 36px;
|
||||
left: 36px;
|
||||
width: 0;
|
||||
height: 0;
|
||||
opacity: 0;
|
||||
}
|
||||
4.9% {
|
||||
top: 36px;
|
||||
left: 36px;
|
||||
width: 0;
|
||||
height: 0;
|
||||
opacity: 0;
|
||||
}
|
||||
5% {
|
||||
top: 36px;
|
||||
left: 36px;
|
||||
width: 0;
|
||||
height: 0;
|
||||
opacity: 1;
|
||||
}
|
||||
100% {
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 72px;
|
||||
height: 72px;
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
:root {
|
||||
--progress: 0%;
|
||||
}
|
||||
|
||||
.progress-bar-container {
|
||||
margin: 100px auto;
|
||||
width: 600px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.progress {
|
||||
padding: 6px;
|
||||
border-radius: 30px;
|
||||
background: rgba(0, 0, 0, 0.25);
|
||||
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.25),
|
||||
0 1px rgba(255, 255, 255, 0.08);
|
||||
}
|
||||
|
||||
.progress-bar {
|
||||
color: rgba(240, 240, 240, 0.9);
|
||||
height: 18px;
|
||||
border-radius: 30px;
|
||||
font-size: 13px;
|
||||
font-family: monospace;
|
||||
font-weight: bold;
|
||||
text-wrap: avoid;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
background-image: linear-gradient(
|
||||
to bottom,
|
||||
rgba(255, 255, 255, 0.2),
|
||||
rgba(255, 255, 255, 0.0)
|
||||
);
|
||||
}
|
||||
|
||||
.progress-moved .progress-bar {
|
||||
width: var(--progress);
|
||||
background-color: #3864cb;
|
||||
}
|
||||
|
||||
#logo {
|
||||
height: 25%;
|
||||
margin-top: 50px;
|
||||
}
|
||||
|
||||
.canvas-fixed {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
}
|
||||
235
dist/web/source/wasm-config.js
vendored
235
dist/web/source/wasm-config.js
vendored
@@ -1,3 +1,68 @@
|
||||
let wasmSize = null;
|
||||
// See comment in dist/web/Dockerfile about imhex.wasm.size
|
||||
fetch("imhex.wasm.size").then(async (resp) => {
|
||||
wasmSize = parseInt((await resp.text()).trim());
|
||||
console.log(`Real WASM binary size is ${wasmSize} bytes`);
|
||||
});
|
||||
|
||||
// Monkeypatch WebAssembly to have a progress bar
|
||||
// inspired from: https://github.com/WordPress/wordpress-playground/pull/46 (but had to be modified)
|
||||
function monkeyPatch(progressFun) {
|
||||
const _instantiateStreaming = WebAssembly.instantiateStreaming;
|
||||
WebAssembly.instantiateStreaming = async (responsePromise, ...args) => {
|
||||
// Do not collect wasm content length here see above
|
||||
let response = await responsePromise
|
||||
const file = response.url.substring(
|
||||
new URL(response.url).origin.length + 1
|
||||
);
|
||||
const reportingResponse = new Response(
|
||||
new ReadableStream(
|
||||
{
|
||||
async start(controller) {
|
||||
const reader = response.clone().body.getReader();
|
||||
let loaded = 0;
|
||||
for (; ;) {
|
||||
const { done, value } = await reader.read();
|
||||
if (done) {
|
||||
if(wasmSize) progressFun(file, wasmSize);
|
||||
break;
|
||||
}
|
||||
loaded += value.byteLength;
|
||||
progressFun(file, loaded);
|
||||
controller.enqueue(value);
|
||||
}
|
||||
controller.close();
|
||||
}
|
||||
},
|
||||
{
|
||||
status: response.status,
|
||||
statusText: response.statusText
|
||||
}
|
||||
)
|
||||
);
|
||||
for (const pair of response.headers.entries()) {
|
||||
reportingResponse.headers.set(pair[0], pair[1]);
|
||||
}
|
||||
|
||||
return _instantiateStreaming(reportingResponse, ...args);
|
||||
}
|
||||
}
|
||||
monkeyPatch((file, done) => {
|
||||
if (!wasmSize) return;
|
||||
if (done > wasmSize) {
|
||||
console.warn(`Downloaded binary size ${done} is larger than expected WASM size ${wasmSize}`);
|
||||
return;
|
||||
}
|
||||
|
||||
const percent = ((done / wasmSize) * 100).toFixed(0);
|
||||
const mibNow = (done / 1024**2).toFixed(1);
|
||||
const mibTotal = (wasmSize / 1024**2).toFixed(1);
|
||||
|
||||
let root = document.querySelector(':root');
|
||||
root.style.setProperty("--progress", `${percent}%`)
|
||||
document.getElementById("progress-bar-content").innerHTML = `${percent}% [${mibNow} MiB / ${mibTotal} MiB]`;
|
||||
});
|
||||
|
||||
function glfwSetCursorCustom(wnd, shape) {
|
||||
let body = document.getElementsByTagName("body")[0]
|
||||
switch (shape) {
|
||||
@@ -30,41 +95,181 @@ function glfwCreateStandardCursorCustom(shape) {
|
||||
return shape
|
||||
}
|
||||
|
||||
var notWorkingTimer = setTimeout(() => {
|
||||
document.getElementById("not_working").classList.add("visible")
|
||||
}, 5000);
|
||||
|
||||
var Module = {
|
||||
preRun: [],
|
||||
postRun: [],
|
||||
postRun: function() {
|
||||
// Patch the emscripten GLFW module to send mouse and touch events in the right order
|
||||
// For ImGui interactions to correctly work with touch input, MousePos events need
|
||||
// to be processed first and then MouseButton events in the next frame. By default,
|
||||
// GLFW does the exact opposite, which causes buttons to require two taps to register
|
||||
// and windows get "stuck" to the cursor when dragged or resized
|
||||
GLFW.onMousemove = event => {
|
||||
if (event.type === "touchmove") {
|
||||
event.preventDefault();
|
||||
let primaryChanged = false;
|
||||
for (let i of event.changedTouches) {
|
||||
if (GLFW.primaryTouchId === i.identifier) {
|
||||
Browser.setMouseCoords(i.pageX, i.pageY);
|
||||
primaryChanged = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!primaryChanged) {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
Browser.calculateMouseEvent(event);
|
||||
}
|
||||
};
|
||||
|
||||
GLFW.onMouseButtonChanged = (event, status) => {
|
||||
if (!GLFW.active) return;
|
||||
if (event.target != Module["canvas"]) return;
|
||||
const isTouchType = event.type === "touchstart" || event.type === "touchend" || event.type === "touchcancel";
|
||||
let eventButton = 0;
|
||||
if (isTouchType) {
|
||||
event.preventDefault();
|
||||
let primaryChanged = false;
|
||||
if (GLFW.primaryTouchId === null && event.type === "touchstart" && event.targetTouches.length > 0) {
|
||||
const chosenTouch = event.targetTouches[0];
|
||||
GLFW.primaryTouchId = chosenTouch.identifier;
|
||||
Browser.setMouseCoords(chosenTouch.pageX, chosenTouch.pageY);
|
||||
primaryChanged = true;
|
||||
} else if (event.type === "touchend" || event.type === "touchcancel") {
|
||||
for (let i of event.changedTouches) {
|
||||
if (GLFW.primaryTouchId === i.identifier) {
|
||||
GLFW.primaryTouchId = null;
|
||||
primaryChanged = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!primaryChanged) {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
Browser.calculateMouseEvent(event);
|
||||
eventButton = GLFW.DOMToGLFWMouseButton(event);
|
||||
}
|
||||
if (status == 1) {
|
||||
GLFW.active.buttons |= (1 << eventButton);
|
||||
try {
|
||||
event.target.setCapture();
|
||||
} catch (e) {}
|
||||
} else {
|
||||
GLFW.active.buttons &= ~(1 << eventButton);
|
||||
}
|
||||
|
||||
if (GLFW.active.cursorPosFunc) {
|
||||
getWasmTableEntry(GLFW.active.cursorPosFunc)(GLFW.active.id, Browser.mouseX, Browser.mouseY);
|
||||
}
|
||||
if (GLFW.active.mouseButtonFunc) {
|
||||
getWasmTableEntry(GLFW.active.mouseButtonFunc)(GLFW.active.id, eventButton, status, GLFW.getModBits(GLFW.active));
|
||||
}
|
||||
};
|
||||
},
|
||||
onRuntimeInitialized: function() {
|
||||
// Triggered when the wasm module is loaded and ready to use.
|
||||
document.getElementById("loading_text").style.display = "none"
|
||||
document.getElementById("loading").style.display = "none"
|
||||
document.getElementById("canvas").style.display = "initial"
|
||||
|
||||
clearTimeout(notWorkingTimer);
|
||||
},
|
||||
print: (function() { })(),
|
||||
printErr: function(text) { },
|
||||
printErr: function(text) { },
|
||||
canvas: (function() {
|
||||
let canvas = document.getElementById('canvas');
|
||||
// As a default initial behavior, pop up an alert when webgl context is lost. To make your
|
||||
// application robust, you may want to override this behavior before shipping!
|
||||
// See http://www.khronos.org/registry/webgl/specs/latest/1.0/#5.15.2
|
||||
canvas.addEventListener("webglcontextlost", function(e) { alert('WebGL context lost. You will need to reload the page.'); e.preventDefault(); }, false);
|
||||
const canvas = document.getElementById('canvas');
|
||||
canvas.addEventListener("webglcontextlost", function(e) {
|
||||
alert('WebGL context lost, please reload the page');
|
||||
e.preventDefault();
|
||||
}, false);
|
||||
|
||||
return canvas;
|
||||
// Turn long touches into right-clicks
|
||||
let timer = null;
|
||||
canvas.addEventListener('touchstart', event => {
|
||||
timer = setTimeout(() => {
|
||||
let eventArgs = {
|
||||
bubbles: true,
|
||||
cancelable: true,
|
||||
view: window,
|
||||
screenX: event.touches[0].screenX,
|
||||
screenY: event.touches[0].screenY,
|
||||
clientX: event.touches[0].clientX,
|
||||
clientY: event.touches[0].clientY,
|
||||
button: 2,
|
||||
buttons: 2,
|
||||
relatedTarget: event.target,
|
||||
region: event.region
|
||||
}
|
||||
|
||||
canvas.dispatchEvent(new MouseEvent('mousedown', eventArgs));
|
||||
canvas.dispatchEvent(new MouseEvent('mouseup', eventArgs));
|
||||
}, 400);
|
||||
});
|
||||
|
||||
canvas.addEventListener('touchend', event => {
|
||||
if (timer) {
|
||||
clearTimeout(timer);
|
||||
timer = null;
|
||||
}
|
||||
});
|
||||
|
||||
if (typeof WebGL2RenderingContext !== 'undefined') {
|
||||
let gl = canvas.getContext('webgl2', { stencil: true });
|
||||
if (!gl) {
|
||||
console.error('WebGL 2 not available, falling back to WebGL');
|
||||
gl = canvas.getContext('webgl', { stencil: true });
|
||||
}
|
||||
if (!gl) {
|
||||
alert('WebGL not available with stencil buffer');
|
||||
}
|
||||
return canvas;
|
||||
} else {
|
||||
alert('WebGL 2 not supported by this browser');
|
||||
}
|
||||
})(),
|
||||
setStatus: function(text) { },
|
||||
totalDependencies: 0,
|
||||
monitorRunDependencies: function(left) { },
|
||||
instantiateWasm: function(imports, successCallback) {
|
||||
monitorRunDependencies: function(left) {
|
||||
},
|
||||
instantiateWasm: async function(imports, successCallback) {
|
||||
imports.env.glfwSetCursor = glfwSetCursorCustom
|
||||
imports.env.glfwCreateStandardCursor = glfwCreateStandardCursorCustom
|
||||
instantiateAsync(wasmBinary, wasmBinaryFile, imports, (result) => successCallback(result.instance, result.module));
|
||||
}
|
||||
let result = await instantiateAsync(null, findWasmBinary(), imports);
|
||||
successCallback(result.instance, result.module)
|
||||
},
|
||||
arguments: []
|
||||
};
|
||||
|
||||
// Handle passing arguments to the wasm module
|
||||
const queryString = window.location.search;
|
||||
const urlParams = new URLSearchParams(queryString);
|
||||
if (urlParams.has("lang")) {
|
||||
Module["arguments"].push("--language");
|
||||
Module["arguments"].push(urlParams.get("lang"));
|
||||
} else if (urlParams.has("save-editor")) {
|
||||
Module["arguments"].push("--save-editor");
|
||||
Module["arguments"].push("gist");
|
||||
Module["arguments"].push(urlParams.get("save-editor"));
|
||||
}
|
||||
|
||||
window.addEventListener('resize', js_resizeCanvas, false);
|
||||
function js_resizeCanvas() {
|
||||
let canvas = document.getElementById('canvas');
|
||||
|
||||
canvas.top = document.documentElement.clientTop;
|
||||
canvas.left = document.documentElement.clientLeft;
|
||||
canvas.width = Math.min(document.documentElement.clientWidth, window.innerWidth || 0);
|
||||
canvas.height = Math.min(document.documentElement.clientHeight, window.innerHeight || 0);
|
||||
}
|
||||
|
||||
canvas.classList.add("canvas_full_screen")
|
||||
}
|
||||
// Prevent some default browser shortcuts from preventing ImHex ones to work
|
||||
document.addEventListener('keydown', e => {
|
||||
if (e.ctrlKey) {
|
||||
if (e.which == 83) e.preventDefault();
|
||||
}
|
||||
})
|
||||
1
lib/external/capstone
vendored
1
lib/external/capstone
vendored
Submodule lib/external/capstone deleted from 097c04d941
1
lib/external/disassembler
vendored
Submodule
1
lib/external/disassembler
vendored
Submodule
Submodule lib/external/disassembler added at 7235352627
1
lib/external/fmt
vendored
1
lib/external/fmt
vendored
Submodule lib/external/fmt deleted from f918289363
40
lib/external/imgui/CMakeLists.txt
vendored
40
lib/external/imgui/CMakeLists.txt
vendored
@@ -1,40 +0,0 @@
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
project(imgui)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
|
||||
find_package(PkgConfig REQUIRED)
|
||||
find_package(Freetype REQUIRED)
|
||||
find_package(OpenGL REQUIRED)
|
||||
pkg_search_module(GLFW REQUIRED glfw3)
|
||||
|
||||
add_library(imgui OBJECT
|
||||
source/imgui.cpp
|
||||
source/imgui_demo.cpp
|
||||
source/imgui_draw.cpp
|
||||
include/misc/freetype/imgui_freetype.cpp # TODO move source and includes in the same directory
|
||||
source/imgui_impl_glfw.cpp
|
||||
source/imgui_impl_opengl3.cpp
|
||||
source/imgui_tables.cpp
|
||||
source/imgui_widgets.cpp
|
||||
|
||||
source/TextEditor.cpp
|
||||
|
||||
source/imnodes.cpp
|
||||
|
||||
source/implot.cpp
|
||||
source/implot_items.cpp
|
||||
source/implot_demo.cpp
|
||||
|
||||
source/fonts/fontawesome_font.c
|
||||
source/fonts/codicons_font.c
|
||||
source/fonts/unifont_font.c
|
||||
)
|
||||
|
||||
target_compile_definitions(imgui PUBLIC IMGUI_IMPL_OPENGL_LOADER_GLAD)
|
||||
target_compile_definitions(imgui PUBLIC IMGUI_USER_CONFIG="imgui_config.h")
|
||||
target_compile_options(imgui PRIVATE -Wno-unknown-warning-option)
|
||||
|
||||
target_include_directories(imgui PUBLIC include ${FREETYPE_INCLUDE_DIRS} ${GLFW_INCLUDE_DIRS} ${OpenGL_INCLUDE_DIRS})
|
||||
target_link_directories(imgui PUBLIC ${GLFW_LIBRARY_DIRS} ${OpenGL_LIBRARY_DIRS})
|
||||
target_link_libraries(imgui PUBLIC Freetype::Freetype ${GLFW_LIBRARIES} ${OPENGL_LIBRARIES})
|
||||
400
lib/external/imgui/include/TextEditor.h
vendored
400
lib/external/imgui/include/TextEditor.h
vendored
@@ -1,400 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <array>
|
||||
#include <memory>
|
||||
#include <unordered_set>
|
||||
#include <unordered_map>
|
||||
#include <map>
|
||||
#include <regex>
|
||||
#include "imgui.h"
|
||||
|
||||
class TextEditor
|
||||
{
|
||||
public:
|
||||
enum class PaletteIndex
|
||||
{
|
||||
Default,
|
||||
Keyword,
|
||||
Number,
|
||||
String,
|
||||
CharLiteral,
|
||||
Punctuation,
|
||||
Preprocessor,
|
||||
Identifier,
|
||||
KnownIdentifier,
|
||||
PreprocIdentifier,
|
||||
Comment,
|
||||
MultiLineComment,
|
||||
Background,
|
||||
Cursor,
|
||||
Selection,
|
||||
ErrorMarker,
|
||||
Breakpoint,
|
||||
LineNumber,
|
||||
CurrentLineFill,
|
||||
CurrentLineFillInactive,
|
||||
CurrentLineEdge,
|
||||
Max
|
||||
};
|
||||
|
||||
enum class SelectionMode
|
||||
{
|
||||
Normal,
|
||||
Word,
|
||||
Line
|
||||
};
|
||||
|
||||
struct Breakpoint
|
||||
{
|
||||
int mLine;
|
||||
bool mEnabled;
|
||||
std::string mCondition;
|
||||
|
||||
Breakpoint()
|
||||
: mLine(-1)
|
||||
, mEnabled(false)
|
||||
{}
|
||||
};
|
||||
|
||||
// Represents a character coordinate from the user's point of view,
|
||||
// i. e. consider an uniform grid (assuming fixed-width font) on the
|
||||
// screen as it is rendered, and each cell has its own coordinate, starting from 0.
|
||||
// Tabs are counted as [1..mTabSize] count empty spaces, depending on
|
||||
// how many space is necessary to reach the next tab stop.
|
||||
// For example, coordinate (1, 5) represents the character 'B' in a line "\tABC", when mTabSize = 4,
|
||||
// because it is rendered as " ABC" on the screen.
|
||||
struct Coordinates
|
||||
{
|
||||
int mLine, mColumn;
|
||||
Coordinates() : mLine(0), mColumn(0) {}
|
||||
Coordinates(int aLine, int aColumn) : mLine(aLine), mColumn(aColumn)
|
||||
{
|
||||
assert(aLine >= 0);
|
||||
assert(aColumn >= 0);
|
||||
}
|
||||
static Coordinates Invalid() { static Coordinates invalid(-1, -1); return invalid; }
|
||||
|
||||
bool operator ==(const Coordinates& o) const
|
||||
{
|
||||
return
|
||||
mLine == o.mLine &&
|
||||
mColumn == o.mColumn;
|
||||
}
|
||||
|
||||
bool operator !=(const Coordinates& o) const
|
||||
{
|
||||
return
|
||||
mLine != o.mLine ||
|
||||
mColumn != o.mColumn;
|
||||
}
|
||||
|
||||
bool operator <(const Coordinates& o) const
|
||||
{
|
||||
if (mLine != o.mLine)
|
||||
return mLine < o.mLine;
|
||||
return mColumn < o.mColumn;
|
||||
}
|
||||
|
||||
bool operator >(const Coordinates& o) const
|
||||
{
|
||||
if (mLine != o.mLine)
|
||||
return mLine > o.mLine;
|
||||
return mColumn > o.mColumn;
|
||||
}
|
||||
|
||||
bool operator <=(const Coordinates& o) const
|
||||
{
|
||||
if (mLine != o.mLine)
|
||||
return mLine < o.mLine;
|
||||
return mColumn <= o.mColumn;
|
||||
}
|
||||
|
||||
bool operator >=(const Coordinates& o) const
|
||||
{
|
||||
if (mLine != o.mLine)
|
||||
return mLine > o.mLine;
|
||||
return mColumn >= o.mColumn;
|
||||
}
|
||||
};
|
||||
|
||||
struct Identifier
|
||||
{
|
||||
Coordinates mLocation;
|
||||
std::string mDeclaration;
|
||||
};
|
||||
|
||||
typedef std::string String;
|
||||
typedef std::unordered_map<std::string, Identifier> Identifiers;
|
||||
typedef std::unordered_set<std::string> Keywords;
|
||||
typedef std::map<int, std::string> ErrorMarkers;
|
||||
typedef std::unordered_set<int> Breakpoints;
|
||||
typedef std::array<ImU32, (unsigned)PaletteIndex::Max> Palette;
|
||||
typedef uint8_t Char;
|
||||
|
||||
struct Glyph
|
||||
{
|
||||
Char mChar;
|
||||
PaletteIndex mColorIndex = PaletteIndex::Default;
|
||||
bool mComment : 1;
|
||||
bool mMultiLineComment : 1;
|
||||
bool mPreprocessor : 1;
|
||||
|
||||
Glyph(Char aChar, PaletteIndex aColorIndex) : mChar(aChar), mColorIndex(aColorIndex),
|
||||
mComment(false), mMultiLineComment(false), mPreprocessor(false) {}
|
||||
};
|
||||
|
||||
typedef std::vector<Glyph> Line;
|
||||
typedef std::vector<Line> Lines;
|
||||
|
||||
struct LanguageDefinition
|
||||
{
|
||||
typedef std::pair<std::string, PaletteIndex> TokenRegexString;
|
||||
typedef std::vector<TokenRegexString> TokenRegexStrings;
|
||||
typedef bool(*TokenizeCallback)(const char * in_begin, const char * in_end, const char *& out_begin, const char *& out_end, PaletteIndex & paletteIndex);
|
||||
|
||||
std::string mName;
|
||||
Keywords mKeywords;
|
||||
Identifiers mIdentifiers;
|
||||
Identifiers mPreprocIdentifiers;
|
||||
std::string mCommentStart, mCommentEnd, mSingleLineComment;
|
||||
char mPreprocChar;
|
||||
bool mAutoIndentation;
|
||||
|
||||
TokenizeCallback mTokenize;
|
||||
|
||||
TokenRegexStrings mTokenRegexStrings;
|
||||
|
||||
bool mCaseSensitive;
|
||||
|
||||
LanguageDefinition()
|
||||
: mPreprocChar('#'), mAutoIndentation(true), mTokenize(nullptr), mCaseSensitive(true)
|
||||
{
|
||||
}
|
||||
|
||||
static const LanguageDefinition& CPlusPlus();
|
||||
static const LanguageDefinition& HLSL();
|
||||
static const LanguageDefinition& GLSL();
|
||||
static const LanguageDefinition& C();
|
||||
static const LanguageDefinition& SQL();
|
||||
static const LanguageDefinition& AngelScript();
|
||||
static const LanguageDefinition& Lua();
|
||||
};
|
||||
|
||||
TextEditor();
|
||||
~TextEditor();
|
||||
|
||||
void SetLanguageDefinition(const LanguageDefinition& aLanguageDef);
|
||||
const LanguageDefinition& GetLanguageDefinition() const { return mLanguageDefinition; }
|
||||
|
||||
static const Palette& GetPalette() { return sPaletteBase; }
|
||||
static void SetPalette(const Palette& aValue);
|
||||
|
||||
void SetErrorMarkers(const ErrorMarkers& aMarkers) { mErrorMarkers = aMarkers; }
|
||||
void SetBreakpoints(const Breakpoints& aMarkers) { mBreakpoints = aMarkers; }
|
||||
|
||||
void Render(const char* aTitle, const ImVec2& aSize = ImVec2(), bool aBorder = false);
|
||||
void SetText(const std::string& aText);
|
||||
std::string GetText() const;
|
||||
|
||||
void SetTextLines(const std::vector<std::string>& aLines);
|
||||
std::vector<std::string> GetTextLines() const;
|
||||
|
||||
std::string GetSelectedText() const;
|
||||
std::string GetCurrentLineText()const;
|
||||
|
||||
int GetTotalLines() const { return (int)mLines.size(); }
|
||||
bool IsOverwrite() const { return mOverwrite; }
|
||||
|
||||
void SetReadOnly(bool aValue);
|
||||
bool IsReadOnly() const { return mReadOnly; }
|
||||
bool IsTextChanged() const { return mTextChanged; }
|
||||
bool IsCursorPositionChanged() const { return mCursorPositionChanged; }
|
||||
|
||||
void SetShowCursor(bool aValue) { mShowCursor = aValue; }
|
||||
void SetShowLineNumbers(bool aValue) { mShowLineNumbers = aValue; }
|
||||
|
||||
bool IsColorizerEnabled() const { return mColorizerEnabled; }
|
||||
void SetColorizerEnable(bool aValue);
|
||||
|
||||
Coordinates GetCursorPosition() const { return GetActualCursorCoordinates(); }
|
||||
void SetCursorPosition(const Coordinates& aPosition);
|
||||
|
||||
inline void SetHandleMouseInputs (bool aValue){ mHandleMouseInputs = aValue;}
|
||||
inline bool IsHandleMouseInputsEnabled() const { return mHandleKeyboardInputs; }
|
||||
|
||||
inline void SetHandleKeyboardInputs (bool aValue){ mHandleKeyboardInputs = aValue;}
|
||||
inline bool IsHandleKeyboardInputsEnabled() const { return mHandleKeyboardInputs; }
|
||||
|
||||
inline void SetImGuiChildIgnored (bool aValue){ mIgnoreImGuiChild = aValue;}
|
||||
inline bool IsImGuiChildIgnored() const { return mIgnoreImGuiChild; }
|
||||
|
||||
inline void SetShowWhitespaces(bool aValue) { mShowWhitespaces = aValue; }
|
||||
inline bool IsShowingWhitespaces() const { return mShowWhitespaces; }
|
||||
|
||||
void SetTabSize(int aValue);
|
||||
inline int GetTabSize() const { return mTabSize; }
|
||||
|
||||
void InsertText(const std::string& aValue);
|
||||
void InsertText(const char* aValue);
|
||||
|
||||
void MoveUp(int aAmount = 1, bool aSelect = false);
|
||||
void MoveDown(int aAmount = 1, bool aSelect = false);
|
||||
void MoveLeft(int aAmount = 1, bool aSelect = false, bool aWordMode = false);
|
||||
void MoveRight(int aAmount = 1, bool aSelect = false, bool aWordMode = false);
|
||||
void MoveTop(bool aSelect = false);
|
||||
void MoveBottom(bool aSelect = false);
|
||||
void MoveHome(bool aSelect = false);
|
||||
void MoveEnd(bool aSelect = false);
|
||||
|
||||
void SetSelectionStart(const Coordinates& aPosition);
|
||||
void SetSelectionEnd(const Coordinates& aPosition);
|
||||
void SetSelection(const Coordinates& aStart, const Coordinates& aEnd, SelectionMode aMode = SelectionMode::Normal);
|
||||
void SelectWordUnderCursor();
|
||||
void SelectAll();
|
||||
bool HasSelection() const;
|
||||
|
||||
void Copy();
|
||||
void Cut();
|
||||
void Paste();
|
||||
void Delete();
|
||||
|
||||
bool CanUndo() const;
|
||||
bool CanRedo() const;
|
||||
void Undo(int aSteps = 1);
|
||||
void Redo(int aSteps = 1);
|
||||
|
||||
static const Palette& GetDarkPalette();
|
||||
static const Palette& GetLightPalette();
|
||||
static const Palette& GetRetroBluePalette();
|
||||
|
||||
private:
|
||||
typedef std::vector<std::pair<std::regex, PaletteIndex>> RegexList;
|
||||
|
||||
struct EditorState
|
||||
{
|
||||
Coordinates mSelectionStart;
|
||||
Coordinates mSelectionEnd;
|
||||
Coordinates mCursorPosition;
|
||||
};
|
||||
|
||||
class UndoRecord
|
||||
{
|
||||
public:
|
||||
UndoRecord() {}
|
||||
~UndoRecord() {}
|
||||
|
||||
UndoRecord(
|
||||
const std::string& aAdded,
|
||||
const TextEditor::Coordinates aAddedStart,
|
||||
const TextEditor::Coordinates aAddedEnd,
|
||||
|
||||
const std::string& aRemoved,
|
||||
const TextEditor::Coordinates aRemovedStart,
|
||||
const TextEditor::Coordinates aRemovedEnd,
|
||||
|
||||
TextEditor::EditorState& aBefore,
|
||||
TextEditor::EditorState& aAfter);
|
||||
|
||||
void Undo(TextEditor* aEditor);
|
||||
void Redo(TextEditor* aEditor);
|
||||
|
||||
std::string mAdded;
|
||||
Coordinates mAddedStart;
|
||||
Coordinates mAddedEnd;
|
||||
|
||||
std::string mRemoved;
|
||||
Coordinates mRemovedStart;
|
||||
Coordinates mRemovedEnd;
|
||||
|
||||
EditorState mBefore;
|
||||
EditorState mAfter;
|
||||
};
|
||||
|
||||
typedef std::vector<UndoRecord> UndoBuffer;
|
||||
|
||||
void ProcessInputs();
|
||||
void Colorize(int aFromLine = 0, int aCount = -1);
|
||||
void ColorizeRange(int aFromLine = 0, int aToLine = 0);
|
||||
void ColorizeInternal();
|
||||
float TextDistanceToLineStart(const Coordinates& aFrom) const;
|
||||
void EnsureCursorVisible();
|
||||
int GetPageSize() const;
|
||||
std::string GetText(const Coordinates& aStart, const Coordinates& aEnd) const;
|
||||
Coordinates GetActualCursorCoordinates() const;
|
||||
Coordinates SanitizeCoordinates(const Coordinates& aValue) const;
|
||||
void Advance(Coordinates& aCoordinates) const;
|
||||
void DeleteRange(const Coordinates& aStart, const Coordinates& aEnd);
|
||||
int InsertTextAt(Coordinates& aWhere, const char* aValue);
|
||||
void AddUndo(UndoRecord& aValue);
|
||||
Coordinates ScreenPosToCoordinates(const ImVec2& aPosition) const;
|
||||
Coordinates FindWordStart(const Coordinates& aFrom) const;
|
||||
Coordinates FindWordEnd(const Coordinates& aFrom) const;
|
||||
Coordinates FindNextWord(const Coordinates& aFrom) const;
|
||||
int GetCharacterIndex(const Coordinates& aCoordinates) const;
|
||||
int GetCharacterColumn(int aLine, int aIndex) const;
|
||||
int GetLineCharacterCount(int aLine) const;
|
||||
int GetLineMaxColumn(int aLine) const;
|
||||
bool IsOnWordBoundary(const Coordinates& aAt) const;
|
||||
void RemoveLine(int aStart, int aEnd);
|
||||
void RemoveLine(int aIndex);
|
||||
Line& InsertLine(int aIndex);
|
||||
void EnterCharacter(ImWchar aChar, bool aShift);
|
||||
void Backspace();
|
||||
void DeleteSelection();
|
||||
std::string GetWordUnderCursor() const;
|
||||
std::string GetWordAt(const Coordinates& aCoords) const;
|
||||
ImU32 GetGlyphColor(const Glyph& aGlyph) const;
|
||||
|
||||
void HandleKeyboardInputs();
|
||||
void HandleMouseInputs();
|
||||
void Render();
|
||||
|
||||
float mLineSpacing;
|
||||
Lines mLines;
|
||||
EditorState mState;
|
||||
UndoBuffer mUndoBuffer;
|
||||
int mUndoIndex;
|
||||
|
||||
int mTabSize;
|
||||
bool mOverwrite;
|
||||
bool mReadOnly;
|
||||
bool mWithinRender;
|
||||
bool mScrollToCursor;
|
||||
bool mScrollToTop;
|
||||
bool mTextChanged;
|
||||
bool mColorizerEnabled;
|
||||
float mTextStart; // position (in pixels) where a code line starts relative to the left of the TextEditor.
|
||||
int mLeftMargin;
|
||||
bool mCursorPositionChanged;
|
||||
int mColorRangeMin, mColorRangeMax;
|
||||
SelectionMode mSelectionMode;
|
||||
bool mHandleKeyboardInputs;
|
||||
bool mHandleMouseInputs;
|
||||
bool mIgnoreImGuiChild;
|
||||
bool mShowWhitespaces;
|
||||
|
||||
static Palette sPaletteBase;
|
||||
Palette mPalette;
|
||||
LanguageDefinition mLanguageDefinition;
|
||||
RegexList mRegexList;
|
||||
|
||||
bool mCheckComments;
|
||||
Breakpoints mBreakpoints;
|
||||
ErrorMarkers mErrorMarkers;
|
||||
ImVec2 mCharAdvance;
|
||||
Coordinates mInteractiveStart, mInteractiveEnd;
|
||||
std::string mLineBuffer;
|
||||
uint64_t mStartTime;
|
||||
|
||||
float mLastClick;
|
||||
bool mShowCursor;
|
||||
bool mShowLineNumbers;
|
||||
};
|
||||
|
||||
bool TokenizeCStyleString(const char * in_begin, const char * in_end, const char *& out_begin, const char *& out_end);
|
||||
bool TokenizeCStyleCharacterLiteral(const char * in_begin, const char * in_end, const char *& out_begin, const char *& out_end);
|
||||
bool TokenizeCStyleIdentifier(const char * in_begin, const char * in_end, const char *& out_begin, const char *& out_end);
|
||||
bool TokenizeCStyleNumber(const char * in_begin, const char * in_end, const char *& out_begin, const char *& out_end);
|
||||
bool TokenizeCStylePunctuation(const char * in_begin, const char * in_end, const char *& out_begin, const char *& out_end);
|
||||
475
lib/external/imgui/include/fonts/codicons_font.h
vendored
475
lib/external/imgui/include/fonts/codicons_font.h
vendored
@@ -1,475 +0,0 @@
|
||||
// Generated by https://github.com/juliettef/IconFontCppHeaders script GenerateIconFontCppHeaders.py for languages C and C++
|
||||
// from https://raw.githubusercontent.com/microsoft/vscode-codicons/main/dist/codicon.css
|
||||
// for use with https://github.com/microsoft/vscode-codicons/raw/main/dist/codicon.ttf
|
||||
#pragma once
|
||||
|
||||
#define FONT_ICON_FILE_NAME_VS "codicon.ttf"
|
||||
|
||||
extern const unsigned int codicons_compressed_size;
|
||||
extern const unsigned int codicons_compressed_data[52184/4];
|
||||
|
||||
#define ICON_MIN_VS 0xea60
|
||||
#define ICON_MAX_VS 0xebdd
|
||||
#define ICON_VS_ADD "\xee\xa9\xa0" // U+ea60
|
||||
#define ICON_VS_PLUS "\xee\xa9\xa0" // U+ea60
|
||||
#define ICON_VS_GIST_NEW "\xee\xa9\xa0" // U+ea60
|
||||
#define ICON_VS_REPO_CREATE "\xee\xa9\xa0" // U+ea60
|
||||
#define ICON_VS_LIGHTBULB "\xee\xa9\xa1" // U+ea61
|
||||
#define ICON_VS_LIGHT_BULB "\xee\xa9\xa1" // U+ea61
|
||||
#define ICON_VS_REPO "\xee\xa9\xa2" // U+ea62
|
||||
#define ICON_VS_REPO_DELETE "\xee\xa9\xa2" // U+ea62
|
||||
#define ICON_VS_GIST_FORK "\xee\xa9\xa3" // U+ea63
|
||||
#define ICON_VS_REPO_FORKED "\xee\xa9\xa3" // U+ea63
|
||||
#define ICON_VS_GIT_PULL_REQUEST "\xee\xa9\xa4" // U+ea64
|
||||
#define ICON_VS_GIT_PULL_REQUEST_ABANDONED "\xee\xa9\xa4" // U+ea64
|
||||
#define ICON_VS_RECORD_KEYS "\xee\xa9\xa5" // U+ea65
|
||||
#define ICON_VS_KEYBOARD "\xee\xa9\xa5" // U+ea65
|
||||
#define ICON_VS_TAG "\xee\xa9\xa6" // U+ea66
|
||||
#define ICON_VS_TAG_ADD "\xee\xa9\xa6" // U+ea66
|
||||
#define ICON_VS_TAG_REMOVE "\xee\xa9\xa6" // U+ea66
|
||||
#define ICON_VS_PERSON "\xee\xa9\xa7" // U+ea67
|
||||
#define ICON_VS_PERSON_FOLLOW "\xee\xa9\xa7" // U+ea67
|
||||
#define ICON_VS_PERSON_OUTLINE "\xee\xa9\xa7" // U+ea67
|
||||
#define ICON_VS_PERSON_FILLED "\xee\xa9\xa7" // U+ea67
|
||||
#define ICON_VS_GIT_BRANCH "\xee\xa9\xa8" // U+ea68
|
||||
#define ICON_VS_GIT_BRANCH_CREATE "\xee\xa9\xa8" // U+ea68
|
||||
#define ICON_VS_GIT_BRANCH_DELETE "\xee\xa9\xa8" // U+ea68
|
||||
#define ICON_VS_SOURCE_CONTROL "\xee\xa9\xa8" // U+ea68
|
||||
#define ICON_VS_MIRROR "\xee\xa9\xa9" // U+ea69
|
||||
#define ICON_VS_MIRROR_PUBLIC "\xee\xa9\xa9" // U+ea69
|
||||
#define ICON_VS_STAR "\xee\xa9\xaa" // U+ea6a
|
||||
#define ICON_VS_STAR_ADD "\xee\xa9\xaa" // U+ea6a
|
||||
#define ICON_VS_STAR_DELETE "\xee\xa9\xaa" // U+ea6a
|
||||
#define ICON_VS_STAR_EMPTY "\xee\xa9\xaa" // U+ea6a
|
||||
#define ICON_VS_COMMENT "\xee\xa9\xab" // U+ea6b
|
||||
#define ICON_VS_COMMENT_ADD "\xee\xa9\xab" // U+ea6b
|
||||
#define ICON_VS_ALERT "\xee\xa9\xac" // U+ea6c
|
||||
#define ICON_VS_WARNING "\xee\xa9\xac" // U+ea6c
|
||||
#define ICON_VS_SEARCH "\xee\xa9\xad" // U+ea6d
|
||||
#define ICON_VS_SEARCH_SAVE "\xee\xa9\xad" // U+ea6d
|
||||
#define ICON_VS_LOG_OUT "\xee\xa9\xae" // U+ea6e
|
||||
#define ICON_VS_SIGN_OUT "\xee\xa9\xae" // U+ea6e
|
||||
#define ICON_VS_LOG_IN "\xee\xa9\xaf" // U+ea6f
|
||||
#define ICON_VS_SIGN_IN "\xee\xa9\xaf" // U+ea6f
|
||||
#define ICON_VS_EYE "\xee\xa9\xb0" // U+ea70
|
||||
#define ICON_VS_EYE_UNWATCH "\xee\xa9\xb0" // U+ea70
|
||||
#define ICON_VS_EYE_WATCH "\xee\xa9\xb0" // U+ea70
|
||||
#define ICON_VS_CIRCLE_FILLED "\xee\xa9\xb1" // U+ea71
|
||||
#define ICON_VS_PRIMITIVE_DOT "\xee\xa9\xb1" // U+ea71
|
||||
#define ICON_VS_CLOSE_DIRTY "\xee\xa9\xb1" // U+ea71
|
||||
#define ICON_VS_DEBUG_BREAKPOINT "\xee\xa9\xb1" // U+ea71
|
||||
#define ICON_VS_DEBUG_BREAKPOINT_DISABLED "\xee\xa9\xb1" // U+ea71
|
||||
#define ICON_VS_DEBUG_HINT "\xee\xa9\xb1" // U+ea71
|
||||
#define ICON_VS_PRIMITIVE_SQUARE "\xee\xa9\xb2" // U+ea72
|
||||
#define ICON_VS_EDIT "\xee\xa9\xb3" // U+ea73
|
||||
#define ICON_VS_PENCIL "\xee\xa9\xb3" // U+ea73
|
||||
#define ICON_VS_INFO "\xee\xa9\xb4" // U+ea74
|
||||
#define ICON_VS_ISSUE_OPENED "\xee\xa9\xb4" // U+ea74
|
||||
#define ICON_VS_GIST_PRIVATE "\xee\xa9\xb5" // U+ea75
|
||||
#define ICON_VS_GIT_FORK_PRIVATE "\xee\xa9\xb5" // U+ea75
|
||||
#define ICON_VS_LOCK "\xee\xa9\xb5" // U+ea75
|
||||
#define ICON_VS_MIRROR_PRIVATE "\xee\xa9\xb5" // U+ea75
|
||||
#define ICON_VS_CLOSE "\xee\xa9\xb6" // U+ea76
|
||||
#define ICON_VS_REMOVE_CLOSE "\xee\xa9\xb6" // U+ea76
|
||||
#define ICON_VS_X "\xee\xa9\xb6" // U+ea76
|
||||
#define ICON_VS_REPO_SYNC "\xee\xa9\xb7" // U+ea77
|
||||
#define ICON_VS_SYNC "\xee\xa9\xb7" // U+ea77
|
||||
#define ICON_VS_CLONE "\xee\xa9\xb8" // U+ea78
|
||||
#define ICON_VS_DESKTOP_DOWNLOAD "\xee\xa9\xb8" // U+ea78
|
||||
#define ICON_VS_BEAKER "\xee\xa9\xb9" // U+ea79
|
||||
#define ICON_VS_MICROSCOPE "\xee\xa9\xb9" // U+ea79
|
||||
#define ICON_VS_VM "\xee\xa9\xba" // U+ea7a
|
||||
#define ICON_VS_DEVICE_DESKTOP "\xee\xa9\xba" // U+ea7a
|
||||
#define ICON_VS_FILE "\xee\xa9\xbb" // U+ea7b
|
||||
#define ICON_VS_FILE_TEXT "\xee\xa9\xbb" // U+ea7b
|
||||
#define ICON_VS_MORE "\xee\xa9\xbc" // U+ea7c
|
||||
#define ICON_VS_ELLIPSIS "\xee\xa9\xbc" // U+ea7c
|
||||
#define ICON_VS_KEBAB_HORIZONTAL "\xee\xa9\xbc" // U+ea7c
|
||||
#define ICON_VS_MAIL_REPLY "\xee\xa9\xbd" // U+ea7d
|
||||
#define ICON_VS_REPLY "\xee\xa9\xbd" // U+ea7d
|
||||
#define ICON_VS_ORGANIZATION "\xee\xa9\xbe" // U+ea7e
|
||||
#define ICON_VS_ORGANIZATION_FILLED "\xee\xa9\xbe" // U+ea7e
|
||||
#define ICON_VS_ORGANIZATION_OUTLINE "\xee\xa9\xbe" // U+ea7e
|
||||
#define ICON_VS_NEW_FILE "\xee\xa9\xbf" // U+ea7f
|
||||
#define ICON_VS_FILE_ADD "\xee\xa9\xbf" // U+ea7f
|
||||
#define ICON_VS_NEW_FOLDER "\xee\xaa\x80" // U+ea80
|
||||
#define ICON_VS_FILE_DIRECTORY_CREATE "\xee\xaa\x80" // U+ea80
|
||||
#define ICON_VS_TRASH "\xee\xaa\x81" // U+ea81
|
||||
#define ICON_VS_TRASHCAN "\xee\xaa\x81" // U+ea81
|
||||
#define ICON_VS_HISTORY "\xee\xaa\x82" // U+ea82
|
||||
#define ICON_VS_CLOCK "\xee\xaa\x82" // U+ea82
|
||||
#define ICON_VS_FOLDER "\xee\xaa\x83" // U+ea83
|
||||
#define ICON_VS_FILE_DIRECTORY "\xee\xaa\x83" // U+ea83
|
||||
#define ICON_VS_SYMBOL_FOLDER "\xee\xaa\x83" // U+ea83
|
||||
#define ICON_VS_LOGO_GITHUB "\xee\xaa\x84" // U+ea84
|
||||
#define ICON_VS_MARK_GITHUB "\xee\xaa\x84" // U+ea84
|
||||
#define ICON_VS_GITHUB "\xee\xaa\x84" // U+ea84
|
||||
#define ICON_VS_TERMINAL "\xee\xaa\x85" // U+ea85
|
||||
#define ICON_VS_CONSOLE "\xee\xaa\x85" // U+ea85
|
||||
#define ICON_VS_REPL "\xee\xaa\x85" // U+ea85
|
||||
#define ICON_VS_ZAP "\xee\xaa\x86" // U+ea86
|
||||
#define ICON_VS_SYMBOL_EVENT "\xee\xaa\x86" // U+ea86
|
||||
#define ICON_VS_ERROR "\xee\xaa\x87" // U+ea87
|
||||
#define ICON_VS_STOP "\xee\xaa\x87" // U+ea87
|
||||
#define ICON_VS_VARIABLE "\xee\xaa\x88" // U+ea88
|
||||
#define ICON_VS_SYMBOL_VARIABLE "\xee\xaa\x88" // U+ea88
|
||||
#define ICON_VS_ARRAY "\xee\xaa\x8a" // U+ea8a
|
||||
#define ICON_VS_SYMBOL_ARRAY "\xee\xaa\x8a" // U+ea8a
|
||||
#define ICON_VS_SYMBOL_MODULE "\xee\xaa\x8b" // U+ea8b
|
||||
#define ICON_VS_SYMBOL_PACKAGE "\xee\xaa\x8b" // U+ea8b
|
||||
#define ICON_VS_SYMBOL_NAMESPACE "\xee\xaa\x8b" // U+ea8b
|
||||
#define ICON_VS_SYMBOL_OBJECT "\xee\xaa\x8b" // U+ea8b
|
||||
#define ICON_VS_SYMBOL_METHOD "\xee\xaa\x8c" // U+ea8c
|
||||
#define ICON_VS_SYMBOL_FUNCTION "\xee\xaa\x8c" // U+ea8c
|
||||
#define ICON_VS_SYMBOL_CONSTRUCTOR "\xee\xaa\x8c" // U+ea8c
|
||||
#define ICON_VS_SYMBOL_BOOLEAN "\xee\xaa\x8f" // U+ea8f
|
||||
#define ICON_VS_SYMBOL_NULL "\xee\xaa\x8f" // U+ea8f
|
||||
#define ICON_VS_SYMBOL_NUMERIC "\xee\xaa\x90" // U+ea90
|
||||
#define ICON_VS_SYMBOL_NUMBER "\xee\xaa\x90" // U+ea90
|
||||
#define ICON_VS_SYMBOL_STRUCTURE "\xee\xaa\x91" // U+ea91
|
||||
#define ICON_VS_SYMBOL_STRUCT "\xee\xaa\x91" // U+ea91
|
||||
#define ICON_VS_SYMBOL_PARAMETER "\xee\xaa\x92" // U+ea92
|
||||
#define ICON_VS_SYMBOL_TYPE_PARAMETER "\xee\xaa\x92" // U+ea92
|
||||
#define ICON_VS_SYMBOL_KEY "\xee\xaa\x93" // U+ea93
|
||||
#define ICON_VS_SYMBOL_TEXT "\xee\xaa\x93" // U+ea93
|
||||
#define ICON_VS_SYMBOL_REFERENCE "\xee\xaa\x94" // U+ea94
|
||||
#define ICON_VS_GO_TO_FILE "\xee\xaa\x94" // U+ea94
|
||||
#define ICON_VS_SYMBOL_ENUM "\xee\xaa\x95" // U+ea95
|
||||
#define ICON_VS_SYMBOL_VALUE "\xee\xaa\x95" // U+ea95
|
||||
#define ICON_VS_SYMBOL_RULER "\xee\xaa\x96" // U+ea96
|
||||
#define ICON_VS_SYMBOL_UNIT "\xee\xaa\x96" // U+ea96
|
||||
#define ICON_VS_ACTIVATE_BREAKPOINTS "\xee\xaa\x97" // U+ea97
|
||||
#define ICON_VS_ARCHIVE "\xee\xaa\x98" // U+ea98
|
||||
#define ICON_VS_ARROW_BOTH "\xee\xaa\x99" // U+ea99
|
||||
#define ICON_VS_ARROW_DOWN "\xee\xaa\x9a" // U+ea9a
|
||||
#define ICON_VS_ARROW_LEFT "\xee\xaa\x9b" // U+ea9b
|
||||
#define ICON_VS_ARROW_RIGHT "\xee\xaa\x9c" // U+ea9c
|
||||
#define ICON_VS_ARROW_SMALL_DOWN "\xee\xaa\x9d" // U+ea9d
|
||||
#define ICON_VS_ARROW_SMALL_LEFT "\xee\xaa\x9e" // U+ea9e
|
||||
#define ICON_VS_ARROW_SMALL_RIGHT "\xee\xaa\x9f" // U+ea9f
|
||||
#define ICON_VS_ARROW_SMALL_UP "\xee\xaa\xa0" // U+eaa0
|
||||
#define ICON_VS_ARROW_UP "\xee\xaa\xa1" // U+eaa1
|
||||
#define ICON_VS_BELL "\xee\xaa\xa2" // U+eaa2
|
||||
#define ICON_VS_BOLD "\xee\xaa\xa3" // U+eaa3
|
||||
#define ICON_VS_BOOK "\xee\xaa\xa4" // U+eaa4
|
||||
#define ICON_VS_BOOKMARK "\xee\xaa\xa5" // U+eaa5
|
||||
#define ICON_VS_DEBUG_BREAKPOINT_CONDITIONAL_UNVERIFIED "\xee\xaa\xa6" // U+eaa6
|
||||
#define ICON_VS_DEBUG_BREAKPOINT_CONDITIONAL "\xee\xaa\xa7" // U+eaa7
|
||||
#define ICON_VS_DEBUG_BREAKPOINT_CONDITIONAL_DISABLED "\xee\xaa\xa7" // U+eaa7
|
||||
#define ICON_VS_DEBUG_BREAKPOINT_DATA_UNVERIFIED "\xee\xaa\xa8" // U+eaa8
|
||||
#define ICON_VS_DEBUG_BREAKPOINT_DATA "\xee\xaa\xa9" // U+eaa9
|
||||
#define ICON_VS_DEBUG_BREAKPOINT_DATA_DISABLED "\xee\xaa\xa9" // U+eaa9
|
||||
#define ICON_VS_DEBUG_BREAKPOINT_LOG_UNVERIFIED "\xee\xaa\xaa" // U+eaaa
|
||||
#define ICON_VS_DEBUG_BREAKPOINT_LOG "\xee\xaa\xab" // U+eaab
|
||||
#define ICON_VS_DEBUG_BREAKPOINT_LOG_DISABLED "\xee\xaa\xab" // U+eaab
|
||||
#define ICON_VS_BRIEFCASE "\xee\xaa\xac" // U+eaac
|
||||
#define ICON_VS_BROADCAST "\xee\xaa\xad" // U+eaad
|
||||
#define ICON_VS_BROWSER "\xee\xaa\xae" // U+eaae
|
||||
#define ICON_VS_BUG "\xee\xaa\xaf" // U+eaaf
|
||||
#define ICON_VS_CALENDAR "\xee\xaa\xb0" // U+eab0
|
||||
#define ICON_VS_CASE_SENSITIVE "\xee\xaa\xb1" // U+eab1
|
||||
#define ICON_VS_CHECK "\xee\xaa\xb2" // U+eab2
|
||||
#define ICON_VS_CHECKLIST "\xee\xaa\xb3" // U+eab3
|
||||
#define ICON_VS_CHEVRON_DOWN "\xee\xaa\xb4" // U+eab4
|
||||
#define ICON_VS_CHEVRON_LEFT "\xee\xaa\xb5" // U+eab5
|
||||
#define ICON_VS_CHEVRON_RIGHT "\xee\xaa\xb6" // U+eab6
|
||||
#define ICON_VS_CHEVRON_UP "\xee\xaa\xb7" // U+eab7
|
||||
#define ICON_VS_CHROME_CLOSE "\xee\xaa\xb8" // U+eab8
|
||||
#define ICON_VS_CHROME_MAXIMIZE "\xee\xaa\xb9" // U+eab9
|
||||
#define ICON_VS_CHROME_MINIMIZE "\xee\xaa\xba" // U+eaba
|
||||
#define ICON_VS_CHROME_RESTORE "\xee\xaa\xbb" // U+eabb
|
||||
#define ICON_VS_CIRCLE_OUTLINE "\xee\xaa\xbc" // U+eabc
|
||||
#define ICON_VS_DEBUG_BREAKPOINT_UNVERIFIED "\xee\xaa\xbc" // U+eabc
|
||||
#define ICON_VS_CIRCLE_SLASH "\xee\xaa\xbd" // U+eabd
|
||||
#define ICON_VS_CIRCUIT_BOARD "\xee\xaa\xbe" // U+eabe
|
||||
#define ICON_VS_CLEAR_ALL "\xee\xaa\xbf" // U+eabf
|
||||
#define ICON_VS_CLIPPY "\xee\xab\x80" // U+eac0
|
||||
#define ICON_VS_CLOSE_ALL "\xee\xab\x81" // U+eac1
|
||||
#define ICON_VS_CLOUD_DOWNLOAD "\xee\xab\x82" // U+eac2
|
||||
#define ICON_VS_CLOUD_UPLOAD "\xee\xab\x83" // U+eac3
|
||||
#define ICON_VS_CODE "\xee\xab\x84" // U+eac4
|
||||
#define ICON_VS_COLLAPSE_ALL "\xee\xab\x85" // U+eac5
|
||||
#define ICON_VS_COLOR_MODE "\xee\xab\x86" // U+eac6
|
||||
#define ICON_VS_COMMENT_DISCUSSION "\xee\xab\x87" // U+eac7
|
||||
#define ICON_VS_CREDIT_CARD "\xee\xab\x89" // U+eac9
|
||||
#define ICON_VS_DASH "\xee\xab\x8c" // U+eacc
|
||||
#define ICON_VS_DASHBOARD "\xee\xab\x8d" // U+eacd
|
||||
#define ICON_VS_DATABASE "\xee\xab\x8e" // U+eace
|
||||
#define ICON_VS_DEBUG_CONTINUE "\xee\xab\x8f" // U+eacf
|
||||
#define ICON_VS_DEBUG_DISCONNECT "\xee\xab\x90" // U+ead0
|
||||
#define ICON_VS_DEBUG_PAUSE "\xee\xab\x91" // U+ead1
|
||||
#define ICON_VS_DEBUG_RESTART "\xee\xab\x92" // U+ead2
|
||||
#define ICON_VS_DEBUG_START "\xee\xab\x93" // U+ead3
|
||||
#define ICON_VS_DEBUG_STEP_INTO "\xee\xab\x94" // U+ead4
|
||||
#define ICON_VS_DEBUG_STEP_OUT "\xee\xab\x95" // U+ead5
|
||||
#define ICON_VS_DEBUG_STEP_OVER "\xee\xab\x96" // U+ead6
|
||||
#define ICON_VS_DEBUG_STOP "\xee\xab\x97" // U+ead7
|
||||
#define ICON_VS_DEBUG "\xee\xab\x98" // U+ead8
|
||||
#define ICON_VS_DEVICE_CAMERA_VIDEO "\xee\xab\x99" // U+ead9
|
||||
#define ICON_VS_DEVICE_CAMERA "\xee\xab\x9a" // U+eada
|
||||
#define ICON_VS_DEVICE_MOBILE "\xee\xab\x9b" // U+eadb
|
||||
#define ICON_VS_DIFF_ADDED "\xee\xab\x9c" // U+eadc
|
||||
#define ICON_VS_DIFF_IGNORED "\xee\xab\x9d" // U+eadd
|
||||
#define ICON_VS_DIFF_MODIFIED "\xee\xab\x9e" // U+eade
|
||||
#define ICON_VS_DIFF_REMOVED "\xee\xab\x9f" // U+eadf
|
||||
#define ICON_VS_DIFF_RENAMED "\xee\xab\xa0" // U+eae0
|
||||
#define ICON_VS_DIFF "\xee\xab\xa1" // U+eae1
|
||||
#define ICON_VS_DISCARD "\xee\xab\xa2" // U+eae2
|
||||
#define ICON_VS_EDITOR_LAYOUT "\xee\xab\xa3" // U+eae3
|
||||
#define ICON_VS_EMPTY_WINDOW "\xee\xab\xa4" // U+eae4
|
||||
#define ICON_VS_EXCLUDE "\xee\xab\xa5" // U+eae5
|
||||
#define ICON_VS_EXTENSIONS "\xee\xab\xa6" // U+eae6
|
||||
#define ICON_VS_EYE_CLOSED "\xee\xab\xa7" // U+eae7
|
||||
#define ICON_VS_FILE_BINARY "\xee\xab\xa8" // U+eae8
|
||||
#define ICON_VS_FILE_CODE "\xee\xab\xa9" // U+eae9
|
||||
#define ICON_VS_FILE_MEDIA "\xee\xab\xaa" // U+eaea
|
||||
#define ICON_VS_FILE_PDF "\xee\xab\xab" // U+eaeb
|
||||
#define ICON_VS_FILE_SUBMODULE "\xee\xab\xac" // U+eaec
|
||||
#define ICON_VS_FILE_SYMLINK_DIRECTORY "\xee\xab\xad" // U+eaed
|
||||
#define ICON_VS_FILE_SYMLINK_FILE "\xee\xab\xae" // U+eaee
|
||||
#define ICON_VS_FILE_ZIP "\xee\xab\xaf" // U+eaef
|
||||
#define ICON_VS_FILES "\xee\xab\xb0" // U+eaf0
|
||||
#define ICON_VS_FILTER "\xee\xab\xb1" // U+eaf1
|
||||
#define ICON_VS_FLAME "\xee\xab\xb2" // U+eaf2
|
||||
#define ICON_VS_FOLD_DOWN "\xee\xab\xb3" // U+eaf3
|
||||
#define ICON_VS_FOLD_UP "\xee\xab\xb4" // U+eaf4
|
||||
#define ICON_VS_FOLD "\xee\xab\xb5" // U+eaf5
|
||||
#define ICON_VS_FOLDER_ACTIVE "\xee\xab\xb6" // U+eaf6
|
||||
#define ICON_VS_FOLDER_OPENED "\xee\xab\xb7" // U+eaf7
|
||||
#define ICON_VS_GEAR "\xee\xab\xb8" // U+eaf8
|
||||
#define ICON_VS_GIFT "\xee\xab\xb9" // U+eaf9
|
||||
#define ICON_VS_GIST_SECRET "\xee\xab\xba" // U+eafa
|
||||
#define ICON_VS_GIST "\xee\xab\xbb" // U+eafb
|
||||
#define ICON_VS_GIT_COMMIT "\xee\xab\xbc" // U+eafc
|
||||
#define ICON_VS_GIT_COMPARE "\xee\xab\xbd" // U+eafd
|
||||
#define ICON_VS_COMPARE_CHANGES "\xee\xab\xbd" // U+eafd
|
||||
#define ICON_VS_GIT_MERGE "\xee\xab\xbe" // U+eafe
|
||||
#define ICON_VS_GITHUB_ACTION "\xee\xab\xbf" // U+eaff
|
||||
#define ICON_VS_GITHUB_ALT "\xee\xac\x80" // U+eb00
|
||||
#define ICON_VS_GLOBE "\xee\xac\x81" // U+eb01
|
||||
#define ICON_VS_GRABBER "\xee\xac\x82" // U+eb02
|
||||
#define ICON_VS_GRAPH "\xee\xac\x83" // U+eb03
|
||||
#define ICON_VS_GRIPPER "\xee\xac\x84" // U+eb04
|
||||
#define ICON_VS_HEART "\xee\xac\x85" // U+eb05
|
||||
#define ICON_VS_HOME "\xee\xac\x86" // U+eb06
|
||||
#define ICON_VS_HORIZONTAL_RULE "\xee\xac\x87" // U+eb07
|
||||
#define ICON_VS_HUBOT "\xee\xac\x88" // U+eb08
|
||||
#define ICON_VS_INBOX "\xee\xac\x89" // U+eb09
|
||||
#define ICON_VS_ISSUE_REOPENED "\xee\xac\x8b" // U+eb0b
|
||||
#define ICON_VS_ISSUES "\xee\xac\x8c" // U+eb0c
|
||||
#define ICON_VS_ITALIC "\xee\xac\x8d" // U+eb0d
|
||||
#define ICON_VS_JERSEY "\xee\xac\x8e" // U+eb0e
|
||||
#define ICON_VS_JSON "\xee\xac\x8f" // U+eb0f
|
||||
#define ICON_VS_KEBAB_VERTICAL "\xee\xac\x90" // U+eb10
|
||||
#define ICON_VS_KEY "\xee\xac\x91" // U+eb11
|
||||
#define ICON_VS_LAW "\xee\xac\x92" // U+eb12
|
||||
#define ICON_VS_LIGHTBULB_AUTOFIX "\xee\xac\x93" // U+eb13
|
||||
#define ICON_VS_LINK_EXTERNAL "\xee\xac\x94" // U+eb14
|
||||
#define ICON_VS_LINK "\xee\xac\x95" // U+eb15
|
||||
#define ICON_VS_LIST_ORDERED "\xee\xac\x96" // U+eb16
|
||||
#define ICON_VS_LIST_UNORDERED "\xee\xac\x97" // U+eb17
|
||||
#define ICON_VS_LIVE_SHARE "\xee\xac\x98" // U+eb18
|
||||
#define ICON_VS_LOADING "\xee\xac\x99" // U+eb19
|
||||
#define ICON_VS_LOCATION "\xee\xac\x9a" // U+eb1a
|
||||
#define ICON_VS_MAIL_READ "\xee\xac\x9b" // U+eb1b
|
||||
#define ICON_VS_MAIL "\xee\xac\x9c" // U+eb1c
|
||||
#define ICON_VS_MARKDOWN "\xee\xac\x9d" // U+eb1d
|
||||
#define ICON_VS_MEGAPHONE "\xee\xac\x9e" // U+eb1e
|
||||
#define ICON_VS_MENTION "\xee\xac\x9f" // U+eb1f
|
||||
#define ICON_VS_MILESTONE "\xee\xac\xa0" // U+eb20
|
||||
#define ICON_VS_MORTAR_BOARD "\xee\xac\xa1" // U+eb21
|
||||
#define ICON_VS_MOVE "\xee\xac\xa2" // U+eb22
|
||||
#define ICON_VS_MULTIPLE_WINDOWS "\xee\xac\xa3" // U+eb23
|
||||
#define ICON_VS_MUTE "\xee\xac\xa4" // U+eb24
|
||||
#define ICON_VS_NO_NEWLINE "\xee\xac\xa5" // U+eb25
|
||||
#define ICON_VS_NOTE "\xee\xac\xa6" // U+eb26
|
||||
#define ICON_VS_OCTOFACE "\xee\xac\xa7" // U+eb27
|
||||
#define ICON_VS_OPEN_PREVIEW "\xee\xac\xa8" // U+eb28
|
||||
#define ICON_VS_PACKAGE "\xee\xac\xa9" // U+eb29
|
||||
#define ICON_VS_PAINTCAN "\xee\xac\xaa" // U+eb2a
|
||||
#define ICON_VS_PIN "\xee\xac\xab" // U+eb2b
|
||||
#define ICON_VS_PLAY "\xee\xac\xac" // U+eb2c
|
||||
#define ICON_VS_RUN "\xee\xac\xac" // U+eb2c
|
||||
#define ICON_VS_PLUG "\xee\xac\xad" // U+eb2d
|
||||
#define ICON_VS_PRESERVE_CASE "\xee\xac\xae" // U+eb2e
|
||||
#define ICON_VS_PREVIEW "\xee\xac\xaf" // U+eb2f
|
||||
#define ICON_VS_PROJECT "\xee\xac\xb0" // U+eb30
|
||||
#define ICON_VS_PULSE "\xee\xac\xb1" // U+eb31
|
||||
#define ICON_VS_QUESTION "\xee\xac\xb2" // U+eb32
|
||||
#define ICON_VS_QUOTE "\xee\xac\xb3" // U+eb33
|
||||
#define ICON_VS_RADIO_TOWER "\xee\xac\xb4" // U+eb34
|
||||
#define ICON_VS_REACTIONS "\xee\xac\xb5" // U+eb35
|
||||
#define ICON_VS_REFERENCES "\xee\xac\xb6" // U+eb36
|
||||
#define ICON_VS_REFRESH "\xee\xac\xb7" // U+eb37
|
||||
#define ICON_VS_REGEX "\xee\xac\xb8" // U+eb38
|
||||
#define ICON_VS_REMOTE_EXPLORER "\xee\xac\xb9" // U+eb39
|
||||
#define ICON_VS_REMOTE "\xee\xac\xba" // U+eb3a
|
||||
#define ICON_VS_REMOVE "\xee\xac\xbb" // U+eb3b
|
||||
#define ICON_VS_REPLACE_ALL "\xee\xac\xbc" // U+eb3c
|
||||
#define ICON_VS_REPLACE "\xee\xac\xbd" // U+eb3d
|
||||
#define ICON_VS_REPO_CLONE "\xee\xac\xbe" // U+eb3e
|
||||
#define ICON_VS_REPO_FORCE_PUSH "\xee\xac\xbf" // U+eb3f
|
||||
#define ICON_VS_REPO_PULL "\xee\xad\x80" // U+eb40
|
||||
#define ICON_VS_REPO_PUSH "\xee\xad\x81" // U+eb41
|
||||
#define ICON_VS_REPORT "\xee\xad\x82" // U+eb42
|
||||
#define ICON_VS_REQUEST_CHANGES "\xee\xad\x83" // U+eb43
|
||||
#define ICON_VS_ROCKET "\xee\xad\x84" // U+eb44
|
||||
#define ICON_VS_ROOT_FOLDER_OPENED "\xee\xad\x85" // U+eb45
|
||||
#define ICON_VS_ROOT_FOLDER "\xee\xad\x86" // U+eb46
|
||||
#define ICON_VS_RSS "\xee\xad\x87" // U+eb47
|
||||
#define ICON_VS_RUBY "\xee\xad\x88" // U+eb48
|
||||
#define ICON_VS_SAVE_ALL "\xee\xad\x89" // U+eb49
|
||||
#define ICON_VS_SAVE_AS "\xee\xad\x8a" // U+eb4a
|
||||
#define ICON_VS_SAVE "\xee\xad\x8b" // U+eb4b
|
||||
#define ICON_VS_SCREEN_FULL "\xee\xad\x8c" // U+eb4c
|
||||
#define ICON_VS_SCREEN_NORMAL "\xee\xad\x8d" // U+eb4d
|
||||
#define ICON_VS_SEARCH_STOP "\xee\xad\x8e" // U+eb4e
|
||||
#define ICON_VS_SERVER "\xee\xad\x90" // U+eb50
|
||||
#define ICON_VS_SETTINGS_GEAR "\xee\xad\x91" // U+eb51
|
||||
#define ICON_VS_SETTINGS "\xee\xad\x92" // U+eb52
|
||||
#define ICON_VS_SHIELD "\xee\xad\x93" // U+eb53
|
||||
#define ICON_VS_SMILEY "\xee\xad\x94" // U+eb54
|
||||
#define ICON_VS_SORT_PRECEDENCE "\xee\xad\x95" // U+eb55
|
||||
#define ICON_VS_SPLIT_HORIZONTAL "\xee\xad\x96" // U+eb56
|
||||
#define ICON_VS_SPLIT_VERTICAL "\xee\xad\x97" // U+eb57
|
||||
#define ICON_VS_SQUIRREL "\xee\xad\x98" // U+eb58
|
||||
#define ICON_VS_STAR_FULL "\xee\xad\x99" // U+eb59
|
||||
#define ICON_VS_STAR_HALF "\xee\xad\x9a" // U+eb5a
|
||||
#define ICON_VS_SYMBOL_CLASS "\xee\xad\x9b" // U+eb5b
|
||||
#define ICON_VS_SYMBOL_COLOR "\xee\xad\x9c" // U+eb5c
|
||||
#define ICON_VS_SYMBOL_CONSTANT "\xee\xad\x9d" // U+eb5d
|
||||
#define ICON_VS_SYMBOL_ENUM_MEMBER "\xee\xad\x9e" // U+eb5e
|
||||
#define ICON_VS_SYMBOL_FIELD "\xee\xad\x9f" // U+eb5f
|
||||
#define ICON_VS_SYMBOL_FILE "\xee\xad\xa0" // U+eb60
|
||||
#define ICON_VS_SYMBOL_INTERFACE "\xee\xad\xa1" // U+eb61
|
||||
#define ICON_VS_SYMBOL_KEYWORD "\xee\xad\xa2" // U+eb62
|
||||
#define ICON_VS_SYMBOL_MISC "\xee\xad\xa3" // U+eb63
|
||||
#define ICON_VS_SYMBOL_OPERATOR "\xee\xad\xa4" // U+eb64
|
||||
#define ICON_VS_SYMBOL_PROPERTY "\xee\xad\xa5" // U+eb65
|
||||
#define ICON_VS_WRENCH "\xee\xad\xa5" // U+eb65
|
||||
#define ICON_VS_WRENCH_SUBACTION "\xee\xad\xa5" // U+eb65
|
||||
#define ICON_VS_SYMBOL_SNIPPET "\xee\xad\xa6" // U+eb66
|
||||
#define ICON_VS_TASKLIST "\xee\xad\xa7" // U+eb67
|
||||
#define ICON_VS_TELESCOPE "\xee\xad\xa8" // U+eb68
|
||||
#define ICON_VS_TEXT_SIZE "\xee\xad\xa9" // U+eb69
|
||||
#define ICON_VS_THREE_BARS "\xee\xad\xaa" // U+eb6a
|
||||
#define ICON_VS_THUMBSDOWN "\xee\xad\xab" // U+eb6b
|
||||
#define ICON_VS_THUMBSUP "\xee\xad\xac" // U+eb6c
|
||||
#define ICON_VS_TOOLS "\xee\xad\xad" // U+eb6d
|
||||
#define ICON_VS_TRIANGLE_DOWN "\xee\xad\xae" // U+eb6e
|
||||
#define ICON_VS_TRIANGLE_LEFT "\xee\xad\xaf" // U+eb6f
|
||||
#define ICON_VS_TRIANGLE_RIGHT "\xee\xad\xb0" // U+eb70
|
||||
#define ICON_VS_TRIANGLE_UP "\xee\xad\xb1" // U+eb71
|
||||
#define ICON_VS_TWITTER "\xee\xad\xb2" // U+eb72
|
||||
#define ICON_VS_UNFOLD "\xee\xad\xb3" // U+eb73
|
||||
#define ICON_VS_UNLOCK "\xee\xad\xb4" // U+eb74
|
||||
#define ICON_VS_UNMUTE "\xee\xad\xb5" // U+eb75
|
||||
#define ICON_VS_UNVERIFIED "\xee\xad\xb6" // U+eb76
|
||||
#define ICON_VS_VERIFIED "\xee\xad\xb7" // U+eb77
|
||||
#define ICON_VS_VERSIONS "\xee\xad\xb8" // U+eb78
|
||||
#define ICON_VS_VM_ACTIVE "\xee\xad\xb9" // U+eb79
|
||||
#define ICON_VS_VM_OUTLINE "\xee\xad\xba" // U+eb7a
|
||||
#define ICON_VS_VM_RUNNING "\xee\xad\xbb" // U+eb7b
|
||||
#define ICON_VS_WATCH "\xee\xad\xbc" // U+eb7c
|
||||
#define ICON_VS_WHITESPACE "\xee\xad\xbd" // U+eb7d
|
||||
#define ICON_VS_WHOLE_WORD "\xee\xad\xbe" // U+eb7e
|
||||
#define ICON_VS_WINDOW "\xee\xad\xbf" // U+eb7f
|
||||
#define ICON_VS_WORD_WRAP "\xee\xae\x80" // U+eb80
|
||||
#define ICON_VS_ZOOM_IN "\xee\xae\x81" // U+eb81
|
||||
#define ICON_VS_ZOOM_OUT "\xee\xae\x82" // U+eb82
|
||||
#define ICON_VS_LIST_FILTER "\xee\xae\x83" // U+eb83
|
||||
#define ICON_VS_LIST_FLAT "\xee\xae\x84" // U+eb84
|
||||
#define ICON_VS_LIST_SELECTION "\xee\xae\x85" // U+eb85
|
||||
#define ICON_VS_SELECTION "\xee\xae\x85" // U+eb85
|
||||
#define ICON_VS_LIST_TREE "\xee\xae\x86" // U+eb86
|
||||
#define ICON_VS_DEBUG_BREAKPOINT_FUNCTION_UNVERIFIED "\xee\xae\x87" // U+eb87
|
||||
#define ICON_VS_DEBUG_BREAKPOINT_FUNCTION "\xee\xae\x88" // U+eb88
|
||||
#define ICON_VS_DEBUG_BREAKPOINT_FUNCTION_DISABLED "\xee\xae\x88" // U+eb88
|
||||
#define ICON_VS_DEBUG_STACKFRAME_ACTIVE "\xee\xae\x89" // U+eb89
|
||||
#define ICON_VS_DEBUG_STACKFRAME_DOT "\xee\xae\x8a" // U+eb8a
|
||||
#define ICON_VS_DEBUG_STACKFRAME "\xee\xae\x8b" // U+eb8b
|
||||
#define ICON_VS_DEBUG_STACKFRAME_FOCUSED "\xee\xae\x8b" // U+eb8b
|
||||
#define ICON_VS_DEBUG_BREAKPOINT_UNSUPPORTED "\xee\xae\x8c" // U+eb8c
|
||||
#define ICON_VS_SYMBOL_STRING "\xee\xae\x8d" // U+eb8d
|
||||
#define ICON_VS_DEBUG_REVERSE_CONTINUE "\xee\xae\x8e" // U+eb8e
|
||||
#define ICON_VS_DEBUG_STEP_BACK "\xee\xae\x8f" // U+eb8f
|
||||
#define ICON_VS_DEBUG_RESTART_FRAME "\xee\xae\x90" // U+eb90
|
||||
#define ICON_VS_DEBUG_ALT "\xee\xae\x91" // U+eb91
|
||||
#define ICON_VS_CALL_INCOMING "\xee\xae\x92" // U+eb92
|
||||
#define ICON_VS_CALL_OUTGOING "\xee\xae\x93" // U+eb93
|
||||
#define ICON_VS_MENU "\xee\xae\x94" // U+eb94
|
||||
#define ICON_VS_EXPAND_ALL "\xee\xae\x95" // U+eb95
|
||||
#define ICON_VS_FEEDBACK "\xee\xae\x96" // U+eb96
|
||||
#define ICON_VS_GROUP_BY_REF_TYPE "\xee\xae\x97" // U+eb97
|
||||
#define ICON_VS_UNGROUP_BY_REF_TYPE "\xee\xae\x98" // U+eb98
|
||||
#define ICON_VS_ACCOUNT "\xee\xae\x99" // U+eb99
|
||||
#define ICON_VS_BELL_DOT "\xee\xae\x9a" // U+eb9a
|
||||
#define ICON_VS_DEBUG_CONSOLE "\xee\xae\x9b" // U+eb9b
|
||||
#define ICON_VS_LIBRARY "\xee\xae\x9c" // U+eb9c
|
||||
#define ICON_VS_OUTPUT "\xee\xae\x9d" // U+eb9d
|
||||
#define ICON_VS_RUN_ALL "\xee\xae\x9e" // U+eb9e
|
||||
#define ICON_VS_SYNC_IGNORED "\xee\xae\x9f" // U+eb9f
|
||||
#define ICON_VS_PINNED "\xee\xae\xa0" // U+eba0
|
||||
#define ICON_VS_GITHUB_INVERTED "\xee\xae\xa1" // U+eba1
|
||||
#define ICON_VS_SERVER_PROCESS "\xee\xae\xa2" // U+eba2
|
||||
#define ICON_VS_SERVER_ENVIRONMENT "\xee\xae\xa3" // U+eba3
|
||||
#define ICON_VS_PASS "\xee\xae\xa4" // U+eba4
|
||||
#define ICON_VS_ISSUE_CLOSED "\xee\xae\xa4" // U+eba4
|
||||
#define ICON_VS_STOP_CIRCLE "\xee\xae\xa5" // U+eba5
|
||||
#define ICON_VS_PLAY_CIRCLE "\xee\xae\xa6" // U+eba6
|
||||
#define ICON_VS_RECORD "\xee\xae\xa7" // U+eba7
|
||||
#define ICON_VS_DEBUG_ALT_SMALL "\xee\xae\xa8" // U+eba8
|
||||
#define ICON_VS_VM_CONNECT "\xee\xae\xa9" // U+eba9
|
||||
#define ICON_VS_CLOUD "\xee\xae\xaa" // U+ebaa
|
||||
#define ICON_VS_MERGE "\xee\xae\xab" // U+ebab
|
||||
#define ICON_VS_EXPORT "\xee\xae\xac" // U+ebac
|
||||
#define ICON_VS_GRAPH_LEFT "\xee\xae\xad" // U+ebad
|
||||
#define ICON_VS_MAGNET "\xee\xae\xae" // U+ebae
|
||||
#define ICON_VS_NOTEBOOK "\xee\xae\xaf" // U+ebaf
|
||||
#define ICON_VS_REDO "\xee\xae\xb0" // U+ebb0
|
||||
#define ICON_VS_CHECK_ALL "\xee\xae\xb1" // U+ebb1
|
||||
#define ICON_VS_PINNED_DIRTY "\xee\xae\xb2" // U+ebb2
|
||||
#define ICON_VS_PASS_FILLED "\xee\xae\xb3" // U+ebb3
|
||||
#define ICON_VS_CIRCLE_LARGE_FILLED "\xee\xae\xb4" // U+ebb4
|
||||
#define ICON_VS_CIRCLE_LARGE_OUTLINE "\xee\xae\xb5" // U+ebb5
|
||||
#define ICON_VS_COMBINE "\xee\xae\xb6" // U+ebb6
|
||||
#define ICON_VS_GATHER "\xee\xae\xb6" // U+ebb6
|
||||
#define ICON_VS_TABLE "\xee\xae\xb7" // U+ebb7
|
||||
#define ICON_VS_VARIABLE_GROUP "\xee\xae\xb8" // U+ebb8
|
||||
#define ICON_VS_TYPE_HIERARCHY "\xee\xae\xb9" // U+ebb9
|
||||
#define ICON_VS_TYPE_HIERARCHY_SUB "\xee\xae\xba" // U+ebba
|
||||
#define ICON_VS_TYPE_HIERARCHY_SUPER "\xee\xae\xbb" // U+ebbb
|
||||
#define ICON_VS_GIT_PULL_REQUEST_CREATE "\xee\xae\xbc" // U+ebbc
|
||||
#define ICON_VS_RUN_ABOVE "\xee\xae\xbd" // U+ebbd
|
||||
#define ICON_VS_RUN_BELOW "\xee\xae\xbe" // U+ebbe
|
||||
#define ICON_VS_NOTEBOOK_TEMPLATE "\xee\xae\xbf" // U+ebbf
|
||||
#define ICON_VS_DEBUG_RERUN "\xee\xaf\x80" // U+ebc0
|
||||
#define ICON_VS_WORKSPACE_TRUSTED "\xee\xaf\x81" // U+ebc1
|
||||
#define ICON_VS_WORKSPACE_UNTRUSTED "\xee\xaf\x82" // U+ebc2
|
||||
#define ICON_VS_WORKSPACE_UNKNOWN "\xee\xaf\x83" // U+ebc3
|
||||
#define ICON_VS_TERMINAL_CMD "\xee\xaf\x84" // U+ebc4
|
||||
#define ICON_VS_TERMINAL_DEBIAN "\xee\xaf\x85" // U+ebc5
|
||||
#define ICON_VS_TERMINAL_LINUX "\xee\xaf\x86" // U+ebc6
|
||||
#define ICON_VS_TERMINAL_POWERSHELL "\xee\xaf\x87" // U+ebc7
|
||||
#define ICON_VS_TERMINAL_TMUX "\xee\xaf\x88" // U+ebc8
|
||||
#define ICON_VS_TERMINAL_UBUNTU "\xee\xaf\x89" // U+ebc9
|
||||
#define ICON_VS_TERMINAL_BASH "\xee\xaf\x8a" // U+ebca
|
||||
#define ICON_VS_ARROW_SWAP "\xee\xaf\x8b" // U+ebcb
|
||||
#define ICON_VS_COPY "\xee\xaf\x8c" // U+ebcc
|
||||
#define ICON_VS_PERSON_ADD "\xee\xaf\x8d" // U+ebcd
|
||||
#define ICON_VS_FILTER_FILLED "\xee\xaf\x8e" // U+ebce
|
||||
#define ICON_VS_WAND "\xee\xaf\x8f" // U+ebcf
|
||||
#define ICON_VS_DEBUG_LINE_BY_LINE "\xee\xaf\x90" // U+ebd0
|
||||
#define ICON_VS_INSPECT "\xee\xaf\x91" // U+ebd1
|
||||
#define ICON_VS_LAYERS "\xee\xaf\x92" // U+ebd2
|
||||
#define ICON_VS_LAYERS_DOT "\xee\xaf\x93" // U+ebd3
|
||||
#define ICON_VS_LAYERS_ACTIVE "\xee\xaf\x94" // U+ebd4
|
||||
#define ICON_VS_COMPASS "\xee\xaf\x95" // U+ebd5
|
||||
#define ICON_VS_COMPASS_DOT "\xee\xaf\x96" // U+ebd6
|
||||
#define ICON_VS_COMPASS_ACTIVE "\xee\xaf\x97" // U+ebd7
|
||||
#define ICON_VS_AZURE "\xee\xaf\x98" // U+ebd8
|
||||
#define ICON_VS_ISSUE_DRAFT "\xee\xaf\x99" // U+ebd9
|
||||
#define ICON_VS_GIT_PULL_REQUEST_CLOSED "\xee\xaf\x9a" // U+ebda
|
||||
#define ICON_VS_GIT_PULL_REQUEST_DRAFT "\xee\xaf\x9b" // U+ebdb
|
||||
#define ICON_VS_DEBUG_ALL "\xee\xaf\x9c" // U+ebdc
|
||||
#define ICON_VS_DEBUG_COVERAGE "\xee\xaf\x9d" // U+ebdd
|
||||
1015
lib/external/imgui/include/fonts/fontawesome_font.h
vendored
1015
lib/external/imgui/include/fonts/fontawesome_font.h
vendored
File diff suppressed because it is too large
Load Diff
@@ -1,6 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#define FONT_ICON_FILE_NAME_UNIFONT "unifont.ttf"
|
||||
|
||||
extern const unsigned int unifont_compressed_size;
|
||||
extern const unsigned int unifont_compressed_data[52184/4];
|
||||
9
lib/external/imgui/include/imgui_config.h
vendored
9
lib/external/imgui/include/imgui_config.h
vendored
@@ -1,9 +0,0 @@
|
||||
// ImGui config (check imconfig.h for more information about these definitions)
|
||||
#pragma once
|
||||
|
||||
#define IMGUI_DEFINE_MATH_OPERATORS
|
||||
#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS
|
||||
#define IMGUI_DISABLE_OBSOLETE_KEYIO
|
||||
#define IMGUI_ENABLE_FREETYPE
|
||||
#define ImDrawIdx unsigned int
|
||||
#define IMGUI_DEBUG_TOOL_ITEM_PICKER_EX
|
||||
@@ -1,799 +0,0 @@
|
||||
// dear imgui: FreeType font builder (used as a replacement for the stb_truetype builder)
|
||||
// (code)
|
||||
|
||||
// Get the latest version at https://github.com/ocornut/imgui/tree/master/misc/freetype
|
||||
// Original code by @vuhdo (Aleksei Skriabin). Improvements by @mikesart. Maintained since 2019 by @ocornut.
|
||||
|
||||
// CHANGELOG
|
||||
// (minor and older changes stripped away, please see git history for details)
|
||||
// 2023/01/04: fixed a packing issue which in some occurrences would prevent large amount of glyphs from being packed correctly.
|
||||
// 2021/08/23: fixed crash when FT_Render_Glyph() fails to render a glyph and returns NULL.
|
||||
// 2021/03/05: added ImGuiFreeTypeBuilderFlags_Bitmap to load bitmap glyphs.
|
||||
// 2021/03/02: set 'atlas->TexPixelsUseColors = true' to help some backends with deciding of a prefered texture format.
|
||||
// 2021/01/28: added support for color-layered glyphs via ImGuiFreeTypeBuilderFlags_LoadColor (require Freetype 2.10+).
|
||||
// 2021/01/26: simplified integration by using '#define IMGUI_ENABLE_FREETYPE'.
|
||||
// renamed ImGuiFreeType::XXX flags to ImGuiFreeTypeBuilderFlags_XXX for consistency with other API. removed ImGuiFreeType::BuildFontAtlas().
|
||||
// 2020/06/04: fix for rare case where FT_Get_Char_Index() succeed but FT_Load_Glyph() fails.
|
||||
// 2019/02/09: added RasterizerFlags::Monochrome flag to disable font anti-aliasing (combine with ::MonoHinting for best results!)
|
||||
// 2019/01/15: added support for imgui allocators + added FreeType only override function SetAllocatorFunctions().
|
||||
// 2019/01/10: re-factored to match big update in STB builder. fixed texture height waste. fixed redundant glyphs when merging. support for glyph padding.
|
||||
// 2018/06/08: added support for ImFontConfig::GlyphMinAdvanceX, GlyphMaxAdvanceX.
|
||||
// 2018/02/04: moved to main imgui repository (away from http://www.github.com/ocornut/imgui_club)
|
||||
// 2018/01/22: fix for addition of ImFontAtlas::TexUvscale member.
|
||||
// 2017/10/22: minor inconsequential change to match change in master (removed an unnecessary statement).
|
||||
// 2017/09/26: fixes for imgui internal changes.
|
||||
// 2017/08/26: cleanup, optimizations, support for ImFontConfig::RasterizerFlags, ImFontConfig::RasterizerMultiply.
|
||||
// 2017/08/16: imported from https://github.com/Vuhdo/imgui_freetype into http://www.github.com/ocornut/imgui_club, updated for latest changes in ImFontAtlas, minor tweaks.
|
||||
|
||||
// About Gamma Correct Blending:
|
||||
// - FreeType assumes blending in linear space rather than gamma space.
|
||||
// - See https://www.freetype.org/freetype2/docs/reference/ft2-base_interface.html#FT_Render_Glyph
|
||||
// - For correct results you need to be using sRGB and convert to linear space in the pixel shader output.
|
||||
// - The default dear imgui styles will be impacted by this change (alpha values will need tweaking).
|
||||
|
||||
// FIXME: cfg.OversampleH, OversampleV are not supported (but perhaps not so necessary with this rasterizer).
|
||||
|
||||
#include "imgui_freetype.h"
|
||||
#include "imgui_internal.h" // ImMin,ImMax,ImFontAtlasBuild*,
|
||||
#include <stdint.h>
|
||||
#include <ft2build.h>
|
||||
#include FT_FREETYPE_H // <freetype/freetype.h>
|
||||
#include FT_MODULE_H // <freetype/ftmodapi.h>
|
||||
#include FT_GLYPH_H // <freetype/ftglyph.h>
|
||||
#include FT_SYNTHESIS_H // <freetype/ftsynth.h>
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning (push)
|
||||
#pragma warning (disable: 4505) // unreferenced local function has been removed (stb stuff)
|
||||
#pragma warning (disable: 26812) // [Static Analyzer] The enum type 'xxx' is unscoped. Prefer 'enum class' over 'enum' (Enum.3).
|
||||
#endif
|
||||
|
||||
#ifdef __GNUC__
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind
|
||||
#pragma GCC diagnostic ignored "-Wunused-function" // warning: 'xxxx' defined but not used
|
||||
#pragma GCC diagnostic ignored "-Wsubobject-linkage" // warning: 'xxxx' has a field 'xxxx' whose type uses the anonymous namespace
|
||||
#endif
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
// Data
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
// Default memory allocators
|
||||
static void* ImGuiFreeTypeDefaultAllocFunc(size_t size, void* user_data) { IM_UNUSED(user_data); return IM_ALLOC(size); }
|
||||
static void ImGuiFreeTypeDefaultFreeFunc(void* ptr, void* user_data) { IM_UNUSED(user_data); IM_FREE(ptr); }
|
||||
|
||||
// Current memory allocators
|
||||
static void* (*GImGuiFreeTypeAllocFunc)(size_t size, void* user_data) = ImGuiFreeTypeDefaultAllocFunc;
|
||||
static void (*GImGuiFreeTypeFreeFunc)(void* ptr, void* user_data) = ImGuiFreeTypeDefaultFreeFunc;
|
||||
static void* GImGuiFreeTypeAllocatorUserData = nullptr;
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
// Code
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
namespace
|
||||
{
|
||||
// Glyph metrics:
|
||||
// --------------
|
||||
//
|
||||
// xmin xmax
|
||||
// | |
|
||||
// |<-------- width -------->|
|
||||
// | |
|
||||
// | +-------------------------+----------------- ymax
|
||||
// | | ggggggggg ggggg | ^ ^
|
||||
// | | g:::::::::ggg::::g | | |
|
||||
// | | g:::::::::::::::::g | | |
|
||||
// | | g::::::ggggg::::::gg | | |
|
||||
// | | g:::::g g:::::g | | |
|
||||
// offsetX -|-------->| g:::::g g:::::g | offsetY |
|
||||
// | | g:::::g g:::::g | | |
|
||||
// | | g::::::g g:::::g | | |
|
||||
// | | g:::::::ggggg:::::g | | |
|
||||
// | | g::::::::::::::::g | | height
|
||||
// | | gg::::::::::::::g | | |
|
||||
// baseline ---*---------|---- gggggggg::::::g-----*-------- |
|
||||
// / | | g:::::g | |
|
||||
// origin | | gggggg g:::::g | |
|
||||
// | | g:::::gg gg:::::g | |
|
||||
// | | g::::::ggg:::::::g | |
|
||||
// | | gg:::::::::::::g | |
|
||||
// | | ggg::::::ggg | |
|
||||
// | | gggggg | v
|
||||
// | +-------------------------+----------------- ymin
|
||||
// | |
|
||||
// |------------- advanceX ----------->|
|
||||
|
||||
// A structure that describe a glyph.
|
||||
struct GlyphInfo
|
||||
{
|
||||
int Width; // Glyph's width in pixels.
|
||||
int Height; // Glyph's height in pixels.
|
||||
FT_Int OffsetX; // The distance from the origin ("pen position") to the left of the glyph.
|
||||
FT_Int OffsetY; // The distance from the origin to the top of the glyph. This is usually a value < 0.
|
||||
float AdvanceX; // The distance from the origin to the origin of the next glyph. This is usually a value > 0.
|
||||
bool IsColored; // The glyph is colored
|
||||
};
|
||||
|
||||
// Font parameters and metrics.
|
||||
struct FontInfo
|
||||
{
|
||||
uint32_t PixelHeight; // Size this font was generated with.
|
||||
float Ascender; // The pixel extents above the baseline in pixels (typically positive).
|
||||
float Descender; // The extents below the baseline in pixels (typically negative).
|
||||
float LineSpacing; // The baseline-to-baseline distance. Note that it usually is larger than the sum of the ascender and descender taken as absolute values. There is also no guarantee that no glyphs extend above or below subsequent baselines when using this distance. Think of it as a value the designer of the font finds appropriate.
|
||||
float LineGap; // The spacing in pixels between one row's descent and the next row's ascent.
|
||||
float MaxAdvanceWidth; // This field gives the maximum horizontal cursor advance for all glyphs in the font.
|
||||
};
|
||||
|
||||
// FreeType glyph rasterizer.
|
||||
// NB: No ctor/dtor, explicitly call Init()/Shutdown()
|
||||
struct FreeTypeFont
|
||||
{
|
||||
bool InitFont(FT_Library ft_library, const ImFontConfig& cfg, unsigned int extra_user_flags); // Initialize from an external data buffer. Doesn't copy data, and you must ensure it stays valid up to this object lifetime.
|
||||
void CloseFont();
|
||||
void SetPixelHeight(int pixel_height); // Change font pixel size. All following calls to RasterizeGlyph() will use this size
|
||||
const FT_Glyph_Metrics* LoadGlyph(uint32_t in_codepoint);
|
||||
const FT_Bitmap* RenderGlyphAndGetInfo(GlyphInfo* out_glyph_info);
|
||||
void BlitGlyph(const FT_Bitmap* ft_bitmap, uint32_t* dst, uint32_t dst_pitch, unsigned char* multiply_table = nullptr);
|
||||
~FreeTypeFont() { CloseFont(); }
|
||||
|
||||
// [Internals]
|
||||
FontInfo Info; // Font descriptor of the current font.
|
||||
FT_Face Face;
|
||||
unsigned int UserFlags; // = ImFontConfig::RasterizerFlags
|
||||
FT_Int32 LoadFlags;
|
||||
FT_Render_Mode RenderMode;
|
||||
};
|
||||
|
||||
// From SDL_ttf: Handy routines for converting from fixed point
|
||||
#define FT_CEIL(X) (((X + 63) & -64) / 64)
|
||||
|
||||
bool FreeTypeFont::InitFont(FT_Library ft_library, const ImFontConfig& cfg, unsigned int extra_font_builder_flags)
|
||||
{
|
||||
FT_Error error = FT_New_Memory_Face(ft_library, (uint8_t*)cfg.FontData, (uint32_t)cfg.FontDataSize, (uint32_t)cfg.FontNo, &Face);
|
||||
if (error != 0)
|
||||
return false;
|
||||
error = FT_Select_Charmap(Face, FT_ENCODING_UNICODE);
|
||||
if (error != 0)
|
||||
return false;
|
||||
|
||||
// Convert to FreeType flags (NB: Bold and Oblique are processed separately)
|
||||
UserFlags = cfg.FontBuilderFlags | extra_font_builder_flags;
|
||||
|
||||
LoadFlags = 0;
|
||||
if ((UserFlags & ImGuiFreeTypeBuilderFlags_Bitmap) == 0)
|
||||
LoadFlags |= FT_LOAD_NO_BITMAP;
|
||||
|
||||
if (UserFlags & ImGuiFreeTypeBuilderFlags_NoHinting)
|
||||
LoadFlags |= FT_LOAD_NO_HINTING;
|
||||
if (UserFlags & ImGuiFreeTypeBuilderFlags_NoAutoHint)
|
||||
LoadFlags |= FT_LOAD_NO_AUTOHINT;
|
||||
if (UserFlags & ImGuiFreeTypeBuilderFlags_ForceAutoHint)
|
||||
LoadFlags |= FT_LOAD_FORCE_AUTOHINT;
|
||||
if (UserFlags & ImGuiFreeTypeBuilderFlags_LightHinting)
|
||||
LoadFlags |= FT_LOAD_TARGET_LIGHT;
|
||||
else if (UserFlags & ImGuiFreeTypeBuilderFlags_MonoHinting)
|
||||
LoadFlags |= FT_LOAD_TARGET_MONO;
|
||||
else
|
||||
LoadFlags |= FT_LOAD_TARGET_NORMAL;
|
||||
|
||||
if (UserFlags & ImGuiFreeTypeBuilderFlags_Monochrome)
|
||||
RenderMode = FT_RENDER_MODE_MONO;
|
||||
else
|
||||
RenderMode = FT_RENDER_MODE_NORMAL;
|
||||
|
||||
if (UserFlags & ImGuiFreeTypeBuilderFlags_LoadColor)
|
||||
LoadFlags |= FT_LOAD_COLOR;
|
||||
|
||||
memset(&Info, 0, sizeof(Info));
|
||||
SetPixelHeight((uint32_t)cfg.SizePixels);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void FreeTypeFont::CloseFont()
|
||||
{
|
||||
if (Face)
|
||||
{
|
||||
FT_Done_Face(Face);
|
||||
Face = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
void FreeTypeFont::SetPixelHeight(int pixel_height)
|
||||
{
|
||||
// Vuhdo: I'm not sure how to deal with font sizes properly. As far as I understand, currently ImGui assumes that the 'pixel_height'
|
||||
// is a maximum height of an any given glyph, i.e. it's the sum of font's ascender and descender. Seems strange to me.
|
||||
// NB: FT_Set_Pixel_Sizes() doesn't seem to get us the same result.
|
||||
FT_Size_RequestRec req;
|
||||
req.type = (UserFlags & ImGuiFreeTypeBuilderFlags_Bitmap) ? FT_SIZE_REQUEST_TYPE_NOMINAL : FT_SIZE_REQUEST_TYPE_REAL_DIM;
|
||||
req.width = 0;
|
||||
req.height = (uint32_t)pixel_height * 64;
|
||||
req.horiResolution = 0;
|
||||
req.vertResolution = 0;
|
||||
FT_Request_Size(Face, &req);
|
||||
|
||||
// Update font info
|
||||
FT_Size_Metrics metrics = Face->size->metrics;
|
||||
Info.PixelHeight = (uint32_t)pixel_height;
|
||||
Info.Ascender = (float)FT_CEIL(metrics.ascender);
|
||||
Info.Descender = (float)FT_CEIL(metrics.descender);
|
||||
Info.LineSpacing = (float)FT_CEIL(metrics.height);
|
||||
Info.LineGap = (float)FT_CEIL(metrics.height - metrics.ascender + metrics.descender);
|
||||
Info.MaxAdvanceWidth = (float)FT_CEIL(metrics.max_advance);
|
||||
}
|
||||
|
||||
const FT_Glyph_Metrics* FreeTypeFont::LoadGlyph(uint32_t codepoint)
|
||||
{
|
||||
uint32_t glyph_index = FT_Get_Char_Index(Face, codepoint);
|
||||
if (glyph_index == 0)
|
||||
return nullptr;
|
||||
|
||||
// If this crash for you: FreeType 2.11.0 has a crash bug on some bitmap/colored fonts.
|
||||
// - https://gitlab.freedesktop.org/freetype/freetype/-/issues/1076
|
||||
// - https://github.com/ocornut/imgui/issues/4567
|
||||
// - https://github.com/ocornut/imgui/issues/4566
|
||||
// You can use FreeType 2.10, or the patched version of 2.11.0 in VcPkg, or probably any upcoming FreeType version.
|
||||
FT_Error error = FT_Load_Glyph(Face, glyph_index, LoadFlags);
|
||||
if (error)
|
||||
return nullptr;
|
||||
|
||||
// Need an outline for this to work
|
||||
FT_GlyphSlot slot = Face->glyph;
|
||||
IM_ASSERT(slot->format == FT_GLYPH_FORMAT_OUTLINE || slot->format == FT_GLYPH_FORMAT_BITMAP);
|
||||
|
||||
// Apply convenience transform (this is not picking from real "Bold"/"Italic" fonts! Merely applying FreeType helper transform. Oblique == Slanting)
|
||||
if (UserFlags & ImGuiFreeTypeBuilderFlags_Bold)
|
||||
FT_GlyphSlot_Embolden(slot);
|
||||
if (UserFlags & ImGuiFreeTypeBuilderFlags_Oblique)
|
||||
{
|
||||
FT_GlyphSlot_Oblique(slot);
|
||||
//FT_BBox bbox;
|
||||
//FT_Outline_Get_BBox(&slot->outline, &bbox);
|
||||
//slot->metrics.width = bbox.xMax - bbox.xMin;
|
||||
//slot->metrics.height = bbox.yMax - bbox.yMin;
|
||||
}
|
||||
|
||||
return &slot->metrics;
|
||||
}
|
||||
|
||||
const FT_Bitmap* FreeTypeFont::RenderGlyphAndGetInfo(GlyphInfo* out_glyph_info)
|
||||
{
|
||||
FT_GlyphSlot slot = Face->glyph;
|
||||
FT_Error error = FT_Render_Glyph(slot, RenderMode);
|
||||
if (error != 0)
|
||||
return nullptr;
|
||||
|
||||
FT_Bitmap* ft_bitmap = &Face->glyph->bitmap;
|
||||
out_glyph_info->Width = (int)ft_bitmap->width;
|
||||
out_glyph_info->Height = (int)ft_bitmap->rows;
|
||||
out_glyph_info->OffsetX = Face->glyph->bitmap_left;
|
||||
out_glyph_info->OffsetY = -Face->glyph->bitmap_top;
|
||||
out_glyph_info->AdvanceX = (float)FT_CEIL(slot->advance.x);
|
||||
out_glyph_info->IsColored = (ft_bitmap->pixel_mode == FT_PIXEL_MODE_BGRA);
|
||||
|
||||
return ft_bitmap;
|
||||
}
|
||||
|
||||
void FreeTypeFont::BlitGlyph(const FT_Bitmap* ft_bitmap, uint32_t* dst, uint32_t dst_pitch, unsigned char* multiply_table)
|
||||
{
|
||||
IM_ASSERT(ft_bitmap != nullptr);
|
||||
const uint32_t w = ft_bitmap->width;
|
||||
const uint32_t h = ft_bitmap->rows;
|
||||
const uint8_t* src = ft_bitmap->buffer;
|
||||
const uint32_t src_pitch = ft_bitmap->pitch;
|
||||
|
||||
switch (ft_bitmap->pixel_mode)
|
||||
{
|
||||
case FT_PIXEL_MODE_GRAY: // Grayscale image, 1 byte per pixel.
|
||||
{
|
||||
if (multiply_table == nullptr)
|
||||
{
|
||||
for (uint32_t y = 0; y < h; y++, src += src_pitch, dst += dst_pitch)
|
||||
for (uint32_t x = 0; x < w; x++)
|
||||
dst[x] = IM_COL32(255, 255, 255, src[x]);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (uint32_t y = 0; y < h; y++, src += src_pitch, dst += dst_pitch)
|
||||
for (uint32_t x = 0; x < w; x++)
|
||||
dst[x] = IM_COL32(255, 255, 255, multiply_table[src[x]]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case FT_PIXEL_MODE_MONO: // Monochrome image, 1 bit per pixel. The bits in each byte are ordered from MSB to LSB.
|
||||
{
|
||||
uint8_t color0 = multiply_table ? multiply_table[0] : 0;
|
||||
uint8_t color1 = multiply_table ? multiply_table[255] : 255;
|
||||
for (uint32_t y = 0; y < h; y++, src += src_pitch, dst += dst_pitch)
|
||||
{
|
||||
uint8_t bits = 0;
|
||||
const uint8_t* bits_ptr = src;
|
||||
for (uint32_t x = 0; x < w; x++, bits <<= 1)
|
||||
{
|
||||
if ((x & 7) == 0)
|
||||
bits = *bits_ptr++;
|
||||
dst[x] = IM_COL32(255, 255, 255, (bits & 0x80) ? color1 : color0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case FT_PIXEL_MODE_BGRA:
|
||||
{
|
||||
// FIXME: Converting pre-multiplied alpha to straight. Doesn't smell good.
|
||||
#define DE_MULTIPLY(color, alpha) (ImU32)(255.0f * (float)color / (float)alpha + 0.5f)
|
||||
if (multiply_table == nullptr)
|
||||
{
|
||||
for (uint32_t y = 0; y < h; y++, src += src_pitch, dst += dst_pitch)
|
||||
for (uint32_t x = 0; x < w; x++)
|
||||
{
|
||||
uint8_t r = src[x * 4 + 2], g = src[x * 4 + 1], b = src[x * 4], a = src[x * 4 + 3];
|
||||
dst[x] = IM_COL32(DE_MULTIPLY(r, a), DE_MULTIPLY(g, a), DE_MULTIPLY(b, a), a);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (uint32_t y = 0; y < h; y++, src += src_pitch, dst += dst_pitch)
|
||||
{
|
||||
for (uint32_t x = 0; x < w; x++)
|
||||
{
|
||||
uint8_t r = src[x * 4 + 2], g = src[x * 4 + 1], b = src[x * 4], a = src[x * 4 + 3];
|
||||
dst[x] = IM_COL32(multiply_table[DE_MULTIPLY(r, a)], multiply_table[DE_MULTIPLY(g, a)], multiply_table[DE_MULTIPLY(b, a)], multiply_table[a]);
|
||||
}
|
||||
}
|
||||
}
|
||||
#undef DE_MULTIPLY
|
||||
break;
|
||||
}
|
||||
default:
|
||||
IM_ASSERT(0 && "FreeTypeFont::BlitGlyph(): Unknown bitmap pixel mode!");
|
||||
}
|
||||
}
|
||||
} // namespace
|
||||
|
||||
#ifndef STB_RECT_PACK_IMPLEMENTATION // in case the user already have an implementation in the _same_ compilation unit (e.g. unity builds)
|
||||
#ifndef IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION
|
||||
#define STBRP_ASSERT(x) do { IM_ASSERT(x); } while (0)
|
||||
#define STBRP_STATIC
|
||||
#define STB_RECT_PACK_IMPLEMENTATION
|
||||
#endif
|
||||
#ifdef IMGUI_STB_RECT_PACK_FILENAME
|
||||
#include IMGUI_STB_RECT_PACK_FILENAME
|
||||
#else
|
||||
#include "imstb_rectpack.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
struct ImFontBuildSrcGlyphFT
|
||||
{
|
||||
GlyphInfo Info;
|
||||
uint32_t Codepoint;
|
||||
unsigned int* BitmapData; // Point within one of the dst_tmp_bitmap_buffers[] array
|
||||
|
||||
ImFontBuildSrcGlyphFT() { memset((void*)this, 0, sizeof(*this)); }
|
||||
};
|
||||
|
||||
struct ImFontBuildSrcDataFT
|
||||
{
|
||||
FreeTypeFont Font;
|
||||
stbrp_rect* Rects; // Rectangle to pack. We first fill in their size and the packer will give us their position.
|
||||
const ImWchar* SrcRanges; // Ranges as requested by user (user is allowed to request too much, e.g. 0x0020..0xFFFF)
|
||||
int DstIndex; // Index into atlas->Fonts[] and dst_tmp_array[]
|
||||
int GlyphsHighest; // Highest requested codepoint
|
||||
int GlyphsCount; // Glyph count (excluding missing glyphs and glyphs already set by an earlier source font)
|
||||
ImBitVector GlyphsSet; // Glyph bit map (random access, 1-bit per codepoint. This will be a maximum of 8KB)
|
||||
ImVector<ImFontBuildSrcGlyphFT> GlyphsList;
|
||||
};
|
||||
|
||||
// Temporary data for one destination ImFont* (multiple source fonts can be merged into one destination ImFont)
|
||||
struct ImFontBuildDstDataFT
|
||||
{
|
||||
int SrcCount; // Number of source fonts targeting this destination font.
|
||||
int GlyphsHighest;
|
||||
int GlyphsCount;
|
||||
ImBitVector GlyphsSet; // This is used to resolve collision when multiple sources are merged into a same destination font.
|
||||
};
|
||||
|
||||
bool ImFontAtlasBuildWithFreeTypeEx(FT_Library ft_library, ImFontAtlas* atlas, unsigned int extra_flags)
|
||||
{
|
||||
IM_ASSERT(atlas->ConfigData.Size > 0);
|
||||
|
||||
ImFontAtlasBuildInit(atlas);
|
||||
|
||||
// Clear atlas
|
||||
atlas->TexID = (ImTextureID)nullptr;
|
||||
atlas->TexWidth = atlas->TexHeight = 0;
|
||||
atlas->TexUvScale = ImVec2(0.0f, 0.0f);
|
||||
atlas->TexUvWhitePixel = ImVec2(0.0f, 0.0f);
|
||||
atlas->ClearTexData();
|
||||
|
||||
// Temporary storage for building
|
||||
bool src_load_color = false;
|
||||
ImVector<ImFontBuildSrcDataFT> src_tmp_array;
|
||||
ImVector<ImFontBuildDstDataFT> dst_tmp_array;
|
||||
src_tmp_array.resize(atlas->ConfigData.Size);
|
||||
dst_tmp_array.resize(atlas->Fonts.Size);
|
||||
memset((void*)src_tmp_array.Data, 0, (size_t)src_tmp_array.size_in_bytes());
|
||||
memset((void*)dst_tmp_array.Data, 0, (size_t)dst_tmp_array.size_in_bytes());
|
||||
|
||||
// 1. Initialize font loading structure, check font data validity
|
||||
for (int src_i = 0; src_i < atlas->ConfigData.Size; src_i++)
|
||||
{
|
||||
ImFontBuildSrcDataFT& src_tmp = src_tmp_array[src_i];
|
||||
ImFontConfig& cfg = atlas->ConfigData[src_i];
|
||||
FreeTypeFont& font_face = src_tmp.Font;
|
||||
IM_ASSERT(cfg.DstFont && (!cfg.DstFont->IsLoaded() || cfg.DstFont->ContainerAtlas == atlas));
|
||||
|
||||
// Find index from cfg.DstFont (we allow the user to set cfg.DstFont. Also it makes casual debugging nicer than when storing indices)
|
||||
src_tmp.DstIndex = -1;
|
||||
for (int output_i = 0; output_i < atlas->Fonts.Size && src_tmp.DstIndex == -1; output_i++)
|
||||
if (cfg.DstFont == atlas->Fonts[output_i])
|
||||
src_tmp.DstIndex = output_i;
|
||||
IM_ASSERT(src_tmp.DstIndex != -1); // cfg.DstFont not pointing within atlas->Fonts[] array?
|
||||
if (src_tmp.DstIndex == -1)
|
||||
return false;
|
||||
|
||||
// Load font
|
||||
if (!font_face.InitFont(ft_library, cfg, extra_flags))
|
||||
return false;
|
||||
|
||||
// Measure highest codepoints
|
||||
src_load_color |= (cfg.FontBuilderFlags & ImGuiFreeTypeBuilderFlags_LoadColor) != 0;
|
||||
ImFontBuildDstDataFT& dst_tmp = dst_tmp_array[src_tmp.DstIndex];
|
||||
src_tmp.SrcRanges = cfg.GlyphRanges ? cfg.GlyphRanges : atlas->GetGlyphRangesDefault();
|
||||
for (const ImWchar* src_range = src_tmp.SrcRanges; src_range[0] && src_range[1]; src_range += 2)
|
||||
{
|
||||
// Check for valid range. This may also help detect *some* dangling pointers, because a common
|
||||
// user error is to setup ImFontConfig::GlyphRanges with a pointer to data that isn't persistent.
|
||||
IM_ASSERT(src_range[0] <= src_range[1]);
|
||||
src_tmp.GlyphsHighest = ImMax(src_tmp.GlyphsHighest, (int)src_range[1]);
|
||||
}
|
||||
dst_tmp.SrcCount++;
|
||||
dst_tmp.GlyphsHighest = ImMax(dst_tmp.GlyphsHighest, src_tmp.GlyphsHighest);
|
||||
}
|
||||
|
||||
// 2. For every requested codepoint, check for their presence in the font data, and handle redundancy or overlaps between source fonts to avoid unused glyphs.
|
||||
int total_glyphs_count = 0;
|
||||
for (int src_i = 0; src_i < src_tmp_array.Size; src_i++)
|
||||
{
|
||||
ImFontBuildSrcDataFT& src_tmp = src_tmp_array[src_i];
|
||||
ImFontBuildDstDataFT& dst_tmp = dst_tmp_array[src_tmp.DstIndex];
|
||||
src_tmp.GlyphsSet.Create(src_tmp.GlyphsHighest + 1);
|
||||
if (dst_tmp.GlyphsSet.Storage.empty())
|
||||
dst_tmp.GlyphsSet.Create(dst_tmp.GlyphsHighest + 1);
|
||||
|
||||
for (const ImWchar* src_range = src_tmp.SrcRanges; src_range[0] && src_range[1]; src_range += 2)
|
||||
for (int codepoint = src_range[0]; codepoint <= (int)src_range[1]; codepoint++)
|
||||
{
|
||||
if (dst_tmp.GlyphsSet.TestBit(codepoint)) // Don't overwrite existing glyphs. We could make this an option (e.g. MergeOverwrite)
|
||||
continue;
|
||||
uint32_t glyph_index = FT_Get_Char_Index(src_tmp.Font.Face, codepoint); // It is actually in the font? (FIXME-OPT: We are not storing the glyph_index..)
|
||||
if (glyph_index == 0)
|
||||
continue;
|
||||
|
||||
// Add to avail set/counters
|
||||
src_tmp.GlyphsCount++;
|
||||
dst_tmp.GlyphsCount++;
|
||||
src_tmp.GlyphsSet.SetBit(codepoint);
|
||||
dst_tmp.GlyphsSet.SetBit(codepoint);
|
||||
total_glyphs_count++;
|
||||
}
|
||||
}
|
||||
|
||||
// 3. Unpack our bit map into a flat list (we now have all the Unicode points that we know are requested _and_ available _and_ not overlapping another)
|
||||
for (int src_i = 0; src_i < src_tmp_array.Size; src_i++)
|
||||
{
|
||||
ImFontBuildSrcDataFT& src_tmp = src_tmp_array[src_i];
|
||||
src_tmp.GlyphsList.reserve(src_tmp.GlyphsCount);
|
||||
|
||||
IM_ASSERT(sizeof(src_tmp.GlyphsSet.Storage.Data[0]) == sizeof(ImU32));
|
||||
const ImU32* it_begin = src_tmp.GlyphsSet.Storage.begin();
|
||||
const ImU32* it_end = src_tmp.GlyphsSet.Storage.end();
|
||||
for (const ImU32* it = it_begin; it < it_end; it++)
|
||||
if (ImU32 entries_32 = *it)
|
||||
for (ImU32 bit_n = 0; bit_n < 32; bit_n++)
|
||||
if (entries_32 & ((ImU32)1 << bit_n))
|
||||
{
|
||||
ImFontBuildSrcGlyphFT src_glyph;
|
||||
src_glyph.Codepoint = (ImWchar)(((it - it_begin) << 5) + bit_n);
|
||||
//src_glyph.GlyphIndex = 0; // FIXME-OPT: We had this info in the previous step and lost it..
|
||||
src_tmp.GlyphsList.push_back(src_glyph);
|
||||
}
|
||||
src_tmp.GlyphsSet.Clear();
|
||||
IM_ASSERT(src_tmp.GlyphsList.Size == src_tmp.GlyphsCount);
|
||||
}
|
||||
for (int dst_i = 0; dst_i < dst_tmp_array.Size; dst_i++)
|
||||
dst_tmp_array[dst_i].GlyphsSet.Clear();
|
||||
dst_tmp_array.clear();
|
||||
|
||||
// Allocate packing character data and flag packed characters buffer as non-packed (x0=y0=x1=y1=0)
|
||||
// (We technically don't need to zero-clear buf_rects, but let's do it for the sake of sanity)
|
||||
ImVector<stbrp_rect> buf_rects;
|
||||
buf_rects.resize(total_glyphs_count);
|
||||
memset(buf_rects.Data, 0, (size_t)buf_rects.size_in_bytes());
|
||||
|
||||
// Allocate temporary rasterization data buffers.
|
||||
// We could not find a way to retrieve accurate glyph size without rendering them.
|
||||
// (e.g. slot->metrics->width not always matching bitmap->width, especially considering the Oblique transform)
|
||||
// We allocate in chunks of 256 KB to not waste too much extra memory ahead. Hopefully users of FreeType won't mind the temporary allocations.
|
||||
const int BITMAP_BUFFERS_CHUNK_SIZE = 256 * 1024;
|
||||
int buf_bitmap_current_used_bytes = 0;
|
||||
ImVector<unsigned char*> buf_bitmap_buffers;
|
||||
buf_bitmap_buffers.push_back((unsigned char*)IM_ALLOC(BITMAP_BUFFERS_CHUNK_SIZE));
|
||||
|
||||
// 4. Gather glyphs sizes so we can pack them in our virtual canvas.
|
||||
// 8. Render/rasterize font characters into the texture
|
||||
int total_surface = 0;
|
||||
int buf_rects_out_n = 0;
|
||||
for (int src_i = 0; src_i < src_tmp_array.Size; src_i++)
|
||||
{
|
||||
ImFontBuildSrcDataFT& src_tmp = src_tmp_array[src_i];
|
||||
ImFontConfig& cfg = atlas->ConfigData[src_i];
|
||||
if (src_tmp.GlyphsCount == 0)
|
||||
continue;
|
||||
|
||||
src_tmp.Rects = &buf_rects[buf_rects_out_n];
|
||||
buf_rects_out_n += src_tmp.GlyphsCount;
|
||||
|
||||
// Compute multiply table if requested
|
||||
const bool multiply_enabled = (cfg.RasterizerMultiply != 1.0f);
|
||||
unsigned char multiply_table[256];
|
||||
if (multiply_enabled)
|
||||
ImFontAtlasBuildMultiplyCalcLookupTable(multiply_table, cfg.RasterizerMultiply);
|
||||
|
||||
// Gather the sizes of all rectangles we will need to pack
|
||||
const int padding = atlas->TexGlyphPadding;
|
||||
for (int glyph_i = 0; glyph_i < src_tmp.GlyphsList.Size; glyph_i++)
|
||||
{
|
||||
ImFontBuildSrcGlyphFT& src_glyph = src_tmp.GlyphsList[glyph_i];
|
||||
|
||||
const FT_Glyph_Metrics* metrics = src_tmp.Font.LoadGlyph(src_glyph.Codepoint);
|
||||
if (metrics == nullptr)
|
||||
continue;
|
||||
|
||||
// Render glyph into a bitmap (currently held by FreeType)
|
||||
const FT_Bitmap* ft_bitmap = src_tmp.Font.RenderGlyphAndGetInfo(&src_glyph.Info);
|
||||
if (ft_bitmap == nullptr)
|
||||
continue;
|
||||
|
||||
// Allocate new temporary chunk if needed
|
||||
const int bitmap_size_in_bytes = src_glyph.Info.Width * src_glyph.Info.Height * 4;
|
||||
if (buf_bitmap_current_used_bytes + bitmap_size_in_bytes > BITMAP_BUFFERS_CHUNK_SIZE)
|
||||
{
|
||||
buf_bitmap_current_used_bytes = 0;
|
||||
buf_bitmap_buffers.push_back((unsigned char*)IM_ALLOC(BITMAP_BUFFERS_CHUNK_SIZE));
|
||||
}
|
||||
IM_ASSERT(buf_bitmap_current_used_bytes + bitmap_size_in_bytes <= BITMAP_BUFFERS_CHUNK_SIZE); // We could probably allocate custom-sized buffer instead.
|
||||
|
||||
// Blit rasterized pixels to our temporary buffer and keep a pointer to it.
|
||||
src_glyph.BitmapData = (unsigned int*)(buf_bitmap_buffers.back() + buf_bitmap_current_used_bytes);
|
||||
buf_bitmap_current_used_bytes += bitmap_size_in_bytes;
|
||||
src_tmp.Font.BlitGlyph(ft_bitmap, src_glyph.BitmapData, src_glyph.Info.Width, multiply_enabled ? multiply_table : nullptr);
|
||||
|
||||
src_tmp.Rects[glyph_i].w = (stbrp_coord)(src_glyph.Info.Width + padding);
|
||||
src_tmp.Rects[glyph_i].h = (stbrp_coord)(src_glyph.Info.Height + padding);
|
||||
total_surface += src_tmp.Rects[glyph_i].w * src_tmp.Rects[glyph_i].h;
|
||||
}
|
||||
}
|
||||
|
||||
// We need a width for the skyline algorithm, any width!
|
||||
// The exact width doesn't really matter much, but some API/GPU have texture size limitations and increasing width can decrease height.
|
||||
// User can override TexDesiredWidth and TexGlyphPadding if they wish, otherwise we use a simple heuristic to select the width based on expected surface.
|
||||
const int surface_sqrt = (int)ImSqrt((float)total_surface) + 1;
|
||||
atlas->TexHeight = 0;
|
||||
if (atlas->TexDesiredWidth > 0)
|
||||
atlas->TexWidth = atlas->TexDesiredWidth;
|
||||
else
|
||||
atlas->TexWidth = (surface_sqrt >= 4096 * 0.7f) ? 4096 : (surface_sqrt >= 2048 * 0.7f) ? 2048 : (surface_sqrt >= 1024 * 0.7f) ? 1024 : 512;
|
||||
|
||||
// 5. Start packing
|
||||
// Pack our extra data rectangles first, so it will be on the upper-left corner of our texture (UV will have small values).
|
||||
const int TEX_HEIGHT_MAX = 1024 * 32;
|
||||
const int num_nodes_for_packing_algorithm = atlas->TexWidth - atlas->TexGlyphPadding;
|
||||
ImVector<stbrp_node> pack_nodes;
|
||||
pack_nodes.resize(num_nodes_for_packing_algorithm);
|
||||
stbrp_context pack_context;
|
||||
stbrp_init_target(&pack_context, atlas->TexWidth - atlas->TexGlyphPadding, TEX_HEIGHT_MAX - atlas->TexGlyphPadding, pack_nodes.Data, pack_nodes.Size);
|
||||
ImFontAtlasBuildPackCustomRects(atlas, &pack_context);
|
||||
|
||||
// 6. Pack each source font. No rendering yet, we are working with rectangles in an infinitely tall texture at this point.
|
||||
for (int src_i = 0; src_i < src_tmp_array.Size; src_i++)
|
||||
{
|
||||
ImFontBuildSrcDataFT& src_tmp = src_tmp_array[src_i];
|
||||
if (src_tmp.GlyphsCount == 0)
|
||||
continue;
|
||||
|
||||
stbrp_pack_rects(&pack_context, src_tmp.Rects, src_tmp.GlyphsCount);
|
||||
|
||||
// Extend texture height and mark missing glyphs as non-packed so we won't render them.
|
||||
// FIXME: We are not handling packing failure here (would happen if we got off TEX_HEIGHT_MAX or if a single if larger than TexWidth?)
|
||||
for (int glyph_i = 0; glyph_i < src_tmp.GlyphsCount; glyph_i++)
|
||||
if (src_tmp.Rects[glyph_i].was_packed)
|
||||
atlas->TexHeight = ImMax(atlas->TexHeight, src_tmp.Rects[glyph_i].y + src_tmp.Rects[glyph_i].h);
|
||||
}
|
||||
|
||||
// 7. Allocate texture
|
||||
atlas->TexHeight = (atlas->Flags & ImFontAtlasFlags_NoPowerOfTwoHeight) ? (atlas->TexHeight + 1) : ImUpperPowerOfTwo(atlas->TexHeight);
|
||||
atlas->TexUvScale = ImVec2(1.0f / atlas->TexWidth, 1.0f / atlas->TexHeight);
|
||||
if (src_load_color)
|
||||
{
|
||||
size_t tex_size = (size_t)atlas->TexWidth * atlas->TexHeight * 4;
|
||||
atlas->TexPixelsRGBA32 = (unsigned int*)IM_ALLOC(tex_size);
|
||||
memset(atlas->TexPixelsRGBA32, 0, tex_size);
|
||||
}
|
||||
else
|
||||
{
|
||||
size_t tex_size = (size_t)atlas->TexWidth * atlas->TexHeight * 1;
|
||||
atlas->TexPixelsAlpha8 = (unsigned char*)IM_ALLOC(tex_size);
|
||||
memset(atlas->TexPixelsAlpha8, 0, tex_size);
|
||||
}
|
||||
|
||||
// 8. Copy rasterized font characters back into the main texture
|
||||
// 9. Setup ImFont and glyphs for runtime
|
||||
bool tex_use_colors = false;
|
||||
for (int src_i = 0; src_i < src_tmp_array.Size; src_i++)
|
||||
{
|
||||
ImFontBuildSrcDataFT& src_tmp = src_tmp_array[src_i];
|
||||
// IMHEX PATCH BEGIN
|
||||
// if (src_tmp.GlyphsCount == 0)
|
||||
// continue;
|
||||
// IMHEX PATCH END
|
||||
|
||||
// When merging fonts with MergeMode=true:
|
||||
// - We can have multiple input fonts writing into a same destination font.
|
||||
// - dst_font->ConfigData is != from cfg which is our source configuration.
|
||||
ImFontConfig& cfg = atlas->ConfigData[src_i];
|
||||
ImFont* dst_font = cfg.DstFont;
|
||||
|
||||
const float ascent = src_tmp.Font.Info.Ascender;
|
||||
const float descent = src_tmp.Font.Info.Descender;
|
||||
ImFontAtlasBuildSetupFont(atlas, dst_font, &cfg, ascent, descent);
|
||||
const float font_off_x = cfg.GlyphOffset.x;
|
||||
const float font_off_y = cfg.GlyphOffset.y + IM_ROUND(dst_font->Ascent);
|
||||
|
||||
const int padding = atlas->TexGlyphPadding;
|
||||
for (int glyph_i = 0; glyph_i < src_tmp.GlyphsCount; glyph_i++)
|
||||
{
|
||||
ImFontBuildSrcGlyphFT& src_glyph = src_tmp.GlyphsList[glyph_i];
|
||||
stbrp_rect& pack_rect = src_tmp.Rects[glyph_i];
|
||||
IM_ASSERT(pack_rect.was_packed);
|
||||
if (pack_rect.w == 0 && pack_rect.h == 0)
|
||||
continue;
|
||||
|
||||
GlyphInfo& info = src_glyph.Info;
|
||||
IM_ASSERT(info.Width + padding <= pack_rect.w);
|
||||
IM_ASSERT(info.Height + padding <= pack_rect.h);
|
||||
const int tx = pack_rect.x + padding;
|
||||
const int ty = pack_rect.y + padding;
|
||||
|
||||
// Register glyph
|
||||
float x0 = info.OffsetX + font_off_x;
|
||||
float y0 = info.OffsetY + font_off_y;
|
||||
float x1 = x0 + info.Width;
|
||||
float y1 = y0 + info.Height;
|
||||
float u0 = (tx) / (float)atlas->TexWidth;
|
||||
float v0 = (ty) / (float)atlas->TexHeight;
|
||||
float u1 = (tx + info.Width) / (float)atlas->TexWidth;
|
||||
float v1 = (ty + info.Height) / (float)atlas->TexHeight;
|
||||
dst_font->AddGlyph(&cfg, (ImWchar)src_glyph.Codepoint, x0, y0, x1, y1, u0, v0, u1, v1, info.AdvanceX);
|
||||
|
||||
ImFontGlyph* dst_glyph = &dst_font->Glyphs.back();
|
||||
IM_ASSERT(dst_glyph->Codepoint == src_glyph.Codepoint);
|
||||
if (src_glyph.Info.IsColored)
|
||||
dst_glyph->Colored = tex_use_colors = true;
|
||||
|
||||
// Blit from temporary buffer to final texture
|
||||
size_t blit_src_stride = (size_t)src_glyph.Info.Width;
|
||||
size_t blit_dst_stride = (size_t)atlas->TexWidth;
|
||||
unsigned int* blit_src = src_glyph.BitmapData;
|
||||
if (atlas->TexPixelsAlpha8 != nullptr)
|
||||
{
|
||||
unsigned char* blit_dst = atlas->TexPixelsAlpha8 + (ty * blit_dst_stride) + tx;
|
||||
for (int y = 0; y < info.Height; y++, blit_dst += blit_dst_stride, blit_src += blit_src_stride)
|
||||
for (int x = 0; x < info.Width; x++)
|
||||
blit_dst[x] = (unsigned char)((blit_src[x] >> IM_COL32_A_SHIFT) & 0xFF);
|
||||
}
|
||||
else
|
||||
{
|
||||
unsigned int* blit_dst = atlas->TexPixelsRGBA32 + (ty * blit_dst_stride) + tx;
|
||||
for (int y = 0; y < info.Height; y++, blit_dst += blit_dst_stride, blit_src += blit_src_stride)
|
||||
for (int x = 0; x < info.Width; x++)
|
||||
blit_dst[x] = blit_src[x];
|
||||
}
|
||||
}
|
||||
|
||||
src_tmp.Rects = nullptr;
|
||||
}
|
||||
atlas->TexPixelsUseColors = tex_use_colors;
|
||||
|
||||
// Cleanup
|
||||
for (int buf_i = 0; buf_i < buf_bitmap_buffers.Size; buf_i++)
|
||||
IM_FREE(buf_bitmap_buffers[buf_i]);
|
||||
src_tmp_array.clear_destruct();
|
||||
|
||||
ImFontAtlasBuildFinish(atlas);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// FreeType memory allocation callbacks
|
||||
static void* FreeType_Alloc(FT_Memory /*memory*/, long size)
|
||||
{
|
||||
return GImGuiFreeTypeAllocFunc((size_t)size, GImGuiFreeTypeAllocatorUserData);
|
||||
}
|
||||
|
||||
static void FreeType_Free(FT_Memory /*memory*/, void* block)
|
||||
{
|
||||
GImGuiFreeTypeFreeFunc(block, GImGuiFreeTypeAllocatorUserData);
|
||||
}
|
||||
|
||||
static void* FreeType_Realloc(FT_Memory /*memory*/, long cur_size, long new_size, void* block)
|
||||
{
|
||||
// Implement realloc() as we don't ask user to provide it.
|
||||
if (block == nullptr)
|
||||
return GImGuiFreeTypeAllocFunc((size_t)new_size, GImGuiFreeTypeAllocatorUserData);
|
||||
|
||||
if (new_size == 0)
|
||||
{
|
||||
GImGuiFreeTypeFreeFunc(block, GImGuiFreeTypeAllocatorUserData);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (new_size > cur_size)
|
||||
{
|
||||
void* new_block = GImGuiFreeTypeAllocFunc((size_t)new_size, GImGuiFreeTypeAllocatorUserData);
|
||||
memcpy(new_block, block, (size_t)cur_size);
|
||||
GImGuiFreeTypeFreeFunc(block, GImGuiFreeTypeAllocatorUserData);
|
||||
return new_block;
|
||||
}
|
||||
|
||||
return block;
|
||||
}
|
||||
|
||||
static bool ImFontAtlasBuildWithFreeType(ImFontAtlas* atlas)
|
||||
{
|
||||
// FreeType memory management: https://www.freetype.org/freetype2/docs/design/design-4.html
|
||||
FT_MemoryRec_ memory_rec = {};
|
||||
memory_rec.user = nullptr;
|
||||
memory_rec.alloc = &FreeType_Alloc;
|
||||
memory_rec.free = &FreeType_Free;
|
||||
memory_rec.realloc = &FreeType_Realloc;
|
||||
|
||||
// https://www.freetype.org/freetype2/docs/reference/ft2-module_management.html#FT_New_Library
|
||||
FT_Library ft_library;
|
||||
FT_Error error = FT_New_Library(&memory_rec, &ft_library);
|
||||
if (error != 0)
|
||||
return false;
|
||||
|
||||
// If you don't call FT_Add_Default_Modules() the rest of code may work, but FreeType won't use our custom allocator.
|
||||
FT_Add_Default_Modules(ft_library);
|
||||
|
||||
bool ret = ImFontAtlasBuildWithFreeTypeEx(ft_library, atlas, atlas->FontBuilderFlags);
|
||||
FT_Done_Library(ft_library);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
const ImFontBuilderIO* ImGuiFreeType::GetBuilderForFreeType()
|
||||
{
|
||||
static ImFontBuilderIO io;
|
||||
io.FontBuilder_Build = ImFontAtlasBuildWithFreeType;
|
||||
return &io;
|
||||
}
|
||||
|
||||
void ImGuiFreeType::SetAllocatorFunctions(void* (*alloc_func)(size_t sz, void* user_data), void (*free_func)(void* ptr, void* user_data), void* user_data)
|
||||
{
|
||||
GImGuiFreeTypeAllocFunc = alloc_func;
|
||||
GImGuiFreeTypeFreeFunc = free_func;
|
||||
GImGuiFreeTypeAllocatorUserData = user_data;
|
||||
}
|
||||
|
||||
#ifdef __GNUC__
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning (pop)
|
||||
#endif
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user