Compare commits
2826 Commits
__refs_pul
...
__refs_pul
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
aec3b28547 | ||
|
|
5d5f1dfb68 | ||
|
|
f4f64cc197 | ||
|
|
f10a7081e3 | ||
|
|
33778e4984 | ||
|
|
c2e4666579 | ||
|
|
f53dc4c9d6 | ||
|
|
2d7a85f7af | ||
|
|
8b097aa17e | ||
|
|
d818791866 | ||
|
|
3b28d382d0 | ||
|
|
8cdc1be0df | ||
|
|
f473780c52 | ||
|
|
b5b0d4e7c3 | ||
|
|
e026b66bbb | ||
|
|
713c1ed203 | ||
|
|
21f5161ad8 | ||
|
|
eaff98dbb3 | ||
|
|
20a745aa71 | ||
|
|
6f904bb622 | ||
|
|
e9cf161917 | ||
|
|
1a3b3e9100 | ||
|
|
1148e2ce7b | ||
|
|
5bc14ab0de | ||
|
|
8e2f62c6a5 | ||
|
|
67c8b671d2 | ||
|
|
054d3e5fc3 | ||
|
|
325f72aceb | ||
|
|
a4f5ccbf0a | ||
|
|
8d968780c1 | ||
|
|
58ee23f16d | ||
|
|
27960d8c2c | ||
|
|
af6e0faf0a | ||
|
|
8a440faa69 | ||
|
|
9fba2d68fe | ||
|
|
1ea49442f9 | ||
|
|
bb1fcfac33 | ||
|
|
aa4fa8bded | ||
|
|
801d6c1b6f | ||
|
|
cdb43e64c1 | ||
|
|
74aa14c9b4 | ||
|
|
e08c132175 | ||
|
|
f2d55bb881 | ||
|
|
22347e8844 | ||
|
|
af1ca87be1 | ||
|
|
2678dbfbe6 | ||
|
|
b1712b8312 | ||
|
|
92801b1c34 | ||
|
|
f3264dd78d | ||
|
|
ebd613c2cc | ||
|
|
2adde6ae8b | ||
|
|
554cc9488f | ||
|
|
71eeab257f | ||
|
|
7bedea73a8 | ||
|
|
d81a984d4a | ||
|
|
2e8246a02c | ||
|
|
7a50d56d0e | ||
|
|
f4a3d28224 | ||
|
|
979483c7dd | ||
|
|
b20dfb357b | ||
|
|
115d3e133f | ||
|
|
22659afcd0 | ||
|
|
974362bc12 | ||
|
|
bd58c5470c | ||
|
|
bf1084ff6e | ||
|
|
1a93237c23 | ||
|
|
7435dc53c8 | ||
|
|
d3f421b9a6 | ||
|
|
1e9e598ed0 | ||
|
|
c493bd9cc9 | ||
|
|
06e288cea0 | ||
|
|
e9e511ca04 | ||
|
|
feae1c4c32 | ||
|
|
a24dbcac6e | ||
|
|
80db02c497 | ||
|
|
b3c303539e | ||
|
|
c2d28351c7 | ||
|
|
668e5452fa | ||
|
|
e86bdb1601 | ||
|
|
f95789a0b3 | ||
|
|
20a2e80a9f | ||
|
|
9723c80d93 | ||
|
|
17af2937fe | ||
|
|
95ce471774 | ||
|
|
1247c53786 | ||
|
|
70e65ee63a | ||
|
|
18ca3ca751 | ||
|
|
f5f28a4f67 | ||
|
|
389979018c | ||
|
|
1d28b2e142 | ||
|
|
ebf9a784a9 | ||
|
|
890bbc0cd3 | ||
|
|
941cdae6f0 | ||
|
|
287485e3a7 | ||
|
|
8e51c61dbc | ||
|
|
106d900f93 | ||
|
|
b628192bf2 | ||
|
|
d2fbc78320 | ||
|
|
056f987bcd | ||
|
|
11adef4843 | ||
|
|
94ad97def0 | ||
|
|
ac2feaf5fb | ||
|
|
039fc7f985 | ||
|
|
97ef21e166 | ||
|
|
305035b503 | ||
|
|
ee4691297f | ||
|
|
236d463c52 | ||
|
|
866e66dc31 | ||
|
|
9e2ad45c98 | ||
|
|
292135a3b7 | ||
|
|
482cf8a005 | ||
|
|
1ca800ccee | ||
|
|
977ce4abbc | ||
|
|
7e0ff43da0 | ||
|
|
34ae2ec644 | ||
|
|
e21fbd9ae5 | ||
|
|
404149e475 | ||
|
|
d205dee0a6 | ||
|
|
927569bed8 | ||
|
|
fb73e8b723 | ||
|
|
25f29c2f4f | ||
|
|
94a5e97eb3 | ||
|
|
ab86b80cac | ||
|
|
ba02f0deef | ||
|
|
0a1278081e | ||
|
|
7ad20154fc | ||
|
|
188feba457 | ||
|
|
c2ee513d35 | ||
|
|
bc91ebacc1 | ||
|
|
a418f6e77b | ||
|
|
8d9250fa70 | ||
|
|
4236799832 | ||
|
|
9fcd2bf672 | ||
|
|
db3a525166 | ||
|
|
1bbe9309da | ||
|
|
2a3f8e8484 | ||
|
|
1b9ed033fc | ||
|
|
f10a304ecd | ||
|
|
d6e4e6ea32 | ||
|
|
82151d407d | ||
|
|
c12c756539 | ||
|
|
e3b4c8e043 | ||
|
|
ad965501d0 | ||
|
|
166286e976 | ||
|
|
ba2ffd7b81 | ||
|
|
5f41477f9c | ||
|
|
80f6df5414 | ||
|
|
32847d8b86 | ||
|
|
7e3561b1cd | ||
|
|
0368324f79 | ||
|
|
b0ceb4df70 | ||
|
|
226786f0b0 | ||
|
|
bc8ef64804 | ||
|
|
bd377908d7 | ||
|
|
4e33b4b42f | ||
|
|
0f6fbdb963 | ||
|
|
bc77a7580e | ||
|
|
79e0dd249e | ||
|
|
5017038ca7 | ||
|
|
91f10a1460 | ||
|
|
6f6d9af408 | ||
|
|
0e978bdd50 | ||
|
|
57f42e5887 | ||
|
|
d083c07c46 | ||
|
|
da7053b169 | ||
|
|
0dbc8f3577 | ||
|
|
dcfbad2129 | ||
|
|
24f10a20e7 | ||
|
|
5e262a4a68 | ||
|
|
b38223f662 | ||
|
|
45bdc53b8f | ||
|
|
738845cc0e | ||
|
|
3f8b9181b5 | ||
|
|
095f320581 | ||
|
|
6e9d66fd3a | ||
|
|
914ebee67a | ||
|
|
aa7e061e71 | ||
|
|
d327f66990 | ||
|
|
8be46f412e | ||
|
|
b172f0d770 | ||
|
|
f0eab802e8 | ||
|
|
81a8a57ce2 | ||
|
|
fe11b51545 | ||
|
|
480906fe1b | ||
|
|
72f671fd7a | ||
|
|
e9710a2cf7 | ||
|
|
dc4fe2fbd5 | ||
|
|
dd3a237981 | ||
|
|
93480b10ef | ||
|
|
9e8608e8b1 | ||
|
|
aa7c824ea4 | ||
|
|
9b8afed5f7 | ||
|
|
b9950cd4b0 | ||
|
|
d0046b120a | ||
|
|
1cb978eb82 | ||
|
|
45debfe4fd | ||
|
|
9d0c3bda7f | ||
|
|
001091fa72 | ||
|
|
283c63645d | ||
|
|
c7983e970c | ||
|
|
8a7f8f3e2c | ||
|
|
960e8dc5e5 | ||
|
|
f24531b1a2 | ||
|
|
3a91a62b8f | ||
|
|
a3228d9b77 | ||
|
|
8ab33616ac | ||
|
|
b6087e35b5 | ||
|
|
7ccd8de863 | ||
|
|
eed4f2e229 | ||
|
|
ebd4b1422d | ||
|
|
1d01ffccb8 | ||
|
|
30e98fae3f | ||
|
|
dcdaac8a0b | ||
|
|
b67cbb8d92 | ||
|
|
fcd4c1a0dc | ||
|
|
e17c0019c5 | ||
|
|
834fa5db65 | ||
|
|
6e021f22b8 | ||
|
|
3421e1617e | ||
|
|
7618b5237d | ||
|
|
ad073846bc | ||
|
|
16fb1c8fe7 | ||
|
|
d5995fd30f | ||
|
|
3597650f22 | ||
|
|
34571f4d2e | ||
|
|
3e80202604 | ||
|
|
266c1c8020 | ||
|
|
45db4bb3ea | ||
|
|
3f0caefdf5 | ||
|
|
9ceb0d9381 | ||
|
|
dcd6bb82f7 | ||
|
|
716e5cf070 | ||
|
|
654fae29c1 | ||
|
|
b283cf7348 | ||
|
|
03bf0739a4 | ||
|
|
97d52b9f89 | ||
|
|
3f2a738d34 | ||
|
|
d3cc369618 | ||
|
|
4fb1b24d68 | ||
|
|
746c2a3ae7 | ||
|
|
72eeca1f03 | ||
|
|
960a1416de | ||
|
|
12c7469d81 | ||
|
|
78bc2b70bb | ||
|
|
e98a3ca171 | ||
|
|
cb889f9220 | ||
|
|
d62750c46d | ||
|
|
15983dcfdc | ||
|
|
dbd15b0d10 | ||
|
|
72b03025ac | ||
|
|
0906de9a14 | ||
|
|
b1d5db1cf6 | ||
|
|
23ce4f5afc | ||
|
|
d15e15bd05 | ||
|
|
9b19c218a9 | ||
|
|
83e5f639e6 | ||
|
|
20e19a340c | ||
|
|
15a2388a33 | ||
|
|
74d4050924 | ||
|
|
33ea53094c | ||
|
|
84c344b9b1 | ||
|
|
97f262c1f5 | ||
|
|
46fc7595b4 | ||
|
|
7b09b30ef1 | ||
|
|
3c0113632d | ||
|
|
0cfb231e00 | ||
|
|
b863d6c860 | ||
|
|
7772fc0731 | ||
|
|
c1355ada4b | ||
|
|
b3b34a1e76 | ||
|
|
d454364bca | ||
|
|
15c7641bef | ||
|
|
26629c661c | ||
|
|
b18589ecf7 | ||
|
|
29a6fbacd5 | ||
|
|
30fabc41c6 | ||
|
|
1f2de7501b | ||
|
|
811c01e5fe | ||
|
|
8217ed7acb | ||
|
|
9c123c29a6 | ||
|
|
4887d18591 | ||
|
|
8e10c9bb2e | ||
|
|
e21f2348e7 | ||
|
|
c93e5ecfe6 | ||
|
|
5ba48c1610 | ||
|
|
6377585edb | ||
|
|
8c92435ded | ||
|
|
fa1c7c7ee1 | ||
|
|
6bafd3f4f7 | ||
|
|
9eb4888df7 | ||
|
|
46297c9653 | ||
|
|
c5ce5c06e4 | ||
|
|
f01472a5ff | ||
|
|
3411883fe3 | ||
|
|
1c4f9e822c | ||
|
|
5bae5a48b9 | ||
|
|
529f4a0131 | ||
|
|
afb1012bcd | ||
|
|
8244762b89 | ||
|
|
1f99d53e2c | ||
|
|
7056b9c46a | ||
|
|
db752b52e8 | ||
|
|
a3de996ae7 | ||
|
|
a13ab958cb | ||
|
|
b07af7dda8 | ||
|
|
8432749db7 | ||
|
|
0d42706a7b | ||
|
|
a321bce378 | ||
|
|
7f48aa8d25 | ||
|
|
5620327e03 | ||
|
|
3165466b66 | ||
|
|
a8d2f5787f | ||
|
|
c102e3ae28 | ||
|
|
35da7f57ef | ||
|
|
0c20da7fde | ||
|
|
e27ae04696 | ||
|
|
41f6c9f87f | ||
|
|
d7459354f5 | ||
|
|
fd30d48ceb | ||
|
|
774e7deae8 | ||
|
|
d881dee818 | ||
|
|
dc6a365337 | ||
|
|
78022b5a79 | ||
|
|
a21b9deb98 | ||
|
|
c91ccbd0ba | ||
|
|
d673d508dd | ||
|
|
a81536f53f | ||
|
|
903906da3b | ||
|
|
67a70bd9e1 | ||
|
|
4e5eb2044a | ||
|
|
c02bbb7030 | ||
|
|
876aa82c29 | ||
|
|
7117fcc024 | ||
|
|
7096f01c14 | ||
|
|
b57d58c0dc | ||
|
|
93930a966f | ||
|
|
0b33e36292 | ||
|
|
19d41dcc6e | ||
|
|
a7758b0b36 | ||
|
|
6fc123d67c | ||
|
|
7ea3ce103f | ||
|
|
1aa66ed5ed | ||
|
|
28c726f205 | ||
|
|
a234e4c200 | ||
|
|
6a110ac5f5 | ||
|
|
255fd8768d | ||
|
|
3d86e3afc4 | ||
|
|
699c920991 | ||
|
|
813837c5cf | ||
|
|
7a3ab7c63d | ||
|
|
3bde97ea05 | ||
|
|
f18a176b60 | ||
|
|
b178089251 | ||
|
|
214150f00c | ||
|
|
588077184b | ||
|
|
3e2e9be6d5 | ||
|
|
ad0b57f407 | ||
|
|
9e847b7549 | ||
|
|
c34ec5e77c | ||
|
|
6d2734a074 | ||
|
|
3dcda15195 | ||
|
|
0c55bed047 | ||
|
|
11baa40d75 | ||
|
|
4af793c591 | ||
|
|
ef8925b7ac | ||
|
|
ff4941fb3a | ||
|
|
617b6974b9 | ||
|
|
b9126a64bf | ||
|
|
11f2eff17d | ||
|
|
589babbf74 | ||
|
|
9b6dbe9b54 | ||
|
|
79f177c6d2 | ||
|
|
3fd864d67b | ||
|
|
59a9aaf388 | ||
|
|
12fbc8c8df | ||
|
|
40505bc4fc | ||
|
|
415d3c0bac | ||
|
|
ab47bf6ad6 | ||
|
|
f251b8873a | ||
|
|
e2c41a5891 | ||
|
|
e450a2d2b8 | ||
|
|
f0e461bf6f | ||
|
|
75cd28a7cc | ||
|
|
acbd46366c | ||
|
|
8266064796 | ||
|
|
933508e2a2 | ||
|
|
4693d23efb | ||
|
|
647f017c6d | ||
|
|
f64cd87604 | ||
|
|
d088dbfbe1 | ||
|
|
2e9f544ecc | ||
|
|
54411bef4e | ||
|
|
22fc378fe9 | ||
|
|
7698567fc9 | ||
|
|
da88f3b8f0 | ||
|
|
076b395104 | ||
|
|
c8562b21d9 | ||
|
|
04bd0c957e | ||
|
|
9f0da33c33 | ||
|
|
5d7b364a21 | ||
|
|
2e37201c63 | ||
|
|
fb17e866aa | ||
|
|
41328afb58 | ||
|
|
40f417125b | ||
|
|
c781aea947 | ||
|
|
d6a819c7cb | ||
|
|
59ad933022 | ||
|
|
3cdf854e44 | ||
|
|
417cb45e3f | ||
|
|
addbcd5784 | ||
|
|
ea51a3af26 | ||
|
|
2617de1fe6 | ||
|
|
c84e60b470 | ||
|
|
61442d6afb | ||
|
|
2bbff9fa96 | ||
|
|
f484927ed0 | ||
|
|
bca8916cea | ||
|
|
a8675f4287 | ||
|
|
03c782e378 | ||
|
|
4d058cfb76 | ||
|
|
17c6104d2a | ||
|
|
b5aa570354 | ||
|
|
3e478ca131 | ||
|
|
fa228ca637 | ||
|
|
f84c965dec | ||
|
|
92a4b2faf8 | ||
|
|
8a9a4e2c42 | ||
|
|
65f19b51c4 | ||
|
|
145a7293a3 | ||
|
|
d237a89048 | ||
|
|
9d0841b48b | ||
|
|
d3fb1d6c38 | ||
|
|
63b6e802cd | ||
|
|
72b26ac32f | ||
|
|
5a4af616c6 | ||
|
|
1eca380886 | ||
|
|
46d1ca768d | ||
|
|
fe7e0eada0 | ||
|
|
056a08cdbf | ||
|
|
bbfa9d0635 | ||
|
|
54c0c8adee | ||
|
|
8afa81ac1b | ||
|
|
d51f4d21bb | ||
|
|
5d0a1e7efd | ||
|
|
0f35755572 | ||
|
|
8285ca4ad8 | ||
|
|
36981a5aa6 | ||
|
|
bb63ae3052 | ||
|
|
28128348f2 | ||
|
|
46c6973d2b | ||
|
|
223bd35450 | ||
|
|
21204ba488 | ||
|
|
b67c2dc82c | ||
|
|
595070c901 | ||
|
|
bf71fc0342 | ||
|
|
d59f503729 | ||
|
|
7cd8a65949 | ||
|
|
686fb3e78c | ||
|
|
8fd28244e4 | ||
|
|
a3aa8617bc | ||
|
|
188194908c | ||
|
|
867eabd6b7 | ||
|
|
53ef90d1bd | ||
|
|
8d3f48d0a3 | ||
|
|
945f9a1b04 | ||
|
|
14ee32c46a | ||
|
|
aaf5161344 | ||
|
|
599de29ea3 | ||
|
|
fa64309aac | ||
|
|
2415bad9ad | ||
|
|
5d9d42f0d0 | ||
|
|
80f85b429c | ||
|
|
9f6868ad9b | ||
|
|
db309b2423 | ||
|
|
c2466a2f19 | ||
|
|
792dee47a7 | ||
|
|
93ab46e500 | ||
|
|
437526e782 | ||
|
|
a6273dd56a | ||
|
|
1a44949ef7 | ||
|
|
177e8ce655 | ||
|
|
73fba0de46 | ||
|
|
baa24f4ea9 | ||
|
|
8bda0ca68d | ||
|
|
343bbfdabc | ||
|
|
f55b7aefd9 | ||
|
|
0dc285dcfd | ||
|
|
fb8de89859 | ||
|
|
9390d54bb3 | ||
|
|
5c631ec9c5 | ||
|
|
a621ab6853 | ||
|
|
f44a1e0291 | ||
|
|
9b8e5bea66 | ||
|
|
f5cf9960d9 | ||
|
|
2252a63f80 | ||
|
|
eda28266fb | ||
|
|
48b4105871 | ||
|
|
c59ed47608 | ||
|
|
035716d57b | ||
|
|
941a722ff1 | ||
|
|
60024ad7c2 | ||
|
|
fc43e027f6 | ||
|
|
a7dae7fd70 | ||
|
|
05a38e307c | ||
|
|
f15e5522dc | ||
|
|
c89f804a01 | ||
|
|
a724fb3657 | ||
|
|
7dbe3c18f1 | ||
|
|
718423e506 | ||
|
|
f2f39102fa | ||
|
|
0f81e18793 | ||
|
|
a08edd67eb | ||
|
|
567c3a2ee7 | ||
|
|
c6a2e519ef | ||
|
|
e646bd902d | ||
|
|
045d0b5bbd | ||
|
|
e59ab7c1d6 | ||
|
|
68596a7068 | ||
|
|
a9bc417f59 | ||
|
|
e403638d9b | ||
|
|
2dc720c355 | ||
|
|
5682608df7 | ||
|
|
49602139c8 | ||
|
|
b5609e1578 | ||
|
|
8375fd2aba | ||
|
|
98cd5164c5 | ||
|
|
5621a65037 | ||
|
|
35eee446c7 | ||
|
|
32745ead7e | ||
|
|
87dea94e14 | ||
|
|
df8b9863f9 | ||
|
|
822e8d21ea | ||
|
|
924215a41f | ||
|
|
308292dfa1 | ||
|
|
7dbbd8a02e | ||
|
|
68db4f3ece | ||
|
|
80b9a276ed | ||
|
|
77df82f5d6 | ||
|
|
253d3dd3d8 | ||
|
|
a0626221a5 | ||
|
|
859be35d54 | ||
|
|
42e57c1218 | ||
|
|
35a0b32553 | ||
|
|
641346c15c | ||
|
|
ebff5ba514 | ||
|
|
77677e205e | ||
|
|
2af9a7146d | ||
|
|
7d9b7394dd | ||
|
|
589dc083a5 | ||
|
|
9ca6728217 | ||
|
|
e634b75754 | ||
|
|
5137a198f9 | ||
|
|
5990cae193 | ||
|
|
9cf261ba8b | ||
|
|
28c3575679 | ||
|
|
33b012e86b | ||
|
|
8af3ebb149 | ||
|
|
fd3b4451ec | ||
|
|
a634efa40e | ||
|
|
4feff63ffa | ||
|
|
56e5425e59 | ||
|
|
e415558a4f | ||
|
|
c6d1472513 | ||
|
|
f13cf506e0 | ||
|
|
fe44e843fe | ||
|
|
efc655aec0 | ||
|
|
f3660ba9dd | ||
|
|
9906feefbd | ||
|
|
7526af5e52 | ||
|
|
b8229a7684 | ||
|
|
7bc467e872 | ||
|
|
37ac2b6657 | ||
|
|
6250f52e93 | ||
|
|
2d69a9b8bf | ||
|
|
73566ff7a9 | ||
|
|
2a75837bc3 | ||
|
|
f2d4d5c219 | ||
|
|
80b6fc592e | ||
|
|
10b0bea060 | ||
|
|
46b8c8e1da | ||
|
|
be25e78b07 | ||
|
|
b2f472a2b1 | ||
|
|
52fbe1e10c | ||
|
|
8abf808854 | ||
|
|
f7a9d42592 | ||
|
|
0f1ae781d0 | ||
|
|
cc7583e036 | ||
|
|
669757a97b | ||
|
|
6d4bac8522 | ||
|
|
2e37ce01c9 | ||
|
|
22e7402ab1 | ||
|
|
8582194a4c | ||
|
|
8482933db8 | ||
|
|
0e428823f0 | ||
|
|
56d718b2a1 | ||
|
|
b53fa9514f | ||
|
|
686fde7e52 | ||
|
|
85a448d405 | ||
|
|
a613d45de9 | ||
|
|
19f1216e72 | ||
|
|
7af6931fb5 | ||
|
|
470c6bdca9 | ||
|
|
f1790e6d91 | ||
|
|
bf16c73260 | ||
|
|
fa53ccc74b | ||
|
|
2eb174713b | ||
|
|
1f1739d366 | ||
|
|
87168bfe8b | ||
|
|
9befb8c887 | ||
|
|
c3c9175a1c | ||
|
|
88c93a7436 | ||
|
|
9549eed0be | ||
|
|
22994607cc | ||
|
|
8feeb81af2 | ||
|
|
d1e414d813 | ||
|
|
6ba089fafb | ||
|
|
cf15b651ed | ||
|
|
74cf73f9d3 | ||
|
|
9c2335b984 | ||
|
|
1355f0f39e | ||
|
|
bbeb9f1dbb | ||
|
|
e192d417ec | ||
|
|
8c6a8edaca | ||
|
|
aa0f3047d3 | ||
|
|
6d436d7a52 | ||
|
|
cac1133bc4 | ||
|
|
8223d18088 | ||
|
|
8978ecb09c | ||
|
|
f1e377f57e | ||
|
|
cdefefc539 | ||
|
|
f94093d0fd | ||
|
|
d553135748 | ||
|
|
f2a5a77e27 | ||
|
|
6ae0086b39 | ||
|
|
326e7c7020 | ||
|
|
72b69cea4b | ||
|
|
f64d0b3f26 | ||
|
|
457659fe01 | ||
|
|
42f7ca7412 | ||
|
|
be9e952bdc | ||
|
|
ab60414122 | ||
|
|
f44b360724 | ||
|
|
c4f0927a62 | ||
|
|
b21dfbb295 | ||
|
|
42b198eb0a | ||
|
|
96dcccc80c | ||
|
|
ecd332b1b7 | ||
|
|
723dc644fa | ||
|
|
4cb47b0278 | ||
|
|
90b8d4dd36 | ||
|
|
60a882cd50 | ||
|
|
0dfafdbe59 | ||
|
|
d0888f8548 | ||
|
|
5a454173a8 | ||
|
|
7dc72daea9 | ||
|
|
2ef7450465 | ||
|
|
f6715f98f5 | ||
|
|
812b404492 | ||
|
|
61ce89a55a | ||
|
|
7efb64132d | ||
|
|
38ceab13f6 | ||
|
|
7052d43a67 | ||
|
|
da1bec121a | ||
|
|
5fe5ccac42 | ||
|
|
ac168eeb5d | ||
|
|
791cd14c8d | ||
|
|
4325a7c82d | ||
|
|
d8f6000f54 | ||
|
|
60d70c4f43 | ||
|
|
92ca422088 | ||
|
|
8cb65fe65a | ||
|
|
7656d83df5 | ||
|
|
21436f5ef7 | ||
|
|
1c4b0ebb1f | ||
|
|
05fee70211 | ||
|
|
20e5abb308 | ||
|
|
972548e3ee | ||
|
|
40b7d0bf3f | ||
|
|
39c7c1f580 | ||
|
|
b3b9468573 | ||
|
|
ba01a8302a | ||
|
|
9a8a90b52b | ||
|
|
78398d0978 | ||
|
|
6f368abe13 | ||
|
|
3146e95585 | ||
|
|
838faf147e | ||
|
|
d666e01cdf | ||
|
|
c92a8a6154 | ||
|
|
84c497292a | ||
|
|
8c22334f96 | ||
|
|
6dc133c24a | ||
|
|
160df440bc | ||
|
|
b242f1c5dd | ||
|
|
d7d0b46fc1 | ||
|
|
fc1bd06192 | ||
|
|
7d59c3acbf | ||
|
|
d96a9e0c11 | ||
|
|
23ec6b3d8f | ||
|
|
e5a59ef27c | ||
|
|
1eee09f364 | ||
|
|
6354d08359 | ||
|
|
7e5dd46cf4 | ||
|
|
e626a520ca | ||
|
|
28d1e73d2f | ||
|
|
8f0a23b631 | ||
|
|
1ebe8f4011 | ||
|
|
e46ec64690 | ||
|
|
a7ddec88d4 | ||
|
|
b763220dec | ||
|
|
81449f025a | ||
|
|
f008b22e3b | ||
|
|
ff04320c97 | ||
|
|
59de38b965 | ||
|
|
cea19fd659 | ||
|
|
a8aef599e0 | ||
|
|
0409bdfea5 | ||
|
|
b6bab59000 | ||
|
|
37bec598ea | ||
|
|
1ecb322daa | ||
|
|
e523c76cc8 | ||
|
|
4857eb441b | ||
|
|
af1ff4d3ce | ||
|
|
54ea95cca7 | ||
|
|
10906dceec | ||
|
|
686cbf3ac6 | ||
|
|
b5addf8fb8 | ||
|
|
be031989ee | ||
|
|
64ecf81a3c | ||
|
|
a4f88c7d7c | ||
|
|
9453223075 | ||
|
|
b17754f998 | ||
|
|
0b9bb082c3 | ||
|
|
077cc683e5 | ||
|
|
3df85a103a | ||
|
|
4caa2bad9d | ||
|
|
9a08160ae5 | ||
|
|
c211368734 | ||
|
|
cebdae6c92 | ||
|
|
d736cca848 | ||
|
|
3b68600f81 | ||
|
|
4f84372bc2 | ||
|
|
74afcd5328 | ||
|
|
cb49df156d | ||
|
|
776cb91785 | ||
|
|
34b6c8bd88 | ||
|
|
089baa04e8 | ||
|
|
d6ff5c6f75 | ||
|
|
0f563111a2 | ||
|
|
4660bc1c78 | ||
|
|
01ebb65c30 | ||
|
|
7b81903756 | ||
|
|
62f34c8e5c | ||
|
|
e91f2b7663 | ||
|
|
eb10f25025 | ||
|
|
6665557ff7 | ||
|
|
ae095cfb71 | ||
|
|
2579ae543b | ||
|
|
d1bf7919da | ||
|
|
ec8dfc8fb7 | ||
|
|
a06220682c | ||
|
|
4e88458814 | ||
|
|
857510a7c0 | ||
|
|
96528b3aab | ||
|
|
669ef82aee | ||
|
|
90c8d09098 | ||
|
|
61decd84cc | ||
|
|
bae3799bd5 | ||
|
|
a5810d61da | ||
|
|
c1a9e94068 | ||
|
|
2cdb40d709 | ||
|
|
743d18f0e4 | ||
|
|
92be29adba | ||
|
|
3b1f0fea31 | ||
|
|
a75145a2c6 | ||
|
|
634229ff45 | ||
|
|
120b00fb1a | ||
|
|
f3e14cae1e | ||
|
|
a4760e939f | ||
|
|
8cd9522526 | ||
|
|
924292f2cc | ||
|
|
c291db72e7 | ||
|
|
cc566dadd8 | ||
|
|
5b46a89230 | ||
|
|
37347bfa38 | ||
|
|
188d63fdb6 | ||
|
|
c1ec89bdaf | ||
|
|
e74ada0a73 | ||
|
|
0f2e32c017 | ||
|
|
6c26b6efbc | ||
|
|
eb8afab865 | ||
|
|
d2bb0a6f2d | ||
|
|
36526c63ef | ||
|
|
4d62e75fb2 | ||
|
|
ade45b5b99 | ||
|
|
152a012373 | ||
|
|
b70cd0c33f | ||
|
|
b2e82d16c8 | ||
|
|
55b7f1a7b3 | ||
|
|
393fee10a2 | ||
|
|
8d558777a6 | ||
|
|
86ee1f6101 | ||
|
|
f2d5d8cfac | ||
|
|
846cc6cee3 | ||
|
|
528dea988c | ||
|
|
ce5bc477ca | ||
|
|
ddfabf3133 | ||
|
|
180587bb8b | ||
|
|
a0874a7a68 | ||
|
|
9bd3986540 | ||
|
|
ba722be2ac | ||
|
|
3fd3775d35 | ||
|
|
925724c990 | ||
|
|
db22b88fea | ||
|
|
fc2f7b0df6 | ||
|
|
15b26249cc | ||
|
|
f18d454eb6 | ||
|
|
b4a93cfdde | ||
|
|
d3db770cad | ||
|
|
13dd0b88de | ||
|
|
11fe85f129 | ||
|
|
bf45ccfb40 | ||
|
|
7325413cd8 | ||
|
|
b1a29371c9 | ||
|
|
d97b977540 | ||
|
|
f0a582b218 | ||
|
|
cb4da3975e | ||
|
|
6577bbc3c5 | ||
|
|
4af2a1a3d7 | ||
|
|
47e806b084 | ||
|
|
e33558c6ce | ||
|
|
f9fdaafa04 | ||
|
|
db256ea395 | ||
|
|
2a01a03375 | ||
|
|
8bee016145 | ||
|
|
039b293092 | ||
|
|
85116643b2 | ||
|
|
de1b6cc695 | ||
|
|
0f664ef89d | ||
|
|
12bcf64ab5 | ||
|
|
89c28f9f80 | ||
|
|
f447dfc36b | ||
|
|
06d4654966 | ||
|
|
ea53d6085a | ||
|
|
2c2e872b31 | ||
|
|
5d852467a2 | ||
|
|
b624a95205 | ||
|
|
941a3dda8a | ||
|
|
c5126f51dd | ||
|
|
52a4489d65 | ||
|
|
4ad82f2e5a | ||
|
|
11ea159aa4 | ||
|
|
a6fd4533f6 | ||
|
|
40e28f6217 | ||
|
|
6a72bd62b5 | ||
|
|
bf18e584e5 | ||
|
|
172a362884 | ||
|
|
26745f28ea | ||
|
|
9007c48992 | ||
|
|
6843538f7c | ||
|
|
1b397c77fa | ||
|
|
26979cd6ef | ||
|
|
37b7df9c59 | ||
|
|
b29239506f | ||
|
|
1631e99eed | ||
|
|
30c130546e | ||
|
|
7ca9dedfd6 | ||
|
|
a377fea90f | ||
|
|
31f9c1ab5d | ||
|
|
5c4bd3ef33 | ||
|
|
f8f3b27eb3 | ||
|
|
0ae6d8be5b | ||
|
|
d7d5bf411a | ||
|
|
97f1e62b66 | ||
|
|
4243c1198f | ||
|
|
9771615f16 | ||
|
|
eb8a7a92c1 | ||
|
|
a37c9fb9d3 | ||
|
|
ccc3985cc0 | ||
|
|
f7a0328a6e | ||
|
|
1db4afd4f4 | ||
|
|
07211ecf73 | ||
|
|
e60b433efa | ||
|
|
a48e5c64b6 | ||
|
|
e9c80ea5b7 | ||
|
|
2f625f2c6f | ||
|
|
979d2000d2 | ||
|
|
12ed746477 | ||
|
|
0123411468 | ||
|
|
77f4fc473f | ||
|
|
fb70c9683c | ||
|
|
501e23ce59 | ||
|
|
560884336f | ||
|
|
5245c86f26 | ||
|
|
423ab5e2bc | ||
|
|
3e7459bbf9 | ||
|
|
2044041c6a | ||
|
|
709e4fa5d2 | ||
|
|
b8332610e6 | ||
|
|
bc510f942c | ||
|
|
24e0b1ed8d | ||
|
|
6ca816e011 | ||
|
|
363f36b904 | ||
|
|
d040a73bed | ||
|
|
b5dbc6cb98 | ||
|
|
047a1586fe | ||
|
|
7cd6cc0fd9 | ||
|
|
6551a72ec8 | ||
|
|
4b931bb913 | ||
|
|
eb435816e3 | ||
|
|
ed6201c590 | ||
|
|
0bdadea496 | ||
|
|
b75c569d7a | ||
|
|
b5faa68120 | ||
|
|
5a692ddaec | ||
|
|
e02c4b7195 | ||
|
|
e7a602fe16 | ||
|
|
51b1c1f211 | ||
|
|
a6bd7917cb | ||
|
|
38e800f70d | ||
|
|
70420272ca | ||
|
|
1d1329af23 | ||
|
|
3974895e08 | ||
|
|
8a8c0f348b | ||
|
|
ad4097e75c | ||
|
|
85ba60d5ec | ||
|
|
5e334af369 | ||
|
|
dcf115778a | ||
|
|
0cb52ee74a | ||
|
|
b250ce21b9 | ||
|
|
174464a87f | ||
|
|
1469b3212b | ||
|
|
915d69ac4c | ||
|
|
fb1979d7e2 | ||
|
|
b285c2a4ed | ||
|
|
f273959205 | ||
|
|
008c709dbf | ||
|
|
3b4e400333 | ||
|
|
92c8bd4b1f | ||
|
|
c75ae6c585 | ||
|
|
21f4f49c7a | ||
|
|
1b28b26682 | ||
|
|
441f8b5a4b | ||
|
|
2d6113de09 | ||
|
|
f2ae2a7ff2 | ||
|
|
bf325d3859 | ||
|
|
892888ed9e | ||
|
|
fb5301cf6e | ||
|
|
0be8f8716c | ||
|
|
37b12c42b0 | ||
|
|
26823cd38b | ||
|
|
4dee08b343 | ||
|
|
df8c01604e | ||
|
|
e0a4450bbd | ||
|
|
c4de706ace | ||
|
|
b090422991 | ||
|
|
a7360f2642 | ||
|
|
0be77c3ae4 | ||
|
|
029a11030e | ||
|
|
261250e3d9 | ||
|
|
d5b0e275e3 | ||
|
|
ea1ea0224c | ||
|
|
e971f17bb8 | ||
|
|
bb448ae66f | ||
|
|
7628f3a6fc | ||
|
|
b125388152 | ||
|
|
e594e63bb5 | ||
|
|
3a96dd023f | ||
|
|
80762583c2 | ||
|
|
5b96915c69 | ||
|
|
4cb1f36896 | ||
|
|
e823c908ea | ||
|
|
23bb870046 | ||
|
|
cef18c94e2 | ||
|
|
c81a2aabbf | ||
|
|
c7c0219f8a | ||
|
|
5f00fe905c | ||
|
|
fa5bd0ab10 | ||
|
|
c7c1f56ce6 | ||
|
|
0c28f5dea6 | ||
|
|
6bcd5ce047 | ||
|
|
5472528202 | ||
|
|
e4da1a54cf | ||
|
|
e085e6a768 | ||
|
|
fae1efaad4 | ||
|
|
070daf4126 | ||
|
|
a0dfe090b9 | ||
|
|
f75e964d49 | ||
|
|
091dd226d6 | ||
|
|
ded09dc727 | ||
|
|
ad49cec194 | ||
|
|
1a84bce0f4 | ||
|
|
1bf449d752 | ||
|
|
dbc94efdb5 | ||
|
|
d60767d393 | ||
|
|
20544977da | ||
|
|
a0df747325 | ||
|
|
426fda1d52 | ||
|
|
1683cb0ec9 | ||
|
|
f9026e8a7a | ||
|
|
e1ad7d69b9 | ||
|
|
e24717bca0 | ||
|
|
e10b11a5d0 | ||
|
|
443bb3d522 | ||
|
|
30ff675f02 | ||
|
|
da6a40e3d1 | ||
|
|
0dd007e9ba | ||
|
|
e2fa1ca5e1 | ||
|
|
553e672777 | ||
|
|
bfb1531352 | ||
|
|
af65e1c0a0 | ||
|
|
60fc0b086f | ||
|
|
f241bb72f5 | ||
|
|
602f57da38 | ||
|
|
2889372e47 | ||
|
|
c04062cb0f | ||
|
|
e14dcd0789 | ||
|
|
05a6f243f8 | ||
|
|
f146a6d45a | ||
|
|
a1393dc70c | ||
|
|
d8af401b2c | ||
|
|
2ee472b9c7 | ||
|
|
5759d94b5c | ||
|
|
f7c7f422c6 | ||
|
|
8fca90b5d5 | ||
|
|
f443c7e5b0 | ||
|
|
23713d5dee | ||
|
|
9017093f58 | ||
|
|
000e78144c | ||
|
|
97e06b0a0d | ||
|
|
18c981b996 | ||
|
|
c74787a11c | ||
|
|
09a750e866 | ||
|
|
a1c9ac7845 | ||
|
|
2509c44078 | ||
|
|
9590c932ec | ||
|
|
ba7cdce46d | ||
|
|
a630fa287e | ||
|
|
632562f5cf | ||
|
|
c330dcd3fd | ||
|
|
e2815408fd | ||
|
|
2b36d4c9d7 | ||
|
|
6dc1d6e568 | ||
|
|
a53714acd3 | ||
|
|
a0874d9b64 | ||
|
|
6c41d87a9d | ||
|
|
d0bf7df5ba | ||
|
|
0b9c59ff22 | ||
|
|
f7e96dc068 | ||
|
|
a2d0e2d807 | ||
|
|
0b0c5672c8 | ||
|
|
ff28080091 | ||
|
|
1410aa1824 | ||
|
|
a925473995 | ||
|
|
98c71c6a0d | ||
|
|
37a4ea046d | ||
|
|
dcdffabfe6 | ||
|
|
8ed9f9d49f | ||
|
|
d36ec905b1 | ||
|
|
92bf5c88e6 | ||
|
|
335df895b9 | ||
|
|
fccb28d2e9 | ||
|
|
ab6954e942 | ||
|
|
bbc7844021 | ||
|
|
eee37b857b | ||
|
|
6a3a3964b0 | ||
|
|
5bb6753f2e | ||
|
|
f111cd66ce | ||
|
|
1016e31fc7 | ||
|
|
b3a0b1489b | ||
|
|
28da285031 | ||
|
|
2ca3beb9d3 | ||
|
|
f352a741d3 | ||
|
|
c4f9cd3559 | ||
|
|
f14a53abd0 | ||
|
|
4652d70572 | ||
|
|
129757b967 | ||
|
|
ff7d68d743 | ||
|
|
ac4ea522cb | ||
|
|
4bf16b79e6 | ||
|
|
818b1730a9 | ||
|
|
2fa0971ceb | ||
|
|
3597687453 | ||
|
|
372db835f4 | ||
|
|
3545b144f1 | ||
|
|
bf14f4be22 | ||
|
|
f852369986 | ||
|
|
0e9081b973 | ||
|
|
0f64274145 | ||
|
|
6fa3687afc | ||
|
|
9ea5eacf91 | ||
|
|
1a2acc3baa | ||
|
|
fa4ac279a7 | ||
|
|
ade7ed7c5f | ||
|
|
a9b7752b9d | ||
|
|
114d6b2f97 | ||
|
|
8eefc62833 | ||
|
|
dd4a1672a7 | ||
|
|
bd82cffd0b | ||
|
|
1e1f939817 | ||
|
|
e3caf669b0 | ||
|
|
34d581f2dc | ||
|
|
3feb3ce283 | ||
|
|
327692ed9d | ||
|
|
9d0d77de1f | ||
|
|
5cc94c17f6 | ||
|
|
753fea5d65 | ||
|
|
b6063d9a93 | ||
|
|
095f7c83fc | ||
|
|
d6fc0bdc75 | ||
|
|
ea67a89d63 | ||
|
|
291ded52ac | ||
|
|
abc5c134a3 | ||
|
|
380c165339 | ||
|
|
25c5aa5869 | ||
|
|
aa1f4af109 | ||
|
|
9b0f747d3f | ||
|
|
2c7676d371 | ||
|
|
0045ea662f | ||
|
|
ebe0150635 | ||
|
|
bb1f277db1 | ||
|
|
55c91ae782 | ||
|
|
47960b0659 | ||
|
|
3c333c53f1 | ||
|
|
efe7e245b2 | ||
|
|
16a3f9e393 | ||
|
|
b458d7447c | ||
|
|
ba271f6569 | ||
|
|
1d088c637c | ||
|
|
7ddfd3054d | ||
|
|
597a7c615c | ||
|
|
1ddff14511 | ||
|
|
f2f2572fed | ||
|
|
5ddc2e09b1 | ||
|
|
8d48798f1c | ||
|
|
551fe3dd69 | ||
|
|
a851aa4cf1 | ||
|
|
cf3a272332 | ||
|
|
84d72fd92f | ||
|
|
0ae7092ba4 | ||
|
|
84c6a98374 | ||
|
|
9fc8ead842 | ||
|
|
7cfe3ef046 | ||
|
|
22ad9094e6 | ||
|
|
b5eac78b43 | ||
|
|
59f4f1d7ff | ||
|
|
f0199a17f6 | ||
|
|
1c792389e6 | ||
|
|
fc2266130b | ||
|
|
e8fb93e34f | ||
|
|
5e2a8ebabf | ||
|
|
933df2606a | ||
|
|
e52ca85711 | ||
|
|
4251eb26ec | ||
|
|
f20d872643 | ||
|
|
dda4ec93be | ||
|
|
7f1dca8cd2 | ||
|
|
fd95b6ee26 | ||
|
|
4650486b8e | ||
|
|
c4ad608870 | ||
|
|
0920950d5e | ||
|
|
0a6ca01991 | ||
|
|
cef5f45de2 | ||
|
|
d3ff5b91e1 | ||
|
|
b6a0355568 | ||
|
|
7abf185390 | ||
|
|
e6a7723f2f | ||
|
|
38a90882a4 | ||
|
|
c18cb1b192 | ||
|
|
159bcbfdbc | ||
|
|
3289892cd3 | ||
|
|
737c8bee16 | ||
|
|
e2de82543b | ||
|
|
0b897c45d2 | ||
|
|
8f6c3b5c20 | ||
|
|
bb396ed8fc | ||
|
|
4a6cf7ecaf | ||
|
|
b03e7bf28f | ||
|
|
ee6e88fdb5 | ||
|
|
f7dd8d5e81 | ||
|
|
f2985f7080 | ||
|
|
c6f4b93f2e | ||
|
|
02b4b2ed6e | ||
|
|
f556d6ee90 | ||
|
|
d7d40b3c56 | ||
|
|
2f746e9946 | ||
|
|
14f8065843 | ||
|
|
f927beb5e2 | ||
|
|
6409b1d1a4 | ||
|
|
f91c51467a | ||
|
|
8baae9d982 | ||
|
|
8f2b642415 | ||
|
|
bcf9d20d57 | ||
|
|
6479f63091 | ||
|
|
2e6d8e1321 | ||
|
|
55f5d0f777 | ||
|
|
2a069e76a5 | ||
|
|
6ed4206f87 | ||
|
|
88f409aec9 | ||
|
|
fe2ed4bf72 | ||
|
|
51dd13b8a0 | ||
|
|
56e4066f4f | ||
|
|
488b7a4041 | ||
|
|
64f98f4d0f | ||
|
|
5e8ef00497 | ||
|
|
069a88dad7 | ||
|
|
76890672a0 | ||
|
|
aa47af7fb6 | ||
|
|
f8cf87ce34 | ||
|
|
17d740299a | ||
|
|
8b1e269e58 | ||
|
|
e26fbfd1d7 | ||
|
|
7623957f80 | ||
|
|
5ac5cbeab7 | ||
|
|
4fc8b8229e | ||
|
|
232ef55c1a | ||
|
|
707cc66362 | ||
|
|
198b6c9bdd | ||
|
|
81e22ae8c7 | ||
|
|
067e15d348 | ||
|
|
8309d0dade | ||
|
|
f2c307557a | ||
|
|
29564d73bd | ||
|
|
c4491352b3 | ||
|
|
bc2c13ede1 | ||
|
|
cc1f2c131b | ||
|
|
ddec9cb369 | ||
|
|
3a1eaf2efc | ||
|
|
dac86b61ee | ||
|
|
4c45611a2b | ||
|
|
4d22e15308 | ||
|
|
393a0f99da | ||
|
|
77f4743199 | ||
|
|
0db22eadd5 | ||
|
|
27217c621b | ||
|
|
4798b1d04d | ||
|
|
20b832cfc1 | ||
|
|
5728e42634 | ||
|
|
2ca548bbe5 | ||
|
|
d30d6f81aa | ||
|
|
ca5a8966ac | ||
|
|
acc83a1c32 | ||
|
|
d25a37966d | ||
|
|
4c9b80cee3 | ||
|
|
38a964735f | ||
|
|
c135317de1 | ||
|
|
6e7e767645 | ||
|
|
b5e3599704 | ||
|
|
960578f4e1 | ||
|
|
e4e962bc7c | ||
|
|
d27cb1dedc | ||
|
|
cda7210fad | ||
|
|
a89471621b | ||
|
|
2427a5e976 | ||
|
|
7524a55133 | ||
|
|
63e8174caa | ||
|
|
9dc43d3720 | ||
|
|
a7cd452ea1 | ||
|
|
ba20dd9b61 | ||
|
|
3e4cc6b3d2 | ||
|
|
3faa675d6b | ||
|
|
1490f14ab4 | ||
|
|
2f3c1bdfb4 | ||
|
|
d467b5ce4f | ||
|
|
1abb98202c | ||
|
|
bdb6956879 | ||
|
|
5a4e1b469d | ||
|
|
f50dcc88bf | ||
|
|
351b5d23f4 | ||
|
|
fb9e856b91 | ||
|
|
0e03257393 | ||
|
|
40b0ea1086 | ||
|
|
f2b9be9bd3 | ||
|
|
7f27be1521 | ||
|
|
ac9f937477 | ||
|
|
945f554b84 | ||
|
|
ec9130de8d | ||
|
|
f00ada3363 | ||
|
|
bde54333df | ||
|
|
905fc92ce1 | ||
|
|
5ff3206207 | ||
|
|
f4e98ecf3f | ||
|
|
17fccb8c5d | ||
|
|
16df1f8078 | ||
|
|
016307ae65 | ||
|
|
5b1edc6ae7 | ||
|
|
5dea1faedd | ||
|
|
b7b2627b37 | ||
|
|
fb952c399e | ||
|
|
c96acc1941 | ||
|
|
07ab936f12 | ||
|
|
da995a4377 | ||
|
|
ac2ed18a3b | ||
|
|
7eeb6d9608 | ||
|
|
efcab1e918 | ||
|
|
1238e48c58 | ||
|
|
0f28ed9ce8 | ||
|
|
2589c30cbe | ||
|
|
77fd4f4237 | ||
|
|
e53cd12c42 | ||
|
|
031fc3a460 | ||
|
|
d0e4d1182b | ||
|
|
942f70951d | ||
|
|
327b23e4ce | ||
|
|
3bbd35dde9 | ||
|
|
7402001787 | ||
|
|
db33d7668e | ||
|
|
aa05d36823 | ||
|
|
dd4582f85d | ||
|
|
fd3d56740e | ||
|
|
143bc8713d | ||
|
|
926e18d25c | ||
|
|
4e7092881f | ||
|
|
643e590b5c | ||
|
|
1e5644935d | ||
|
|
f1ee7e4e0e | ||
|
|
dcb8113347 | ||
|
|
963aedd8cc | ||
|
|
a2d474386c | ||
|
|
406907d570 | ||
|
|
42edd7911e | ||
|
|
cef0f5b5a7 | ||
|
|
6edb024d38 | ||
|
|
ebbb55ec8f | ||
|
|
deb83c9fc5 | ||
|
|
17b29d8865 | ||
|
|
a2d69adad1 | ||
|
|
a5cd925a95 | ||
|
|
934b8ffcf8 | ||
|
|
823d58ac9b | ||
|
|
5a3ed81d9a | ||
|
|
18bf4acb9b | ||
|
|
998390ac1a | ||
|
|
5719467add | ||
|
|
386112da32 | ||
|
|
f9bcf89510 | ||
|
|
007815647c | ||
|
|
56656b75ab | ||
|
|
cd778cf991 | ||
|
|
41c03f481a | ||
|
|
1840685ee8 | ||
|
|
6ad2a7aeb2 | ||
|
|
2061d2014d | ||
|
|
d098d941d7 | ||
|
|
63d3dd5262 | ||
|
|
e8a960f6a1 | ||
|
|
43558dc40a | ||
|
|
bc48e2bda6 | ||
|
|
a09602d6f6 | ||
|
|
ab900f8a25 | ||
|
|
c67dae54b9 | ||
|
|
9f2ad62084 | ||
|
|
4a150a8f3c | ||
|
|
c4bcd5c4ac | ||
|
|
65d94857c3 | ||
|
|
006e6a7f4a | ||
|
|
093aa35c87 | ||
|
|
733c8890aa | ||
|
|
0229983ff2 | ||
|
|
4ebdb7e3e1 | ||
|
|
74b3f0faa7 | ||
|
|
258694996f | ||
|
|
2d387d95a8 | ||
|
|
26ea6b9546 | ||
|
|
5e9f1ec096 | ||
|
|
f1709b8b59 | ||
|
|
6f71fb2954 | ||
|
|
d3f4fd1777 | ||
|
|
d0d49bb951 | ||
|
|
84e78790ab | ||
|
|
774d3112af | ||
|
|
8d529a5cda | ||
|
|
7cde5b83bc | ||
|
|
1f286b72a1 | ||
|
|
c4e4fa53d9 | ||
|
|
c0d9e4e435 | ||
|
|
fc4591fa49 | ||
|
|
4088afe23c | ||
|
|
0edc986861 | ||
|
|
c93c5a72bb | ||
|
|
61a2fe8c3b | ||
|
|
0aee903ada | ||
|
|
d2c39bdb29 | ||
|
|
45d941d62e | ||
|
|
00f0c77570 | ||
|
|
29d809b6e1 | ||
|
|
dd8887c8cf | ||
|
|
100f5f4131 | ||
|
|
5234f2d287 | ||
|
|
a088ebe903 | ||
|
|
61687840bc | ||
|
|
bdad00c73f | ||
|
|
17ce07943d | ||
|
|
efc8179747 | ||
|
|
8a1f96011d | ||
|
|
2600633b89 | ||
|
|
ba7f213655 | ||
|
|
4f0f88bc6a | ||
|
|
8634b8cb83 | ||
|
|
2d8097eecc | ||
|
|
647157f99f | ||
|
|
4d5e42240c | ||
|
|
7acc5c8f30 | ||
|
|
018191c1f0 | ||
|
|
2ce61344d6 | ||
|
|
e2cb7d7833 | ||
|
|
0423a38ab5 | ||
|
|
ed210c32b3 | ||
|
|
8efeb6ee2b | ||
|
|
2eceee3a4c | ||
|
|
009b15b3aa | ||
|
|
c5e7e0fa26 | ||
|
|
c19afd2118 | ||
|
|
0a33d915f8 | ||
|
|
073653e858 | ||
|
|
68c00ee771 | ||
|
|
e27d824768 | ||
|
|
c46b3dec63 | ||
|
|
6034399bf9 | ||
|
|
35e979f041 | ||
|
|
0c22e52f52 | ||
|
|
e3e4f27447 | ||
|
|
e5a7f2ef29 | ||
|
|
5b136aa211 | ||
|
|
cf5b8483fc | ||
|
|
f32309400c | ||
|
|
aea9a91100 | ||
|
|
589b642790 | ||
|
|
b25f19ac26 | ||
|
|
5af117e00c | ||
|
|
3174bfd50c | ||
|
|
e279a6955e | ||
|
|
4ba5acdaff | ||
|
|
d171409f29 | ||
|
|
77b7cec8af | ||
|
|
0820c99462 | ||
|
|
4623415026 | ||
|
|
743b0e71d9 | ||
|
|
d3b7f57b2b | ||
|
|
a0b30189e5 | ||
|
|
593ec7fa74 | ||
|
|
b230913c2b | ||
|
|
27be446049 | ||
|
|
e5f8df8088 | ||
|
|
972b289c78 | ||
|
|
ec15e485c9 | ||
|
|
d4cadf11fc | ||
|
|
ed2ff8df85 | ||
|
|
bbe57a66ca | ||
|
|
8a73eb8024 | ||
|
|
99079cc906 | ||
|
|
34d491295c | ||
|
|
79317b63d9 | ||
|
|
82210ab480 | ||
|
|
0c9c97e5ea | ||
|
|
4b8ba4551a | ||
|
|
ef421696e3 | ||
|
|
fefa645ec7 | ||
|
|
c96d143135 | ||
|
|
75affa13f7 | ||
|
|
0fbe0634a7 | ||
|
|
5dd31f204a | ||
|
|
9ca3a2d461 | ||
|
|
609023ceaf | ||
|
|
2de470c9b2 | ||
|
|
f1798c1db6 | ||
|
|
1323ab2f5f | ||
|
|
6c8857d2bb | ||
|
|
050e9be15b | ||
|
|
f68f37b520 | ||
|
|
19acec351c | ||
|
|
4ab8692475 | ||
|
|
d7ab4fd53d | ||
|
|
282195b450 | ||
|
|
d7d6975af0 | ||
|
|
f775a3781b | ||
|
|
5c6e13a171 | ||
|
|
0647f86649 | ||
|
|
0987783699 | ||
|
|
93aa14e345 | ||
|
|
a879984c06 | ||
|
|
7166fdc490 | ||
|
|
9a0405858a | ||
|
|
0e754875d1 | ||
|
|
75ee2f8c67 | ||
|
|
3d75e3cd07 | ||
|
|
29bb82cb8e | ||
|
|
dd5c15abd0 | ||
|
|
fb13bfe693 | ||
|
|
5a31552764 | ||
|
|
83b382a036 | ||
|
|
c3ea6f4ddb | ||
|
|
793339b73a | ||
|
|
3b4f134c08 | ||
|
|
20b622ec89 | ||
|
|
f784595a61 | ||
|
|
51750dc8f5 | ||
|
|
d9305b0a07 | ||
|
|
5f72aade77 | ||
|
|
e40c23463f | ||
|
|
2b1654ad9b | ||
|
|
1f70365faa | ||
|
|
01013689b8 | ||
|
|
b4c53b1e59 | ||
|
|
37fe84c512 | ||
|
|
af7f5bef8d | ||
|
|
5872abeab9 | ||
|
|
a62df98686 | ||
|
|
4dd8a831bd | ||
|
|
958e81404b | ||
|
|
d7ce7aa527 | ||
|
|
ae2fab4a0e | ||
|
|
45cb3edb62 | ||
|
|
946b62c03d | ||
|
|
708686b6d4 | ||
|
|
6ace08aa0c | ||
|
|
dc1e04137c | ||
|
|
3c37ee434a | ||
|
|
8b833d3a97 | ||
|
|
2240cb2eb0 | ||
|
|
52da9de5c4 | ||
|
|
48b6c98d31 | ||
|
|
50ce19b3ff | ||
|
|
702439b519 | ||
|
|
94d23b480e | ||
|
|
ddd8709e14 | ||
|
|
3d801be97d | ||
|
|
26af2b644c | ||
|
|
51f92f0e4e | ||
|
|
8ce1ec7ffa | ||
|
|
1410bd3bd0 | ||
|
|
3925f4ff63 | ||
|
|
0dfad003dc | ||
|
|
eac57e29c1 | ||
|
|
f672c7bd24 | ||
|
|
8b36777731 | ||
|
|
13d46f6820 | ||
|
|
32789a70fb | ||
|
|
cc7f1155a8 | ||
|
|
d989102c9c | ||
|
|
691f069743 | ||
|
|
09c3e444d4 | ||
|
|
7ed97fb89a | ||
|
|
49b10339bf | ||
|
|
bd8c80a7b4 | ||
|
|
257e7afb79 | ||
|
|
96b0e9476b | ||
|
|
d9a904f9cb | ||
|
|
6219654ded | ||
|
|
26b68313b9 | ||
|
|
4b14e17b18 | ||
|
|
01667d9a35 | ||
|
|
58ae94af4c | ||
|
|
30ab0fa45d | ||
|
|
48470e57fc | ||
|
|
3f87d70f0e | ||
|
|
c88cdc9a2b | ||
|
|
d2419570b9 | ||
|
|
0c8df1046f | ||
|
|
3aa047cd1d | ||
|
|
85a83158fb | ||
|
|
1c0179ad1b | ||
|
|
f69a543110 | ||
|
|
c59bdecd23 | ||
|
|
6e5e5be736 | ||
|
|
d5d2ca8058 | ||
|
|
2a910a6d88 | ||
|
|
0e3f0120a8 | ||
|
|
f120e78b56 | ||
|
|
84fbbe2629 | ||
|
|
2500a57f3d | ||
|
|
fcec20c9ff | ||
|
|
ebdae19fd2 | ||
|
|
396a8d91a4 | ||
|
|
784b96d87f | ||
|
|
dc8479928c | ||
|
|
fe948af095 | ||
|
|
362659f009 | ||
|
|
491f5bab88 | ||
|
|
bfc454e951 | ||
|
|
dc17944ce4 | ||
|
|
8bf09b5302 | ||
|
|
a3afeb4687 | ||
|
|
f196924ddd | ||
|
|
1b95f61d82 | ||
|
|
57ce84d471 | ||
|
|
05e120a4cc | ||
|
|
85861d44b7 | ||
|
|
b7aef81cb4 | ||
|
|
d532f6b496 | ||
|
|
14085ec670 | ||
|
|
1976a2d773 | ||
|
|
1ea1affe0a | ||
|
|
8410e7891c | ||
|
|
dba91b2ecf | ||
|
|
81bb315839 | ||
|
|
519e7013be | ||
|
|
f4bb89ce73 | ||
|
|
c0262001d8 | ||
|
|
5cd3701663 | ||
|
|
722af0703e | ||
|
|
991cdda3fc | ||
|
|
c3307b41db | ||
|
|
0bbda3bab4 | ||
|
|
fed59e0714 | ||
|
|
d93cfb32fe | ||
|
|
274b925a97 | ||
|
|
bdc59c4c21 | ||
|
|
309ffc1df1 | ||
|
|
a71d6cc040 | ||
|
|
d450c44ede | ||
|
|
197a3f178e | ||
|
|
93bcd00e44 | ||
|
|
b9c857be81 | ||
|
|
d3619aaff3 | ||
|
|
8b685c4308 | ||
|
|
09063dc5bb | ||
|
|
549d0c1715 | ||
|
|
a71013cf16 | ||
|
|
dc3f6a34f8 | ||
|
|
904a319694 | ||
|
|
0ef4185644 | ||
|
|
87893e6d68 | ||
|
|
7a79fa7a90 | ||
|
|
7c934c5164 | ||
|
|
74842116b2 | ||
|
|
02702c6605 | ||
|
|
7299895b48 | ||
|
|
08ad9b36d4 | ||
|
|
2267f98941 | ||
|
|
3f515c01bc | ||
|
|
ac6853c585 | ||
|
|
474586bc53 | ||
|
|
950f6c0c20 | ||
|
|
1c9612b791 | ||
|
|
2161f52661 | ||
|
|
b2df959733 | ||
|
|
1f7ec4be9b | ||
|
|
b879d8c31b | ||
|
|
15f16e256c | ||
|
|
5b9e41bf1c | ||
|
|
15b2eec4bd | ||
|
|
7b4dcacbb2 | ||
|
|
33d17d0b62 | ||
|
|
c3c6ac38e0 | ||
|
|
50407a8dc8 | ||
|
|
3c3a6cb2af | ||
|
|
a976c2e3ba | ||
|
|
a94fb932ff | ||
|
|
e91327c86a | ||
|
|
47fcd68b01 | ||
|
|
e22b80b70f | ||
|
|
9a9e9dc375 | ||
|
|
5c743ddfa8 | ||
|
|
60c93ca3b5 | ||
|
|
c523ff2a98 | ||
|
|
f8f6722133 | ||
|
|
682b4af017 | ||
|
|
7331b79021 | ||
|
|
2117be46a8 | ||
|
|
e09e683720 | ||
|
|
2dee47c827 | ||
|
|
d63a76f4ce | ||
|
|
00c34e4df7 | ||
|
|
78b97ee364 | ||
|
|
624cd9cd98 | ||
|
|
c7125f37aa | ||
|
|
d5aa474788 | ||
|
|
f95d119dde | ||
|
|
ffda82eea5 | ||
|
|
ec3e99eec7 | ||
|
|
6fa7b1f486 | ||
|
|
ff2d1a2b74 | ||
|
|
f87bb8ba0a | ||
|
|
51f4a9fd32 | ||
|
|
e06f2705f0 | ||
|
|
8752f07e8e | ||
|
|
b48b8ed5e5 | ||
|
|
ab2eef396a | ||
|
|
457b6413e6 | ||
|
|
324c8d21a4 | ||
|
|
45c91bf87b | ||
|
|
f00e8d4b2b | ||
|
|
3687a805ec | ||
|
|
e023a4cfd0 | ||
|
|
de79b6fc48 | ||
|
|
87c07643ff | ||
|
|
ecf6ecf325 | ||
|
|
f0b9bc14b6 | ||
|
|
f9be06b15f | ||
|
|
9cde5cbbd3 | ||
|
|
0f9274fe24 | ||
|
|
0433e6cf0b | ||
|
|
4d31874c7c | ||
|
|
ede028fe4d | ||
|
|
b836ae5c6a | ||
|
|
d6792632f0 | ||
|
|
c52754e79a | ||
|
|
8f86cc4df9 | ||
|
|
0473b59256 | ||
|
|
d5f5aeeab8 | ||
|
|
a81b9ca689 | ||
|
|
c283a8509d | ||
|
|
251457b9d5 | ||
|
|
ffa8f5c7dc | ||
|
|
7d2d6e5f78 | ||
|
|
914eb7561e | ||
|
|
ca20b1f87d | ||
|
|
54b5178f6c | ||
|
|
78f2b85fe6 | ||
|
|
7b445ddff0 | ||
|
|
e74d322724 | ||
|
|
43183db51f | ||
|
|
0c56c9f541 | ||
|
|
f99961581e | ||
|
|
765eef3319 | ||
|
|
eac4c016cb | ||
|
|
5297f5dfc9 | ||
|
|
2c482722e7 | ||
|
|
a251b323a0 | ||
|
|
ce2aee819a | ||
|
|
0637dd93b5 | ||
|
|
7139e6353f | ||
|
|
a371744575 | ||
|
|
c7ffd8a920 | ||
|
|
ba4fb4109a | ||
|
|
c6f87f7e2c | ||
|
|
f9e3824820 | ||
|
|
98b1436b8b | ||
|
|
a12571c709 | ||
|
|
ebee2513a9 | ||
|
|
57855a1701 | ||
|
|
c900c092e3 | ||
|
|
e08fcb0df4 | ||
|
|
a3ca5c8e4e | ||
|
|
3d9fbffbab | ||
|
|
64b6a7c006 | ||
|
|
7d56e88369 | ||
|
|
8df4283b19 | ||
|
|
3a4a424b70 | ||
|
|
63557e3fc1 | ||
|
|
07cc781163 | ||
|
|
d24d047d45 | ||
|
|
552018c50a | ||
|
|
e85b22320a | ||
|
|
eea08f281d | ||
|
|
eb231cb19d | ||
|
|
dc338ccecf | ||
|
|
08e09184df | ||
|
|
81d3462a19 | ||
|
|
ab4b27f0f5 | ||
|
|
1104913a8f | ||
|
|
0aef634a54 | ||
|
|
660499ac01 | ||
|
|
99695d03d2 | ||
|
|
59b268de35 | ||
|
|
5f33d2cf07 | ||
|
|
31d49e0109 | ||
|
|
e936f5952c | ||
|
|
896e5009ae | ||
|
|
a2c84d5779 | ||
|
|
8e1768cf1d | ||
|
|
031a9c57bb | ||
|
|
859c36c269 | ||
|
|
201a7af92a | ||
|
|
ade0889519 | ||
|
|
80abe6eb08 | ||
|
|
f50a32bfce | ||
|
|
c106f71beb | ||
|
|
2e5e7d9be0 | ||
|
|
a316fbb15a | ||
|
|
6a28f46844 | ||
|
|
30a01584f2 | ||
|
|
8e905b3af6 | ||
|
|
068bd6f728 | ||
|
|
e054e55ca2 | ||
|
|
080a2d719c | ||
|
|
64068583fb | ||
|
|
fddd243b17 | ||
|
|
1ebaaf9bb1 | ||
|
|
aa84cab4e9 | ||
|
|
ca17df5757 | ||
|
|
2be17a0c6e | ||
|
|
b3b3dd7591 | ||
|
|
3873b36db3 | ||
|
|
c084fc824c | ||
|
|
314ce5e505 | ||
|
|
9a35d1fb4a | ||
|
|
8fc9c03126 | ||
|
|
8ab6f26c09 | ||
|
|
86ea7995ad | ||
|
|
51ee2d2eb1 | ||
|
|
5edff287b6 | ||
|
|
0c2fab4401 | ||
|
|
d77279a415 | ||
|
|
324c21c922 | ||
|
|
98923ab6e5 | ||
|
|
af258584d9 | ||
|
|
87de1ca968 | ||
|
|
a03f9b6fb6 | ||
|
|
f4d364a60e | ||
|
|
6542c60602 | ||
|
|
d895bc1543 | ||
|
|
d014873916 | ||
|
|
edf30d84cc | ||
|
|
693cca8f1f | ||
|
|
7dde13f875 | ||
|
|
7a7488a0bb | ||
|
|
3a45eacb16 | ||
|
|
960297e577 | ||
|
|
a39144050b | ||
|
|
af37dd0d52 | ||
|
|
e5599ed300 | ||
|
|
ff0fa86b17 | ||
|
|
f40fabd688 | ||
|
|
501d0bc5ed | ||
|
|
6fe0cb671d | ||
|
|
1643786c04 | ||
|
|
bd9ac24631 | ||
|
|
5c8beca792 | ||
|
|
6cccdcacd2 | ||
|
|
6d49e4621c | ||
|
|
416faa20d1 | ||
|
|
03631f9b8f | ||
|
|
6f6af6928f | ||
|
|
d299f7ed28 | ||
|
|
64da2bf0cd | ||
|
|
5389dedfa1 | ||
|
|
f8a11a664f | ||
|
|
18b517e236 | ||
|
|
193ea9df29 | ||
|
|
32b1d8ebb0 | ||
|
|
1308afe2c2 | ||
|
|
4e01e9ffc5 | ||
|
|
0d8bd3ba36 | ||
|
|
ac2de12ed8 | ||
|
|
d261984f54 | ||
|
|
abf8dcd700 | ||
|
|
5679d066b5 | ||
|
|
0fb6d2a247 | ||
|
|
9005cda664 | ||
|
|
f72bd57212 | ||
|
|
1bd0cf542f | ||
|
|
42a50da76b | ||
|
|
d474d117f6 | ||
|
|
5864cb7e00 | ||
|
|
9b4187974b | ||
|
|
7e756faaba | ||
|
|
6c6d99ca51 | ||
|
|
f6eb62d062 | ||
|
|
996f14f757 | ||
|
|
ae7a82fa1c | ||
|
|
5a7306d6df | ||
|
|
4311297eb1 | ||
|
|
2f8e8e1455 | ||
|
|
9cfebb9334 | ||
|
|
86ecbdfa4d | ||
|
|
feecc76333 | ||
|
|
1ec1325117 | ||
|
|
75e5d0a6a0 | ||
|
|
0a52e1f587 | ||
|
|
fc9cc21024 | ||
|
|
4c98113b57 | ||
|
|
006fe5fc0f | ||
|
|
976bacf5f7 | ||
|
|
0f941d0245 | ||
|
|
21b040bd8c | ||
|
|
da2400a601 | ||
|
|
3c3831906b | ||
|
|
d5b983a8c0 | ||
|
|
47ca79ba4b | ||
|
|
aef4630102 | ||
|
|
6d5f2a3cff | ||
|
|
5587383eb7 | ||
|
|
1357724cd9 | ||
|
|
769f4a7018 | ||
|
|
8ea5e7dfb5 | ||
|
|
a286b61f75 | ||
|
|
282a2ad539 | ||
|
|
6abc6003f5 | ||
|
|
8e9b33a34a | ||
|
|
0a31e373f1 | ||
|
|
5b7f86708c | ||
|
|
d192fb066d | ||
|
|
c549c36076 | ||
|
|
6970b7d3d5 | ||
|
|
920d2cf41d | ||
|
|
7d7849d71a | ||
|
|
1a6cd7eb4b | ||
|
|
8043a35cf9 | ||
|
|
14b4d971a4 | ||
|
|
d2182568ad | ||
|
|
aa4d4ff23c | ||
|
|
75cbfeee58 | ||
|
|
4cb2995c61 | ||
|
|
55946cdc11 | ||
|
|
24d064e830 | ||
|
|
e311398a22 | ||
|
|
f5e839066a | ||
|
|
07411fb631 | ||
|
|
9da1534237 | ||
|
|
0176e2786f | ||
|
|
5d5dd66d92 | ||
|
|
7a77b8356c | ||
|
|
b242bdf945 | ||
|
|
9b66e0dc8b | ||
|
|
f74652d2fe | ||
|
|
5fc8eb227a | ||
|
|
f3f7018c9e | ||
|
|
678d15761f | ||
|
|
5ec1140f8b | ||
|
|
6d02fe39f5 | ||
|
|
696cb197a5 | ||
|
|
a6e76c0903 | ||
|
|
15d0e98267 | ||
|
|
17ecf0d1a2 | ||
|
|
7e0d6903ff | ||
|
|
7e1b76d406 | ||
|
|
aab41604f7 | ||
|
|
691a42fe98 | ||
|
|
387d935a54 | ||
|
|
d8aa2460ef | ||
|
|
c1f0044a4b | ||
|
|
49bfe9bf91 | ||
|
|
4e971f44a2 | ||
|
|
8b94422e3e | ||
|
|
7d106eff10 | ||
|
|
594bd182b4 | ||
|
|
15d21c0dc5 | ||
|
|
eb2d6e4015 | ||
|
|
73624b4721 | ||
|
|
22995bd9bf | ||
|
|
4c235955cf | ||
|
|
90243c56fb | ||
|
|
84ade0713c | ||
|
|
e3a8292495 | ||
|
|
111275bfbd | ||
|
|
a86d7cacc1 | ||
|
|
90501f20e6 | ||
|
|
a442ee07f4 | ||
|
|
251f29dd7f | ||
|
|
2403e86cbb | ||
|
|
d00e2340c6 | ||
|
|
47ff008817 | ||
|
|
0cf15f64ef | ||
|
|
fda578e19d | ||
|
|
2f76dc6758 | ||
|
|
27ce3b3f51 | ||
|
|
dda9ffe790 | ||
|
|
1ecee38468 | ||
|
|
c379b22117 | ||
|
|
a47f149e07 | ||
|
|
2929b67c5f | ||
|
|
ff6db69c60 | ||
|
|
e8b2fd4a18 | ||
|
|
12f72a6597 | ||
|
|
61992170ac | ||
|
|
dc4217589b | ||
|
|
591ffad670 | ||
|
|
15c907317c | ||
|
|
28de7f584e | ||
|
|
555907ce8d | ||
|
|
599dc2bbb5 | ||
|
|
656a442433 | ||
|
|
c6709d97bc | ||
|
|
bbffa6ad69 | ||
|
|
e16541e47c | ||
|
|
ef6873980e | ||
|
|
df81fa11fc | ||
|
|
01a1555b5d | ||
|
|
913f7ee524 | ||
|
|
0964a3ff53 | ||
|
|
4c9ed98084 | ||
|
|
9572652ddc | ||
|
|
67c657bf80 | ||
|
|
205e8f9f9e | ||
|
|
39d4994c15 | ||
|
|
60f2587eac | ||
|
|
040b7386a9 | ||
|
|
41ec40e9aa | ||
|
|
2850a22359 | ||
|
|
fdd7e9e86a | ||
|
|
aacc3a4a59 | ||
|
|
d051bd3032 | ||
|
|
efdff9ad3e | ||
|
|
57a5fc40c0 | ||
|
|
562f36a144 | ||
|
|
3268cab26b | ||
|
|
bab30bcd6e | ||
|
|
22f3a7e94c | ||
|
|
e46d086189 | ||
|
|
15b44fb380 | ||
|
|
14cc1ed911 | ||
|
|
bd8cc69893 | ||
|
|
14602287f7 | ||
|
|
24bd57b6bf | ||
|
|
854912ca5d | ||
|
|
7129611e65 | ||
|
|
164c15f911 | ||
|
|
6d29c20208 | ||
|
|
32dfd4b4fe | ||
|
|
142a5dc3f5 | ||
|
|
e2b63a2dd7 | ||
|
|
3e7e8daf59 | ||
|
|
1cc183703a | ||
|
|
2b422fbcc5 | ||
|
|
7805f66784 | ||
|
|
43b6cbd762 | ||
|
|
d496969c9c | ||
|
|
fd771d7a87 | ||
|
|
8d5a6110f7 | ||
|
|
4501a9eb50 | ||
|
|
23f967b0af | ||
|
|
aff35d3e58 | ||
|
|
727d508e02 | ||
|
|
3c710f9b10 | ||
|
|
8c50833445 | ||
|
|
d89e48679e | ||
|
|
d7fe2784cc | ||
|
|
3f623b2561 | ||
|
|
847fb951e2 | ||
|
|
60aa72e117 | ||
|
|
60749f2cda | ||
|
|
507e0b5989 | ||
|
|
1d45b57939 | ||
|
|
6e0319eec9 | ||
|
|
f3afe24594 | ||
|
|
ffcf7ecee9 | ||
|
|
a5a74eb121 | ||
|
|
c9d10de644 | ||
|
|
4632791a40 | ||
|
|
135aec7bea | ||
|
|
e5d417213c | ||
|
|
5f51622e9d | ||
|
|
655623ebb2 | ||
|
|
a4120ca66c | ||
|
|
bf9945b81b | ||
|
|
3ee4432fe3 | ||
|
|
db0db6a182 | ||
|
|
226c5546e2 | ||
|
|
38f4c9cce9 | ||
|
|
9dd3976f9f | ||
|
|
997af88ec6 | ||
|
|
f2c8619704 | ||
|
|
df0a81621f | ||
|
|
ad664b4a01 | ||
|
|
a1b81469a3 | ||
|
|
ff7c798d86 | ||
|
|
0ad050f85d | ||
|
|
0b7efc2be2 | ||
|
|
2efc1c9348 | ||
|
|
069e040500 | ||
|
|
35a92b4097 | ||
|
|
c6bbc41984 | ||
|
|
fa24df7340 | ||
|
|
d47605b2ed | ||
|
|
a4c5d8fd50 | ||
|
|
9045c57d6f | ||
|
|
61ec5fa776 | ||
|
|
f3ba678b81 | ||
|
|
4630209c4c | ||
|
|
6e750ae12d | ||
|
|
64ec5ac356 | ||
|
|
f531d4b810 | ||
|
|
0408f1191a | ||
|
|
06a4369f75 | ||
|
|
44d746fc92 | ||
|
|
857bf9cd09 | ||
|
|
dccadce074 | ||
|
|
aa6380e5bc | ||
|
|
a06dcfeb61 | ||
|
|
b393408496 | ||
|
|
af9a8258b9 | ||
|
|
ef47d855ce | ||
|
|
e3905cdfd8 | ||
|
|
5181b4a0df | ||
|
|
5ef90464a1 | ||
|
|
3219be8ee0 | ||
|
|
6105793843 | ||
|
|
693cbc1f8f | ||
|
|
6d24c73ea9 | ||
|
|
bbdfbe44e6 | ||
|
|
e5e3b97db2 | ||
|
|
58ee548ed8 | ||
|
|
9d7028bcfb | ||
|
|
fc6f898e0b | ||
|
|
c26b141407 | ||
|
|
80c16961ae | ||
|
|
67c982be1b | ||
|
|
87afef73b1 | ||
|
|
cb8e85a37d | ||
|
|
be01912539 | ||
|
|
acfa76aa38 | ||
|
|
f7619a9a19 | ||
|
|
abe5c6efec | ||
|
|
644fbbeb13 | ||
|
|
2faafff1b9 | ||
|
|
cbba0bec7c | ||
|
|
b1f89408dd | ||
|
|
0a7d53692a | ||
|
|
64815a8b16 | ||
|
|
b8422b24bd | ||
|
|
7e2c0c5371 | ||
|
|
aa5bb3b997 | ||
|
|
65883d9327 | ||
|
|
91dbebbcc5 | ||
|
|
1ce8cb148c | ||
|
|
2a99464ef1 | ||
|
|
2bc88032e2 | ||
|
|
b0e2e1d3f5 | ||
|
|
e815e4a6aa | ||
|
|
81d988b022 | ||
|
|
e366f60cff | ||
|
|
aeb29a1a60 | ||
|
|
6bd5f98272 | ||
|
|
39da819b55 | ||
|
|
1d2070d0d3 | ||
|
|
b25605e20f | ||
|
|
efd1c3f8c3 | ||
|
|
a950188c11 | ||
|
|
81004211dd | ||
|
|
0c447e0a06 | ||
|
|
0a1c73e396 | ||
|
|
3eb737a5f5 | ||
|
|
db151efd0a | ||
|
|
ebbba0d381 | ||
|
|
85edb851b0 | ||
|
|
e16899783d | ||
|
|
d53c9cde1a | ||
|
|
e33b938505 | ||
|
|
426c4a2a5b | ||
|
|
446d7c7e55 | ||
|
|
8986aa181d | ||
|
|
04f8d39a96 | ||
|
|
c99f47d8f0 | ||
|
|
6b7ebb3f82 | ||
|
|
f6ad3e42f0 | ||
|
|
9ea3d55243 | ||
|
|
b83e95727f | ||
|
|
f707026ac5 | ||
|
|
3aa42627a3 | ||
|
|
ff6c24932a | ||
|
|
95380d8950 | ||
|
|
d26c6b3212 | ||
|
|
9b2d643451 | ||
|
|
95b34f8081 | ||
|
|
802ef6d099 | ||
|
|
96f0e32f83 | ||
|
|
09b0564c75 | ||
|
|
b350f192bb | ||
|
|
381a5c053f | ||
|
|
89a43b8447 | ||
|
|
784c5539ea | ||
|
|
116194b147 | ||
|
|
958b978efe | ||
|
|
1400aeceac | ||
|
|
06b70d170e | ||
|
|
58852bedbf | ||
|
|
20ba5b14b4 | ||
|
|
933af7af66 | ||
|
|
de7ecee516 | ||
|
|
63e956cc7a | ||
|
|
4d89df8df2 | ||
|
|
0c0fb463f0 | ||
|
|
c928b04eee | ||
|
|
39baad9926 | ||
|
|
7eef9ebc3b | ||
|
|
5912c9c327 | ||
|
|
55f24e1cf4 | ||
|
|
96cafbe4cc | ||
|
|
caba93fa45 | ||
|
|
becb758a84 | ||
|
|
9aad2f29bb | ||
|
|
0cdf8ff102 | ||
|
|
9a627aa30b | ||
|
|
317e795d35 | ||
|
|
69a38e7b54 | ||
|
|
373a790d76 | ||
|
|
c8f8e70d31 | ||
|
|
62b105b695 | ||
|
|
964cfaea47 | ||
|
|
dd0b8047eb | ||
|
|
f746a00964 | ||
|
|
a2024d7497 | ||
|
|
e07f193aff | ||
|
|
ab67f0ffa3 | ||
|
|
f62935d278 | ||
|
|
a66c186e81 | ||
|
|
7f8c99899b | ||
|
|
38376b833e | ||
|
|
45e2fce7c0 | ||
|
|
856a1d0386 | ||
|
|
31797a242f | ||
|
|
12e92f17de | ||
|
|
8186f1271b | ||
|
|
31abe54c99 | ||
|
|
6efb710b28 | ||
|
|
c103759cdc | ||
|
|
46f78b7f19 | ||
|
|
2f0a61debf | ||
|
|
0f8be2d2cc | ||
|
|
afb5140b53 | ||
|
|
fba547b924 | ||
|
|
c6cf075b51 | ||
|
|
d7dd6c8bd1 | ||
|
|
3789de6bd9 | ||
|
|
305e63d9ea | ||
|
|
3475808a54 | ||
|
|
d622a2235b | ||
|
|
e649f5d98d | ||
|
|
4a2d1571bc | ||
|
|
557b732b43 | ||
|
|
e3f9d09b28 | ||
|
|
1351c0ce9f | ||
|
|
e66a6a2a1b | ||
|
|
6085b419e5 | ||
|
|
77bcdafc94 | ||
|
|
450c84c990 | ||
|
|
88d604383e | ||
|
|
8530a2d7df | ||
|
|
4b5b32e721 | ||
|
|
be913040a8 | ||
|
|
bf76afc68d | ||
|
|
4be68dddfb | ||
|
|
58c336b671 | ||
|
|
b12a0b753f | ||
|
|
9d8a724225 | ||
|
|
004991d79e | ||
|
|
6436d101b5 | ||
|
|
2d40891b45 | ||
|
|
6aa90e13f9 | ||
|
|
8ee230fe1c | ||
|
|
c58bc25d5b | ||
|
|
b5ca152389 | ||
|
|
5b0fe77140 | ||
|
|
b8e9af943a | ||
|
|
6dd05e610a | ||
|
|
b967a581a1 | ||
|
|
987d85a33b | ||
|
|
878562c291 | ||
|
|
d6be7ff683 | ||
|
|
dc2ee9b338 | ||
|
|
cf414db710 | ||
|
|
7ad669a911 | ||
|
|
5eeef06c10 | ||
|
|
544cebd90d | ||
|
|
c9009d39d4 | ||
|
|
6b775034dd | ||
|
|
699b2a6571 | ||
|
|
48366b1071 | ||
|
|
ea0ca17215 | ||
|
|
ba2a54a9dd | ||
|
|
cddb9bd2aa | ||
|
|
95addab57b | ||
|
|
1149e66820 | ||
|
|
1912c4691b | ||
|
|
228d8ac14a | ||
|
|
338a0f01f2 | ||
|
|
ddcf2ef32a | ||
|
|
f73c39d573 | ||
|
|
2f56125f12 | ||
|
|
2e13b7f3ca | ||
|
|
c28a48aa02 | ||
|
|
2b00bdec1f | ||
|
|
af7282b5ea | ||
|
|
0801363840 | ||
|
|
b63a4192a7 | ||
|
|
e58ad4ab51 | ||
|
|
e04e6aabbc | ||
|
|
8b00954ec7 | ||
|
|
ed8072b48b | ||
|
|
82fc075ff6 | ||
|
|
0d086616d1 | ||
|
|
fc6fa0f088 | ||
|
|
6c71858c5c | ||
|
|
f1d1049c4f | ||
|
|
19557aaab3 | ||
|
|
c4d318f691 | ||
|
|
aaa7beeda8 | ||
|
|
8e9318f20a | ||
|
|
b694423d09 | ||
|
|
a949fd5f25 | ||
|
|
d171822dce | ||
|
|
310a1c30ca | ||
|
|
c229503f4a | ||
|
|
9dfb223d26 | ||
|
|
449902b558 | ||
|
|
348c9c9ff3 | ||
|
|
01b407638c | ||
|
|
c37de30cfc | ||
|
|
0e67c21c9e | ||
|
|
781b046579 | ||
|
|
3d89dacd56 | ||
|
|
6307999116 | ||
|
|
6878ba7608 | ||
|
|
76f303538b | ||
|
|
5f3bad8fb1 | ||
|
|
bdc72d0904 | ||
|
|
603b619cbe | ||
|
|
021cb0bced | ||
|
|
bf89870437 | ||
|
|
e34fa6365f | ||
|
|
e9af70eaf3 | ||
|
|
afbef52516 | ||
|
|
b003075570 | ||
|
|
281bc90ad2 | ||
|
|
4369767c72 | ||
|
|
38c7b20475 | ||
|
|
69e2453649 | ||
|
|
7400100da7 | ||
|
|
c89e3d5951 | ||
|
|
973a6c40da | ||
|
|
c2b210f713 | ||
|
|
a15f4d1590 | ||
|
|
7497675a83 | ||
|
|
30fd5d9e96 | ||
|
|
05356543d9 | ||
|
|
0937bed8d8 | ||
|
|
5e5bb0c32e | ||
|
|
cd0b31fd73 | ||
|
|
2b93313348 | ||
|
|
3ab6d77c20 | ||
|
|
60fe45813b | ||
|
|
a43f8d2fb7 | ||
|
|
c407b6ce2f | ||
|
|
01cb800256 | ||
|
|
8b3994e9e4 | ||
|
|
a89e32b157 | ||
|
|
cfaacc07dc | ||
|
|
3933b68c59 | ||
|
|
c4cc099617 | ||
|
|
3ed5ecd67a | ||
|
|
d01d1f7e01 | ||
|
|
083d2d89a5 | ||
|
|
c1071c1ff7 | ||
|
|
0b6cc0592d | ||
|
|
f53dbafdae | ||
|
|
1b9012aea0 | ||
|
|
d29578d467 | ||
|
|
2c663fbc3e | ||
|
|
4966568076 | ||
|
|
922b31ebbd | ||
|
|
7b2d034769 | ||
|
|
9d12460901 | ||
|
|
190b1bbf1f | ||
|
|
d90d5a0ee6 | ||
|
|
6a261e825c | ||
|
|
0144b8e1da | ||
|
|
848effe9c3 | ||
|
|
ac15b3b625 | ||
|
|
483737f2e6 | ||
|
|
0ca8354464 | ||
|
|
e516a5bc96 | ||
|
|
085c8f2987 | ||
|
|
54bdba750a | ||
|
|
532dc797c9 | ||
|
|
744f4af3ab | ||
|
|
82087672b7 | ||
|
|
5e17a586da | ||
|
|
4bc961d5fd | ||
|
|
8a24214b46 | ||
|
|
6cccc36505 | ||
|
|
748856ed9e | ||
|
|
97dc9634a2 | ||
|
|
cee8df6ff0 | ||
|
|
73740d74ed | ||
|
|
23f5d5a776 | ||
|
|
fddfe946c8 | ||
|
|
29032ce9b6 | ||
|
|
8f39297c53 | ||
|
|
40599c24ea | ||
|
|
270cbb0119 | ||
|
|
282f2c8042 | ||
|
|
031443199b | ||
|
|
8376821776 | ||
|
|
d09b7a3c12 | ||
|
|
ed20141346 | ||
|
|
015d7b9779 | ||
|
|
5a531d7ec2 | ||
|
|
bbb96a392d | ||
|
|
84afaaa10c | ||
|
|
402692c08d | ||
|
|
3013f26d70 | ||
|
|
31764c48fb | ||
|
|
195fedccf0 | ||
|
|
2589a68c42 | ||
|
|
03835d04f4 | ||
|
|
da80ece8b9 | ||
|
|
56e22e6aac | ||
|
|
1ea0702eaa | ||
|
|
de9a625c7e | ||
|
|
d03e7f08ff | ||
|
|
7b33e163b9 | ||
|
|
cf81e08389 | ||
|
|
95dbc6eb0e | ||
|
|
87df493b5b | ||
|
|
644d1e7ca3 | ||
|
|
e9c209ccc8 | ||
|
|
bec9049597 | ||
|
|
84a22cb594 | ||
|
|
32f92b4a69 | ||
|
|
5e2b66d2a4 | ||
|
|
1d02eb0587 | ||
|
|
e906165229 | ||
|
|
48265fa94c | ||
|
|
b3cfcf55ea | ||
|
|
913be80782 | ||
|
|
f008dfbaca | ||
|
|
ff502a51c5 | ||
|
|
0735630744 | ||
|
|
c642dc459b | ||
|
|
434ae89a6a | ||
|
|
4179e91baf | ||
|
|
78b0d9c8b0 | ||
|
|
907c21d7fa | ||
|
|
912e53323d | ||
|
|
2732ec758d | ||
|
|
ac829f87e0 | ||
|
|
823ce62f2f | ||
|
|
f971aceac3 | ||
|
|
1f89d5d184 | ||
|
|
8de154893c | ||
|
|
161be512fd | ||
|
|
5f567a8229 | ||
|
|
43bb29edc5 | ||
|
|
1463127fad | ||
|
|
7a37dba75b | ||
|
|
bcea959910 | ||
|
|
808053cbcf | ||
|
|
2fd4f6f154 | ||
|
|
b6422038b5 | ||
|
|
a1bd909294 | ||
|
|
7c12ee9ecc | ||
|
|
3d89e0a94c | ||
|
|
af26b7a0bc | ||
|
|
5dfd2dba70 | ||
|
|
7e18bcf6e0 | ||
|
|
a06a32c05d | ||
|
|
53df67376d | ||
|
|
0c84d59a27 | ||
|
|
844b9970b4 | ||
|
|
f61c9da7d3 | ||
|
|
8c385a3fc6 | ||
|
|
a7eb6a4045 | ||
|
|
45ed9e7e5e | ||
|
|
a5ab8accc2 | ||
|
|
4195d9b3f8 | ||
|
|
74186a5f01 | ||
|
|
e663f5c914 | ||
|
|
e7b1f2ae0a | ||
|
|
0ebcff710e | ||
|
|
240a3b80d9 | ||
|
|
71edb55114 | ||
|
|
5ef2df056d | ||
|
|
c2c4faef4c | ||
|
|
bd833b8dd8 | ||
|
|
f2e7f7e101 | ||
|
|
4b5141954e | ||
|
|
2a0a86f629 | ||
|
|
a74774257e | ||
|
|
c86b9d4242 | ||
|
|
3c057bd3d8 | ||
|
|
b02a533d94 | ||
|
|
37b0aa5af7 | ||
|
|
82f3e6dc69 | ||
|
|
e3f4233cef | ||
|
|
d1f73c424f | ||
|
|
d7e346239b | ||
|
|
8a0d848646 | ||
|
|
53aa55fcaa | ||
|
|
9f66580d7e | ||
|
|
6e57389172 | ||
|
|
7411aed5c7 | ||
|
|
2e2cfa0037 | ||
|
|
c717d1551d | ||
|
|
71f6672415 | ||
|
|
2e8a7a7a08 | ||
|
|
22421528b7 | ||
|
|
2b7316a379 | ||
|
|
721475420d | ||
|
|
2706394384 | ||
|
|
04325e5980 | ||
|
|
d36eeaa3ca | ||
|
|
14af5919ba | ||
|
|
be217bca70 | ||
|
|
7c747c8c33 | ||
|
|
2599d34c96 | ||
|
|
32391cffdd | ||
|
|
87eca546b2 | ||
|
|
2ce2e05db0 | ||
|
|
ba5d0f594d | ||
|
|
2f4a1e0d59 | ||
|
|
513483f8d5 | ||
|
|
42928659e8 | ||
|
|
6ea428addf | ||
|
|
31dee93e84 | ||
|
|
addef06081 | ||
|
|
5d635986bf | ||
|
|
11a64acf23 | ||
|
|
0fae76c741 | ||
|
|
797b91a449 | ||
|
|
6e1bb58ee8 | ||
|
|
f297a59985 | ||
|
|
afd06675fa | ||
|
|
845ac621b3 | ||
|
|
1f18d64d1f | ||
|
|
7134a17fc6 | ||
|
|
bba12520c4 | ||
|
|
8cb2bc748d | ||
|
|
65d7a82db4 | ||
|
|
7e143d4422 | ||
|
|
052eacc3b9 | ||
|
|
bcaafb826e | ||
|
|
ddc54615ca | ||
|
|
a97d9613a7 | ||
|
|
57722fb192 | ||
|
|
ddfefa9007 | ||
|
|
2521171ef5 | ||
|
|
a67df5ad94 | ||
|
|
bafb7afba2 | ||
|
|
76baf84763 | ||
|
|
d06824809f | ||
|
|
09f43c0975 | ||
|
|
ca5ea5142d | ||
|
|
b58a48d796 | ||
|
|
d60a9be5c6 | ||
|
|
5114d75647 | ||
|
|
541fc80240 | ||
|
|
543192e045 | ||
|
|
751fbfdcc3 | ||
|
|
f7b4f44adf | ||
|
|
bbf92a54e5 | ||
|
|
13a8e39813 | ||
|
|
f226365f55 | ||
|
|
d91f1c0624 | ||
|
|
6c89d4ca26 | ||
|
|
1fe72dcc04 | ||
|
|
ac4f7b0fde | ||
|
|
b3af7aad9e | ||
|
|
d6e56b8c88 | ||
|
|
1ed7f3e028 | ||
|
|
5fdfd782cc | ||
|
|
13683a6a11 | ||
|
|
3972ac40ef | ||
|
|
07bfe0abbb | ||
|
|
042cc00150 | ||
|
|
b9fb46ac9d | ||
|
|
5bca1e6adf | ||
|
|
5bf8eed96c | ||
|
|
48f9bef75d | ||
|
|
ece0f050a9 | ||
|
|
ec93d6e19a | ||
|
|
60b3fc01a2 | ||
|
|
ef622a07ff | ||
|
|
8c573218b1 | ||
|
|
bc886a7a03 | ||
|
|
5dc9950772 | ||
|
|
aec28ed91e | ||
|
|
506ab06238 | ||
|
|
abe5bb4019 | ||
|
|
1fa772393b | ||
|
|
abc34ddb88 | ||
|
|
299a4ecd3e | ||
|
|
a008b28659 | ||
|
|
0d5604fdcb | ||
|
|
927b34a1e3 | ||
|
|
d5774a8e03 | ||
|
|
d3efa637b4 | ||
|
|
8a3428f16c | ||
|
|
526eb33d1e | ||
|
|
248b2993e8 | ||
|
|
1f14332047 | ||
|
|
7b72b71605 | ||
|
|
9cf1cfe3fd | ||
|
|
d7bfda3e26 | ||
|
|
f87093686e | ||
|
|
6cec330103 | ||
|
|
9205aca95c | ||
|
|
9e52aaa01d | ||
|
|
70d0d8890a | ||
|
|
fdb0f8203e | ||
|
|
2eec2c156b | ||
|
|
078969bdd0 | ||
|
|
eb26a1941e | ||
|
|
2aad510c84 | ||
|
|
623fbdd66f | ||
|
|
3244b2b79e | ||
|
|
06b3891c66 | ||
|
|
0f2005c370 | ||
|
|
47221ab1e6 | ||
|
|
87a2fd8b3f | ||
|
|
2011f9a042 | ||
|
|
2bdf9ede91 | ||
|
|
2c98275b51 | ||
|
|
f77dfb3966 | ||
|
|
c1beb2ce20 | ||
|
|
2d195ba64e | ||
|
|
8540e02176 | ||
|
|
3194f40e96 | ||
|
|
bc3f57efd0 | ||
|
|
86d5461bcd | ||
|
|
ecbad494d9 | ||
|
|
9431ee330a | ||
|
|
a962c30df1 | ||
|
|
86e29ac281 | ||
|
|
1484a23530 | ||
|
|
87e3b9ffc0 | ||
|
|
f5a49df679 | ||
|
|
d8311e8365 | ||
|
|
a813f78551 | ||
|
|
9e8383e296 | ||
|
|
51e91dfd86 | ||
|
|
b044c047c4 | ||
|
|
466e608c19 | ||
|
|
ec28f037e6 | ||
|
|
cd817be922 | ||
|
|
cc19a76656 | ||
|
|
bc59aaccb1 | ||
|
|
e0c10019a9 | ||
|
|
918ca40c68 | ||
|
|
d02c9c83f5 | ||
|
|
ba998b85a1 | ||
|
|
179ad35c2e | ||
|
|
0b6c0afeb7 | ||
|
|
5e3536f66f | ||
|
|
f05ae742a4 | ||
|
|
071510b367 | ||
|
|
58a04c0776 | ||
|
|
63c2274324 | ||
|
|
d8a78d4d9e | ||
|
|
149ea561a6 | ||
|
|
37319fb17f | ||
|
|
84959be150 | ||
|
|
e77dc4e9d2 | ||
|
|
12a11472f1 | ||
|
|
5906d8b01c | ||
|
|
68eb197494 | ||
|
|
a1a5570e97 | ||
|
|
18c1c39d5e | ||
|
|
58e9f78844 | ||
|
|
ce6a65cec9 | ||
|
|
656d824b20 | ||
|
|
bac1a6b140 | ||
|
|
0ee3e2c25e | ||
|
|
2978b5fbc8 | ||
|
|
c5a4025b65 | ||
|
|
5831fe6a60 | ||
|
|
f3cef178e3 | ||
|
|
f1ad4332ad | ||
|
|
f52d8c1a9b | ||
|
|
12390eb155 | ||
|
|
687d973980 | ||
|
|
32e279c0ca | ||
|
|
de6a2bed32 | ||
|
|
dd0e1061ef | ||
|
|
dc1b024b80 | ||
|
|
01dd833ffa | ||
|
|
4ad86a6f78 | ||
|
|
e7ebb9d36c | ||
|
|
ac0104b8b0 | ||
|
|
0fcabd2b11 | ||
|
|
c7745408f7 | ||
|
|
afd45d1d7f | ||
|
|
583d777b1a | ||
|
|
d6a5a00c24 | ||
|
|
eff10959de | ||
|
|
d8ef20c856 | ||
|
|
630a850d4d | ||
|
|
082b74fa24 | ||
|
|
76247170df | ||
|
|
fa5076eb9b | ||
|
|
455147ee95 | ||
|
|
83c214f6d8 | ||
|
|
387bd3a1e4 | ||
|
|
d1b9383d86 | ||
|
|
03c5cfead4 | ||
|
|
fa552f11ef | ||
|
|
16f39aa452 | ||
|
|
250d474280 | ||
|
|
78735e2ada | ||
|
|
3efb205a68 | ||
|
|
2f1514b904 | ||
|
|
2e7cf2f6cf | ||
|
|
78e7c77ff5 | ||
|
|
0c7da9b815 | ||
|
|
7c1f84a92b | ||
|
|
e43eb130d4 | ||
|
|
fef1462371 | ||
|
|
b3e530d005 | ||
|
|
8e6336d96b | ||
|
|
e74825e3d0 | ||
|
|
d8908aef63 | ||
|
|
46f660a789 | ||
|
|
186873420f | ||
|
|
e85c5dbb54 | ||
|
|
a796149c42 | ||
|
|
e88dc7fc6d | ||
|
|
8738963bce | ||
|
|
55461125ba | ||
|
|
0609b89f74 | ||
|
|
21ba05e5f1 | ||
|
|
a575399fbc | ||
|
|
08325e51e5 | ||
|
|
adee93d784 | ||
|
|
f3e8f42718 | ||
|
|
863730f6a7 | ||
|
|
a9fc659809 | ||
|
|
3c5ff418ca | ||
|
|
2f9eb98f03 | ||
|
|
026379ed55 | ||
|
|
e053d30bf7 | ||
|
|
ef7eb8bc4c | ||
|
|
1f18c9f8dd | ||
|
|
734f4b7041 | ||
|
|
3007d0c651 | ||
|
|
7d3a6016d6 | ||
|
|
44ef68fb48 | ||
|
|
b3e64813f5 | ||
|
|
9d6748fa94 | ||
|
|
638e47c04d | ||
|
|
96820ae42a | ||
|
|
f5144e6c10 | ||
|
|
7312894a6a | ||
|
|
32592364b8 | ||
|
|
493c432d1e | ||
|
|
33ba604fd9 | ||
|
|
2e3601f415 | ||
|
|
4cb302c8ae | ||
|
|
6a5d560c4f | ||
|
|
0aa443a871 | ||
|
|
7d0c17d2ae | ||
|
|
5b65d95310 | ||
|
|
9ae5a09655 | ||
|
|
882040fde7 | ||
|
|
5989a6ac57 | ||
|
|
840b85690b | ||
|
|
38bfbe1b2b | ||
|
|
14eca982f4 | ||
|
|
74d4bc0af1 | ||
|
|
c39b52f974 | ||
|
|
69c3021a8d | ||
|
|
e2c7954be5 | ||
|
|
a12a30c9e0 | ||
|
|
cdeeecf080 | ||
|
|
ccab02c723 | ||
|
|
306408d174 | ||
|
|
b9a9ad9742 | ||
|
|
785407d06f | ||
|
|
46b0277cbf | ||
|
|
2e5696dba4 | ||
|
|
d852c4ecc7 | ||
|
|
db97090cad | ||
|
|
b39c053785 | ||
|
|
0ee00861f6 | ||
|
|
a1942238f5 | ||
|
|
bd7e691f78 | ||
|
|
cfb354f11f | ||
|
|
094ae6fadb | ||
|
|
d67e2f78b7 | ||
|
|
ddbeebb887 | ||
|
|
4d51792285 | ||
|
|
3f69c2039d | ||
|
|
18527b9e21 | ||
|
|
642b9b5030 | ||
|
|
c0a87bc89f | ||
|
|
cd8be1846b | ||
|
|
7cd5a653ff | ||
|
|
cebf245504 | ||
|
|
6ba619f225 | ||
|
|
d1ae413ffd | ||
|
|
35f3360663 | ||
|
|
5115d0177e | ||
|
|
93f607f549 | ||
|
|
df25b047f8 | ||
|
|
66eabd326f | ||
|
|
38c87733d9 | ||
|
|
4a1db13072 | ||
|
|
0be8e1bfb6 | ||
|
|
e4ff244288 | ||
|
|
47657a1817 | ||
|
|
f48a89af8b | ||
|
|
132961b14f | ||
|
|
3b457a5876 | ||
|
|
5855cf087d | ||
|
|
4821652241 | ||
|
|
3425cfe54a | ||
|
|
5d81a2fd48 | ||
|
|
254582aa35 | ||
|
|
ff68db61bc | ||
|
|
b6c241d667 | ||
|
|
bd6131bdc0 | ||
|
|
a96502edd3 | ||
|
|
4d086a4db4 | ||
|
|
0298b7bedd | ||
|
|
48393d452c | ||
|
|
9ff23da255 | ||
|
|
1af1c5c37b | ||
|
|
cb405ad1b4 | ||
|
|
ce65925bc3 | ||
|
|
bb7eb5c574 | ||
|
|
a5f77c9886 | ||
|
|
9221e6e67a | ||
|
|
31c1bb901b | ||
|
|
ea1b04f5da | ||
|
|
75631b2a9f | ||
|
|
46663d657f | ||
|
|
d3eb63a773 | ||
|
|
aee575b24d | ||
|
|
12a9e8502c | ||
|
|
5df3afd522 | ||
|
|
13ddf60f60 | ||
|
|
8165de065b | ||
|
|
6b25e93119 | ||
|
|
bed3618480 | ||
|
|
e5606d9d6e | ||
|
|
97fe935c8a | ||
|
|
2e420aba3c | ||
|
|
428154da45 | ||
|
|
12f78c2ba6 | ||
|
|
facb2555a9 | ||
|
|
b335cce22e | ||
|
|
e663751f8b | ||
|
|
cd06f5cedb | ||
|
|
599744921d | ||
|
|
ce31184557 | ||
|
|
1fe9b0b82e | ||
|
|
4e09202226 |
20
.github/ISSUE_TEMPLATE.md
vendored
Normal file
20
.github/ISSUE_TEMPLATE.md
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
<!--
|
||||
Please keep in mind yuzu is EXPERIMENTAL SOFTWARE.
|
||||
|
||||
Please read the FAQ: https://yuzu-emu.org/wiki/faq/
|
||||
|
||||
When submitting an issue, please do the following:
|
||||
|
||||
- Provide the version (commit hash) of yuzu you are using.
|
||||
- Provide sufficient detail for the issue to be reproduced.
|
||||
- Provide:
|
||||
- For crashes, a backtrace.
|
||||
- For graphical issues, comparison screenshots with real hardware.
|
||||
- For emulation inaccuracies, a test-case (if able).
|
||||
-->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
6
.gitignore
vendored
6
.gitignore
vendored
@@ -4,15 +4,21 @@ doc-build/
|
||||
|
||||
# Generated source files
|
||||
src/common/scm_rev.cpp
|
||||
.travis.descriptor.json
|
||||
|
||||
# Project/editor files
|
||||
*.swp
|
||||
.idea/
|
||||
.vs/
|
||||
.vscode/
|
||||
|
||||
# *nix related
|
||||
# Common convention for backup or temporary files
|
||||
*~
|
||||
|
||||
# Visual Studio CMake settings
|
||||
CMakeSettings.json
|
||||
|
||||
# OSX global filetypes
|
||||
# Created by Finder or Spotlight in directories for various OS functionality (indexing, etc)
|
||||
.DS_Store
|
||||
|
||||
29
.gitmodules
vendored
29
.gitmodules
vendored
@@ -1,9 +1,24 @@
|
||||
[submodule "inih"]
|
||||
path = externals/inih/inih
|
||||
url = https://github.com/svn2github/inih
|
||||
path = externals/inih/inih
|
||||
url = https://github.com/svn2github/inih
|
||||
[submodule "boost"]
|
||||
path = externals/boost
|
||||
url = https://github.com/citra-emu/ext-boost.git
|
||||
[submodule "nihstro"]
|
||||
path = externals/nihstro
|
||||
url = https://github.com/neobrain/nihstro.git
|
||||
path = externals/boost
|
||||
url = https://github.com/yuzu-emu/ext-boost.git
|
||||
[submodule "catch"]
|
||||
path = externals/catch
|
||||
url = https://github.com/philsquared/Catch.git
|
||||
[submodule "dynarmic"]
|
||||
path = externals/dynarmic
|
||||
url = https://github.com/MerryMage/dynarmic.git
|
||||
[submodule "xbyak"]
|
||||
path = externals/xbyak
|
||||
url = https://github.com/herumi/xbyak.git
|
||||
[submodule "fmt"]
|
||||
path = externals/fmt
|
||||
url = https://github.com/fmtlib/fmt.git
|
||||
[submodule "lz4"]
|
||||
path = externals/lz4
|
||||
url = http://github.com/lz4/lz4.git
|
||||
[submodule "unicorn"]
|
||||
path = externals/unicorn
|
||||
url = https://github.com/yuzu-emu/unicorn
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
set -x
|
||||
|
||||
if grep -nr '\s$' src *.yml *.txt *.md Doxyfile .gitignore .gitmodules .travis* dist/*.desktop \
|
||||
dist/*.svg dist/*.xml; then
|
||||
echo Trailing whitespace found, aborting
|
||||
exit 1
|
||||
fi
|
||||
|
||||
#if OS is linux or is not set
|
||||
if [ "$TRAVIS_OS_NAME" = "linux" -o -z "$TRAVIS_OS_NAME" ]; then
|
||||
export CC=gcc-4.9
|
||||
export CXX=g++-4.9
|
||||
export PKG_CONFIG_PATH=$HOME/.local/lib/pkgconfig:$PKG_CONFIG_PATH
|
||||
|
||||
mkdir build && cd build
|
||||
cmake -DCITRA_FORCE_QT4=ON ..
|
||||
make -j4
|
||||
elif [ "$TRAVIS_OS_NAME" = "osx" ]; then
|
||||
export Qt5_DIR=$(brew --prefix)/opt/qt5
|
||||
mkdir build && cd build
|
||||
cmake .. -GXcode
|
||||
xcodebuild -configuration Release | xcpretty -c && exit ${PIPESTATUS[0]}
|
||||
fi
|
||||
@@ -1,30 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
set -x
|
||||
|
||||
#if OS is linux or is not set
|
||||
if [ "$TRAVIS_OS_NAME" = "linux" -o -z "$TRAVIS_OS_NAME" ]; then
|
||||
export CC=gcc-4.9
|
||||
export CXX=g++-4.9
|
||||
mkdir -p $HOME/.local
|
||||
|
||||
curl http://www.cmake.org/files/v2.8/cmake-2.8.11-Linux-i386.tar.gz \
|
||||
| tar -xz -C $HOME/.local --strip-components=1
|
||||
|
||||
(
|
||||
git clone https://github.com/glfw/glfw.git --branch 3.1.1 --depth 1
|
||||
mkdir glfw/build && cd glfw/build
|
||||
cmake -DBUILD_SHARED_LIBS=ON \
|
||||
-DGLFW_BUILD_EXAMPLES=OFF \
|
||||
-DGLFW_BUILD_TESTS=OFF \
|
||||
-DCMAKE_INSTALL_PREFIX=$HOME/.local \
|
||||
..
|
||||
make -j4 && make install
|
||||
)
|
||||
|
||||
elif [ "$TRAVIS_OS_NAME" = "osx" ]; then
|
||||
brew update > /dev/null # silence the very verbose output
|
||||
brew install qt5 glfw3 pkgconfig
|
||||
gem install xcpretty
|
||||
fi
|
||||
@@ -1,28 +0,0 @@
|
||||
if [ "$TRAVIS_BRANCH" = "master" ]; then
|
||||
GITDATE="`git show -s --date=short --format='%ad' | sed 's/-//g'`"
|
||||
GITREV="`git show -s --format='%h'`"
|
||||
|
||||
if [ "$TRAVIS_OS_NAME" = "linux" -o -z "$TRAVIS_OS_NAME" ]; then
|
||||
REV_NAME="citra-${GITDATE}-${GITREV}-linux-amd64"
|
||||
UPLOAD_DIR="/citra/nightly/linux-amd64"
|
||||
mkdir "$REV_NAME"
|
||||
|
||||
cp build/src/citra/citra "$REV_NAME"
|
||||
cp build/src/citra_qt/citra-qt "$REV_NAME"
|
||||
elif [ "$TRAVIS_OS_NAME" = "osx" ]; then
|
||||
REV_NAME="citra-${GITDATE}-${GITREV}-osx-amd64"
|
||||
UPLOAD_DIR="/citra/nightly/osx-amd64"
|
||||
mkdir "$REV_NAME"
|
||||
|
||||
brew install lftp
|
||||
cp build/src/citra/Release/citra "$REV_NAME"
|
||||
cp -r build/src/citra_qt/Release/citra-qt.app "$REV_NAME"
|
||||
|
||||
# move qt libs into app bundle for deployment
|
||||
$(brew --prefix)/opt/qt5/bin/macdeployqt "${REV_NAME}/citra-qt.app"
|
||||
fi
|
||||
|
||||
ARCHIVE_NAME="${REV_NAME}.tar.xz"
|
||||
tar -cJvf "$ARCHIVE_NAME" "$REV_NAME"
|
||||
lftp -c "open -u citra-builds,$BUILD_PASSWORD sftp://builds.citra-emu.org; put -O '$UPLOAD_DIR' '$ARCHIVE_NAME'"
|
||||
fi
|
||||
64
.travis.yml
64
.travis.yml
@@ -1,28 +1,40 @@
|
||||
os:
|
||||
- linux
|
||||
- osx
|
||||
|
||||
language: cpp
|
||||
matrix:
|
||||
include:
|
||||
- os: linux
|
||||
env: NAME="linux build"
|
||||
sudo: required
|
||||
dist: trusty
|
||||
services: docker
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- p7zip-full
|
||||
install: "./.travis/linux/deps.sh"
|
||||
script: "./.travis/linux/build.sh"
|
||||
after_success: "./.travis/linux/upload.sh"
|
||||
- os: osx
|
||||
env: NAME="macos build"
|
||||
sudo: false
|
||||
osx_image: xcode7.3
|
||||
install: "./.travis/macos/deps.sh"
|
||||
script: "./.travis/macos/build.sh"
|
||||
after_success: "./.travis/macos/upload.sh"
|
||||
- os: linux
|
||||
env: NAME="clang-format"
|
||||
dist: trusty
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- clang-format-3.9
|
||||
script: "./.travis/clang-format/script.sh"
|
||||
|
||||
env:
|
||||
global:
|
||||
- secure: "AXHFIafTmbGDsHD3mUVj5a4I397DQjti/WoqAJGUp2PglxTcc04BwxZ9Z+xLuf5N2Hs5r9ojAJLT8OGxJCLBDXzneQTNSqXbFuYSLbqrEAiIRlA9eRIotWCg+wYcO+5e8MKX+cHVKwiIWasUB21AtCdq6msh6Y3pUshZp212VPg="
|
||||
|
||||
sudo: false
|
||||
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- gcc-4.9
|
||||
- g++-4.9
|
||||
- xorg-dev
|
||||
- libglu1-mesa-dev
|
||||
- libxcursor-dev
|
||||
- lib32stdc++6 # For CMake
|
||||
- lftp # To upload builds
|
||||
|
||||
install: ./.travis-deps.sh
|
||||
script: ./.travis-build.sh
|
||||
after_success: ./.travis-upload.sh
|
||||
deploy:
|
||||
provider: releases
|
||||
api_key:
|
||||
secure: IuTT8DjxzNgOtaEsyOpz1JaSmtDtHSsWZnJKmSBwXAzgP2ZU4Ja3/q0z5PwbC5Ql7kuFahuYTE5oi7lbJBuu2P3y1Wj2zvFozGUkA3JUvEXDNOPS9QTJ1EYd6O+wenZoj7d/Pn+ZeIgyEafnnZsGBb8lMQnV9MfIHgYlZQ5EyF3n4XikT2h1UbDBYx74ciXZIxFEulx68kDr9Q4/U+zIYQmYv2N+lgXSLDkFrCJ046gRcujPYGPqE6jVw0kKni80CTTpuDF5prU8yIBeiffjkJ3Qx1a17G07eZ4r83P4XUOlaHbRBmA/8ywZvLF2Gep3wGKfSFgMWbPxBJk5ZSYcOOAgMsEcg0+gBK9gLTwO4pbmc2GvqP21yRQBzgtbFoEtAHLu5lVPBkZU7kZuRMJtRdqvFIwOLhpnRS8IknFOD5vjtaFiNdGWaK9ePdsGvplijnXcPafkumakc4+eVEiXb6/KzdX1zXdur5tuUPFytm0Oy6IJcGIf8FHXGvUlmWsnPzwfusij9JgeQOP+uegc9PdBfL+h7L5rk+ilELt3cXD5K7wgov/4hkl5istNJ2bm0IioIstWss8QQQTkyscGoeh/oXmUpOL4FdsTvsWhDR3QKeq8nSzgDkqLe0iSbplQGnC7o7ytNbldmxJvf3nylwglA8w3HlqLHtZLkUOcuQ0=
|
||||
file_glob: true
|
||||
file: "artifacts/*"
|
||||
skip_cleanup: true
|
||||
on:
|
||||
tags: true
|
||||
|
||||
37
.travis/clang-format/script.sh
Executable file
37
.travis/clang-format/script.sh
Executable file
@@ -0,0 +1,37 @@
|
||||
#!/bin/bash -ex
|
||||
|
||||
if grep -nr '\s$' src *.yml *.txt *.md Doxyfile .gitignore .gitmodules .travis* dist/*.desktop \
|
||||
dist/*.svg dist/*.xml; then
|
||||
echo Trailing whitespace found, aborting
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Default clang-format points to default 3.5 version one
|
||||
CLANG_FORMAT=clang-format-3.9
|
||||
$CLANG_FORMAT --version
|
||||
|
||||
if [ "$TRAVIS_EVENT_TYPE" = "pull_request" ]; then
|
||||
# Get list of every file modified in this pull request
|
||||
files_to_lint="$(git diff --name-only --diff-filter=ACMRTUXB $TRAVIS_COMMIT_RANGE | grep '^src/[^.]*[.]\(cpp\|h\)$' || true)"
|
||||
else
|
||||
# Check everything for branch pushes
|
||||
files_to_lint="$(find src/ -name '*.cpp' -or -name '*.h')"
|
||||
fi
|
||||
|
||||
# Turn off tracing for this because it's too verbose
|
||||
set +x
|
||||
|
||||
for f in $files_to_lint; do
|
||||
d=$(diff -u "$f" <($CLANG_FORMAT "$f") || true)
|
||||
if ! [ -z "$d" ]; then
|
||||
echo "!!! $f not compliant to coding style, here is the fix:"
|
||||
echo "$d"
|
||||
fail=1
|
||||
fi
|
||||
done
|
||||
|
||||
set -x
|
||||
|
||||
if [ "$fail" = 1 ]; then
|
||||
exit 1
|
||||
fi
|
||||
22
.travis/common/post-upload.sh
Executable file
22
.travis/common/post-upload.sh
Executable file
@@ -0,0 +1,22 @@
|
||||
#!/bin/bash -ex
|
||||
|
||||
# Copy documentation
|
||||
cp license.txt "$REV_NAME"
|
||||
cp README.md "$REV_NAME"
|
||||
|
||||
tar $COMPRESSION_FLAGS "$ARCHIVE_NAME" "$REV_NAME"
|
||||
|
||||
# Find out what release we are building
|
||||
if [ -z $TRAVIS_TAG ]; then
|
||||
RELEASE_NAME=head
|
||||
else
|
||||
RELEASE_NAME=$(echo $TRAVIS_TAG | cut -d- -f1)
|
||||
fi
|
||||
|
||||
mv "$REV_NAME" $RELEASE_NAME
|
||||
|
||||
7z a "$REV_NAME.7z" $RELEASE_NAME
|
||||
|
||||
# move the compiled archive into the artifacts directory to be uploaded by travis releases
|
||||
mv "$ARCHIVE_NAME" artifacts/
|
||||
mv "$REV_NAME.7z" artifacts/
|
||||
6
.travis/common/pre-upload.sh
Executable file
6
.travis/common/pre-upload.sh
Executable file
@@ -0,0 +1,6 @@
|
||||
#!/bin/bash -ex
|
||||
|
||||
GITDATE="`git show -s --date=short --format='%ad' | sed 's/-//g'`"
|
||||
GITREV="`git show -s --format='%h'`"
|
||||
|
||||
mkdir -p artifacts
|
||||
3
.travis/linux/build.sh
Executable file
3
.travis/linux/build.sh
Executable file
@@ -0,0 +1,3 @@
|
||||
#!/bin/bash -ex
|
||||
|
||||
docker run -v $(pwd):/yuzu ubuntu:18.04 /bin/bash /yuzu/.travis/linux/docker.sh
|
||||
3
.travis/linux/deps.sh
Executable file
3
.travis/linux/deps.sh
Executable file
@@ -0,0 +1,3 @@
|
||||
#!/bin/sh -ex
|
||||
|
||||
docker pull ubuntu:18.04
|
||||
16
.travis/linux/docker.sh
Executable file
16
.travis/linux/docker.sh
Executable file
@@ -0,0 +1,16 @@
|
||||
#!/bin/bash -ex
|
||||
|
||||
apt-get update
|
||||
apt-get install -y build-essential git libqt5opengl5-dev libsdl2-dev libssl-dev python qtbase5-dev wget
|
||||
|
||||
# Get a recent version of CMake
|
||||
wget https://cmake.org/files/v3.10/cmake-3.10.1-Linux-x86_64.sh
|
||||
sh cmake-3.10.1-Linux-x86_64.sh --exclude-subdir --prefix=/ --skip-license
|
||||
|
||||
cd /yuzu
|
||||
|
||||
mkdir build && cd build
|
||||
cmake .. -DYUZU_BUILD_UNICORN=ON -DCMAKE_BUILD_TYPE=Release
|
||||
make -j4
|
||||
|
||||
ctest -VV -C Release
|
||||
14
.travis/linux/upload.sh
Executable file
14
.travis/linux/upload.sh
Executable file
@@ -0,0 +1,14 @@
|
||||
#!/bin/bash -ex
|
||||
|
||||
. .travis/common/pre-upload.sh
|
||||
|
||||
REV_NAME="yuzu-linux-${GITDATE}-${GITREV}"
|
||||
ARCHIVE_NAME="${REV_NAME}.tar.xz"
|
||||
COMPRESSION_FLAGS="-cJvf"
|
||||
|
||||
mkdir "$REV_NAME"
|
||||
|
||||
cp build/bin/yuzu-cmd "$REV_NAME"
|
||||
cp build/bin/yuzu "$REV_NAME"
|
||||
|
||||
. .travis/common/post-upload.sh
|
||||
14
.travis/macos/build.sh
Executable file
14
.travis/macos/build.sh
Executable file
@@ -0,0 +1,14 @@
|
||||
#!/bin/bash -ex
|
||||
|
||||
set -o pipefail
|
||||
|
||||
export MACOSX_DEPLOYMENT_TARGET=10.9
|
||||
export Qt5_DIR=$(brew --prefix)/opt/qt5
|
||||
export UNICORNDIR=$(pwd)/externals/unicorn
|
||||
|
||||
mkdir build && cd build
|
||||
cmake --version
|
||||
cmake .. -DYUZU_BUILD_UNICORN=ON -DCMAKE_OSX_ARCHITECTURES="x86_64;x86_64h" -DCMAKE_BUILD_TYPE=Release
|
||||
make -j4
|
||||
|
||||
ctest -VV -C Release
|
||||
4
.travis/macos/deps.sh
Executable file
4
.travis/macos/deps.sh
Executable file
@@ -0,0 +1,4 @@
|
||||
#!/bin/sh -ex
|
||||
|
||||
brew update
|
||||
brew install dylibbundler p7zip qt5 sdl2
|
||||
110
.travis/macos/upload.sh
Executable file
110
.travis/macos/upload.sh
Executable file
@@ -0,0 +1,110 @@
|
||||
#!/bin/bash -ex
|
||||
|
||||
. .travis/common/pre-upload.sh
|
||||
|
||||
REV_NAME="yuzu-osx-${GITDATE}-${GITREV}"
|
||||
ARCHIVE_NAME="${REV_NAME}.tar.gz"
|
||||
COMPRESSION_FLAGS="-czvf"
|
||||
|
||||
mkdir "$REV_NAME"
|
||||
|
||||
cp build/bin/yuzu-cmd "$REV_NAME"
|
||||
cp -r build/bin/yuzu.app "$REV_NAME"
|
||||
|
||||
# move qt libs into app bundle for deployment
|
||||
$(brew --prefix)/opt/qt5/bin/macdeployqt "${REV_NAME}/yuzu.app"
|
||||
|
||||
# move SDL2 libs into folder for deployment
|
||||
dylibbundler -b -x "${REV_NAME}/yuzu-cmd" -cd -d "${REV_NAME}/libs" -p "@executable_path/libs/"
|
||||
|
||||
# Make the changes to make the yuzu app standalone (i.e. not dependent on the current brew installation).
|
||||
# To do this, the absolute references to each and every QT framework must be re-written to point to the local frameworks
|
||||
# (in the Contents/Frameworks folder).
|
||||
# The "install_name_tool" is used to do so.
|
||||
|
||||
# Coreutils is a hack to coerce Homebrew to point to the absolute Cellar path (symlink dereferenced). i.e:
|
||||
# ls -l /usr/local/opt/qt5:: /usr/local/opt/qt5 -> ../Cellar/qt5/5.6.1-1
|
||||
# grealpath ../Cellar/qt5/5.6.1-1:: /usr/local/Cellar/qt5/5.6.1-1
|
||||
brew install coreutils || brew upgrade coreutils || true
|
||||
|
||||
REV_NAME_ALT=$REV_NAME/
|
||||
# grealpath is located in coreutils, there is no "realpath" for OS X :(
|
||||
QT_BREWS_PATH=$(grealpath "$(brew --prefix qt5)")
|
||||
BREW_PATH=$(brew --prefix)
|
||||
QT_VERSION_NUM=5
|
||||
|
||||
$BREW_PATH/opt/qt5/bin/macdeployqt "${REV_NAME_ALT}yuzu.app" \
|
||||
-executable="${REV_NAME_ALT}yuzu.app/Contents/MacOS/yuzu"
|
||||
|
||||
# These are the files that macdeployqt packed into Contents/Frameworks/ - we don't want those, so we replace them.
|
||||
declare -a macos_libs=("QtCore" "QtWidgets" "QtGui" "QtOpenGL" "QtPrintSupport")
|
||||
|
||||
for macos_lib in "${macos_libs[@]}"
|
||||
do
|
||||
SC_FRAMEWORK_PART=$macos_lib.framework/Versions/$QT_VERSION_NUM/$macos_lib
|
||||
# Replace macdeployqt versions of the Frameworks with our own (from /usr/local/opt/qt5/lib/)
|
||||
cp "$BREW_PATH/opt/qt5/lib/$SC_FRAMEWORK_PART" "${REV_NAME_ALT}yuzu.app/Contents/Frameworks/$SC_FRAMEWORK_PART"
|
||||
|
||||
# Replace references within the embedded Framework files with "internal" versions.
|
||||
for macos_lib2 in "${macos_libs[@]}"
|
||||
do
|
||||
# Since brew references both the non-symlinked and symlink paths of QT5, it needs to be duplicated.
|
||||
# /usr/local/Cellar/qt5/5.6.1-1/lib and /usr/local/opt/qt5/lib both resolve to the same files.
|
||||
# So the two lines below are effectively duplicates when resolved as a path, but as strings, they aren't.
|
||||
RM_FRAMEWORK_PART=$macos_lib2.framework/Versions/$QT_VERSION_NUM/$macos_lib2
|
||||
install_name_tool -change \
|
||||
$QT_BREWS_PATH/lib/$RM_FRAMEWORK_PART \
|
||||
@executable_path/../Frameworks/$RM_FRAMEWORK_PART \
|
||||
"${REV_NAME_ALT}yuzu.app/Contents/Frameworks/$SC_FRAMEWORK_PART"
|
||||
install_name_tool -change \
|
||||
"$BREW_PATH/opt/qt5/lib/$RM_FRAMEWORK_PART" \
|
||||
@executable_path/../Frameworks/$RM_FRAMEWORK_PART \
|
||||
"${REV_NAME_ALT}yuzu.app/Contents/Frameworks/$SC_FRAMEWORK_PART"
|
||||
done
|
||||
done
|
||||
|
||||
# Handles `This application failed to start because it could not find or load the Qt platform plugin "cocoa"`
|
||||
# Which manifests itself as:
|
||||
# "Exception Type: EXC_CRASH (SIGABRT) | Exception Codes: 0x0000000000000000, 0x0000000000000000 | Exception Note: EXC_CORPSE_NOTIFY"
|
||||
# There may be more dylibs needed to be fixed...
|
||||
declare -a macos_plugins=("Plugins/platforms/libqcocoa.dylib")
|
||||
|
||||
for macos_lib in "${macos_plugins[@]}"
|
||||
do
|
||||
install_name_tool -id @executable_path/../$macos_lib "${REV_NAME_ALT}yuzu.app/Contents/$macos_lib"
|
||||
for macos_lib2 in "${macos_libs[@]}"
|
||||
do
|
||||
RM_FRAMEWORK_PART=$macos_lib2.framework/Versions/$QT_VERSION_NUM/$macos_lib2
|
||||
install_name_tool -change \
|
||||
$QT_BREWS_PATH/lib/$RM_FRAMEWORK_PART \
|
||||
@executable_path/../Frameworks/$RM_FRAMEWORK_PART \
|
||||
"${REV_NAME_ALT}yuzu.app/Contents/$macos_lib"
|
||||
install_name_tool -change \
|
||||
"$BREW_PATH/opt/qt5/lib/$RM_FRAMEWORK_PART" \
|
||||
@executable_path/../Frameworks/$RM_FRAMEWORK_PART \
|
||||
"${REV_NAME_ALT}yuzu.app/Contents/$macos_lib"
|
||||
done
|
||||
done
|
||||
|
||||
for macos_lib in "${macos_libs[@]}"
|
||||
do
|
||||
# Debugging info for Travis-CI
|
||||
otool -L "${REV_NAME_ALT}yuzu.app/Contents/Frameworks/$macos_lib.framework/Versions/$QT_VERSION_NUM/$macos_lib"
|
||||
done
|
||||
|
||||
# Make the yuzu.app application launch a debugging terminal.
|
||||
# Store away the actual binary
|
||||
mv ${REV_NAME_ALT}yuzu.app/Contents/MacOS/yuzu ${REV_NAME_ALT}yuzu.app/Contents/MacOS/yuzu-bin
|
||||
|
||||
cat > ${REV_NAME_ALT}yuzu.app/Contents/MacOS/yuzu <<EOL
|
||||
#!/usr/bin/env bash
|
||||
cd "\`dirname "\$0"\`"
|
||||
chmod +x yuzu-bin
|
||||
open yuzu-bin --args "\$@"
|
||||
EOL
|
||||
# Content that will serve as the launching script for yuzu (within the .app folder)
|
||||
|
||||
# Make the launching script executable
|
||||
chmod +x ${REV_NAME_ALT}yuzu.app/Contents/MacOS/yuzu
|
||||
|
||||
. .travis/common/post-upload.sh
|
||||
404
CMakeLists.txt
404
CMakeLists.txt
@@ -1,23 +1,102 @@
|
||||
# CMake 2.8.11 required for Qt5 settings to be applied automatically on
|
||||
# dependent libraries.
|
||||
cmake_minimum_required(VERSION 2.8.11)
|
||||
# CMake 3.6 required for FindBoost to define IMPORTED libs properly on unknown Boost versions
|
||||
cmake_minimum_required(VERSION 3.6)
|
||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules")
|
||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/externals/cmake-modules")
|
||||
include(DownloadExternals)
|
||||
|
||||
project(citra)
|
||||
project(yuzu)
|
||||
|
||||
if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/.git/hooks/pre-commit)
|
||||
option(ENABLE_SDL2 "Enable the SDL2 frontend" ON)
|
||||
option(YUZU_USE_BUNDLED_SDL2 "Download bundled SDL2 binaries" OFF)
|
||||
|
||||
option(ENABLE_QT "Enable the Qt frontend" ON)
|
||||
option(YUZU_USE_BUNDLED_QT "Download bundled Qt binaries" OFF)
|
||||
|
||||
if(NOT EXISTS ${CMAKE_SOURCE_DIR}/.git/hooks/pre-commit)
|
||||
message(STATUS "Copying pre-commit hook")
|
||||
file(COPY hooks/pre-commit
|
||||
DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/.git/hooks)
|
||||
DESTINATION ${CMAKE_SOURCE_DIR}/.git/hooks)
|
||||
endif()
|
||||
|
||||
# Sanity check : Check that all submodules are present
|
||||
# =======================================================================
|
||||
|
||||
function(check_submodules_present)
|
||||
file(READ "${CMAKE_SOURCE_DIR}/.gitmodules" gitmodules)
|
||||
string(REGEX MATCHALL "path *= *[^ \t\r\n]*" gitmodules ${gitmodules})
|
||||
foreach(module ${gitmodules})
|
||||
string(REGEX REPLACE "path *= *" "" module ${module})
|
||||
if (NOT EXISTS "${CMAKE_SOURCE_DIR}/${module}/.git")
|
||||
message(FATAL_ERROR "Git submodule ${module} not found. "
|
||||
"Please run: git submodule update --init --recursive")
|
||||
endif()
|
||||
endforeach()
|
||||
endfunction()
|
||||
check_submodules_present()
|
||||
|
||||
# Detect current compilation architecture and create standard definitions
|
||||
# =======================================================================
|
||||
|
||||
include(CheckSymbolExists)
|
||||
function(detect_architecture symbol arch)
|
||||
if (NOT DEFINED ARCHITECTURE)
|
||||
set(CMAKE_REQUIRED_QUIET 1)
|
||||
check_symbol_exists("${symbol}" "" ARCHITECTURE_${arch})
|
||||
unset(CMAKE_REQUIRED_QUIET)
|
||||
|
||||
# The output variable needs to be unique across invocations otherwise
|
||||
# CMake's crazy scope rules will keep it defined
|
||||
if (ARCHITECTURE_${arch})
|
||||
set(ARCHITECTURE "${arch}" PARENT_SCOPE)
|
||||
set(ARCHITECTURE_${arch} 1 PARENT_SCOPE)
|
||||
add_definitions(-DARCHITECTURE_${arch}=1)
|
||||
endif()
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
if (MSVC)
|
||||
detect_architecture("_M_AMD64" x86_64)
|
||||
detect_architecture("_M_IX86" x86)
|
||||
detect_architecture("_M_ARM" ARM)
|
||||
else()
|
||||
detect_architecture("__x86_64__" x86_64)
|
||||
detect_architecture("__i386__" x86)
|
||||
detect_architecture("__arm__" ARM)
|
||||
endif()
|
||||
if (NOT DEFINED ARCHITECTURE)
|
||||
set(ARCHITECTURE "GENERIC")
|
||||
set(ARCHITECTURE_GENERIC 1)
|
||||
add_definitions(-DARCHITECTURE_GENERIC=1)
|
||||
endif()
|
||||
message(STATUS "Target architecture: ${ARCHITECTURE}")
|
||||
|
||||
|
||||
# Configure compilation flags
|
||||
# ===========================
|
||||
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
if (NOT MSVC)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wno-attributes -pthread")
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthread")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-attributes")
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
|
||||
|
||||
if (MINGW)
|
||||
add_definitions(-DMINGW_HAS_SECURE_API)
|
||||
|
||||
if (MINGW_STATIC_BUILD)
|
||||
add_definitions(-DQT_STATICPLUGIN)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static")
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")
|
||||
endif()
|
||||
endif()
|
||||
else()
|
||||
# Silence "deprecation" warnings
|
||||
add_definitions(/D_CRT_SECURE_NO_WARNINGS /D_CRT_NONSTDC_NO_DEPRECATE)
|
||||
add_definitions(/D_CRT_SECURE_NO_WARNINGS /D_CRT_NONSTDC_NO_DEPRECATE /D_SCL_SECURE_NO_WARNINGS)
|
||||
# Avoid windows.h junk
|
||||
add_definitions(/DNOMINMAX)
|
||||
# Avoid windows.h from including some usually unused libs like winsocks.h, since this might cause some redefinition errors.
|
||||
add_definitions(/DWIN32_LEAN_AND_MEAN)
|
||||
|
||||
# set up output paths for executable binaries (.exe-files, and .dll-files on DLL-capable platforms)
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
||||
@@ -31,11 +110,13 @@ else()
|
||||
# /W3 - Level 3 warnings
|
||||
# /MP - Multi-threaded compilation
|
||||
# /Zi - Output debugging information
|
||||
# /Zo - enahnced debug info for optimized builds
|
||||
set(CMAKE_C_FLAGS "/W3 /MP /Zi /Zo" CACHE STRING "" FORCE)
|
||||
# /GR- - Disable RTTI
|
||||
# /Zo - enhanced debug info for optimized builds
|
||||
# /permissive- - enables stricter C++ standards conformance checks
|
||||
set(CMAKE_C_FLAGS "/W3 /MP /Zi /Zo /permissive-" CACHE STRING "" FORCE)
|
||||
# /EHsc - C++-only exception handling semantics
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} /GR- /EHsc" CACHE STRING "" FORCE)
|
||||
# /Zc:throwingNew - let codegen assume `operator new` will never return null
|
||||
# /Zc:inline - let codegen omit inline functions in object files
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} /EHsc /std:c++latest /Zc:throwingNew,inline" CACHE STRING "" FORCE)
|
||||
|
||||
# /MDd - Multi-threaded Debug Runtime DLL
|
||||
set(CMAKE_C_FLAGS_DEBUG "/Od /MDd" CACHE STRING "" FORCE)
|
||||
@@ -47,133 +128,198 @@ else()
|
||||
set(CMAKE_C_FLAGS_RELEASE "/O2 /GS- /MD" CACHE STRING "" FORCE)
|
||||
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}" CACHE STRING "" FORCE)
|
||||
|
||||
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "/DEBUG" CACHE STRING "" FORCE)
|
||||
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/DEBUG" CACHE STRING "" FORCE)
|
||||
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "/DEBUG /MANIFEST:NO" CACHE STRING "" FORCE)
|
||||
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/DEBUG /MANIFEST:NO /INCREMENTAL:NO /OPT:REF,ICF" CACHE STRING "" FORCE)
|
||||
endif()
|
||||
|
||||
# Fix GCC C++17 and Boost.ICL incompatibility (needed to build dynarmic)
|
||||
# See https://bugzilla.redhat.com/show_bug.cgi?id=1485641#c1
|
||||
if (CMAKE_COMPILER_IS_GNUCC)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-new-ttp-matching")
|
||||
endif()
|
||||
|
||||
# Set file offset size to 64 bits.
|
||||
#
|
||||
# On modern Unixes, this is typically already the case. The lone exception is
|
||||
# glibc, which may default to 32 bits. glibc allows this to be configured
|
||||
# by setting _FILE_OFFSET_BITS.
|
||||
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||
add_definitions(-D_FILE_OFFSET_BITS=64)
|
||||
endif()
|
||||
|
||||
add_definitions(-DSINGLETHREADED)
|
||||
# CMake seems to only define _DEBUG on Windows
|
||||
set_property(DIRECTORY APPEND PROPERTY
|
||||
COMPILE_DEFINITIONS $<$<CONFIG:Debug>:_DEBUG> $<$<NOT:$<CONFIG:Debug>>:NDEBUG>)
|
||||
|
||||
find_package(PNG QUIET)
|
||||
if (PNG_FOUND)
|
||||
add_definitions(-DHAVE_PNG)
|
||||
else()
|
||||
message(STATUS "libpng not found. Some debugging features have been disabled.")
|
||||
|
||||
# System imported libraries
|
||||
# ======================
|
||||
|
||||
find_package(Boost 1.63.0 QUIET)
|
||||
if (NOT Boost_FOUND)
|
||||
message(STATUS "Boost 1.63.0 or newer not found, falling back to externals")
|
||||
|
||||
set(BOOST_ROOT "${CMAKE_SOURCE_DIR}/externals/boost")
|
||||
set(Boost_NO_SYSTEM_PATHS OFF)
|
||||
find_package(Boost QUIET REQUIRED)
|
||||
endif()
|
||||
|
||||
find_package(Boost 1.57.0)
|
||||
if (Boost_FOUND)
|
||||
include_directories(${Boost_INCLUDE_DIRS})
|
||||
else()
|
||||
message(STATUS "Boost 1.57.0 or newer not found, falling back to externals")
|
||||
include_directories(externals/boost)
|
||||
endif()
|
||||
# Output binaries to bin/
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
||||
|
||||
# Include bundled CMake modules
|
||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/externals/cmake-modules")
|
||||
# Prefer the -pthread flag on Linux.
|
||||
set(THREADS_PREFER_PTHREAD_FLAG ON)
|
||||
find_package(Threads REQUIRED)
|
||||
|
||||
find_package(OpenGL REQUIRED)
|
||||
include_directories(${OPENGL_INCLUDE_DIR})
|
||||
|
||||
option(ENABLE_GLFW "Enable the GLFW frontend" ON)
|
||||
if (ENABLE_GLFW)
|
||||
if (WIN32)
|
||||
if (ENABLE_SDL2)
|
||||
if (YUZU_USE_BUNDLED_SDL2)
|
||||
# Detect toolchain and platform
|
||||
if (MSVC)
|
||||
if (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||
set(TMP_ARCH "x64")
|
||||
elseif (CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||||
set(TMP_ARCH "Win32")
|
||||
else()
|
||||
set(TMP_ARCH "UNKNOWN")
|
||||
message(SEND_ERROR "Couldn't detect your compiler's architecture, you'll have to manually specify the GLFW library to use. (Try checking CMakeOutput.log to find out why.)")
|
||||
endif()
|
||||
|
||||
if (MSVC11) # Visual C++ 2012
|
||||
set(TMP_TOOLSET "v110")
|
||||
elseif (MSVC12) # Visual C++ 2013
|
||||
set(TMP_TOOLSET "v120")
|
||||
else()
|
||||
set(TMP_TOOLSET "UNSUPPORTED")
|
||||
message(SEND_ERROR "We don't supply GLFW binaries for your version of MSVC, you might have to provide them yourself.")
|
||||
endif()
|
||||
|
||||
set(TMP_TOOLSET "msvc_${TMP_TOOLSET}-${TMP_ARCH}")
|
||||
if (MSVC14 AND ARCHITECTURE_x86_64)
|
||||
set(SDL2_VER "SDL2-2.0.5")
|
||||
else()
|
||||
# Assume mingw
|
||||
if (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||
set(TMP_ARCH "x86_64")
|
||||
elseif (CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||||
set(TMP_ARCH "i686")
|
||||
else()
|
||||
set(TMP_ARCH "UNKNOWN")
|
||||
message(SEND_ERROR "Couldn't detect your compiler's architecture, you'll have to manually specify the GLFW library to use.")
|
||||
endif()
|
||||
|
||||
set(TMP_TOOLSET "mingw-${TMP_ARCH}")
|
||||
message(FATAL_ERROR "No bundled SDL2 binaries for your toolchain. Disable YUZU_USE_BUNDLED_SDL2 and provide your own.")
|
||||
endif()
|
||||
|
||||
set(GLFW_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/externals/glfw-3.1.1.bin")
|
||||
set(GLFW_INCLUDE_DIRS "${GLFW_PREFIX}/include" CACHE PATH "Path to GLFW3 headers")
|
||||
set(GLFW_LIBRARY_DIRS "${GLFW_PREFIX}/lib-${TMP_TOOLSET}" CACHE PATH "Path to GLFW3 libraries")
|
||||
if (DEFINED SDL2_VER)
|
||||
download_bundled_external("sdl2/" ${SDL2_VER} SDL2_PREFIX)
|
||||
endif()
|
||||
|
||||
# Clean up after ourselves
|
||||
unset(TMP_TOOLSET)
|
||||
unset(TMP_ARCH)
|
||||
|
||||
set(GLFW_LIBRARIES glfw3)
|
||||
set(SDL2_FOUND YES)
|
||||
set(SDL2_INCLUDE_DIR "${SDL2_PREFIX}/include" CACHE PATH "Path to SDL2 headers")
|
||||
set(SDL2_LIBRARY "${SDL2_PREFIX}/lib/x64/SDL2.lib" CACHE PATH "Path to SDL2 library")
|
||||
set(SDL2_DLL_DIR "${SDL2_PREFIX}/lib/x64/" CACHE PATH "Path to SDL2.dll")
|
||||
else()
|
||||
find_package(PkgConfig REQUIRED)
|
||||
pkg_search_module(GLFW REQUIRED glfw3)
|
||||
find_package(SDL2 REQUIRED)
|
||||
endif()
|
||||
|
||||
include_directories(${GLFW_INCLUDE_DIRS})
|
||||
link_directories(${GLFW_LIBRARY_DIRS})
|
||||
if (SDL2_FOUND)
|
||||
# TODO(yuriks): Make FindSDL2.cmake export an IMPORTED library instead
|
||||
add_library(SDL2 INTERFACE)
|
||||
target_link_libraries(SDL2 INTERFACE "${SDL2_LIBRARY}")
|
||||
target_include_directories(SDL2 INTERFACE "${SDL2_INCLUDE_DIR}")
|
||||
endif()
|
||||
else()
|
||||
set(SDL2_FOUND NO)
|
||||
endif()
|
||||
|
||||
# If unicorn isn't found, msvc -> download bundled unicorn; everyone else -> build external
|
||||
find_package(Unicorn QUIET)
|
||||
if (NOT UNICORN_FOUND)
|
||||
if (MSVC)
|
||||
message(STATUS "unicorn not found, falling back to bundled")
|
||||
# Detect toolchain and platform
|
||||
if (MSVC14 AND ARCHITECTURE_x86_64)
|
||||
set(UNICORN_VER "unicorn-yuzu")
|
||||
else()
|
||||
message(FATAL_ERROR "No bundled Unicorn binaries for your toolchain. Disable YUZU_USE_BUNDLED_UNICORN and provide your own.")
|
||||
endif()
|
||||
|
||||
if (DEFINED UNICORN_VER)
|
||||
download_bundled_external("unicorn/" ${UNICORN_VER} UNICORN_PREFIX)
|
||||
endif()
|
||||
|
||||
if (DEFINED UNICORN_VER)
|
||||
download_bundled_external("unicorn/" ${UNICORN_VER} UNICORN_PREFIX)
|
||||
endif()
|
||||
|
||||
set(UNICORN_FOUND YES)
|
||||
set(LIBUNICORN_INCLUDE_DIR "${UNICORN_PREFIX}/include" CACHE PATH "Path to Unicorn headers" FORCE)
|
||||
set(LIBUNICORN_LIBRARY "${UNICORN_PREFIX}/lib/x64/unicorn_dynload.lib" CACHE PATH "Path to Unicorn library" FORCE)
|
||||
set(UNICORN_DLL_DIR "${UNICORN_PREFIX}/lib/x64/" CACHE PATH "Path to unicorn.dll" FORCE)
|
||||
else()
|
||||
message(STATUS "unicorn not found, falling back to externals")
|
||||
if (MINGW)
|
||||
set(UNICORN_LIB_NAME "unicorn.a")
|
||||
else()
|
||||
set(UNICORN_LIB_NAME "libunicorn.a")
|
||||
endif()
|
||||
|
||||
set(UNICORN_FOUND YES)
|
||||
set(UNICORN_PREFIX ${CMAKE_SOURCE_DIR}/externals/unicorn)
|
||||
set(LIBUNICORN_LIBRARY "${UNICORN_PREFIX}/${UNICORN_LIB_NAME}" CACHE PATH "Path to Unicorn library" FORCE)
|
||||
set(LIBUNICORN_INCLUDE_DIR "${UNICORN_PREFIX}/include" CACHE PATH "Path to Unicorn headers" FORCE)
|
||||
set(UNICORN_DLL_DIR "${UNICORN_PREFIX}/" CACHE PATH "Path to unicorn dynamic library" FORCE)
|
||||
|
||||
find_package(PythonInterp 2.7 REQUIRED)
|
||||
|
||||
add_custom_command(OUTPUT ${LIBUNICORN_LIBRARY}
|
||||
COMMAND ${CMAKE_COMMAND} -E env UNICORN_ARCHS="aarch64" PYTHON="${PYTHON_EXECUTABLE}" /bin/sh make.sh
|
||||
WORKING_DIRECTORY ${UNICORN_PREFIX}
|
||||
)
|
||||
# ALL makes this custom target build every time
|
||||
# but it won't actually build if LIBUNICORN_LIBRARY is up to date
|
||||
add_custom_target(unicorn-build ALL
|
||||
DEPENDS ${LIBUNICORN_LIBRARY}
|
||||
)
|
||||
unset(UNICORN_LIB_NAME)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if (UNICORN_FOUND)
|
||||
add_library(unicorn INTERFACE)
|
||||
target_link_libraries(unicorn INTERFACE "${LIBUNICORN_LIBRARY}")
|
||||
target_include_directories(unicorn INTERFACE "${LIBUNICORN_INCLUDE_DIR}")
|
||||
else()
|
||||
message(FATAL_ERROR "Could not find or build unicorn which is required.")
|
||||
endif()
|
||||
|
||||
if (ENABLE_QT)
|
||||
if (YUZU_USE_BUNDLED_QT)
|
||||
if (MSVC14 AND ARCHITECTURE_x86_64)
|
||||
set(QT_VER qt-5.7-msvc2015_64)
|
||||
else()
|
||||
message(FATAL_ERROR "No bundled Qt binaries for your toolchain. Disable YUZU_USE_BUNDLED_QT and provide your own.")
|
||||
endif()
|
||||
|
||||
if (DEFINED QT_VER)
|
||||
download_bundled_external("qt/" ${QT_VER} QT_PREFIX)
|
||||
endif()
|
||||
|
||||
set(QT_PREFIX_HINT HINTS "${QT_PREFIX}")
|
||||
else()
|
||||
# Passing an empty HINTS seems to cause default system paths to get ignored in CMake 2.8 so
|
||||
# make sure to not pass anything if we don't have one.
|
||||
set(QT_PREFIX_HINT)
|
||||
endif()
|
||||
|
||||
find_package(Qt5 REQUIRED COMPONENTS Widgets OpenGL ${QT_PREFIX_HINT})
|
||||
endif()
|
||||
|
||||
# Platform-specific library requirements
|
||||
# ======================================
|
||||
|
||||
IF (APPLE)
|
||||
FIND_LIBRARY(COCOA_LIBRARY Cocoa) # Umbrella framework for everything GUI-related
|
||||
FIND_LIBRARY(IOKIT_LIBRARY IOKit) # GLFW dependency
|
||||
FIND_LIBRARY(COREVIDEO_LIBRARY CoreVideo) # GLFW dependency
|
||||
set(PLATFORM_LIBRARIES iconv ${COCOA_LIBRARY} ${IOKIT_LIBRARY} ${COREVIDEO_LIBRARY})
|
||||
set(PLATFORM_LIBRARIES ${COCOA_LIBRARY} ${IOKIT_LIBRARY} ${COREVIDEO_LIBRARY})
|
||||
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++")
|
||||
ELSEIF(MINGW)
|
||||
# GCC does not support codecvt, so use iconv instead
|
||||
set(PLATFORM_LIBRARIES winmm ws2_32 iconv)
|
||||
|
||||
# WSAPoll functionality doesn't exist before WinNT 6.x (Vista and up)
|
||||
add_definitions(-D_WIN32_WINNT=0x0600)
|
||||
ELSEIF(WIN32)
|
||||
if (CMAKE_CXX_COMPILER_ID STREQUAL Clang)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++")
|
||||
endif()
|
||||
ELSEIF (WIN32)
|
||||
# WSAPoll and SHGetKnownFolderPath (AppData/Roaming) didn't exist before WinNT 6.x (Vista)
|
||||
add_definitions(-D_WIN32_WINNT=0x0600 -DWINVER=0x0600)
|
||||
set(PLATFORM_LIBRARIES winmm ws2_32)
|
||||
ELSE()
|
||||
IF (MINGW)
|
||||
# PSAPI is the Process Status API
|
||||
set(PLATFORM_LIBRARIES ${PLATFORM_LIBRARIES} psapi imm32 version)
|
||||
ENDIF (MINGW)
|
||||
ELSEIF (CMAKE_SYSTEM_NAME MATCHES "^(Linux|kFreeBSD|GNU|SunOS)$")
|
||||
set(PLATFORM_LIBRARIES rt)
|
||||
ENDIF (APPLE)
|
||||
|
||||
option(ENABLE_QT "Enable the Qt frontend" ON)
|
||||
option(CITRA_FORCE_QT4 "Use Qt4 even if Qt5 is available." OFF)
|
||||
if (ENABLE_QT)
|
||||
# Set CMAKE_PREFIX_PATH if QTDIR is defined in the environment This allows CMake to
|
||||
# automatically find the Qt packages on Windows
|
||||
if (DEFINED ENV{QTDIR})
|
||||
list(APPEND CMAKE_PREFIX_PATH "$ENV{QTDIR}")
|
||||
endif()
|
||||
|
||||
if (NOT CITRA_FORCE_QT4)
|
||||
find_package(Qt5 COMPONENTS Widgets OpenGL)
|
||||
set(CITRA_QT_LIBS Qt5::Widgets Qt5::OpenGL)
|
||||
endif()
|
||||
|
||||
if (CITRA_FORCE_QT4 OR NOT Qt5_FOUND)
|
||||
# Try to fallback to Qt4
|
||||
find_package(Qt4 REQUIRED COMPONENTS QtGui QtOpenGL)
|
||||
set(CITRA_QT_LIBS Qt4::QtGui Qt4::QtOpenGL)
|
||||
# MINGW: GCC does not support codecvt, so use iconv instead
|
||||
if (UNIX OR MINGW)
|
||||
find_library(ICONV_LIBRARY NAMES iconv)
|
||||
if (ICONV_LIBRARY)
|
||||
list(APPEND PLATFORM_LIBRARIES ${ICONV_LIBRARY})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
|
||||
# Include source code
|
||||
# ===================
|
||||
|
||||
# This function should be passed a list of all files in a target. It will automatically generate
|
||||
# file groups following the directory hierarchy, so that the layout of the files in IDEs matches the
|
||||
# one in the filesystem.
|
||||
@@ -190,38 +336,36 @@ function(create_directory_groups)
|
||||
endforeach()
|
||||
endfunction()
|
||||
|
||||
# generate git revision information
|
||||
# Gets a UTC timstamp and sets the provided variable to it
|
||||
function(get_timestamp _var)
|
||||
string(TIMESTAMP timestamp UTC)
|
||||
set(${_var} "${timestamp}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
# generate git/build information
|
||||
include(GetGitRevisionDescription)
|
||||
get_git_head_revision(GIT_REF_SPEC GIT_REV)
|
||||
git_describe(GIT_DESC --always --long --dirty)
|
||||
git_branch_name(GIT_BRANCH)
|
||||
get_timestamp(BUILD_DATE)
|
||||
|
||||
set(INI_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/externals/inih")
|
||||
include_directories(${INI_PREFIX})
|
||||
add_subdirectory(${INI_PREFIX})
|
||||
|
||||
include_directories(externals/nihstro/include)
|
||||
|
||||
if (MSVC)
|
||||
add_subdirectory(externals/getopt)
|
||||
endif()
|
||||
|
||||
# process subdirectories
|
||||
if(ENABLE_QT)
|
||||
include_directories(externals/qhexedit)
|
||||
add_subdirectory(externals/qhexedit)
|
||||
endif()
|
||||
enable_testing()
|
||||
add_subdirectory(externals)
|
||||
add_subdirectory(src)
|
||||
|
||||
|
||||
# Installation instructions
|
||||
# =========================
|
||||
|
||||
# Install freedesktop.org metadata files, following those specifications:
|
||||
# http://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html
|
||||
# http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html
|
||||
# http://standards.freedesktop.org/shared-mime-info-spec/shared-mime-info-spec-latest.html
|
||||
if(${CMAKE_SYSTEM_NAME} MATCHES "Linux|FreeBSD|OpenBSD|NetBSD")
|
||||
install(FILES "${CMAKE_SOURCE_DIR}/dist/citra.desktop"
|
||||
if(ENABLE_QT AND UNIX AND NOT APPLE)
|
||||
install(FILES "${CMAKE_SOURCE_DIR}/dist/yuzu.desktop"
|
||||
DESTINATION "${CMAKE_INSTALL_PREFIX}/share/applications")
|
||||
install(FILES "${CMAKE_SOURCE_DIR}/dist/citra.svg"
|
||||
install(FILES "${CMAKE_SOURCE_DIR}/dist/yuzu.svg"
|
||||
DESTINATION "${CMAKE_INSTALL_PREFIX}/share/pixmaps")
|
||||
install(FILES "${CMAKE_SOURCE_DIR}/dist/citra.xml"
|
||||
install(FILES "${CMAKE_SOURCE_DIR}/dist/yuzu.xml"
|
||||
DESTINATION "${CMAKE_INSTALL_PREFIX}/share/mime/packages")
|
||||
endif()
|
||||
|
||||
17
CMakeModules/CopyYuzuQt5Deps.cmake
Normal file
17
CMakeModules/CopyYuzuQt5Deps.cmake
Normal file
@@ -0,0 +1,17 @@
|
||||
function(copy_yuzu_Qt5_deps target_dir)
|
||||
include(WindowsCopyFiles)
|
||||
set(DLL_DEST "${CMAKE_BINARY_DIR}/bin/$<CONFIG>/")
|
||||
set(Qt5_DLL_DIR "${Qt5_DIR}/../../../bin")
|
||||
set(Qt5_PLATFORMS_DIR "${Qt5_DIR}/../../../plugins/platforms/")
|
||||
set(PLATFORMS ${DLL_DEST}platforms/)
|
||||
windows_copy_files(${target_dir} ${Qt5_DLL_DIR} ${DLL_DEST}
|
||||
icudt*.dll
|
||||
icuin*.dll
|
||||
icuuc*.dll
|
||||
Qt5Core$<$<CONFIG:Debug>:d>.*
|
||||
Qt5Gui$<$<CONFIG:Debug>:d>.*
|
||||
Qt5OpenGL$<$<CONFIG:Debug>:d>.*
|
||||
Qt5Widgets$<$<CONFIG:Debug>:d>.*
|
||||
)
|
||||
windows_copy_files(yuzu ${Qt5_PLATFORMS_DIR} ${PLATFORMS} qwindows$<$<CONFIG:Debug>:d>.*)
|
||||
endfunction(copy_yuzu_Qt5_deps)
|
||||
5
CMakeModules/CopyYuzuSDLDeps.cmake
Normal file
5
CMakeModules/CopyYuzuSDLDeps.cmake
Normal file
@@ -0,0 +1,5 @@
|
||||
function(copy_yuzu_SDL_deps target_dir)
|
||||
include(WindowsCopyFiles)
|
||||
set(DLL_DEST "${CMAKE_BINARY_DIR}/bin/$<CONFIG>/")
|
||||
windows_copy_files(${target_dir} ${SDL2_DLL_DIR} ${DLL_DEST} SDL2.dll)
|
||||
endfunction(copy_yuzu_SDL_deps)
|
||||
9
CMakeModules/CopyYuzuUnicornDeps.cmake
Normal file
9
CMakeModules/CopyYuzuUnicornDeps.cmake
Normal file
@@ -0,0 +1,9 @@
|
||||
function(copy_yuzu_unicorn_deps target_dir)
|
||||
include(WindowsCopyFiles)
|
||||
set(DLL_DEST "${CMAKE_BINARY_DIR}/bin/$<CONFIG>/")
|
||||
windows_copy_files(${target_dir} ${UNICORN_DLL_DIR} ${DLL_DEST}
|
||||
libgcc_s_seh-1.dll
|
||||
libwinpthread-1.dll
|
||||
unicorn.dll
|
||||
)
|
||||
endfunction(copy_yuzu_unicorn_deps)
|
||||
18
CMakeModules/DownloadExternals.cmake
Normal file
18
CMakeModules/DownloadExternals.cmake
Normal file
@@ -0,0 +1,18 @@
|
||||
|
||||
# This function downloads a binary library package from our external repo.
|
||||
# Params:
|
||||
# remote_path: path to the file to download, relative to the remote repository root
|
||||
# prefix_var: name of a variable which will be set with the path to the extracted contents
|
||||
function(download_bundled_external remote_path lib_name prefix_var)
|
||||
set(prefix "${CMAKE_BINARY_DIR}/externals/${lib_name}")
|
||||
if (NOT EXISTS "${prefix}")
|
||||
message(STATUS "Downloading binaries for ${lib_name}...")
|
||||
file(DOWNLOAD
|
||||
https://github.com/yuzu-emu/ext-windows-bin/raw/master/${remote_path}${lib_name}.7z
|
||||
"${CMAKE_BINARY_DIR}/externals/${lib_name}.7z" SHOW_PROGRESS)
|
||||
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf "${CMAKE_BINARY_DIR}/externals/${lib_name}.7z"
|
||||
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/externals")
|
||||
endif()
|
||||
message(STATUS "Using bundled binaries at ${prefix}")
|
||||
set(${prefix_var} "${prefix}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
@@ -1,13 +1,19 @@
|
||||
# Reporting Issues
|
||||
|
||||
**The issue tracker is not a support forum.** Unless you can provide precise *technical information* regarding an issue, you *should not post in it*. If you need support, first read the [FAQ](https://github.com/yuzu-emu/yuzu/wiki/FAQ) and then either visit our Discord server, [our forum](https://community.citra-emu.org) or ask in a general emulation forum such as [/r/emulation](https://www.reddit.com/r/emulation/). If you post support questions, generic messages to the developers or vague reports without technical details, they will be closed and locked.
|
||||
|
||||
If you believe you have a valid issue report, please post text or a screenshot from the log (the console window that opens alongside yuzu) and build version (hex string visible in the titlebar and zip filename), as well as your hardware and software information if applicable.
|
||||
|
||||
# Contributing
|
||||
Citra is a brand new project, so we have a great opportunity to keep things clean and well organized early on. As such, coding style is very important when making commits. They aren't very strict rules since we want to be flexible and we understand that under certain circumstances some of them can be counterproductive. Just try to follow as many of them as possible:
|
||||
yuzu is a brand new project, so we have a great opportunity to keep things clean and well organized early on. As such, coding style is very important when making commits. We run clang-format on our CI to check the code. Please use it to format your code when contributing. However, it doesn't cover all the rules below. Some of them aren't very strict rules since we want to be flexible and we understand that under certain circumstances some of them can be counterproductive. Just try to follow as many of them as possible:
|
||||
|
||||
### General Rules
|
||||
* A lot of code was taken from other projects (e.g. Dolphin, PPSSPP, Gekko, SkyEye). In general, when editing other people's code, follow the style of the module you're in (or better yet, fix the style if it drastically differs from our guide).
|
||||
* Line width is typically 100 characters, but this isn't strictly enforced. Please do not use 80-characters.
|
||||
* A lot of code was taken from other projects (e.g. Citra, Dolphin, PPSSPP, Gekko). In general, when editing other people's code, follow the style of the module you're in (or better yet, fix the style if it drastically differs from our guide).
|
||||
* Line width is typically 100 characters. Please do not use 80-characters.
|
||||
* Don't ever introduce new external dependencies into Core
|
||||
* Don't use any platform specific code in Core
|
||||
* Use namespaces often
|
||||
* Avoid the use of C-style casts and instead prefer C++-style `static_cast` and `reinterpret_cast`. Never use `const_cast` or `dynamic_cast` (we build with RTTI disabled). The only exception to this rule is for casting between two numeric types, where C-style casts are encouraged for brevity and readability.
|
||||
* Avoid the use of C-style casts and instead prefer C++-style `static_cast` and `reinterpret_cast`. Try to avoid using `dynamic_cast`. Never use `const_cast`. The only exception to this rule is for casting between two numeric types, where C-style casts are encouraged for brevity and readability.
|
||||
|
||||
### Naming Rules
|
||||
* Functions: `PascalCase`
|
||||
@@ -25,19 +31,35 @@ Follow the indentation/whitespace style shown below. Do not use tabs, use 4-spac
|
||||
* For items that are both defined and declared in two separate files, put the doc-comment only next to the associated declaration. (In a header file, usually.) Otherwise, put it next to the implementation. Never duplicate doc-comments in both places.
|
||||
|
||||
```cpp
|
||||
// Includes should be sorted lexicographically
|
||||
// STD includes first
|
||||
#include <map>
|
||||
#include <memory>
|
||||
|
||||
// then, library includes
|
||||
#include <nihstro/shared_binary.h>
|
||||
|
||||
// finally, yuzu includes
|
||||
#include "common/math_util.h"
|
||||
#include "common/vector_math.h"
|
||||
|
||||
// each major module is separated
|
||||
#include "video_core/pica.h"
|
||||
#include "video_core/video_core.h"
|
||||
|
||||
namespace Example {
|
||||
|
||||
// Namespace contents are not indented
|
||||
|
||||
// Declare globals at the top
|
||||
int g_foo = 0;
|
||||
char* g_some_pointer; // Pointer * and reference & stick to the type name
|
||||
int g_foo{}; // {} can be used to initialize types as 0, false, or nullptr
|
||||
char* g_some_pointer{}; // Pointer * and reference & stick to the type name, and make sure to initialize as nullptr!
|
||||
|
||||
/// A colorful enum.
|
||||
enum SomeEnum {
|
||||
COLOR_RED, ///< The color of fire.
|
||||
COLOR_GREEN, ///< The color of grass.
|
||||
COLOR_BLUE, ///< Not actually the color of water.
|
||||
ColorRed, ///< The color of fire.
|
||||
ColorGreen, ///< The color of grass.
|
||||
ColorBlue, ///< Not actually the color of water.
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -45,17 +67,19 @@ enum SomeEnum {
|
||||
* Note that the asterisks are indented by one space to align to the first line.
|
||||
*/
|
||||
struct Position {
|
||||
int x, y;
|
||||
int x{}, y{}; // Always intitialize member variables!
|
||||
};
|
||||
|
||||
// Use "typename" rather than "class" here
|
||||
template <typename T>
|
||||
void FooBar() {
|
||||
int some_array[] = {
|
||||
const std::string some_string{ "prefer uniform initialization" };
|
||||
|
||||
int some_array[]{
|
||||
5,
|
||||
25,
|
||||
7,
|
||||
42
|
||||
42,
|
||||
};
|
||||
|
||||
if (note == the_space_after_the_if) {
|
||||
@@ -64,11 +88,8 @@ void FooBar() {
|
||||
// Use a space after the // when commenting
|
||||
}
|
||||
|
||||
// Comment directly above code when possible
|
||||
if (some_condition) single_statement();
|
||||
|
||||
// Place a single space after the for loop semicolons, prefer pre-increment
|
||||
for (int i = 0; i != 25; ++i) {
|
||||
for (int i{}; i != 25; ++i) {
|
||||
// This is how we write loops
|
||||
}
|
||||
|
||||
@@ -86,7 +107,7 @@ void FooBar() {
|
||||
switch (var) {
|
||||
// No indentation for case label
|
||||
case 1: {
|
||||
int case_var = var + 3;
|
||||
int case_var{ var + 3 };
|
||||
DoSomething(case_var);
|
||||
break;
|
||||
}
|
||||
|
||||
4
Doxyfile
4
Doxyfile
@@ -32,7 +32,7 @@ DOXYFILE_ENCODING = UTF-8
|
||||
# title of most generated pages and in a few other places.
|
||||
# The default value is: My Project.
|
||||
|
||||
PROJECT_NAME = Citra
|
||||
PROJECT_NAME = yuzu
|
||||
|
||||
# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
|
||||
# could be handy for archiving the generated documentation or if some version
|
||||
@@ -44,7 +44,7 @@ PROJECT_NUMBER =
|
||||
# for a project that appears at the top of each page and should give viewer a
|
||||
# quick idea about the purpose of the project. Keep the description short.
|
||||
|
||||
PROJECT_BRIEF = "Nintendo 3DS emulator/debugger"
|
||||
PROJECT_BRIEF = "Nintendo Switch emulator/debugger"
|
||||
|
||||
# With the PROJECT_LOGO tag one can specify an logo or icon that is included in
|
||||
# the documentation. The maximum height of the logo should not exceed 55 pixels
|
||||
|
||||
45
README.md
45
README.md
@@ -1,32 +1,39 @@
|
||||
Citra Emulator
|
||||
==============
|
||||
[](https://travis-ci.org/citra-emu/citra)
|
||||
[](https://ci.appveyor.com/project/bunnei/citra)
|
||||
yuzu emulator
|
||||
=============
|
||||
[](https://travis-ci.org/yuzu-emu/yuzu)
|
||||
[](https://ci.appveyor.com/project/bunnei/yuzu)
|
||||
|
||||
Citra is an experimental open-source Nintendo 3DS emulator/debugger written in C++. It is written with portability in mind, with builds actively maintained for Windows, Linux and OS X. Citra only emulates a subset of 3DS hardware, and therefore is generally only useful for running/debugging homebrew applications. At this time, Citra is even able to boot several commercial games! Most of these do not run to a playable state, but we are working every day to advance the project forward.
|
||||
yuzu is an experimental open-source emulator for the Nintendo Switch from the creators of [Citra](https://citra-emu.org/).
|
||||
|
||||
Citra is licensed under the GPLv2 (or any later version). Refer to the license.txt file included. Please read the [FAQ](https://github.com/citra-emu/citra/wiki/FAQ) before getting started with the project.
|
||||
It is written in C++ with portability in mind, with builds actively maintained for Windows, Linux and macOS. The emulator is currently only useful for homebrew development and research purposes.
|
||||
|
||||
For development discussion, please join us @ #citra on freenode.
|
||||
yuzu only emulates a subset of Switch hardware and therefore is generally only useful for running/debugging homebrew applications. At this time, yuzu does not run any commercial Switch games. yuzu can boot some games, to varying degrees of success, but does not implement any of the necessary GPU features to render 3D graphics.
|
||||
|
||||
yuzu is licensed under the GPLv2 (or any later version). Refer to the license.txt file included.
|
||||
|
||||
Check out our [website](https://yuzu-emu.org/)!
|
||||
|
||||
For development discussion, please join us on [Discord](https://discord.gg/XQV6dn9).
|
||||
|
||||
### Development
|
||||
|
||||
If you want to contribute please take a look at the [Contributor's Guide](CONTRIBUTING.md), [TODO list](https://docs.google.com/document/d/1SWIop0uBI9IW8VGg97TAtoT_CHNoP42FzYmvG1F4QDA) and [Developer Information](https://github.com/citra-emu/citra/wiki/Developer-Information). You should as well contact any of the developers in the forum in order to know about the current state of the emulator.
|
||||
Most of the development happens on GitHub. It's also where [our central repository](https://github.com/yuzu-emu/yuzu) is hosted.
|
||||
|
||||
If you want to contribute please take a look at the [Contributor's Guide](CONTRIBUTING.md) and [Developer Information](https://github.com/yuzu-emu/yuzu/wiki/Developer-Information). You should as well contact any of the developers on Discord in order to know about the current state of the emulator.
|
||||
|
||||
### Building
|
||||
|
||||
* __Windows__: [Windows Build](https://github.com/citra-emu/citra/wiki/Windows-Build)
|
||||
* __Linux__: [Linux Build](https://github.com/citra-emu/citra/wiki/Linux-Build)
|
||||
* __OSX__: [OS X Build](https://github.com/citra-emu/citra/wiki/OS-X-Build)
|
||||
* __Windows__: [Windows Build](https://github.com/yuzu-emu/yuzu/wiki/Building-For-Windows)
|
||||
* __Linux__: [Linux Build](https://github.com/yuzu-emu/yuzu/wiki/Building-For-Linux)
|
||||
* __macOS__: [macOS Build](https://github.com/yuzu-emu/yuzu/wiki/Building-for-macOS)
|
||||
|
||||
|
||||
### Support
|
||||
If you like, you can [donate by PayPal](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=K899FANUJ2ZXW) - any donation received will go towards things like:
|
||||
* 3DS consoles for developers to explore the hardware
|
||||
* 3DS games for testing
|
||||
* Any equipment required for homebrew
|
||||
* Infrastructure setup
|
||||
* Eventually 3D displays to get proper 3D output working
|
||||
* ... etc ...
|
||||
We happily accept monetary donations or donated games and hardware. Please see our [donations page](https://yuzu-emu.org/donate/) for more information on how you can contribute to yuzu. Any donations received will go towards things like:
|
||||
* Switch consoles to explore and reverse-engineer the hardware
|
||||
* Switch games for testing, reverse-engineering, and implementing new features
|
||||
* Web hosting and infrastructure setup
|
||||
* Software licenses (e.g. Visual Studio, IDA Pro, etc.)
|
||||
* Additional hardware (e.g. GPUs as-needed to improve rendering support, other peripherals to add support for, etc.)
|
||||
|
||||
We also more than gladly accept used 3DS consoles, preferrably ones with firmware 4.5 or lower! If you would like to give yours away, don't hesitate to join our IRC channel #citra on [Freenode](http://webchat.freenode.net/?channels=citra) and talk to neobrain or bunnei. Mind you, IRC is slow-paced, so it might be a while until people reply. If you're in a hurry you can just leave contact details in the channel or via private message and we'll get back to you.
|
||||
We also more than gladly accept used Switch consoles, preferably ones with firmware 3.0.0 or lower! If you would like to give yours away, don't hesitate to join our [Discord](https://discord.gg/VXqngT3) and talk to bunnei. You may also contact: donations@yuzu-emu.org.
|
||||
|
||||
182
appveyor.yml
182
appveyor.yml
@@ -1,10 +1,20 @@
|
||||
# shallow clone
|
||||
clone_depth: 5
|
||||
clone_depth: 10
|
||||
|
||||
cache:
|
||||
- C:\ProgramData\chocolatey\bin -> appveyor.yml
|
||||
- C:\ProgramData\chocolatey\lib -> appveyor.yml
|
||||
|
||||
os: Visual Studio 2017
|
||||
|
||||
environment:
|
||||
QTDIR: C:\Qt\5.4\msvc2013_64_opengl
|
||||
BUILD_PASSWORD:
|
||||
secure: EXGNlWKJsCtbeImEJ5EP9qrxZ+EqUFfNy+CP61nDOMA=
|
||||
# Tell msys2 to add mingw64 to the path
|
||||
MSYSTEM: MINGW64
|
||||
# Tell msys2 to inherit the current directory when starting the shell
|
||||
CHERE_INVOKING: 1
|
||||
matrix:
|
||||
- BUILD_TYPE: mingw
|
||||
- BUILD_TYPE: msvc
|
||||
|
||||
platform:
|
||||
- x64
|
||||
@@ -14,38 +24,148 @@ configuration:
|
||||
|
||||
install:
|
||||
- git submodule update --init --recursive
|
||||
- ps: |
|
||||
if ($env:BUILD_TYPE -eq 'mingw') {
|
||||
$dependencies = "mingw64/mingw-w64-x86_64-cmake",
|
||||
"mingw64/mingw-w64-x86_64-qt5",
|
||||
"mingw64/mingw-w64-x86_64-SDL2"
|
||||
# redirect err to null to prevent warnings from becoming errors
|
||||
# workaround to prevent pacman from failing due to cyclical dependencies
|
||||
C:\msys64\usr\bin\bash -lc "pacman --noconfirm -S mingw64/mingw-w64-x86_64-freetype mingw64/mingw-w64-x86_64-fontconfig" 2> $null
|
||||
C:\msys64\usr\bin\bash -lc "pacman --noconfirm -S $dependencies" 2> $null
|
||||
}
|
||||
|
||||
before_build:
|
||||
- mkdir build
|
||||
- cd build
|
||||
- cmake -G "Visual Studio 12 Win64" ..
|
||||
- mkdir %BUILD_TYPE%_build
|
||||
- cd %BUILD_TYPE%_build
|
||||
- ps: |
|
||||
if ($env:BUILD_TYPE -eq 'msvc') {
|
||||
# redirect stderr and change the exit code to prevent powershell from cancelling the build if cmake prints a warning
|
||||
cmd /C 'cmake -G "Visual Studio 15 2017 Win64" -DYUZU_USE_BUNDLED_QT=1 -DYUZU_USE_BUNDLED_SDL2=1 -DYUZU_USE_BUNDLED_UNICORN=1 .. 2>&1 && exit 0'
|
||||
} else {
|
||||
C:\msys64\usr\bin\bash.exe -lc "cmake -G 'MSYS Makefiles' -DYUZU_BUILD_UNICORN=1 -DCMAKE_BUILD_TYPE=Release .. 2>&1"
|
||||
}
|
||||
- cd ..
|
||||
|
||||
build_script:
|
||||
- ps: |
|
||||
if ($env:BUILD_TYPE -eq 'msvc') {
|
||||
# https://www.appveyor.com/docs/build-phase
|
||||
msbuild msvc_build/yuzu.sln /maxcpucount /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"
|
||||
} else {
|
||||
C:\msys64\usr\bin\bash.exe -lc 'mingw32-make -C mingw_build/ 2>&1'
|
||||
}
|
||||
|
||||
after_build:
|
||||
# copying the needed QT Dlls is now done post build. See the CMakeLists.txt file in the citra-qt folder
|
||||
- ps: >
|
||||
if (!"$env:APPVEYOR_PULL_REQUEST_TITLE" -and ("$env:APPVEYOR_REPO_BRANCH" -eq "master"))
|
||||
{
|
||||
$GITDATE = $(git show -s --date=short --format='%ad') -replace "-",""
|
||||
$GITREV = $(git show -s --format='%h')
|
||||
# Where are these spaces coming from? Regardless, let's remove them
|
||||
$BUILD_NAME = "citra-${GITDATE}-${GITREV}-windows-amd64.7z" -replace " ",""
|
||||
$BUILD_NAME_NOQT = "citra-noqt-${GITDATE}-${GITREV}-windows-amd64.7z" -replace " ",""
|
||||
# Zip up the build folder
|
||||
7z a $BUILD_NAME .\build\bin\release\*
|
||||
# Do a second archive with only the binaries
|
||||
7z a $BUILD_NAME_NOQT .\build\bin\release\*.exe
|
||||
- ps: |
|
||||
$GITDATE = $(git show -s --date=short --format='%ad') -replace "-",""
|
||||
$GITREV = $(git show -s --format='%h')
|
||||
|
||||
# Download winscp
|
||||
Invoke-WebRequest "http://iweb.dl.sourceforge.net/project/winscp/WinSCP/5.7.3/winscp573.zip" -OutFile "winscp573.zip"
|
||||
7z e -y winscp573.zip
|
||||
# Find out which kind of release we are producing by tag name
|
||||
if ($env:APPVEYOR_REPO_TAG_NAME) {
|
||||
$RELEASE_DIST, $RELEASE_VERSION = $env:APPVEYOR_REPO_TAG_NAME.split('-')
|
||||
} else {
|
||||
# There is no repo tag - make assumptions
|
||||
$RELEASE_DIST = "head"
|
||||
}
|
||||
|
||||
# Upload to server
|
||||
.\WinSCP.com /command `
|
||||
"option batch abort" `
|
||||
"option confirm off" `
|
||||
"open sftp://citra-builds:${env:BUILD_PASSWORD}@builds.citra-emu.org -hostkey=*" `
|
||||
"put $BUILD_NAME /citra/nightly/windows-amd64/" `
|
||||
"put $BUILD_NAME_NOQT /citra/nightly/windows-noqt-amd64/" `
|
||||
"exit"
|
||||
if ($env:BUILD_TYPE -eq 'msvc') {
|
||||
# Where are these spaces coming from? Regardless, let's remove them
|
||||
$MSVC_BUILD_ZIP = "yuzu-windows-msvc-$GITDATE-$GITREV.zip" -replace " ", ""
|
||||
$MSVC_BUILD_PDB = "yuzu-windows-msvc-$GITDATE-$GITREV-debugsymbols.zip" -replace " ", ""
|
||||
$MSVC_SEVENZIP = "yuzu-windows-msvc-$GITDATE-$GITREV.7z" -replace " ", ""
|
||||
|
||||
# set the build names as env vars so the artifacts can upload them
|
||||
$env:BUILD_ZIP = $MSVC_BUILD_ZIP
|
||||
$env:BUILD_SYMBOLS = $MSVC_BUILD_PDB
|
||||
$env:BUILD_UPDATE = $MSVC_SEVENZIP
|
||||
|
||||
mkdir pdb
|
||||
Get-ChildItem ".\msvc_build\bin\" -Recurse -Filter "*.pdb" | Copy-Item -destination .\pdb
|
||||
7z a -tzip $MSVC_BUILD_PDB .\pdb\*.pdb
|
||||
|
||||
mkdir $RELEASE_DIST
|
||||
Get-ChildItem ".\msvc_build\bin\" -Recurse -Filter "yuzu*.exe" | Copy-Item -destination $RELEASE_DIST
|
||||
Copy-Item .\license.txt -Destination $RELEASE_DIST
|
||||
Copy-Item .\README.md -Destination $RELEASE_DIST
|
||||
7z a -tzip $MSVC_BUILD_ZIP $RELEASE_DIST\*
|
||||
7z a $MSVC_SEVENZIP $RELEASE_DIST
|
||||
} else {
|
||||
$MINGW_BUILD_ZIP = "yuzu-windows-mingw-$GITDATE-$GITREV.zip" -replace " ", ""
|
||||
$MINGW_SEVENZIP = "yuzu-windows-mingw-$GITDATE-$GITREV.7z" -replace " ", ""
|
||||
# not going to bother adding separate debug symbols for mingw, so just upload a README for it
|
||||
# if someone wants to add them, change mingw to compile with -g and use objdump and strip to separate the symbols from the binary
|
||||
$MINGW_NO_DEBUG_SYMBOLS = "README_No_Debug_Symbols.txt"
|
||||
Set-Content -Path $MINGW_NO_DEBUG_SYMBOLS -Value "This is a workaround for Appveyor since msvc has debug symbols but mingw doesnt" -Force
|
||||
|
||||
# store the build information in env vars so we can use them as artifacts
|
||||
$env:BUILD_ZIP = $MINGW_BUILD_ZIP
|
||||
$env:BUILD_SYMBOLS = $MINGW_NO_DEBUG_SYMBOLS
|
||||
$env:BUILD_UPDATE = $MINGW_SEVENZIP
|
||||
|
||||
$CMAKE_SOURCE_DIR = "$env:APPVEYOR_BUILD_FOLDER"
|
||||
$CMAKE_BINARY_DIR = "$CMAKE_SOURCE_DIR/mingw_build/bin"
|
||||
$RELEASE_DIST = $RELEASE_DIST + "-mingw"
|
||||
|
||||
mkdir $RELEASE_DIST
|
||||
mkdir $RELEASE_DIST/platforms
|
||||
|
||||
# copy the compiled binaries and other release files to the release folder
|
||||
Get-ChildItem "$CMAKE_BINARY_DIR" -Filter "yuzu*.exe" | Copy-Item -destination $RELEASE_DIST
|
||||
Copy-Item -path "$CMAKE_SOURCE_DIR/license.txt" -destination $RELEASE_DIST
|
||||
Copy-Item -path "$CMAKE_SOURCE_DIR/README.md" -destination $RELEASE_DIST
|
||||
# copy all the dll dependencies to the release folder
|
||||
# hardcoded list because we don't build static and determining the list of dlls from the binary is a pain.
|
||||
$MingwDLLs = "Qt5Core.dll","Qt5Widgets.dll","Qt5Gui.dll","Qt5OpenGL.dll",
|
||||
# QT dll dependencies
|
||||
"libbz2-*.dll","libicudt*.dll","libicuin*.dll","libicuuc*.dll","libffi-*.dll",
|
||||
"libfreetype-*.dll","libglib-*.dll","libgobject-*.dll","libgraphite2.dll","libiconv-*.dll",
|
||||
"libharfbuzz-*.dll","libintl-*.dll","libpcre-*.dll","libpcre2-16-*.dll","libpcre16-*.dll","libpng16-*.dll",
|
||||
# Runtime/Other dependencies
|
||||
"libgcc_s_seh-*.dll","libstdc++-*.dll","libwinpthread-*.dll","SDL2.dll","zlib1.dll"
|
||||
foreach ($file in $MingwDLLs) {
|
||||
Copy-Item -path "C:/msys64/mingw64/bin/$file" -force -destination "$RELEASE_DIST"
|
||||
}
|
||||
# the above list copies a few extra debug dlls that aren't needed (thanks globbing patterns!)
|
||||
# so we can remove them by hardcoding another list of extra dlls to remove
|
||||
$DebugDLLs = "libicudtd*.dll","libicuind*.dll","libicuucd*.dll"
|
||||
foreach ($file in $DebugDLLs) {
|
||||
Remove-Item -path "$RELEASE_DIST/$file"
|
||||
}
|
||||
|
||||
# copy the qt windows plugin dll to platforms
|
||||
Copy-Item -path "C:/msys64/mingw64/share/qt5/plugins/platforms/qwindows.dll" -force -destination "$RELEASE_DIST/platforms"
|
||||
|
||||
7z a -tzip $MINGW_BUILD_ZIP $RELEASE_DIST\*
|
||||
7z a $MINGW_SEVENZIP $RELEASE_DIST
|
||||
}
|
||||
|
||||
test_script:
|
||||
- cd %BUILD_TYPE%_build
|
||||
- ps: |
|
||||
if ($env:BUILD_TYPE -eq 'msvc') {
|
||||
ctest -VV -C Release
|
||||
} else {
|
||||
C:\msys64\usr\bin\bash.exe -lc "ctest -VV -C Release"
|
||||
}
|
||||
- cd ..
|
||||
|
||||
artifacts:
|
||||
- path: $(BUILD_ZIP)
|
||||
name: build
|
||||
type: zip
|
||||
- path: $(BUILD_SYMBOLS)
|
||||
name: debugsymbols
|
||||
- path: $(BUILD_UPDATE)
|
||||
name: update
|
||||
|
||||
deploy:
|
||||
provider: GitHub
|
||||
release: $(appveyor_repo_tag_name)
|
||||
auth_token:
|
||||
secure: "argb6oi2TYLB4wDy+HoCC8PuGAmsnocSk12CQ5614XAPO+NVPndlkLv1utnDFfg2"
|
||||
artifact: update,build
|
||||
draft: false
|
||||
prerelease: false
|
||||
on:
|
||||
appveyor_repo_tag: true
|
||||
|
||||
14
dist/citra.desktop
vendored
14
dist/citra.desktop
vendored
@@ -1,14 +0,0 @@
|
||||
[Desktop Entry]
|
||||
Version=1.0
|
||||
Type=Application
|
||||
Name=Citra
|
||||
GenericName=3DS Emulator
|
||||
GenericName[fr]=Émulateur 3DS
|
||||
Comment=Nintendo 3DS video game console emulator
|
||||
Comment[fr]=Émulateur de console de jeu Nintendo 3DS
|
||||
Icon=citra
|
||||
TryExec=citra-qt
|
||||
Exec=citra-qt %f
|
||||
Categories=Game;Emulator;Qt;
|
||||
MimeType=application/x-ctr-3dsx;application/x-ctr-cci;application/x-ctr-cia;application/x-ctr-cxi;
|
||||
Keywords=3DS;Nintendo;
|
||||
BIN
dist/citra.ico
vendored
BIN
dist/citra.ico
vendored
Binary file not shown.
|
Before Width: | Height: | Size: 497 KiB |
80
dist/citra.svg
vendored
80
dist/citra.svg
vendored
@@ -1,80 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
Copyright 2014 Citra Emulator Project
|
||||
Licensed under GPLv2 or any later version
|
||||
Refer to the license.txt file included.
|
||||
-->
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 341.071 338.846">
|
||||
<radialGradient id="a" cx="170.5356" cy="167.271" r="170.5332" gradientTransform="matrix(1 0 0 0.9935 0 3.2396)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.5193" stop-color="#FFFFFF" stop-opacity="0.1"/>
|
||||
<stop offset="0.9415" stop-color="#000000" stop-opacity="0.5"/>
|
||||
<stop offset="1" stop-color="#1A1818" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<ellipse fill="url(#a)" cx="170.535" cy="169.423" rx="170.535" ry="169.423"/>
|
||||
<circle fill="#D16F17" cx="170.536" cy="167.885" r="161.557"/>
|
||||
<linearGradient id="b" gradientUnits="userSpaceOnUse" x1="234.4458" y1="33.5771" x2="97.5655" y2="321.2358">
|
||||
<stop offset="0" stop-color="#FFF8BD"/>
|
||||
<stop offset="1" stop-color="#F6DCAE"/>
|
||||
</linearGradient>
|
||||
<circle fill="url(#b)" cx="170.536" cy="167.885" r="155.295"/>
|
||||
<g>
|
||||
<linearGradient id="c" gradientUnits="userSpaceOnUse" x1="332.436" y1="91.7446" x2="111.1593" y2="342.0988">
|
||||
<stop offset="0" stop-color="#F7A076"/>
|
||||
<stop offset="0.4455" stop-color="#F3816C"/>
|
||||
<stop offset="1" stop-color="#F06878"/>
|
||||
</linearGradient>
|
||||
<path fill="url(#c)" stroke="#F06564" stroke-miterlimit="10" d="M309.704,123.138
|
||||
c-5.9-7.802-128.517,44.681-128.517,44.681S303.803,221.01,309.704,212.5C322.434,194.142,323.182,140.957,309.704,123.138z"/>
|
||||
<linearGradient id="d" gradientUnits="userSpaceOnUse" x1="285.5845" y1="50.3345" x2="64.3074" y2="300.6891">
|
||||
<stop offset="0" stop-color="#9DC63B"/>
|
||||
<stop offset="1" stop-color="#9BC183"/>
|
||||
</linearGradient>
|
||||
<path fill="url(#d)" stroke="#72AA42" stroke-miterlimit="10" d="M300.518,100.96c-3.98-21.983-41.059-60.12-63.189-63.188
|
||||
c-9.688-1.345-59.28,122.469-59.28,122.469S302.364,111.149,300.518,100.96z"/>
|
||||
<linearGradient id="e" gradientUnits="userSpaceOnUse" x1="229.4995" y1="0.7637" x2="8.2231" y2="251.1176">
|
||||
<stop offset="0" stop-color="#D5DE26"/>
|
||||
<stop offset="1" stop-color="#C5D94B"/>
|
||||
</linearGradient>
|
||||
<path fill="url(#e)" stroke="#BECD30" stroke-miterlimit="10" d="M215.151,28.584c-18.357-12.73-71.543-13.478-89.362,0.001
|
||||
c-7.801,5.899,44.682,128.516,44.682,128.516S223.663,34.484,215.151,28.584z"/>
|
||||
<linearGradient id="f" gradientUnits="userSpaceOnUse" x1="219.3823" y1="-8.1782" x2="-1.8941" y2="242.1756">
|
||||
<stop offset="0" stop-color="#F2D200"/>
|
||||
<stop offset="1" stop-color="#FDEF52"/>
|
||||
</linearGradient>
|
||||
<path fill="url(#f)" stroke="#E1BE29" stroke-miterlimit="10" d="M162.893,160.239c0,0-49.092-124.315-59.281-122.469
|
||||
c-21.982,3.979-60.12,41.058-63.188,63.189C39.078,110.646,162.893,160.239,162.893,160.239z"/>
|
||||
<linearGradient id="g" gradientUnits="userSpaceOnUse" x1="226.0718" y1="-2.2656" x2="4.7951" y2="248.0886">
|
||||
<stop offset="0" stop-color="#FFCD10"/>
|
||||
<stop offset="1" stop-color="#F29634"/>
|
||||
</linearGradient>
|
||||
<path fill="url(#g)" stroke="#F79421" stroke-miterlimit="10" d="M31.236,123.136c-12.73,18.357-13.479,71.543,0,89.362
|
||||
c5.898,7.801,128.516-44.682,128.516-44.682S37.135,114.625,31.236,123.136z"/>
|
||||
<linearGradient id="h" gradientUnits="userSpaceOnUse" x1="272.9214" y1="39.144" x2="51.6446" y2="289.4984">
|
||||
<stop offset="0" stop-color="#F79F1C"/>
|
||||
<stop offset="0.4455" stop-color="#F08021"/>
|
||||
<stop offset="1" stop-color="#ED693C"/>
|
||||
</linearGradient>
|
||||
<path fill="url(#h)" stroke="#F16622" stroke-miterlimit="10" d="M40.422,234.676c3.979,21.982,41.057,60.12,63.188,63.188
|
||||
c9.687,1.346,59.279-122.468,59.279-122.468S38.574,224.487,40.422,234.676z"/>
|
||||
<linearGradient id="i" gradientUnits="userSpaceOnUse" x1="329.0083" y1="88.7129" x2="107.7311" y2="339.0677">
|
||||
<stop offset="0" stop-color="#E47C26"/>
|
||||
<stop offset="0.4455" stop-color="#DF5B27"/>
|
||||
<stop offset="1" stop-color="#DD3A3A"/>
|
||||
</linearGradient>
|
||||
<path fill="url(#i)" stroke="#E03827" stroke-miterlimit="10" d="M125.787,307.051c18.357,12.73,71.543,13.48,89.362,0
|
||||
c7.801-5.898-44.681-128.515-44.681-128.515S117.275,301.153,125.787,307.051z"/>
|
||||
<linearGradient id="j" gradientUnits="userSpaceOnUse" x1="339.1245" y1="97.6562" x2="117.8478" y2="348.0104">
|
||||
<stop offset="0" stop-color="#F3783C"/>
|
||||
<stop offset="0.4455" stop-color="#EF5339"/>
|
||||
<stop offset="1" stop-color="#ED294A"/>
|
||||
</linearGradient>
|
||||
<path fill="url(#j)" stroke="#ED2836" stroke-miterlimit="10" d="M178.047,175.398c0,0,49.09,124.315,59.28,122.467
|
||||
c21.982-3.979,60.121-41.057,63.189-63.188C301.86,224.991,178.047,175.398,178.047,175.398z"/>
|
||||
</g>
|
||||
<linearGradient id="k" gradientUnits="userSpaceOnUse" x1="170.5352" y1="6.3281" x2="170.5351" y2="329.4424">
|
||||
<stop offset="0" stop-color="#FFFFFF" stop-opacity="0.2"/>
|
||||
<stop offset="0.4504" stop-color="#908E8E" stop-opacity="0.05"/>
|
||||
<stop offset="1" stop-color="#030003" stop-opacity="0.2"/>
|
||||
</linearGradient>
|
||||
<circle fill="url(#k)" cx="170.536" cy="167.885" r="161.557"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 5.4 KiB |
59
dist/citra.xml
vendored
59
dist/citra.xml
vendored
@@ -1,59 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
|
||||
<mime-type type="application/x-ctr-3dsx">
|
||||
<comment>3DS homebrew executable</comment>
|
||||
<comment xml:lang="fr">Exécutable 3DS homebrew</comment>
|
||||
<acronym>3DSX</acronym>
|
||||
<icon name="citra"/>
|
||||
<glob pattern="*.3dsx"/>
|
||||
<magic><match value="3DSX" type="string" offset="0"/></magic>
|
||||
</mime-type>
|
||||
|
||||
<mime-type type="application/x-ctr-cci">
|
||||
<comment>3DS cartridge image</comment>
|
||||
<comment xml:lang="fr">Image de cartouche 3DS</comment>
|
||||
<acronym>CCI</acronym>
|
||||
<expanded-acronym>CTR Cart Image</expanded-acronym>
|
||||
<icon name="citra"/>
|
||||
<glob pattern="*.cci"/>
|
||||
<glob pattern="*.3ds"/>
|
||||
<magic><match value="NCSD" type="string" offset="256"/></magic>
|
||||
</mime-type>
|
||||
|
||||
<mime-type type="application/x-ctr-cxi">
|
||||
<comment>3DS executable</comment>
|
||||
<comment xml:lang="fr">Exécutable 3DS</comment>
|
||||
<acronym>CXI</acronym>
|
||||
<expanded-acronym>CTR eXecutable Image</expanded-acronym>
|
||||
<icon name="citra"/>
|
||||
<glob pattern="*.cxi"/>
|
||||
<magic><match value="NCCH" type="string" offset="256"/></magic>
|
||||
</mime-type>
|
||||
|
||||
<mime-type type="application/x-ctr-cia">
|
||||
<comment>3DS importable archive</comment>
|
||||
<comment xml:lang="fr">Archive importable 3DS</comment>
|
||||
<acronym>CIA</acronym>
|
||||
<expanded-acronym>CTR Importable Archive</expanded-acronym>
|
||||
<icon name="citra"/>
|
||||
<glob pattern="*.cia"/>
|
||||
</mime-type>
|
||||
|
||||
<mime-type type="application/x-ctr-smdh">
|
||||
<comment>3DS icon</comment>
|
||||
<comment xml:lang="fr">Icône 3DS</comment>
|
||||
<acronym>SMDH</acronym>
|
||||
<expanded-acronym>System Menu Data Header</expanded-acronym>
|
||||
<glob pattern="*.smdh"/>
|
||||
<magic><match value="SMDH" type="string" offset="0"/></magic>
|
||||
</mime-type>
|
||||
|
||||
<mime-type type="application/x-ctr-cbmd">
|
||||
<comment>3DS banner</comment>
|
||||
<comment xml:lang="fr">Bannière 3DS</comment>
|
||||
<acronym>CBMD</acronym>
|
||||
<expanded-acronym>CTR Banner Model Data</expanded-acronym>
|
||||
<glob pattern="*.cbmd"/>
|
||||
<magic><match value="CBMD" type="string" offset="0"/></magic>
|
||||
</mime-type>
|
||||
</mime-info>
|
||||
BIN
dist/doc-icon.png
vendored
BIN
dist/doc-icon.png
vendored
Binary file not shown.
|
Before Width: | Height: | Size: 8.6 KiB |
5
dist/icons/icons.qrc
vendored
Normal file
5
dist/icons/icons.qrc
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
<RCC>
|
||||
<qresource prefix="icons">
|
||||
<file>yuzu.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
BIN
dist/icons/yuzu.png
vendored
Normal file
BIN
dist/icons/yuzu.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 7.5 KiB |
12
dist/yuzu.desktop
vendored
Normal file
12
dist/yuzu.desktop
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
[Desktop Entry]
|
||||
Version=1.0
|
||||
Type=Application
|
||||
Name=yuzu
|
||||
GenericName=Switch Emulator
|
||||
Comment=Nintendo Switch video game console emulator
|
||||
Icon=yuzu
|
||||
TryExec=yuzu
|
||||
Exec=yuzu %f
|
||||
Categories=Game;Emulator;Qt;
|
||||
MimeType=application/x-nx-nro;application/x-nx-nso;
|
||||
Keywords=Switch;Nintendo;
|
||||
BIN
dist/yuzu.icns
vendored
Normal file
BIN
dist/yuzu.icns
vendored
Normal file
Binary file not shown.
BIN
dist/yuzu.ico
vendored
Normal file
BIN
dist/yuzu.ico
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 361 KiB |
24
dist/yuzu.manifest
vendored
Normal file
24
dist/yuzu.manifest
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
|
||||
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||
<security>
|
||||
<requestedPrivileges>
|
||||
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
|
||||
</requestedPrivileges>
|
||||
</security>
|
||||
</trustInfo>
|
||||
<application xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||
<windowsSettings>
|
||||
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">True/PM</dpiAware>
|
||||
<longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
|
||||
</windowsSettings>
|
||||
</application>
|
||||
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
|
||||
<application>
|
||||
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
|
||||
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
|
||||
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
|
||||
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
|
||||
</application>
|
||||
</compatibility>
|
||||
</assembly>
|
||||
86
dist/yuzu.svg
vendored
Normal file
86
dist/yuzu.svg
vendored
Normal file
@@ -0,0 +1,86 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.1"
|
||||
id="svg815"
|
||||
xml:space="preserve"
|
||||
width="72"
|
||||
height="80"
|
||||
viewBox="0 0 72 80"
|
||||
sodipodi:docname="center-logo-v3.svg"
|
||||
inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"><metadata
|
||||
id="metadata821"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs819"><clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath831"><path
|
||||
d="M 0,60 H 54 V 0 H 0 Z"
|
||||
id="path829"
|
||||
inkscape:connector-curvature="0" /></clipPath><clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath843"><path
|
||||
d="M 0,60 H 54 V 0 H 0 Z"
|
||||
id="path841"
|
||||
inkscape:connector-curvature="0" /></clipPath><clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath855"><path
|
||||
d="M 0,60 H 54 V 0 H 0 Z"
|
||||
id="path853"
|
||||
inkscape:connector-curvature="0" /></clipPath><clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath867"><path
|
||||
d="M 0,60 H 54 V 0 H 0 Z"
|
||||
id="path865"
|
||||
inkscape:connector-curvature="0" /></clipPath></defs><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1017"
|
||||
id="namedview817"
|
||||
showgrid="false"
|
||||
inkscape:zoom="7.4953319"
|
||||
inkscape:cx="28.177201"
|
||||
inkscape:cy="44.348084"
|
||||
inkscape:window-x="-8"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="g823" /><g
|
||||
id="g823"
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="center-logo-v3"
|
||||
transform="matrix(1.3333333,0,0,-1.3333333,0,80)"><g
|
||||
id="right"
|
||||
inkscape:label="#g825"><g
|
||||
id="g827"
|
||||
clip-path="url(#clipPath831)"><g
|
||||
id="g833"
|
||||
transform="translate(30,48)"><path
|
||||
d="m 0,0 v -48 c 13.255,0 24,10.745 24,24 C 24,-10.745 13.255,0 0,0 M 3,-3.214 C 13.163,-4.674 21,-13.439 21,-24 21,-34.561 13.163,-43.326 3,-44.786 v 41.572"
|
||||
style="fill:#ff3c28;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path835"
|
||||
inkscape:connector-curvature="0" /></g></g></g><g
|
||||
id="left"
|
||||
inkscape:label="#g837"><g
|
||||
id="g839"
|
||||
clip-path="url(#clipPath843)"><g
|
||||
id="g845"
|
||||
transform="translate(24,60)"><path
|
||||
d="m 0,0 c -13.255,0 -24,-10.745 -24,-24 0,-13.255 10.745,-24 24,-24 z m -3,-3.214 v -41.572 c -10.163,1.46 -18,10.225 -18,20.786 0,10.561 7.837,19.326 18,20.786"
|
||||
style="fill:#0ab9e6;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path847"
|
||||
inkscape:connector-curvature="0" /></g></g></g></g></svg>
|
||||
|
After Width: | Height: | Size: 3.4 KiB |
18
dist/yuzu.xml
vendored
Normal file
18
dist/yuzu.xml
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
|
||||
<mime-type type="application/x-nx-nro">
|
||||
<comment>Nintendo Switch homebrew executable</comment>
|
||||
<acronym>NRO</acronym>
|
||||
<icon name="yuzu"/>
|
||||
<glob pattern="*.nro"/>
|
||||
<magic><match value="NRO" type="string" offset="16"/></magic>
|
||||
</mime-type>
|
||||
|
||||
<mime-type type="application/x-nx-nso">
|
||||
<comment>Nintendo Switch homebrew executable</comment>
|
||||
<acronym>NSO</acronym>
|
||||
<icon name="yuzu"/>
|
||||
<glob pattern="*.nso"/>
|
||||
<magic><match value="NSO" type="string" offset="0"/></magic>
|
||||
</mime-type>
|
||||
</mime-info>
|
||||
51
externals/CMakeLists.txt
vendored
Normal file
51
externals/CMakeLists.txt
vendored
Normal file
@@ -0,0 +1,51 @@
|
||||
# Definitions for all external bundled libraries
|
||||
|
||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/CMakeModules)
|
||||
include(DownloadExternals)
|
||||
|
||||
# Catch
|
||||
add_library(catch-single-include INTERFACE)
|
||||
target_include_directories(catch-single-include INTERFACE catch/single_include)
|
||||
|
||||
# Dynarmic
|
||||
if (ARCHITECTURE_x86_64)
|
||||
add_library(xbyak INTERFACE)
|
||||
set(DYNARMIC_TESTS OFF)
|
||||
set(DYNARMIC_NO_BUNDLED_FMT ON)
|
||||
add_subdirectory(dynarmic)
|
||||
endif()
|
||||
|
||||
# libfmt
|
||||
add_subdirectory(fmt)
|
||||
|
||||
# getopt
|
||||
if (MSVC)
|
||||
add_subdirectory(getopt)
|
||||
endif()
|
||||
|
||||
# Glad
|
||||
add_subdirectory(glad)
|
||||
|
||||
# inih
|
||||
add_subdirectory(inih)
|
||||
|
||||
# lz4
|
||||
set(LZ4_BUNDLED_MODE ON)
|
||||
add_subdirectory(lz4/contrib/cmake_unofficial)
|
||||
target_include_directories(lz4_static INTERFACE ./lz4/lib)
|
||||
|
||||
# MicroProfile
|
||||
add_library(microprofile INTERFACE)
|
||||
target_include_directories(microprofile INTERFACE ./microprofile)
|
||||
|
||||
# Unicorn
|
||||
add_library(unicorn-headers INTERFACE)
|
||||
target_include_directories(unicorn-headers INTERFACE ./unicorn/include)
|
||||
|
||||
# Xbyak
|
||||
if (ARCHITECTURE_x86_64)
|
||||
# Defined before "dynarmic" above
|
||||
# add_library(xbyak INTERFACE)
|
||||
target_include_directories(xbyak INTERFACE ./xbyak/xbyak)
|
||||
target_compile_definitions(xbyak INTERFACE XBYAK_NO_OP_NAMES)
|
||||
endif()
|
||||
2
externals/boost
vendored
2
externals/boost
vendored
Submodule externals/boost updated: 728a4d7d1c...d80e506e17
1
externals/catch
vendored
Submodule
1
externals/catch
vendored
Submodule
Submodule externals/catch added at 3dcc923351
239
externals/cmake-modules/FindSDL2.cmake
vendored
Normal file
239
externals/cmake-modules/FindSDL2.cmake
vendored
Normal file
@@ -0,0 +1,239 @@
|
||||
|
||||
# This module defines
|
||||
# SDL2_LIBRARY, the name of the library to link against
|
||||
# SDL2_FOUND, if false, do not try to link to SDL2
|
||||
# SDL2_INCLUDE_DIR, where to find SDL.h
|
||||
# SDL2_DLL_DIR, where to find SDL2.dll if it exists
|
||||
#
|
||||
# This module responds to the the flag:
|
||||
# SDL2_BUILDING_LIBRARY
|
||||
# If this is defined, then no SDL2main will be linked in because
|
||||
# only applications need main().
|
||||
# Otherwise, it is assumed you are building an application and this
|
||||
# module will attempt to locate and set the the proper link flags
|
||||
# as part of the returned SDL2_LIBRARY variable.
|
||||
#
|
||||
# Don't forget to include SDLmain.h and SDLmain.m your project for the
|
||||
# OS X framework based version. (Other versions link to -lSDL2main which
|
||||
# this module will try to find on your behalf.) Also for OS X, this
|
||||
# module will automatically add the -framework Cocoa on your behalf.
|
||||
#
|
||||
#
|
||||
# Additional Note: If you see an empty SDL2_LIBRARY_TEMP in your configuration
|
||||
# and no SDL2_LIBRARY, it means CMake did not find your SDL2 library
|
||||
# (SDL2.dll, libsdl2.so, SDL2.framework, etc).
|
||||
# Set SDL2_LIBRARY_TEMP to point to your SDL2 library, and configure again.
|
||||
# Similarly, if you see an empty SDL2MAIN_LIBRARY, you should set this value
|
||||
# as appropriate. These values are used to generate the final SDL2_LIBRARY
|
||||
# variable, but when these values are unset, SDL2_LIBRARY does not get created.
|
||||
#
|
||||
#
|
||||
# $SDL2DIR is an environment variable that would
|
||||
# correspond to the ./configure --prefix=$SDL2DIR
|
||||
# used in building SDL2.
|
||||
# l.e.galup 9-20-02
|
||||
#
|
||||
# Modified by Eric Wing.
|
||||
# Added code to assist with automated building by using environmental variables
|
||||
# and providing a more controlled/consistent search behavior.
|
||||
# Added new modifications to recognize OS X frameworks and
|
||||
# additional Unix paths (FreeBSD, etc).
|
||||
# Also corrected the header search path to follow "proper" SDL guidelines.
|
||||
# Added a search for SDL2main which is needed by some platforms.
|
||||
# Added a search for threads which is needed by some platforms.
|
||||
# Added needed compile switches for MinGW.
|
||||
#
|
||||
# On OSX, this will prefer the Framework version (if found) over others.
|
||||
# People will have to manually change the cache values of
|
||||
# SDL2_LIBRARY to override this selection or set the CMake environment
|
||||
# CMAKE_INCLUDE_PATH to modify the search paths.
|
||||
#
|
||||
# Note that the header path has changed from SDL2/SDL.h to just SDL.h
|
||||
# This needed to change because "proper" SDL convention
|
||||
# is #include "SDL.h", not <SDL2/SDL.h>. This is done for portability
|
||||
# reasons because not all systems place things in SDL2/ (see FreeBSD).
|
||||
|
||||
#=============================================================================
|
||||
# Copyright 2003-2009 Kitware, Inc.
|
||||
#
|
||||
# Distributed under the OSI-approved BSD License (the "License").
|
||||
#
|
||||
# This software is distributed WITHOUT ANY WARRANTY; without even the
|
||||
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See the License for more information.
|
||||
#=============================================================================
|
||||
# CMake - Cross Platform Makefile Generator
|
||||
# Copyright 2000-2016 Kitware, Inc.
|
||||
# Copyright 2000-2011 Insight Software Consortium
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
#
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
#
|
||||
# * Neither the names of Kitware, Inc., the Insight Software Consortium,
|
||||
# nor the names of their contributors may be used to endorse or promote
|
||||
# products derived from this software without specific prior written
|
||||
# permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# ------------------------------------------------------------------------------
|
||||
#
|
||||
# The above copyright and license notice applies to distributions of
|
||||
# CMake in source and binary form. Some source files contain additional
|
||||
# notices of original copyright by their contributors; see each source
|
||||
# for details. Third-party software packages supplied with CMake under
|
||||
# compatible licenses provide their own copyright notices documented in
|
||||
# corresponding subdirectories.
|
||||
#
|
||||
# ------------------------------------------------------------------------------
|
||||
#
|
||||
# CMake was initially developed by Kitware with the following sponsorship:
|
||||
#
|
||||
# * National Library of Medicine at the National Institutes of Health
|
||||
# as part of the Insight Segmentation and Registration Toolkit (ITK).
|
||||
#
|
||||
# * US National Labs (Los Alamos, Livermore, Sandia) ASC Parallel
|
||||
# Visualization Initiative.
|
||||
#
|
||||
# * National Alliance for Medical Image Computing (NAMIC) is funded by the
|
||||
# National Institutes of Health through the NIH Roadmap for Medical Research,
|
||||
# Grant U54 EB005149.
|
||||
#
|
||||
# * Kitware, Inc.
|
||||
#
|
||||
|
||||
message("<FindSDL2.cmake>")
|
||||
|
||||
SET(SDL2_SEARCH_PATHS
|
||||
~/Library/Frameworks
|
||||
/Library/Frameworks
|
||||
/usr/local
|
||||
/usr
|
||||
/sw # Fink
|
||||
/opt/local # DarwinPorts
|
||||
/opt/csw # Blastwave
|
||||
/opt
|
||||
${SDL2_PATH}
|
||||
)
|
||||
|
||||
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||
set(VC_LIB_PATH_SUFFIX lib/x64)
|
||||
else()
|
||||
set(VC_LIB_PATH_SUFFIX lib/x86)
|
||||
endif()
|
||||
|
||||
FIND_LIBRARY(SDL2_LIBRARY_TEMP
|
||||
NAMES SDL2
|
||||
HINTS
|
||||
$ENV{SDL2DIR}
|
||||
PATH_SUFFIXES lib64 lib ${VC_LIB_PATH_SUFFIX}
|
||||
PATHS ${SDL2_SEARCH_PATHS}
|
||||
)
|
||||
|
||||
IF(SDL2_LIBRARY_TEMP)
|
||||
if(MSVC)
|
||||
get_filename_component(SDL2_DLL_DIR_TEMP ${SDL2_LIBRARY_TEMP} DIRECTORY)
|
||||
if(EXISTS ${SDL2_DLL_DIR_TEMP}/SDL2.dll)
|
||||
set(SDL2_DLL_DIR ${SDL2_DLL_DIR_TEMP})
|
||||
unset(SDL2_DLL_DIR_TEMP)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
FIND_PATH(SDL2_INCLUDE_DIR SDL.h
|
||||
HINTS
|
||||
$ENV{SDL2DIR}
|
||||
PATH_SUFFIXES include/SDL2 include
|
||||
PATHS ${SDL2_SEARCH_PATHS}
|
||||
)
|
||||
|
||||
IF(NOT SDL2_BUILDING_LIBRARY)
|
||||
IF(NOT ${SDL2_INCLUDE_DIR} MATCHES ".framework")
|
||||
# Non-OS X framework versions expect you to also dynamically link to
|
||||
# SDL2main. This is mainly for Windows and OS X. Other (Unix) platforms
|
||||
# seem to provide SDL2main for compatibility even though they don't
|
||||
# necessarily need it.
|
||||
FIND_LIBRARY(SDL2MAIN_LIBRARY
|
||||
NAMES SDL2main
|
||||
HINTS
|
||||
$ENV{SDL2DIR}
|
||||
PATH_SUFFIXES lib64 lib
|
||||
PATHS ${SDL2_SEARCH_PATHS}
|
||||
)
|
||||
ENDIF(NOT ${SDL2_INCLUDE_DIR} MATCHES ".framework")
|
||||
ENDIF(NOT SDL2_BUILDING_LIBRARY)
|
||||
|
||||
# SDL2 may require threads on your system.
|
||||
# The Apple build may not need an explicit flag because one of the
|
||||
# frameworks may already provide it.
|
||||
# But for non-OSX systems, I will use the CMake Threads package.
|
||||
IF(NOT APPLE)
|
||||
FIND_PACKAGE(Threads)
|
||||
ENDIF(NOT APPLE)
|
||||
|
||||
# MinGW needs an additional library, mwindows
|
||||
# It's total link flags should look like -lmingw32 -lSDL2main -lSDL2 -lmwindows
|
||||
# (Actually on second look, I think it only needs one of the m* libraries.)
|
||||
IF(MINGW)
|
||||
SET(MINGW32_LIBRARY mingw32 CACHE STRING "mwindows for MinGW")
|
||||
ENDIF(MINGW)
|
||||
|
||||
# For SDL2main
|
||||
IF(NOT SDL2_BUILDING_LIBRARY)
|
||||
IF(SDL2MAIN_LIBRARY)
|
||||
SET(SDL2_LIBRARY_TEMP ${SDL2MAIN_LIBRARY} ${SDL2_LIBRARY_TEMP})
|
||||
ENDIF(SDL2MAIN_LIBRARY)
|
||||
ENDIF(NOT SDL2_BUILDING_LIBRARY)
|
||||
|
||||
# For OS X, SDL2 uses Cocoa as a backend so it must link to Cocoa.
|
||||
# CMake doesn't display the -framework Cocoa string in the UI even
|
||||
# though it actually is there if I modify a pre-used variable.
|
||||
# I think it has something to do with the CACHE STRING.
|
||||
# So I use a temporary variable until the end so I can set the
|
||||
# "real" variable in one-shot.
|
||||
IF(APPLE)
|
||||
SET(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} "-framework Cocoa")
|
||||
ENDIF(APPLE)
|
||||
|
||||
# For threads, as mentioned Apple doesn't need this.
|
||||
# In fact, there seems to be a problem if I used the Threads package
|
||||
# and try using this line, so I'm just skipping it entirely for OS X.
|
||||
IF(NOT APPLE)
|
||||
SET(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} ${CMAKE_THREAD_LIBS_INIT})
|
||||
ENDIF(NOT APPLE)
|
||||
|
||||
# For MinGW library
|
||||
IF(MINGW)
|
||||
SET(SDL2_LIBRARY_TEMP ${MINGW32_LIBRARY} ${SDL2_LIBRARY_TEMP})
|
||||
ENDIF(MINGW)
|
||||
|
||||
# Set the final string here so the GUI reflects the final state.
|
||||
SET(SDL2_LIBRARY ${SDL2_LIBRARY_TEMP} CACHE STRING "Where the SDL2 Library can be found")
|
||||
|
||||
# Unset the temp variable to INTERNAL so it is not seen in the CMake GUI
|
||||
UNSET(SDL2_LIBRARY_TEMP)
|
||||
ENDIF(SDL2_LIBRARY_TEMP)
|
||||
|
||||
message("</FindSDL2.cmake>")
|
||||
|
||||
INCLUDE(FindPackageHandleStandardArgs)
|
||||
|
||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2 REQUIRED_VARS SDL2_LIBRARY SDL2_INCLUDE_DIR)
|
||||
18
externals/cmake-modules/FindUnicorn.cmake
vendored
Normal file
18
externals/cmake-modules/FindUnicorn.cmake
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
# Exports:
|
||||
# LIBUNICORN_FOUND
|
||||
# LIBUNICORN_INCLUDE_DIR
|
||||
# LIBUNICORN_LIBRARY
|
||||
|
||||
find_path(LIBUNICORN_INCLUDE_DIR
|
||||
unicorn/unicorn.h
|
||||
HINTS $ENV{UNICORNDIR}
|
||||
PATH_SUFFIXES include)
|
||||
|
||||
find_library(LIBUNICORN_LIBRARY
|
||||
NAMES unicorn
|
||||
HINTS $ENV{UNICORNDIR})
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(unicorn DEFAULT_MSG
|
||||
LIBUNICORN_LIBRARY LIBUNICORN_INCLUDE_DIR)
|
||||
mark_as_advanced(LIBUNICORN_INCLUDE_DIR LIBUNICORN_LIBRARY)
|
||||
28
externals/cmake-modules/WindowsCopyFiles.cmake
vendored
Normal file
28
externals/cmake-modules/WindowsCopyFiles.cmake
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
# Copyright 2016 Citra Emulator Project
|
||||
# Licensed under GPLv2 or any later version
|
||||
# Refer to the license.txt file included.
|
||||
|
||||
# This file provides the function windows_copy_files.
|
||||
# This is only valid on Windows.
|
||||
|
||||
# Include guard
|
||||
if(__windows_copy_files)
|
||||
return()
|
||||
endif()
|
||||
set(__windows_copy_files YES)
|
||||
|
||||
# Any number of files to copy from SOURCE_DIR to DEST_DIR can be specified after DEST_DIR.
|
||||
# This copying happens post-build.
|
||||
function(windows_copy_files TARGET SOURCE_DIR DEST_DIR)
|
||||
# windows commandline expects the / to be \ so switch them
|
||||
string(REPLACE "/" "\\\\" SOURCE_DIR ${SOURCE_DIR})
|
||||
string(REPLACE "/" "\\\\" DEST_DIR ${DEST_DIR})
|
||||
|
||||
# /NJH /NJS /NDL /NFL /NC /NS /NP - Silence any output
|
||||
# cmake adds an extra check for command success which doesn't work too well with robocopy
|
||||
# so trick it into thinking the command was successful with the || cmd /c "exit /b 0"
|
||||
add_custom_command(TARGET ${TARGET} POST_BUILD
|
||||
COMMAND if not exist ${DEST_DIR} mkdir ${DEST_DIR} 2> nul
|
||||
COMMAND robocopy ${SOURCE_DIR} ${DEST_DIR} ${ARGN} /NJH /NJS /NDL /NFL /NC /NS /NP || cmd /c "exit /b 0"
|
||||
)
|
||||
endfunction()
|
||||
1
externals/dynarmic
vendored
Submodule
1
externals/dynarmic
vendored
Submodule
Submodule externals/dynarmic added at bc73004dd5
1
externals/fmt
vendored
Submodule
1
externals/fmt
vendored
Submodule
Submodule externals/fmt added at ac5484c4e7
15
externals/glad/CMakeLists.txt
vendored
Normal file
15
externals/glad/CMakeLists.txt
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
set(SRCS
|
||||
src/glad.c
|
||||
)
|
||||
set(HEADERS
|
||||
include/KHR/khrplatform.h
|
||||
include/glad/glad.h
|
||||
)
|
||||
|
||||
create_directory_groups(${SRCS} ${HEADERS})
|
||||
add_library(glad STATIC ${SRCS} ${HEADERS})
|
||||
target_include_directories(glad PUBLIC "include/")
|
||||
|
||||
if ("${CMAKE_SYSTEM_NAME}" MATCHES "Linux")
|
||||
target_link_libraries(glad PRIVATE dl)
|
||||
endif()
|
||||
5
externals/glad/Readme.md
vendored
Normal file
5
externals/glad/Readme.md
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
These files were generated by the [glad](https://github.com/Dav1dde/glad) OpenGL loader generator and have been checked in as-is. You can re-generate them using glad with the following command:
|
||||
|
||||
```
|
||||
python -m glad --profile core --out-path glad/ --api gl=3.3,gles=3.0
|
||||
```
|
||||
282
externals/glad/include/KHR/khrplatform.h
vendored
Normal file
282
externals/glad/include/KHR/khrplatform.h
vendored
Normal file
@@ -0,0 +1,282 @@
|
||||
#ifndef __khrplatform_h_
|
||||
#define __khrplatform_h_
|
||||
|
||||
/*
|
||||
** Copyright (c) 2008-2009 The Khronos Group Inc.
|
||||
**
|
||||
** Permission is hereby granted, free of charge, to any person obtaining a
|
||||
** copy of this software and/or associated documentation files (the
|
||||
** "Materials"), to deal in the Materials without restriction, including
|
||||
** without limitation the rights to use, copy, modify, merge, publish,
|
||||
** distribute, sublicense, and/or sell copies of the Materials, and to
|
||||
** permit persons to whom the Materials are 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 Materials.
|
||||
**
|
||||
** THE MATERIALS ARE 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
|
||||
** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
|
||||
*/
|
||||
|
||||
/* Khronos platform-specific types and definitions.
|
||||
*
|
||||
* $Revision: 23298 $ on $Date: 2013-09-30 17:07:13 -0700 (Mon, 30 Sep 2013) $
|
||||
*
|
||||
* Adopters may modify this file to suit their platform. Adopters are
|
||||
* encouraged to submit platform specific modifications to the Khronos
|
||||
* group so that they can be included in future versions of this file.
|
||||
* Please submit changes by sending them to the public Khronos Bugzilla
|
||||
* (http://khronos.org/bugzilla) by filing a bug against product
|
||||
* "Khronos (general)" component "Registry".
|
||||
*
|
||||
* A predefined template which fills in some of the bug fields can be
|
||||
* reached using http://tinyurl.com/khrplatform-h-bugreport, but you
|
||||
* must create a Bugzilla login first.
|
||||
*
|
||||
*
|
||||
* See the Implementer's Guidelines for information about where this file
|
||||
* should be located on your system and for more details of its use:
|
||||
* http://www.khronos.org/registry/implementers_guide.pdf
|
||||
*
|
||||
* This file should be included as
|
||||
* #include <KHR/khrplatform.h>
|
||||
* by Khronos client API header files that use its types and defines.
|
||||
*
|
||||
* The types in khrplatform.h should only be used to define API-specific types.
|
||||
*
|
||||
* Types defined in khrplatform.h:
|
||||
* khronos_int8_t signed 8 bit
|
||||
* khronos_uint8_t unsigned 8 bit
|
||||
* khronos_int16_t signed 16 bit
|
||||
* khronos_uint16_t unsigned 16 bit
|
||||
* khronos_int32_t signed 32 bit
|
||||
* khronos_uint32_t unsigned 32 bit
|
||||
* khronos_int64_t signed 64 bit
|
||||
* khronos_uint64_t unsigned 64 bit
|
||||
* khronos_intptr_t signed same number of bits as a pointer
|
||||
* khronos_uintptr_t unsigned same number of bits as a pointer
|
||||
* khronos_ssize_t signed size
|
||||
* khronos_usize_t unsigned size
|
||||
* khronos_float_t signed 32 bit floating point
|
||||
* khronos_time_ns_t unsigned 64 bit time in nanoseconds
|
||||
* khronos_utime_nanoseconds_t unsigned time interval or absolute time in
|
||||
* nanoseconds
|
||||
* khronos_stime_nanoseconds_t signed time interval in nanoseconds
|
||||
* khronos_boolean_enum_t enumerated boolean type. This should
|
||||
* only be used as a base type when a client API's boolean type is
|
||||
* an enum. Client APIs which use an integer or other type for
|
||||
* booleans cannot use this as the base type for their boolean.
|
||||
*
|
||||
* Tokens defined in khrplatform.h:
|
||||
*
|
||||
* KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values.
|
||||
*
|
||||
* KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0.
|
||||
* KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0.
|
||||
*
|
||||
* Calling convention macros defined in this file:
|
||||
* KHRONOS_APICALL
|
||||
* KHRONOS_APIENTRY
|
||||
* KHRONOS_APIATTRIBUTES
|
||||
*
|
||||
* These may be used in function prototypes as:
|
||||
*
|
||||
* KHRONOS_APICALL void KHRONOS_APIENTRY funcname(
|
||||
* int arg1,
|
||||
* int arg2) KHRONOS_APIATTRIBUTES;
|
||||
*/
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Definition of KHRONOS_APICALL
|
||||
*-------------------------------------------------------------------------
|
||||
* This precedes the return type of the function in the function prototype.
|
||||
*/
|
||||
#if defined(_WIN32) && !defined(__SCITECH_SNAP__)
|
||||
# define KHRONOS_APICALL __declspec(dllimport)
|
||||
#elif defined (__SYMBIAN32__)
|
||||
# define KHRONOS_APICALL IMPORT_C
|
||||
#else
|
||||
# define KHRONOS_APICALL
|
||||
#endif
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Definition of KHRONOS_APIENTRY
|
||||
*-------------------------------------------------------------------------
|
||||
* This follows the return type of the function and precedes the function
|
||||
* name in the function prototype.
|
||||
*/
|
||||
#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__)
|
||||
/* Win32 but not WinCE */
|
||||
# define KHRONOS_APIENTRY __stdcall
|
||||
#else
|
||||
# define KHRONOS_APIENTRY
|
||||
#endif
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Definition of KHRONOS_APIATTRIBUTES
|
||||
*-------------------------------------------------------------------------
|
||||
* This follows the closing parenthesis of the function prototype arguments.
|
||||
*/
|
||||
#if defined (__ARMCC_2__)
|
||||
#define KHRONOS_APIATTRIBUTES __softfp
|
||||
#else
|
||||
#define KHRONOS_APIATTRIBUTES
|
||||
#endif
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* basic type definitions
|
||||
*-----------------------------------------------------------------------*/
|
||||
#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__)
|
||||
|
||||
|
||||
/*
|
||||
* Using <stdint.h>
|
||||
*/
|
||||
#include <stdint.h>
|
||||
typedef int32_t khronos_int32_t;
|
||||
typedef uint32_t khronos_uint32_t;
|
||||
typedef int64_t khronos_int64_t;
|
||||
typedef uint64_t khronos_uint64_t;
|
||||
#define KHRONOS_SUPPORT_INT64 1
|
||||
#define KHRONOS_SUPPORT_FLOAT 1
|
||||
|
||||
#elif defined(__VMS ) || defined(__sgi)
|
||||
|
||||
/*
|
||||
* Using <inttypes.h>
|
||||
*/
|
||||
#include <inttypes.h>
|
||||
typedef int32_t khronos_int32_t;
|
||||
typedef uint32_t khronos_uint32_t;
|
||||
typedef int64_t khronos_int64_t;
|
||||
typedef uint64_t khronos_uint64_t;
|
||||
#define KHRONOS_SUPPORT_INT64 1
|
||||
#define KHRONOS_SUPPORT_FLOAT 1
|
||||
|
||||
#elif defined(_WIN32) && !defined(__SCITECH_SNAP__)
|
||||
|
||||
/*
|
||||
* Win32
|
||||
*/
|
||||
typedef __int32 khronos_int32_t;
|
||||
typedef unsigned __int32 khronos_uint32_t;
|
||||
typedef __int64 khronos_int64_t;
|
||||
typedef unsigned __int64 khronos_uint64_t;
|
||||
#define KHRONOS_SUPPORT_INT64 1
|
||||
#define KHRONOS_SUPPORT_FLOAT 1
|
||||
|
||||
#elif defined(__sun__) || defined(__digital__)
|
||||
|
||||
/*
|
||||
* Sun or Digital
|
||||
*/
|
||||
typedef int khronos_int32_t;
|
||||
typedef unsigned int khronos_uint32_t;
|
||||
#if defined(__arch64__) || defined(_LP64)
|
||||
typedef long int khronos_int64_t;
|
||||
typedef unsigned long int khronos_uint64_t;
|
||||
#else
|
||||
typedef long long int khronos_int64_t;
|
||||
typedef unsigned long long int khronos_uint64_t;
|
||||
#endif /* __arch64__ */
|
||||
#define KHRONOS_SUPPORT_INT64 1
|
||||
#define KHRONOS_SUPPORT_FLOAT 1
|
||||
|
||||
#elif 0
|
||||
|
||||
/*
|
||||
* Hypothetical platform with no float or int64 support
|
||||
*/
|
||||
typedef int khronos_int32_t;
|
||||
typedef unsigned int khronos_uint32_t;
|
||||
#define KHRONOS_SUPPORT_INT64 0
|
||||
#define KHRONOS_SUPPORT_FLOAT 0
|
||||
|
||||
#else
|
||||
|
||||
/*
|
||||
* Generic fallback
|
||||
*/
|
||||
#include <stdint.h>
|
||||
typedef int32_t khronos_int32_t;
|
||||
typedef uint32_t khronos_uint32_t;
|
||||
typedef int64_t khronos_int64_t;
|
||||
typedef uint64_t khronos_uint64_t;
|
||||
#define KHRONOS_SUPPORT_INT64 1
|
||||
#define KHRONOS_SUPPORT_FLOAT 1
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Types that are (so far) the same on all platforms
|
||||
*/
|
||||
typedef signed char khronos_int8_t;
|
||||
typedef unsigned char khronos_uint8_t;
|
||||
typedef signed short int khronos_int16_t;
|
||||
typedef unsigned short int khronos_uint16_t;
|
||||
|
||||
/*
|
||||
* Types that differ between LLP64 and LP64 architectures - in LLP64,
|
||||
* pointers are 64 bits, but 'long' is still 32 bits. Win64 appears
|
||||
* to be the only LLP64 architecture in current use.
|
||||
*/
|
||||
#ifdef _WIN64
|
||||
typedef signed long long int khronos_intptr_t;
|
||||
typedef unsigned long long int khronos_uintptr_t;
|
||||
typedef signed long long int khronos_ssize_t;
|
||||
typedef unsigned long long int khronos_usize_t;
|
||||
#else
|
||||
typedef signed long int khronos_intptr_t;
|
||||
typedef unsigned long int khronos_uintptr_t;
|
||||
typedef signed long int khronos_ssize_t;
|
||||
typedef unsigned long int khronos_usize_t;
|
||||
#endif
|
||||
|
||||
#if KHRONOS_SUPPORT_FLOAT
|
||||
/*
|
||||
* Float type
|
||||
*/
|
||||
typedef float khronos_float_t;
|
||||
#endif
|
||||
|
||||
#if KHRONOS_SUPPORT_INT64
|
||||
/* Time types
|
||||
*
|
||||
* These types can be used to represent a time interval in nanoseconds or
|
||||
* an absolute Unadjusted System Time. Unadjusted System Time is the number
|
||||
* of nanoseconds since some arbitrary system event (e.g. since the last
|
||||
* time the system booted). The Unadjusted System Time is an unsigned
|
||||
* 64 bit value that wraps back to 0 every 584 years. Time intervals
|
||||
* may be either signed or unsigned.
|
||||
*/
|
||||
typedef khronos_uint64_t khronos_utime_nanoseconds_t;
|
||||
typedef khronos_int64_t khronos_stime_nanoseconds_t;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Dummy value used to pad enum types to 32 bits.
|
||||
*/
|
||||
#ifndef KHRONOS_MAX_ENUM
|
||||
#define KHRONOS_MAX_ENUM 0x7FFFFFFF
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Enumerated boolean type
|
||||
*
|
||||
* Values other than zero should be considered to be true. Therefore
|
||||
* comparisons should not be made against KHRONOS_TRUE.
|
||||
*/
|
||||
typedef enum {
|
||||
KHRONOS_FALSE = 0,
|
||||
KHRONOS_TRUE = 1,
|
||||
KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM
|
||||
} khronos_boolean_enum_t;
|
||||
|
||||
#endif /* __khrplatform_h_ */
|
||||
2419
externals/glad/include/glad/glad.h
vendored
Normal file
2419
externals/glad/include/glad/glad.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1456
externals/glad/src/glad.c
vendored
Normal file
1456
externals/glad/src/glad.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
22
externals/glfw-3.1.1.bin/COPYING.txt
vendored
22
externals/glfw-3.1.1.bin/COPYING.txt
vendored
@@ -1,22 +0,0 @@
|
||||
Copyright (c) 2002-2006 Marcus Geelnard
|
||||
Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would
|
||||
be appreciated but is not required.
|
||||
|
||||
2. Altered source versions must be plainly marked as such, and must not
|
||||
be misrepresented as being the original software.
|
||||
|
||||
3. This notice may not be removed or altered from any source
|
||||
distribution.
|
||||
|
||||
3340
externals/glfw-3.1.1.bin/include/GLFW/glfw3.h
vendored
3340
externals/glfw-3.1.1.bin/include/GLFW/glfw3.h
vendored
File diff suppressed because it is too large
Load Diff
356
externals/glfw-3.1.1.bin/include/GLFW/glfw3native.h
vendored
356
externals/glfw-3.1.1.bin/include/GLFW/glfw3native.h
vendored
@@ -1,356 +0,0 @@
|
||||
/*************************************************************************
|
||||
* GLFW 3.1 - www.glfw.org
|
||||
* A library for OpenGL, window and input
|
||||
*------------------------------------------------------------------------
|
||||
* Copyright (c) 2002-2006 Marcus Geelnard
|
||||
* Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would
|
||||
* be appreciated but is not required.
|
||||
*
|
||||
* 2. Altered source versions must be plainly marked as such, and must not
|
||||
* be misrepresented as being the original software.
|
||||
*
|
||||
* 3. This notice may not be removed or altered from any source
|
||||
* distribution.
|
||||
*
|
||||
*************************************************************************/
|
||||
|
||||
#ifndef _glfw3_native_h_
|
||||
#define _glfw3_native_h_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
* Doxygen documentation
|
||||
*************************************************************************/
|
||||
|
||||
/*! @defgroup native Native access
|
||||
*
|
||||
* **By using the native access functions you assert that you know what you're
|
||||
* doing and how to fix problems caused by using them. If you don't, you
|
||||
* shouldn't be using them.**
|
||||
*
|
||||
* Before the inclusion of @ref glfw3native.h, you must define exactly one
|
||||
* window system API macro and exactly one context creation API macro. Failure
|
||||
* to do this will cause a compile-time error.
|
||||
*
|
||||
* The available window API macros are:
|
||||
* * `GLFW_EXPOSE_NATIVE_WIN32`
|
||||
* * `GLFW_EXPOSE_NATIVE_COCOA`
|
||||
* * `GLFW_EXPOSE_NATIVE_X11`
|
||||
*
|
||||
* The available context API macros are:
|
||||
* * `GLFW_EXPOSE_NATIVE_WGL`
|
||||
* * `GLFW_EXPOSE_NATIVE_NSGL`
|
||||
* * `GLFW_EXPOSE_NATIVE_GLX`
|
||||
* * `GLFW_EXPOSE_NATIVE_EGL`
|
||||
*
|
||||
* These macros select which of the native access functions that are declared
|
||||
* and which platform-specific headers to include. It is then up your (by
|
||||
* definition platform-specific) code to handle which of these should be
|
||||
* defined.
|
||||
*/
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
* System headers and types
|
||||
*************************************************************************/
|
||||
|
||||
#if defined(GLFW_EXPOSE_NATIVE_WIN32)
|
||||
// This is a workaround for the fact that glfw3.h needs to export APIENTRY (for
|
||||
// example to allow applications to correctly declare a GL_ARB_debug_output
|
||||
// callback) but windows.h assumes no one will define APIENTRY before it does
|
||||
#undef APIENTRY
|
||||
#include <windows.h>
|
||||
#elif defined(GLFW_EXPOSE_NATIVE_COCOA)
|
||||
#include <ApplicationServices/ApplicationServices.h>
|
||||
#if defined(__OBJC__)
|
||||
#import <Cocoa/Cocoa.h>
|
||||
#else
|
||||
typedef void* id;
|
||||
#endif
|
||||
#elif defined(GLFW_EXPOSE_NATIVE_X11)
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/extensions/Xrandr.h>
|
||||
#else
|
||||
#error "No window API selected"
|
||||
#endif
|
||||
|
||||
#if defined(GLFW_EXPOSE_NATIVE_WGL)
|
||||
/* WGL is declared by windows.h */
|
||||
#elif defined(GLFW_EXPOSE_NATIVE_NSGL)
|
||||
/* NSGL is declared by Cocoa.h */
|
||||
#elif defined(GLFW_EXPOSE_NATIVE_GLX)
|
||||
#include <GL/glx.h>
|
||||
#elif defined(GLFW_EXPOSE_NATIVE_EGL)
|
||||
#include <EGL/egl.h>
|
||||
#else
|
||||
#error "No context API selected"
|
||||
#endif
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
* Functions
|
||||
*************************************************************************/
|
||||
|
||||
#if defined(GLFW_EXPOSE_NATIVE_WIN32)
|
||||
/*! @brief Returns the adapter device name of the specified monitor.
|
||||
*
|
||||
* @return The UTF-8 encoded adapter device name (for example `\\.\DISPLAY1`)
|
||||
* of the specified monitor, or `NULL` if an [error](@ref error_handling)
|
||||
* occurred.
|
||||
*
|
||||
* @par Thread Safety
|
||||
* This function may be called from any thread. Access is not synchronized.
|
||||
*
|
||||
* @par History
|
||||
* Added in GLFW 3.1.
|
||||
*
|
||||
* @ingroup native
|
||||
*/
|
||||
GLFWAPI const char* glfwGetWin32Adapter(GLFWmonitor* monitor);
|
||||
|
||||
/*! @brief Returns the display device name of the specified monitor.
|
||||
*
|
||||
* @return The UTF-8 encoded display device name (for example
|
||||
* `\\.\DISPLAY1\Monitor0`) of the specified monitor, or `NULL` if an
|
||||
* [error](@ref error_handling) occurred.
|
||||
*
|
||||
* @par Thread Safety
|
||||
* This function may be called from any thread. Access is not synchronized.
|
||||
*
|
||||
* @par History
|
||||
* Added in GLFW 3.1.
|
||||
*
|
||||
* @ingroup native
|
||||
*/
|
||||
GLFWAPI const char* glfwGetWin32Monitor(GLFWmonitor* monitor);
|
||||
|
||||
/*! @brief Returns the `HWND` of the specified window.
|
||||
*
|
||||
* @return The `HWND` of the specified window, or `NULL` if an
|
||||
* [error](@ref error_handling) occurred.
|
||||
*
|
||||
* @par Thread Safety
|
||||
* This function may be called from any thread. Access is not synchronized.
|
||||
*
|
||||
* @par History
|
||||
* Added in GLFW 3.0.
|
||||
*
|
||||
* @ingroup native
|
||||
*/
|
||||
GLFWAPI HWND glfwGetWin32Window(GLFWwindow* window);
|
||||
#endif
|
||||
|
||||
#if defined(GLFW_EXPOSE_NATIVE_WGL)
|
||||
/*! @brief Returns the `HGLRC` of the specified window.
|
||||
*
|
||||
* @return The `HGLRC` of the specified window, or `NULL` if an
|
||||
* [error](@ref error_handling) occurred.
|
||||
*
|
||||
* @par Thread Safety
|
||||
* This function may be called from any thread. Access is not synchronized.
|
||||
*
|
||||
* @par History
|
||||
* Added in GLFW 3.0.
|
||||
*
|
||||
* @ingroup native
|
||||
*/
|
||||
GLFWAPI HGLRC glfwGetWGLContext(GLFWwindow* window);
|
||||
#endif
|
||||
|
||||
#if defined(GLFW_EXPOSE_NATIVE_COCOA)
|
||||
/*! @brief Returns the `CGDirectDisplayID` of the specified monitor.
|
||||
*
|
||||
* @return The `CGDirectDisplayID` of the specified monitor, or
|
||||
* `kCGNullDirectDisplay` if an [error](@ref error_handling) occurred.
|
||||
*
|
||||
* @par Thread Safety
|
||||
* This function may be called from any thread. Access is not synchronized.
|
||||
*
|
||||
* @par History
|
||||
* Added in GLFW 3.1.
|
||||
*
|
||||
* @ingroup native
|
||||
*/
|
||||
GLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* monitor);
|
||||
|
||||
/*! @brief Returns the `NSWindow` of the specified window.
|
||||
*
|
||||
* @return The `NSWindow` of the specified window, or `nil` if an
|
||||
* [error](@ref error_handling) occurred.
|
||||
*
|
||||
* @par Thread Safety
|
||||
* This function may be called from any thread. Access is not synchronized.
|
||||
*
|
||||
* @par History
|
||||
* Added in GLFW 3.0.
|
||||
*
|
||||
* @ingroup native
|
||||
*/
|
||||
GLFWAPI id glfwGetCocoaWindow(GLFWwindow* window);
|
||||
#endif
|
||||
|
||||
#if defined(GLFW_EXPOSE_NATIVE_NSGL)
|
||||
/*! @brief Returns the `NSOpenGLContext` of the specified window.
|
||||
*
|
||||
* @return The `NSOpenGLContext` of the specified window, or `nil` if an
|
||||
* [error](@ref error_handling) occurred.
|
||||
*
|
||||
* @par Thread Safety
|
||||
* This function may be called from any thread. Access is not synchronized.
|
||||
*
|
||||
* @par History
|
||||
* Added in GLFW 3.0.
|
||||
*
|
||||
* @ingroup native
|
||||
*/
|
||||
GLFWAPI id glfwGetNSGLContext(GLFWwindow* window);
|
||||
#endif
|
||||
|
||||
#if defined(GLFW_EXPOSE_NATIVE_X11)
|
||||
/*! @brief Returns the `Display` used by GLFW.
|
||||
*
|
||||
* @return The `Display` used by GLFW, or `NULL` if an
|
||||
* [error](@ref error_handling) occurred.
|
||||
*
|
||||
* @par Thread Safety
|
||||
* This function may be called from any thread. Access is not synchronized.
|
||||
*
|
||||
* @par History
|
||||
* Added in GLFW 3.0.
|
||||
*
|
||||
* @ingroup native
|
||||
*/
|
||||
GLFWAPI Display* glfwGetX11Display(void);
|
||||
|
||||
/*! @brief Returns the `RRCrtc` of the specified monitor.
|
||||
*
|
||||
* @return The `RRCrtc` of the specified monitor, or `None` if an
|
||||
* [error](@ref error_handling) occurred.
|
||||
*
|
||||
* @par Thread Safety
|
||||
* This function may be called from any thread. Access is not synchronized.
|
||||
*
|
||||
* @par History
|
||||
* Added in GLFW 3.1.
|
||||
*
|
||||
* @ingroup native
|
||||
*/
|
||||
GLFWAPI RRCrtc glfwGetX11Adapter(GLFWmonitor* monitor);
|
||||
|
||||
/*! @brief Returns the `RROutput` of the specified monitor.
|
||||
*
|
||||
* @return The `RROutput` of the specified monitor, or `None` if an
|
||||
* [error](@ref error_handling) occurred.
|
||||
*
|
||||
* @par Thread Safety
|
||||
* This function may be called from any thread. Access is not synchronized.
|
||||
*
|
||||
* @par History
|
||||
* Added in GLFW 3.1.
|
||||
*
|
||||
* @ingroup native
|
||||
*/
|
||||
GLFWAPI RROutput glfwGetX11Monitor(GLFWmonitor* monitor);
|
||||
|
||||
/*! @brief Returns the `Window` of the specified window.
|
||||
*
|
||||
* @return The `Window` of the specified window, or `None` if an
|
||||
* [error](@ref error_handling) occurred.
|
||||
*
|
||||
* @par Thread Safety
|
||||
* This function may be called from any thread. Access is not synchronized.
|
||||
*
|
||||
* @par History
|
||||
* Added in GLFW 3.0.
|
||||
*
|
||||
* @ingroup native
|
||||
*/
|
||||
GLFWAPI Window glfwGetX11Window(GLFWwindow* window);
|
||||
#endif
|
||||
|
||||
#if defined(GLFW_EXPOSE_NATIVE_GLX)
|
||||
/*! @brief Returns the `GLXContext` of the specified window.
|
||||
*
|
||||
* @return The `GLXContext` of the specified window, or `NULL` if an
|
||||
* [error](@ref error_handling) occurred.
|
||||
*
|
||||
* @par Thread Safety
|
||||
* This function may be called from any thread. Access is not synchronized.
|
||||
*
|
||||
* @par History
|
||||
* Added in GLFW 3.0.
|
||||
*
|
||||
* @ingroup native
|
||||
*/
|
||||
GLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* window);
|
||||
#endif
|
||||
|
||||
#if defined(GLFW_EXPOSE_NATIVE_EGL)
|
||||
/*! @brief Returns the `EGLDisplay` used by GLFW.
|
||||
*
|
||||
* @return The `EGLDisplay` used by GLFW, or `EGL_NO_DISPLAY` if an
|
||||
* [error](@ref error_handling) occurred.
|
||||
*
|
||||
* @par Thread Safety
|
||||
* This function may be called from any thread. Access is not synchronized.
|
||||
*
|
||||
* @par History
|
||||
* Added in GLFW 3.0.
|
||||
*
|
||||
* @ingroup native
|
||||
*/
|
||||
GLFWAPI EGLDisplay glfwGetEGLDisplay(void);
|
||||
|
||||
/*! @brief Returns the `EGLContext` of the specified window.
|
||||
*
|
||||
* @return The `EGLContext` of the specified window, or `EGL_NO_CONTEXT` if an
|
||||
* [error](@ref error_handling) occurred.
|
||||
*
|
||||
* @par Thread Safety
|
||||
* This function may be called from any thread. Access is not synchronized.
|
||||
*
|
||||
* @par History
|
||||
* Added in GLFW 3.0.
|
||||
*
|
||||
* @ingroup native
|
||||
*/
|
||||
GLFWAPI EGLContext glfwGetEGLContext(GLFWwindow* window);
|
||||
|
||||
/*! @brief Returns the `EGLSurface` of the specified window.
|
||||
*
|
||||
* @return The `EGLSurface` of the specified window, or `EGL_NO_SURFACE` if an
|
||||
* [error](@ref error_handling) occurred.
|
||||
*
|
||||
* @par Thread Safety
|
||||
* This function may be called from any thread. Access is not synchronized.
|
||||
*
|
||||
* @par History
|
||||
* Added in GLFW 3.0.
|
||||
*
|
||||
* @ingroup native
|
||||
*/
|
||||
GLFWAPI EGLSurface glfwGetEGLSurface(GLFWwindow* window);
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _glfw3_native_h_ */
|
||||
|
||||
BIN
externals/glfw-3.1.1.bin/lib-mingw-i686/glfw3.dll
vendored
BIN
externals/glfw-3.1.1.bin/lib-mingw-i686/glfw3.dll
vendored
Binary file not shown.
BIN
externals/glfw-3.1.1.bin/lib-mingw-i686/glfw3dll.a
vendored
BIN
externals/glfw-3.1.1.bin/lib-mingw-i686/glfw3dll.a
vendored
Binary file not shown.
BIN
externals/glfw-3.1.1.bin/lib-mingw-i686/libglfw3.a
vendored
BIN
externals/glfw-3.1.1.bin/lib-mingw-i686/libglfw3.a
vendored
Binary file not shown.
BIN
externals/glfw-3.1.1.bin/lib-mingw-x86_64/glfw3.dll
vendored
BIN
externals/glfw-3.1.1.bin/lib-mingw-x86_64/glfw3.dll
vendored
Binary file not shown.
BIN
externals/glfw-3.1.1.bin/lib-mingw-x86_64/glfw3dll.a
vendored
BIN
externals/glfw-3.1.1.bin/lib-mingw-x86_64/glfw3dll.a
vendored
Binary file not shown.
BIN
externals/glfw-3.1.1.bin/lib-mingw-x86_64/libglfw3.a
vendored
BIN
externals/glfw-3.1.1.bin/lib-mingw-x86_64/libglfw3.a
vendored
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
externals/glfw-3.1.1.bin/lib-msvc_v120-x64/glfw3.dll
vendored
BIN
externals/glfw-3.1.1.bin/lib-msvc_v120-x64/glfw3.dll
vendored
Binary file not shown.
BIN
externals/glfw-3.1.1.bin/lib-msvc_v120-x64/glfw3.lib
vendored
BIN
externals/glfw-3.1.1.bin/lib-msvc_v120-x64/glfw3.lib
vendored
Binary file not shown.
Binary file not shown.
1
externals/inih/CMakeLists.txt
vendored
1
externals/inih/CMakeLists.txt
vendored
@@ -9,3 +9,4 @@ set(HEADERS
|
||||
|
||||
create_directory_groups(${SRCS} ${HEADERS})
|
||||
add_library(inih ${SRCS} ${HEADERS})
|
||||
target_include_directories(inih INTERFACE .)
|
||||
|
||||
1
externals/lz4
vendored
Submodule
1
externals/lz4
vendored
Submodule
Submodule externals/lz4 added at 4db65c1d99
7
externals/microprofile/README.md
vendored
Normal file
7
externals/microprofile/README.md
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
# microprofile
|
||||
|
||||
MicroProfile is a embeddable profiler in a single file, written in C++
|
||||
|
||||
It can display profile information in the application, or by generating captures via a minimal built in webserver.
|
||||
|
||||
For more information see the project webpage at https://bitbucket.org/jonasmeyer/microprofile
|
||||
3571
externals/microprofile/microprofile.h
vendored
Normal file
3571
externals/microprofile/microprofile.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3868
externals/microprofile/microprofile_html.h
vendored
Normal file
3868
externals/microprofile/microprofile_html.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3354
externals/microprofile/microprofileui.h
vendored
Normal file
3354
externals/microprofile/microprofileui.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1
externals/nihstro
vendored
1
externals/nihstro
vendored
Submodule externals/nihstro deleted from 676254f71e
21
externals/qhexedit/CMakeLists.txt
vendored
21
externals/qhexedit/CMakeLists.txt
vendored
@@ -1,21 +0,0 @@
|
||||
set(CMAKE_AUTOMOC ON)
|
||||
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||
|
||||
set(SRCS
|
||||
commands.cpp
|
||||
qhexedit.cpp
|
||||
qhexedit_p.cpp
|
||||
xbytearray.cpp
|
||||
)
|
||||
|
||||
set(HEADERS
|
||||
commands.h
|
||||
qhexedit.h
|
||||
qhexedit_p.h
|
||||
xbytearray.h
|
||||
)
|
||||
|
||||
create_directory_groups(${SRCS} ${HEADERS})
|
||||
|
||||
add_library(qhexedit STATIC ${SRCS} ${HEADERS})
|
||||
target_link_libraries(qhexedit ${CITRA_QT_LIBS})
|
||||
115
externals/qhexedit/commands.cpp
vendored
115
externals/qhexedit/commands.cpp
vendored
@@ -1,115 +0,0 @@
|
||||
#include "commands.h"
|
||||
|
||||
CharCommand::CharCommand(XByteArray * xData, Cmd cmd, int charPos, char newChar, QUndoCommand *parent)
|
||||
: QUndoCommand(parent)
|
||||
{
|
||||
_xData = xData;
|
||||
_charPos = charPos;
|
||||
_newChar = newChar;
|
||||
_cmd = cmd;
|
||||
}
|
||||
|
||||
bool CharCommand::mergeWith(const QUndoCommand *command)
|
||||
{
|
||||
const CharCommand *nextCommand = static_cast<const CharCommand *>(command);
|
||||
bool result = false;
|
||||
|
||||
if (_cmd != remove)
|
||||
{
|
||||
if (nextCommand->_cmd == replace)
|
||||
if (nextCommand->_charPos == _charPos)
|
||||
{
|
||||
_newChar = nextCommand->_newChar;
|
||||
result = true;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void CharCommand::undo()
|
||||
{
|
||||
switch (_cmd)
|
||||
{
|
||||
case insert:
|
||||
_xData->remove(_charPos, 1);
|
||||
break;
|
||||
case replace:
|
||||
_xData->replace(_charPos, _oldChar);
|
||||
_xData->setDataChanged(_charPos, _wasChanged);
|
||||
break;
|
||||
case remove:
|
||||
_xData->insert(_charPos, _oldChar);
|
||||
_xData->setDataChanged(_charPos, _wasChanged);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void CharCommand::redo()
|
||||
{
|
||||
switch (_cmd)
|
||||
{
|
||||
case insert:
|
||||
_xData->insert(_charPos, _newChar);
|
||||
break;
|
||||
case replace:
|
||||
_oldChar = _xData->data()[_charPos];
|
||||
_wasChanged = _xData->dataChanged(_charPos);
|
||||
_xData->replace(_charPos, _newChar);
|
||||
break;
|
||||
case remove:
|
||||
_oldChar = _xData->data()[_charPos];
|
||||
_wasChanged = _xData->dataChanged(_charPos);
|
||||
_xData->remove(_charPos, 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
ArrayCommand::ArrayCommand(XByteArray * xData, Cmd cmd, int baPos, QByteArray newBa, int len, QUndoCommand *parent)
|
||||
: QUndoCommand(parent)
|
||||
{
|
||||
_cmd = cmd;
|
||||
_xData = xData;
|
||||
_baPos = baPos;
|
||||
_newBa = newBa;
|
||||
_len = len;
|
||||
}
|
||||
|
||||
void ArrayCommand::undo()
|
||||
{
|
||||
switch (_cmd)
|
||||
{
|
||||
case insert:
|
||||
_xData->remove(_baPos, _newBa.length());
|
||||
break;
|
||||
case replace:
|
||||
_xData->replace(_baPos, _oldBa);
|
||||
_xData->setDataChanged(_baPos, _wasChanged);
|
||||
break;
|
||||
case remove:
|
||||
_xData->insert(_baPos, _oldBa);
|
||||
_xData->setDataChanged(_baPos, _wasChanged);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void ArrayCommand::redo()
|
||||
{
|
||||
switch (_cmd)
|
||||
{
|
||||
case insert:
|
||||
_xData->insert(_baPos, _newBa);
|
||||
break;
|
||||
case replace:
|
||||
_oldBa = _xData->data().mid(_baPos, _len);
|
||||
_wasChanged = _xData->dataChanged(_baPos, _len);
|
||||
_xData->replace(_baPos, _newBa);
|
||||
break;
|
||||
case remove:
|
||||
_oldBa = _xData->data().mid(_baPos, _len);
|
||||
_wasChanged = _xData->dataChanged(_baPos, _len);
|
||||
_xData->remove(_baPos, _len);
|
||||
break;
|
||||
}
|
||||
}
|
||||
70
externals/qhexedit/commands.h
vendored
70
externals/qhexedit/commands.h
vendored
@@ -1,70 +0,0 @@
|
||||
#ifndef COMMANDS_H
|
||||
#define COMMANDS_H
|
||||
|
||||
/** \cond docNever */
|
||||
|
||||
#include <QUndoCommand>
|
||||
|
||||
#include "xbytearray.h"
|
||||
|
||||
/*! CharCommand is a class to prived undo/redo functionality in QHexEdit.
|
||||
A QUndoCommand represents a single editing action on a document. CharCommand
|
||||
is responsable for manipulations on single chars. It can insert. replace and
|
||||
remove characters. A manipulation stores allways to actions
|
||||
1. redo (or do) action
|
||||
2. undo action.
|
||||
|
||||
CharCommand also supports command compression via mergeWidht(). This allows
|
||||
the user to execute a undo command contation e.g. 3 steps in a single command.
|
||||
If you for example insert a new byt "34" this means for the editor doing 3
|
||||
steps: insert a "00", replace it with "03" and the replace it with "34". These
|
||||
3 steps are combined into a single step, insert a "34".
|
||||
*/
|
||||
class CharCommand : public QUndoCommand
|
||||
{
|
||||
public:
|
||||
enum { Id = 1234 };
|
||||
enum Cmd {insert, remove, replace};
|
||||
|
||||
CharCommand(XByteArray * xData, Cmd cmd, int charPos, char newChar,
|
||||
QUndoCommand *parent=0);
|
||||
|
||||
void undo();
|
||||
void redo();
|
||||
bool mergeWith(const QUndoCommand *command);
|
||||
int id() const { return Id; }
|
||||
|
||||
private:
|
||||
XByteArray * _xData;
|
||||
int _charPos;
|
||||
bool _wasChanged;
|
||||
char _newChar;
|
||||
char _oldChar;
|
||||
Cmd _cmd;
|
||||
};
|
||||
|
||||
/*! ArrayCommand provides undo/redo functionality for handling binary strings. It
|
||||
can undo/redo insert, replace and remove binary strins (QByteArrays).
|
||||
*/
|
||||
class ArrayCommand : public QUndoCommand
|
||||
{
|
||||
public:
|
||||
enum Cmd {insert, remove, replace};
|
||||
ArrayCommand(XByteArray * xData, Cmd cmd, int baPos, QByteArray newBa=QByteArray(), int len=0,
|
||||
QUndoCommand *parent=0);
|
||||
void undo();
|
||||
void redo();
|
||||
|
||||
private:
|
||||
Cmd _cmd;
|
||||
XByteArray * _xData;
|
||||
int _baPos;
|
||||
int _len;
|
||||
QByteArray _wasChanged;
|
||||
QByteArray _newBa;
|
||||
QByteArray _oldBa;
|
||||
};
|
||||
|
||||
/** \endcond docNever */
|
||||
|
||||
#endif // COMMANDS_H
|
||||
502
externals/qhexedit/license.txt
vendored
502
externals/qhexedit/license.txt
vendored
@@ -1,502 +0,0 @@
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 2.1, February 1999
|
||||
|
||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
[This is the first released version of the Lesser GPL. It also counts
|
||||
as the successor of the GNU Library Public License, version 2, hence
|
||||
the version number 2.1.]
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
Licenses are intended to guarantee your freedom to share and change
|
||||
free software--to make sure the software is free for all its users.
|
||||
|
||||
This license, the Lesser General Public License, applies to some
|
||||
specially designated software packages--typically libraries--of the
|
||||
Free Software Foundation and other authors who decide to use it. You
|
||||
can use it too, but we suggest you first think carefully about whether
|
||||
this license or the ordinary General Public License is the better
|
||||
strategy to use in any particular case, based on the explanations below.
|
||||
|
||||
When we speak of free software, we are referring to freedom of use,
|
||||
not price. Our General Public Licenses are designed to make sure that
|
||||
you have the freedom to distribute copies of free software (and charge
|
||||
for this service if you wish); that you receive source code or can get
|
||||
it if you want it; that you can change the software and use pieces of
|
||||
it in new free programs; and that you are informed that you can do
|
||||
these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
distributors to deny you these rights or to ask you to surrender these
|
||||
rights. These restrictions translate to certain responsibilities for
|
||||
you if you distribute copies of the library or if you modify it.
|
||||
|
||||
For example, if you distribute copies of the library, whether gratis
|
||||
or for a fee, you must give the recipients all the rights that we gave
|
||||
you. You must make sure that they, too, receive or can get the source
|
||||
code. If you link other code with the library, you must provide
|
||||
complete object files to the recipients, so that they can relink them
|
||||
with the library after making changes to the library and recompiling
|
||||
it. And you must show them these terms so they know their rights.
|
||||
|
||||
We protect your rights with a two-step method: (1) we copyright the
|
||||
library, and (2) we offer you this license, which gives you legal
|
||||
permission to copy, distribute and/or modify the library.
|
||||
|
||||
To protect each distributor, we want to make it very clear that
|
||||
there is no warranty for the free library. Also, if the library is
|
||||
modified by someone else and passed on, the recipients should know
|
||||
that what they have is not the original version, so that the original
|
||||
author's reputation will not be affected by problems that might be
|
||||
introduced by others.
|
||||
|
||||
Finally, software patents pose a constant threat to the existence of
|
||||
any free program. We wish to make sure that a company cannot
|
||||
effectively restrict the users of a free program by obtaining a
|
||||
restrictive license from a patent holder. Therefore, we insist that
|
||||
any patent license obtained for a version of the library must be
|
||||
consistent with the full freedom of use specified in this license.
|
||||
|
||||
Most GNU software, including some libraries, is covered by the
|
||||
ordinary GNU General Public License. This license, the GNU Lesser
|
||||
General Public License, applies to certain designated libraries, and
|
||||
is quite different from the ordinary General Public License. We use
|
||||
this license for certain libraries in order to permit linking those
|
||||
libraries into non-free programs.
|
||||
|
||||
When a program is linked with a library, whether statically or using
|
||||
a shared library, the combination of the two is legally speaking a
|
||||
combined work, a derivative of the original library. The ordinary
|
||||
General Public License therefore permits such linking only if the
|
||||
entire combination fits its criteria of freedom. The Lesser General
|
||||
Public License permits more lax criteria for linking other code with
|
||||
the library.
|
||||
|
||||
We call this license the "Lesser" General Public License because it
|
||||
does Less to protect the user's freedom than the ordinary General
|
||||
Public License. It also provides other free software developers Less
|
||||
of an advantage over competing non-free programs. These disadvantages
|
||||
are the reason we use the ordinary General Public License for many
|
||||
libraries. However, the Lesser license provides advantages in certain
|
||||
special circumstances.
|
||||
|
||||
For example, on rare occasions, there may be a special need to
|
||||
encourage the widest possible use of a certain library, so that it becomes
|
||||
a de-facto standard. To achieve this, non-free programs must be
|
||||
allowed to use the library. A more frequent case is that a free
|
||||
library does the same job as widely used non-free libraries. In this
|
||||
case, there is little to gain by limiting the free library to free
|
||||
software only, so we use the Lesser General Public License.
|
||||
|
||||
In other cases, permission to use a particular library in non-free
|
||||
programs enables a greater number of people to use a large body of
|
||||
free software. For example, permission to use the GNU C Library in
|
||||
non-free programs enables many more people to use the whole GNU
|
||||
operating system, as well as its variant, the GNU/Linux operating
|
||||
system.
|
||||
|
||||
Although the Lesser General Public License is Less protective of the
|
||||
users' freedom, it does ensure that the user of a program that is
|
||||
linked with the Library has the freedom and the wherewithal to run
|
||||
that program using a modified version of the Library.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow. Pay close attention to the difference between a
|
||||
"work based on the library" and a "work that uses the library". The
|
||||
former contains code derived from the library, whereas the latter must
|
||||
be combined with the library in order to run.
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library or other
|
||||
program which contains a notice placed by the copyright holder or
|
||||
other authorized party saying it may be distributed under the terms of
|
||||
this Lesser General Public License (also called "this License").
|
||||
Each licensee is addressed as "you".
|
||||
|
||||
A "library" means a collection of software functions and/or data
|
||||
prepared so as to be conveniently linked with application programs
|
||||
(which use some of those functions and data) to form executables.
|
||||
|
||||
The "Library", below, refers to any such software library or work
|
||||
which has been distributed under these terms. A "work based on the
|
||||
Library" means either the Library or any derivative work under
|
||||
copyright law: that is to say, a work containing the Library or a
|
||||
portion of it, either verbatim or with modifications and/or translated
|
||||
straightforwardly into another language. (Hereinafter, translation is
|
||||
included without limitation in the term "modification".)
|
||||
|
||||
"Source code" for a work means the preferred form of the work for
|
||||
making modifications to it. For a library, complete source code means
|
||||
all the source code for all modules it contains, plus any associated
|
||||
interface definition files, plus the scripts used to control compilation
|
||||
and installation of the library.
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running a program using the Library is not restricted, and output from
|
||||
such a program is covered only if its contents constitute a work based
|
||||
on the Library (independent of the use of the Library in a tool for
|
||||
writing it). Whether that is true depends on what the Library does
|
||||
and what the program that uses the Library does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Library's
|
||||
complete source code as you receive it, in any medium, provided that
|
||||
you conspicuously and appropriately publish on each copy an
|
||||
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||
all the notices that refer to this License and to the absence of any
|
||||
warranty; and distribute a copy of this License along with the
|
||||
Library.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy,
|
||||
and you may at your option offer warranty protection in exchange for a
|
||||
fee.
|
||||
|
||||
2. You may modify your copy or copies of the Library or any portion
|
||||
of it, thus forming a work based on the Library, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) The modified work must itself be a software library.
|
||||
|
||||
b) You must cause the files modified to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
c) You must cause the whole of the work to be licensed at no
|
||||
charge to all third parties under the terms of this License.
|
||||
|
||||
d) If a facility in the modified Library refers to a function or a
|
||||
table of data to be supplied by an application program that uses
|
||||
the facility, other than as an argument passed when the facility
|
||||
is invoked, then you must make a good faith effort to ensure that,
|
||||
in the event an application does not supply such function or
|
||||
table, the facility still operates, and performs whatever part of
|
||||
its purpose remains meaningful.
|
||||
|
||||
(For example, a function in a library to compute square roots has
|
||||
a purpose that is entirely well-defined independent of the
|
||||
application. Therefore, Subsection 2d requires that any
|
||||
application-supplied function or table used by this function must
|
||||
be optional: if the application does not supply it, the square
|
||||
root function must still compute square roots.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Library,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Library, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote
|
||||
it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Library.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Library
|
||||
with the Library (or with a work based on the Library) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||
License instead of this License to a given copy of the Library. To do
|
||||
this, you must alter all the notices that refer to this License, so
|
||||
that they refer to the ordinary GNU General Public License, version 2,
|
||||
instead of to this License. (If a newer version than version 2 of the
|
||||
ordinary GNU General Public License has appeared, then you can specify
|
||||
that version instead if you wish.) Do not make any other change in
|
||||
these notices.
|
||||
|
||||
Once this change is made in a given copy, it is irreversible for
|
||||
that copy, so the ordinary GNU General Public License applies to all
|
||||
subsequent copies and derivative works made from that copy.
|
||||
|
||||
This option is useful when you wish to copy part of the code of
|
||||
the Library into a program that is not a library.
|
||||
|
||||
4. You may copy and distribute the Library (or a portion or
|
||||
derivative of it, under Section 2) in object code or executable form
|
||||
under the terms of Sections 1 and 2 above provided that you accompany
|
||||
it with the complete corresponding machine-readable source code, which
|
||||
must be distributed under the terms of Sections 1 and 2 above on a
|
||||
medium customarily used for software interchange.
|
||||
|
||||
If distribution of object code is made by offering access to copy
|
||||
from a designated place, then offering equivalent access to copy the
|
||||
source code from the same place satisfies the requirement to
|
||||
distribute the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
5. A program that contains no derivative of any portion of the
|
||||
Library, but is designed to work with the Library by being compiled or
|
||||
linked with it, is called a "work that uses the Library". Such a
|
||||
work, in isolation, is not a derivative work of the Library, and
|
||||
therefore falls outside the scope of this License.
|
||||
|
||||
However, linking a "work that uses the Library" with the Library
|
||||
creates an executable that is a derivative of the Library (because it
|
||||
contains portions of the Library), rather than a "work that uses the
|
||||
library". The executable is therefore covered by this License.
|
||||
Section 6 states terms for distribution of such executables.
|
||||
|
||||
When a "work that uses the Library" uses material from a header file
|
||||
that is part of the Library, the object code for the work may be a
|
||||
derivative work of the Library even though the source code is not.
|
||||
Whether this is true is especially significant if the work can be
|
||||
linked without the Library, or if the work is itself a library. The
|
||||
threshold for this to be true is not precisely defined by law.
|
||||
|
||||
If such an object file uses only numerical parameters, data
|
||||
structure layouts and accessors, and small macros and small inline
|
||||
functions (ten lines or less in length), then the use of the object
|
||||
file is unrestricted, regardless of whether it is legally a derivative
|
||||
work. (Executables containing this object code plus portions of the
|
||||
Library will still fall under Section 6.)
|
||||
|
||||
Otherwise, if the work is a derivative of the Library, you may
|
||||
distribute the object code for the work under the terms of Section 6.
|
||||
Any executables containing that work also fall under Section 6,
|
||||
whether or not they are linked directly with the Library itself.
|
||||
|
||||
6. As an exception to the Sections above, you may also combine or
|
||||
link a "work that uses the Library" with the Library to produce a
|
||||
work containing portions of the Library, and distribute that work
|
||||
under terms of your choice, provided that the terms permit
|
||||
modification of the work for the customer's own use and reverse
|
||||
engineering for debugging such modifications.
|
||||
|
||||
You must give prominent notice with each copy of the work that the
|
||||
Library is used in it and that the Library and its use are covered by
|
||||
this License. You must supply a copy of this License. If the work
|
||||
during execution displays copyright notices, you must include the
|
||||
copyright notice for the Library among them, as well as a reference
|
||||
directing the user to the copy of this License. Also, you must do one
|
||||
of these things:
|
||||
|
||||
a) Accompany the work with the complete corresponding
|
||||
machine-readable source code for the Library including whatever
|
||||
changes were used in the work (which must be distributed under
|
||||
Sections 1 and 2 above); and, if the work is an executable linked
|
||||
with the Library, with the complete machine-readable "work that
|
||||
uses the Library", as object code and/or source code, so that the
|
||||
user can modify the Library and then relink to produce a modified
|
||||
executable containing the modified Library. (It is understood
|
||||
that the user who changes the contents of definitions files in the
|
||||
Library will not necessarily be able to recompile the application
|
||||
to use the modified definitions.)
|
||||
|
||||
b) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (1) uses at run time a
|
||||
copy of the library already present on the user's computer system,
|
||||
rather than copying library functions into the executable, and (2)
|
||||
will operate properly with a modified version of the library, if
|
||||
the user installs one, as long as the modified version is
|
||||
interface-compatible with the version that the work was made with.
|
||||
|
||||
c) Accompany the work with a written offer, valid for at
|
||||
least three years, to give the same user the materials
|
||||
specified in Subsection 6a, above, for a charge no more
|
||||
than the cost of performing this distribution.
|
||||
|
||||
d) If distribution of the work is made by offering access to copy
|
||||
from a designated place, offer equivalent access to copy the above
|
||||
specified materials from the same place.
|
||||
|
||||
e) Verify that the user has already received a copy of these
|
||||
materials or that you have already sent this user a copy.
|
||||
|
||||
For an executable, the required form of the "work that uses the
|
||||
Library" must include any data and utility programs needed for
|
||||
reproducing the executable from it. However, as a special exception,
|
||||
the materials to be distributed need not include anything that is
|
||||
normally distributed (in either source or binary form) with the major
|
||||
components (compiler, kernel, and so on) of the operating system on
|
||||
which the executable runs, unless that component itself accompanies
|
||||
the executable.
|
||||
|
||||
It may happen that this requirement contradicts the license
|
||||
restrictions of other proprietary libraries that do not normally
|
||||
accompany the operating system. Such a contradiction means you cannot
|
||||
use both them and the Library together in an executable that you
|
||||
distribute.
|
||||
|
||||
7. You may place library facilities that are a work based on the
|
||||
Library side-by-side in a single library together with other library
|
||||
facilities not covered by this License, and distribute such a combined
|
||||
library, provided that the separate distribution of the work based on
|
||||
the Library and of the other library facilities is otherwise
|
||||
permitted, and provided that you do these two things:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work
|
||||
based on the Library, uncombined with any other library
|
||||
facilities. This must be distributed under the terms of the
|
||||
Sections above.
|
||||
|
||||
b) Give prominent notice with the combined library of the fact
|
||||
that part of it is a work based on the Library, and explaining
|
||||
where to find the accompanying uncombined form of the same work.
|
||||
|
||||
8. You may not copy, modify, sublicense, link with, or distribute
|
||||
the Library except as expressly provided under this License. Any
|
||||
attempt otherwise to copy, modify, sublicense, link with, or
|
||||
distribute the Library is void, and will automatically terminate your
|
||||
rights under this License. However, parties who have received copies,
|
||||
or rights, from you under this License will not have their licenses
|
||||
terminated so long as such parties remain in full compliance.
|
||||
|
||||
9. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Library or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Library (or any work based on the
|
||||
Library), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Library or works based on it.
|
||||
|
||||
10. Each time you redistribute the Library (or any work based on the
|
||||
Library), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute, link with or modify the Library
|
||||
subject to these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties with
|
||||
this License.
|
||||
|
||||
11. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Library at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Library by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Library.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under any
|
||||
particular circumstance, the balance of the section is intended to apply,
|
||||
and the section as a whole is intended to apply in other circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
12. If the distribution and/or use of the Library is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Library under this License may add
|
||||
an explicit geographical distribution limitation excluding those countries,
|
||||
so that distribution is permitted only in or among countries not thus
|
||||
excluded. In such case, this License incorporates the limitation as if
|
||||
written in the body of this License.
|
||||
|
||||
13. The Free Software Foundation may publish revised and/or new
|
||||
versions of the Lesser General Public License from time to time.
|
||||
Such new versions will be similar in spirit to the present version,
|
||||
but may differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Library
|
||||
specifies a version number of this License which applies to it and
|
||||
"any later version", you have the option of following the terms and
|
||||
conditions either of that version or of any later version published by
|
||||
the Free Software Foundation. If the Library does not specify a
|
||||
license version number, you may choose any version ever published by
|
||||
the Free Software Foundation.
|
||||
|
||||
14. If you wish to incorporate parts of the Library into other free
|
||||
programs whose distribution conditions are incompatible with these,
|
||||
write to the author to ask for permission. For software which is
|
||||
copyrighted by the Free Software Foundation, write to the Free
|
||||
Software Foundation; we sometimes make exceptions for this. Our
|
||||
decision will be guided by the two goals of preserving the free status
|
||||
of all derivatives of our free software and of promoting the sharing
|
||||
and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
||||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
||||
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Libraries
|
||||
|
||||
If you develop a new library, and you want it to be of the greatest
|
||||
possible use to the public, we recommend making it free software that
|
||||
everyone can redistribute and change. You can do so by permitting
|
||||
redistribution under these terms (or, alternatively, under the terms of the
|
||||
ordinary General Public License).
|
||||
|
||||
To apply these terms, attach the following notices to the library. It is
|
||||
safest to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least the
|
||||
"copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the library's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the library, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1990
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
||||
180
externals/qhexedit/qhexedit.cpp
vendored
180
externals/qhexedit/qhexedit.cpp
vendored
@@ -1,180 +0,0 @@
|
||||
#include <QtGui>
|
||||
|
||||
#include "qhexedit.h"
|
||||
|
||||
|
||||
QHexEdit::QHexEdit(QWidget *parent) : QScrollArea(parent)
|
||||
{
|
||||
qHexEdit_p = new QHexEditPrivate(this);
|
||||
setWidget(qHexEdit_p);
|
||||
setWidgetResizable(true);
|
||||
|
||||
connect(qHexEdit_p, SIGNAL(currentAddressChanged(int)), this, SIGNAL(currentAddressChanged(int)));
|
||||
connect(qHexEdit_p, SIGNAL(currentSizeChanged(int)), this, SIGNAL(currentSizeChanged(int)));
|
||||
connect(qHexEdit_p, SIGNAL(dataChanged()), this, SIGNAL(dataChanged()));
|
||||
connect(qHexEdit_p, SIGNAL(overwriteModeChanged(bool)), this, SIGNAL(overwriteModeChanged(bool)));
|
||||
setFocusPolicy(Qt::NoFocus);
|
||||
}
|
||||
|
||||
int QHexEdit::indexOf(const QByteArray & ba, int from) const
|
||||
{
|
||||
return qHexEdit_p->indexOf(ba, from);
|
||||
}
|
||||
|
||||
void QHexEdit::insert(int i, const QByteArray & ba)
|
||||
{
|
||||
qHexEdit_p->insert(i, ba);
|
||||
}
|
||||
|
||||
void QHexEdit::insert(int i, char ch)
|
||||
{
|
||||
qHexEdit_p->insert(i, ch);
|
||||
}
|
||||
|
||||
int QHexEdit::lastIndexOf(const QByteArray & ba, int from) const
|
||||
{
|
||||
return qHexEdit_p->lastIndexOf(ba, from);
|
||||
}
|
||||
|
||||
void QHexEdit::remove(int pos, int len)
|
||||
{
|
||||
qHexEdit_p->remove(pos, len);
|
||||
}
|
||||
|
||||
void QHexEdit::replace( int pos, int len, const QByteArray & after)
|
||||
{
|
||||
qHexEdit_p->replace(pos, len, after);
|
||||
}
|
||||
|
||||
QString QHexEdit::toReadableString()
|
||||
{
|
||||
return qHexEdit_p->toRedableString();
|
||||
}
|
||||
|
||||
QString QHexEdit::selectionToReadableString()
|
||||
{
|
||||
return qHexEdit_p->selectionToReadableString();
|
||||
}
|
||||
|
||||
void QHexEdit::setAddressArea(bool addressArea)
|
||||
{
|
||||
qHexEdit_p->setAddressArea(addressArea);
|
||||
}
|
||||
|
||||
void QHexEdit::redo()
|
||||
{
|
||||
qHexEdit_p->redo();
|
||||
}
|
||||
|
||||
void QHexEdit::undo()
|
||||
{
|
||||
qHexEdit_p->undo();
|
||||
}
|
||||
|
||||
void QHexEdit::setAddressWidth(int addressWidth)
|
||||
{
|
||||
qHexEdit_p->setAddressWidth(addressWidth);
|
||||
}
|
||||
|
||||
void QHexEdit::setAsciiArea(bool asciiArea)
|
||||
{
|
||||
qHexEdit_p->setAsciiArea(asciiArea);
|
||||
}
|
||||
|
||||
void QHexEdit::setHighlighting(bool mode)
|
||||
{
|
||||
qHexEdit_p->setHighlighting(mode);
|
||||
}
|
||||
|
||||
void QHexEdit::setAddressOffset(int offset)
|
||||
{
|
||||
qHexEdit_p->setAddressOffset(offset);
|
||||
}
|
||||
|
||||
int QHexEdit::addressOffset()
|
||||
{
|
||||
return qHexEdit_p->addressOffset();
|
||||
}
|
||||
|
||||
void QHexEdit::setCursorPosition(int cursorPos)
|
||||
{
|
||||
// cursorPos in QHexEditPrivate is the position of the textcoursor without
|
||||
// blanks, means bytePos*2
|
||||
qHexEdit_p->setCursorPos(cursorPos*2);
|
||||
}
|
||||
|
||||
int QHexEdit::cursorPosition()
|
||||
{
|
||||
return qHexEdit_p->cursorPos() / 2;
|
||||
}
|
||||
|
||||
|
||||
void QHexEdit::setData(const QByteArray &data)
|
||||
{
|
||||
qHexEdit_p->setData(data);
|
||||
}
|
||||
|
||||
QByteArray QHexEdit::data()
|
||||
{
|
||||
return qHexEdit_p->data();
|
||||
}
|
||||
|
||||
void QHexEdit::setAddressAreaColor(const QColor &color)
|
||||
{
|
||||
qHexEdit_p->setAddressAreaColor(color);
|
||||
}
|
||||
|
||||
QColor QHexEdit::addressAreaColor()
|
||||
{
|
||||
return qHexEdit_p->addressAreaColor();
|
||||
}
|
||||
|
||||
void QHexEdit::setHighlightingColor(const QColor &color)
|
||||
{
|
||||
qHexEdit_p->setHighlightingColor(color);
|
||||
}
|
||||
|
||||
QColor QHexEdit::highlightingColor()
|
||||
{
|
||||
return qHexEdit_p->highlightingColor();
|
||||
}
|
||||
|
||||
void QHexEdit::setSelectionColor(const QColor &color)
|
||||
{
|
||||
qHexEdit_p->setSelectionColor(color);
|
||||
}
|
||||
|
||||
QColor QHexEdit::selectionColor()
|
||||
{
|
||||
return qHexEdit_p->selectionColor();
|
||||
}
|
||||
|
||||
void QHexEdit::setOverwriteMode(bool overwriteMode)
|
||||
{
|
||||
qHexEdit_p->setOverwriteMode(overwriteMode);
|
||||
}
|
||||
|
||||
bool QHexEdit::overwriteMode()
|
||||
{
|
||||
return qHexEdit_p->overwriteMode();
|
||||
}
|
||||
|
||||
void QHexEdit::setReadOnly(bool readOnly)
|
||||
{
|
||||
qHexEdit_p->setReadOnly(readOnly);
|
||||
}
|
||||
|
||||
bool QHexEdit::isReadOnly()
|
||||
{
|
||||
return qHexEdit_p->isReadOnly();
|
||||
}
|
||||
|
||||
void QHexEdit::setFont(const QFont &font)
|
||||
{
|
||||
qHexEdit_p->setFont(font);
|
||||
}
|
||||
|
||||
const QFont & QHexEdit::font() const
|
||||
{
|
||||
return qHexEdit_p->font();
|
||||
}
|
||||
240
externals/qhexedit/qhexedit.h
vendored
240
externals/qhexedit/qhexedit.h
vendored
@@ -1,240 +0,0 @@
|
||||
// Original author: Winfried Simon
|
||||
// See http://code.google.com/p/qhexedit2/
|
||||
// Huge thanks!
|
||||
|
||||
#ifndef QHEXEDIT_H
|
||||
#define QHEXEDIT_H
|
||||
|
||||
#include <QtGui>
|
||||
#include "qhexedit_p.h"
|
||||
|
||||
/** \mainpage
|
||||
QHexEdit is a binary editor widget for Qt.
|
||||
|
||||
\version Version 0.6.3
|
||||
\image html hexedit.png
|
||||
*/
|
||||
|
||||
|
||||
/*! QHexEdit is a hex editor widget written in C++ for the Qt (Qt4) framework.
|
||||
It is a simple editor for binary data, just like QPlainTextEdit is for text
|
||||
data. There are sip configuration files included, so it is easy to create
|
||||
bindings for PyQt and you can use this widget also in python.
|
||||
|
||||
QHexEdit takes the data of a QByteArray (setData()) and shows it. You can use
|
||||
the mouse or the keyboard to navigate inside the widget. If you hit the keys
|
||||
(0..9, a..f) you will change the data. Changed data is highlighted and can be
|
||||
accessed via data().
|
||||
|
||||
Normaly QHexEdit works in the overwrite Mode. You can set overwriteMode(false)
|
||||
and insert data. In this case the size of data() increases. It is also possible
|
||||
to delete bytes (del or backspace), here the size of data decreases.
|
||||
|
||||
You can select data with keyboard hits or mouse movements. The copy-key will
|
||||
copy the selected data into the clipboard. The cut-key copies also but delets
|
||||
it afterwards. In overwrite mode, the paste function overwrites the content of
|
||||
the (does not change the length) data. In insert mode, clipboard data will be
|
||||
inserted. The clipboard content is expected in ASCII Hex notation. Unknown
|
||||
characters will be ignored.
|
||||
|
||||
QHexEdit comes with undo/redo functionality. All changes can be undone, by
|
||||
pressing the undo-key (usually ctr-z). They can also be redone afterwards.
|
||||
The undo/redo framework is cleared, when setData() sets up a new
|
||||
content for the editor. You can search data inside the content with indexOf()
|
||||
and lastIndexOf(). The replace() function is to change located subdata. This
|
||||
'replaced' data can also be undone by the undo/redo framework.
|
||||
|
||||
This widget can only handle small amounts of data. The size has to be below 10
|
||||
megabytes, otherwise the scroll sliders ard not shown and you can't scroll any
|
||||
more.
|
||||
*/
|
||||
class QHexEdit : public QScrollArea
|
||||
{
|
||||
Q_OBJECT
|
||||
/*! Property data holds the content of QHexEdit. Call setData() to set the
|
||||
content of QHexEdit, data() returns the actual content.
|
||||
*/
|
||||
Q_PROPERTY(QByteArray data READ data WRITE setData)
|
||||
|
||||
/*! Property addressOffset is added to the Numbers of the Address Area.
|
||||
A offset in the address area (left side) is sometimes usefull, whe you show
|
||||
only a segment of a complete memory picture. With setAddressOffset() you set
|
||||
this property - with addressOffset() you get the actual value.
|
||||
*/
|
||||
Q_PROPERTY(int addressOffset READ addressOffset WRITE setAddressOffset)
|
||||
|
||||
/*! Property address area color sets (setAddressAreaColor()) the backgorund
|
||||
color of address areas. You can also read the color (addressaAreaColor()).
|
||||
*/
|
||||
Q_PROPERTY(QColor addressAreaColor READ addressAreaColor WRITE setAddressAreaColor)
|
||||
|
||||
/*! Porperty cursorPosition sets or gets the position of the editor cursor
|
||||
in QHexEdit.
|
||||
*/
|
||||
Q_PROPERTY(int cursorPosition READ cursorPosition WRITE setCursorPosition)
|
||||
|
||||
/*! Property highlighting color sets (setHighlightingColor()) the backgorund
|
||||
color of highlighted text areas. You can also read the color
|
||||
(highlightingColor()).
|
||||
*/
|
||||
Q_PROPERTY(QColor highlightingColor READ highlightingColor WRITE setHighlightingColor)
|
||||
|
||||
/*! Property selection color sets (setSelectionColor()) the backgorund
|
||||
color of selected text areas. You can also read the color
|
||||
(selectionColor()).
|
||||
*/
|
||||
Q_PROPERTY(QColor selectionColor READ selectionColor WRITE setSelectionColor)
|
||||
|
||||
/*! Porperty overwrite mode sets (setOverwriteMode()) or gets (overwriteMode()) the mode
|
||||
in which the editor works. In overwrite mode the user will overwrite existing data. The
|
||||
size of data will be constant. In insert mode the size will grow, when inserting
|
||||
new data.
|
||||
*/
|
||||
Q_PROPERTY(bool overwriteMode READ overwriteMode WRITE setOverwriteMode)
|
||||
|
||||
/*! Porperty readOnly sets (setReadOnly()) or gets (isReadOnly) the mode
|
||||
in which the editor works. In readonly mode the the user can only navigate
|
||||
through the data and select data; modifying is not possible. This
|
||||
property's default is false.
|
||||
*/
|
||||
Q_PROPERTY(bool readOnly READ isReadOnly WRITE setReadOnly)
|
||||
|
||||
/*! Set the font of the widget. Please use fixed width fonts like Mono or Courier.*/
|
||||
Q_PROPERTY(QFont font READ font WRITE setFont)
|
||||
|
||||
|
||||
public:
|
||||
/*! Creates an instance of QHexEdit.
|
||||
\param parent Parent widget of QHexEdit.
|
||||
*/
|
||||
QHexEdit(QWidget *parent = 0);
|
||||
|
||||
/*! Returns the index position of the first occurrence
|
||||
of the byte array ba in this byte array, searching forward from index position
|
||||
from. Returns -1 if ba could not be found. In addition to this functionality
|
||||
of QByteArray the cursorposition is set to the end of found bytearray and
|
||||
it will be selected.
|
||||
|
||||
*/
|
||||
int indexOf(const QByteArray & ba, int from = 0) const;
|
||||
|
||||
/*! Inserts a byte array.
|
||||
\param i Index position, where to insert
|
||||
\param ba byte array, which is to insert
|
||||
In overwrite mode, the existing data will be overwritten, in insertmode ba will be
|
||||
inserted and size of data grows.
|
||||
*/
|
||||
void insert(int i, const QByteArray & ba);
|
||||
|
||||
/*! Inserts a char.
|
||||
\param i Index position, where to insert
|
||||
\param ch Char, which is to insert
|
||||
In overwrite mode, the existing data will be overwritten, in insertmode ba will be
|
||||
inserted and size of data grows.
|
||||
*/
|
||||
void insert(int i, char ch);
|
||||
|
||||
/*! Returns the index position of the last occurrence
|
||||
of the byte array ba in this byte array, searching backwards from index position
|
||||
from. Returns -1 if ba could not be found. In addition to this functionality
|
||||
of QByteArray the cursorposition is set to the beginning of found bytearray and
|
||||
it will be selected.
|
||||
|
||||
*/
|
||||
int lastIndexOf(const QByteArray & ba, int from = 0) const;
|
||||
|
||||
/*! Removes len bytes from the content.
|
||||
\param pos Index position, where to remove
|
||||
\param len Amount of bytes to remove
|
||||
In overwrite mode, the existing bytes will be overwriten with 0x00.
|
||||
*/
|
||||
void remove(int pos, int len=1);
|
||||
|
||||
/*! Replaces len bytes from index position pos with the byte array after.
|
||||
*/
|
||||
void replace( int pos, int len, const QByteArray & after);
|
||||
|
||||
/*! Gives back a formatted image of the content of QHexEdit
|
||||
*/
|
||||
QString toReadableString();
|
||||
|
||||
/*! Gives back a formatted image of the selected content of QHexEdit
|
||||
*/
|
||||
QString selectionToReadableString();
|
||||
|
||||
/*! \cond docNever */
|
||||
void setAddressOffset(int offset);
|
||||
int addressOffset();
|
||||
void setCursorPosition(int cusorPos);
|
||||
int cursorPosition();
|
||||
void setData(QByteArray const &data);
|
||||
QByteArray data();
|
||||
void setAddressAreaColor(QColor const &color);
|
||||
QColor addressAreaColor();
|
||||
void setHighlightingColor(QColor const &color);
|
||||
QColor highlightingColor();
|
||||
void setSelectionColor(QColor const &color);
|
||||
QColor selectionColor();
|
||||
void setOverwriteMode(bool);
|
||||
bool overwriteMode();
|
||||
void setReadOnly(bool);
|
||||
bool isReadOnly();
|
||||
const QFont &font() const;
|
||||
void setFont(const QFont &);
|
||||
/*! \endcond docNever */
|
||||
|
||||
public slots:
|
||||
/*! Redoes the last operation. If there is no operation to redo, i.e.
|
||||
there is no redo step in the undo/redo history, nothing happens.
|
||||
*/
|
||||
void redo();
|
||||
|
||||
/*! Set the minimum width of the address area.
|
||||
\param addressWidth Width in characters.
|
||||
*/
|
||||
void setAddressWidth(int addressWidth);
|
||||
|
||||
/*! Switch the address area on or off.
|
||||
\param addressArea true (show it), false (hide it).
|
||||
*/
|
||||
void setAddressArea(bool addressArea);
|
||||
|
||||
/*! Switch the ascii area on or off.
|
||||
\param asciiArea true (show it), false (hide it).
|
||||
*/
|
||||
void setAsciiArea(bool asciiArea);
|
||||
|
||||
/*! Switch the highlighting feature on or of.
|
||||
\param mode true (show it), false (hide it).
|
||||
*/
|
||||
void setHighlighting(bool mode);
|
||||
|
||||
/*! Undoes the last operation. If there is no operation to undo, i.e.
|
||||
there is no undo step in the undo/redo history, nothing happens.
|
||||
*/
|
||||
void undo();
|
||||
|
||||
signals:
|
||||
|
||||
/*! Contains the address, where the cursor is located. */
|
||||
void currentAddressChanged(int address);
|
||||
|
||||
/*! Contains the size of the data to edit. */
|
||||
void currentSizeChanged(int size);
|
||||
|
||||
/*! The signal is emited every time, the data is changed. */
|
||||
void dataChanged();
|
||||
|
||||
/*! The signal is emited every time, the overwrite mode is changed. */
|
||||
void overwriteModeChanged(bool state);
|
||||
|
||||
private:
|
||||
/*! \cond docNever */
|
||||
QHexEditPrivate *qHexEdit_p;
|
||||
QHBoxLayout *layout;
|
||||
QScrollArea *scrollArea;
|
||||
/*! \endcond docNever */
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
857
externals/qhexedit/qhexedit_p.cpp
vendored
857
externals/qhexedit/qhexedit_p.cpp
vendored
@@ -1,857 +0,0 @@
|
||||
#include "qhexedit_p.h"
|
||||
#include "commands.h"
|
||||
|
||||
const int HEXCHARS_IN_LINE = 47;
|
||||
const int GAP_ADR_HEX = 10;
|
||||
const int GAP_HEX_ASCII = 16;
|
||||
const int BYTES_PER_LINE = 16;
|
||||
|
||||
QHexEditPrivate::QHexEditPrivate(QScrollArea *parent) : QWidget(parent)
|
||||
{
|
||||
_undoStack = new QUndoStack(this);
|
||||
|
||||
_scrollArea = parent;
|
||||
setAddressWidth(4);
|
||||
setAddressOffset(0);
|
||||
setAddressArea(true);
|
||||
setAsciiArea(true);
|
||||
setHighlighting(true);
|
||||
setOverwriteMode(true);
|
||||
setReadOnly(false);
|
||||
setAddressAreaColor(QColor(0xd4, 0xd4, 0xd4, 0xff));
|
||||
setHighlightingColor(QColor(0xff, 0xff, 0x99, 0xff));
|
||||
setSelectionColor(QColor(0x6d, 0x9e, 0xff, 0xff));
|
||||
setFont(QFont("Courier", 10));
|
||||
|
||||
_size = 0;
|
||||
resetSelection(0);
|
||||
|
||||
setFocusPolicy(Qt::StrongFocus);
|
||||
|
||||
connect(&_cursorTimer, SIGNAL(timeout()), this, SLOT(updateCursor()));
|
||||
_cursorTimer.setInterval(500);
|
||||
_cursorTimer.start();
|
||||
}
|
||||
|
||||
void QHexEditPrivate::setAddressOffset(int offset)
|
||||
{
|
||||
_xData.setAddressOffset(offset);
|
||||
adjust();
|
||||
}
|
||||
|
||||
int QHexEditPrivate::addressOffset()
|
||||
{
|
||||
return _xData.addressOffset();
|
||||
}
|
||||
|
||||
void QHexEditPrivate::setData(const QByteArray &data)
|
||||
{
|
||||
_xData.setData(data);
|
||||
_undoStack->clear();
|
||||
adjust();
|
||||
setCursorPos(0);
|
||||
}
|
||||
|
||||
QByteArray QHexEditPrivate::data()
|
||||
{
|
||||
return _xData.data();
|
||||
}
|
||||
|
||||
void QHexEditPrivate::setAddressAreaColor(const QColor &color)
|
||||
{
|
||||
_addressAreaColor = color;
|
||||
update();
|
||||
}
|
||||
|
||||
QColor QHexEditPrivate::addressAreaColor()
|
||||
{
|
||||
return _addressAreaColor;
|
||||
}
|
||||
|
||||
void QHexEditPrivate::setHighlightingColor(const QColor &color)
|
||||
{
|
||||
_highlightingColor = color;
|
||||
update();
|
||||
}
|
||||
|
||||
QColor QHexEditPrivate::highlightingColor()
|
||||
{
|
||||
return _highlightingColor;
|
||||
}
|
||||
|
||||
void QHexEditPrivate::setSelectionColor(const QColor &color)
|
||||
{
|
||||
_selectionColor = color;
|
||||
update();
|
||||
}
|
||||
|
||||
QColor QHexEditPrivate::selectionColor()
|
||||
{
|
||||
return _selectionColor;
|
||||
}
|
||||
|
||||
void QHexEditPrivate::setReadOnly(bool readOnly)
|
||||
{
|
||||
_readOnly = readOnly;
|
||||
}
|
||||
|
||||
bool QHexEditPrivate::isReadOnly()
|
||||
{
|
||||
return _readOnly;
|
||||
}
|
||||
|
||||
XByteArray & QHexEditPrivate::xData()
|
||||
{
|
||||
return _xData;
|
||||
}
|
||||
|
||||
int QHexEditPrivate::indexOf(const QByteArray & ba, int from)
|
||||
{
|
||||
if (from > (_xData.data().length() - 1))
|
||||
from = _xData.data().length() - 1;
|
||||
int idx = _xData.data().indexOf(ba, from);
|
||||
if (idx > -1)
|
||||
{
|
||||
int curPos = idx*2;
|
||||
setCursorPos(curPos + ba.length()*2);
|
||||
resetSelection(curPos);
|
||||
setSelection(curPos + ba.length()*2);
|
||||
ensureVisible();
|
||||
}
|
||||
return idx;
|
||||
}
|
||||
|
||||
void QHexEditPrivate::insert(int index, const QByteArray & ba)
|
||||
{
|
||||
if (ba.length() > 0)
|
||||
{
|
||||
if (_overwriteMode)
|
||||
{
|
||||
QUndoCommand *arrayCommand= new ArrayCommand(&_xData, ArrayCommand::replace, index, ba, ba.length());
|
||||
_undoStack->push(arrayCommand);
|
||||
emit dataChanged();
|
||||
}
|
||||
else
|
||||
{
|
||||
QUndoCommand *arrayCommand= new ArrayCommand(&_xData, ArrayCommand::insert, index, ba, ba.length());
|
||||
_undoStack->push(arrayCommand);
|
||||
emit dataChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void QHexEditPrivate::insert(int index, char ch)
|
||||
{
|
||||
QUndoCommand *charCommand = new CharCommand(&_xData, CharCommand::insert, index, ch);
|
||||
_undoStack->push(charCommand);
|
||||
emit dataChanged();
|
||||
}
|
||||
|
||||
int QHexEditPrivate::lastIndexOf(const QByteArray & ba, int from)
|
||||
{
|
||||
from -= ba.length();
|
||||
if (from < 0)
|
||||
from = 0;
|
||||
int idx = _xData.data().lastIndexOf(ba, from);
|
||||
if (idx > -1)
|
||||
{
|
||||
int curPos = idx*2;
|
||||
setCursorPos(curPos);
|
||||
resetSelection(curPos);
|
||||
setSelection(curPos + ba.length()*2);
|
||||
ensureVisible();
|
||||
}
|
||||
return idx;
|
||||
}
|
||||
|
||||
void QHexEditPrivate::remove(int index, int len)
|
||||
{
|
||||
if (len > 0)
|
||||
{
|
||||
if (len == 1)
|
||||
{
|
||||
if (_overwriteMode)
|
||||
{
|
||||
QUndoCommand *charCommand = new CharCommand(&_xData, CharCommand::replace, index, char(0));
|
||||
_undoStack->push(charCommand);
|
||||
emit dataChanged();
|
||||
}
|
||||
else
|
||||
{
|
||||
QUndoCommand *charCommand = new CharCommand(&_xData, CharCommand::remove, index, char(0));
|
||||
_undoStack->push(charCommand);
|
||||
emit dataChanged();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
QByteArray ba = QByteArray(len, char(0));
|
||||
if (_overwriteMode)
|
||||
{
|
||||
QUndoCommand *arrayCommand = new ArrayCommand(&_xData, ArrayCommand::replace, index, ba, ba.length());
|
||||
_undoStack->push(arrayCommand);
|
||||
emit dataChanged();
|
||||
}
|
||||
else
|
||||
{
|
||||
QUndoCommand *arrayCommand= new ArrayCommand(&_xData, ArrayCommand::remove, index, ba, len);
|
||||
_undoStack->push(arrayCommand);
|
||||
emit dataChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void QHexEditPrivate::replace(int index, char ch)
|
||||
{
|
||||
QUndoCommand *charCommand = new CharCommand(&_xData, CharCommand::replace, index, ch);
|
||||
_undoStack->push(charCommand);
|
||||
resetSelection();
|
||||
emit dataChanged();
|
||||
}
|
||||
|
||||
void QHexEditPrivate::replace(int index, const QByteArray & ba)
|
||||
{
|
||||
QUndoCommand *arrayCommand= new ArrayCommand(&_xData, ArrayCommand::replace, index, ba, ba.length());
|
||||
_undoStack->push(arrayCommand);
|
||||
resetSelection();
|
||||
emit dataChanged();
|
||||
}
|
||||
|
||||
void QHexEditPrivate::replace(int pos, int len, const QByteArray &after)
|
||||
{
|
||||
QUndoCommand *arrayCommand= new ArrayCommand(&_xData, ArrayCommand::replace, pos, after, len);
|
||||
_undoStack->push(arrayCommand);
|
||||
resetSelection();
|
||||
emit dataChanged();
|
||||
}
|
||||
|
||||
void QHexEditPrivate::setAddressArea(bool addressArea)
|
||||
{
|
||||
_addressArea = addressArea;
|
||||
adjust();
|
||||
|
||||
setCursorPos(_cursorPosition);
|
||||
}
|
||||
|
||||
void QHexEditPrivate::setAddressWidth(int addressWidth)
|
||||
{
|
||||
_xData.setAddressWidth(addressWidth);
|
||||
|
||||
setCursorPos(_cursorPosition);
|
||||
}
|
||||
|
||||
void QHexEditPrivate::setAsciiArea(bool asciiArea)
|
||||
{
|
||||
_asciiArea = asciiArea;
|
||||
adjust();
|
||||
}
|
||||
|
||||
void QHexEditPrivate::setFont(const QFont &font)
|
||||
{
|
||||
QWidget::setFont(font);
|
||||
adjust();
|
||||
}
|
||||
|
||||
void QHexEditPrivate::setHighlighting(bool mode)
|
||||
{
|
||||
_highlighting = mode;
|
||||
update();
|
||||
}
|
||||
|
||||
void QHexEditPrivate::setOverwriteMode(bool overwriteMode)
|
||||
{
|
||||
_overwriteMode = overwriteMode;
|
||||
}
|
||||
|
||||
bool QHexEditPrivate::overwriteMode()
|
||||
{
|
||||
return _overwriteMode;
|
||||
}
|
||||
|
||||
void QHexEditPrivate::redo()
|
||||
{
|
||||
_undoStack->redo();
|
||||
emit dataChanged();
|
||||
setCursorPos(_cursorPosition);
|
||||
update();
|
||||
}
|
||||
|
||||
void QHexEditPrivate::undo()
|
||||
{
|
||||
_undoStack->undo();
|
||||
emit dataChanged();
|
||||
setCursorPos(_cursorPosition);
|
||||
update();
|
||||
}
|
||||
|
||||
QString QHexEditPrivate::toRedableString()
|
||||
{
|
||||
return _xData.toRedableString();
|
||||
}
|
||||
|
||||
|
||||
QString QHexEditPrivate::selectionToReadableString()
|
||||
{
|
||||
return _xData.toRedableString(getSelectionBegin(), getSelectionEnd());
|
||||
}
|
||||
|
||||
void QHexEditPrivate::keyPressEvent(QKeyEvent *event)
|
||||
{
|
||||
int charX = (_cursorX - _xPosHex) / _charWidth;
|
||||
int posX = (charX / 3) * 2 + (charX % 3);
|
||||
int posBa = (_cursorY / _charHeight) * BYTES_PER_LINE + posX / 2;
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Cursor movements */
|
||||
/*****************************************************************************/
|
||||
|
||||
if (event->matches(QKeySequence::MoveToNextChar))
|
||||
{
|
||||
setCursorPos(_cursorPosition + 1);
|
||||
resetSelection(_cursorPosition);
|
||||
}
|
||||
if (event->matches(QKeySequence::MoveToPreviousChar))
|
||||
{
|
||||
setCursorPos(_cursorPosition - 1);
|
||||
resetSelection(_cursorPosition);
|
||||
}
|
||||
if (event->matches(QKeySequence::MoveToEndOfLine))
|
||||
{
|
||||
setCursorPos(_cursorPosition | (2 * BYTES_PER_LINE -1));
|
||||
resetSelection(_cursorPosition);
|
||||
}
|
||||
if (event->matches(QKeySequence::MoveToStartOfLine))
|
||||
{
|
||||
setCursorPos(_cursorPosition - (_cursorPosition % (2 * BYTES_PER_LINE)));
|
||||
resetSelection(_cursorPosition);
|
||||
}
|
||||
if (event->matches(QKeySequence::MoveToPreviousLine))
|
||||
{
|
||||
setCursorPos(_cursorPosition - (2 * BYTES_PER_LINE));
|
||||
resetSelection(_cursorPosition);
|
||||
}
|
||||
if (event->matches(QKeySequence::MoveToNextLine))
|
||||
{
|
||||
setCursorPos(_cursorPosition + (2 * BYTES_PER_LINE));
|
||||
resetSelection(_cursorPosition);
|
||||
}
|
||||
|
||||
if (event->matches(QKeySequence::MoveToNextPage))
|
||||
{
|
||||
setCursorPos(_cursorPosition + (((_scrollArea->viewport()->height() / _charHeight) - 1) * 2 * BYTES_PER_LINE));
|
||||
resetSelection(_cursorPosition);
|
||||
}
|
||||
if (event->matches(QKeySequence::MoveToPreviousPage))
|
||||
{
|
||||
setCursorPos(_cursorPosition - (((_scrollArea->viewport()->height() / _charHeight) - 1) * 2 * BYTES_PER_LINE));
|
||||
resetSelection(_cursorPosition);
|
||||
}
|
||||
if (event->matches(QKeySequence::MoveToEndOfDocument))
|
||||
{
|
||||
setCursorPos(_xData.size() * 2);
|
||||
resetSelection(_cursorPosition);
|
||||
}
|
||||
if (event->matches(QKeySequence::MoveToStartOfDocument))
|
||||
{
|
||||
setCursorPos(0);
|
||||
resetSelection(_cursorPosition);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Select commands */
|
||||
/*****************************************************************************/
|
||||
if (event->matches(QKeySequence::SelectAll))
|
||||
{
|
||||
resetSelection(0);
|
||||
setSelection(2*_xData.size() + 1);
|
||||
}
|
||||
if (event->matches(QKeySequence::SelectNextChar))
|
||||
{
|
||||
int pos = _cursorPosition + 1;
|
||||
setCursorPos(pos);
|
||||
setSelection(pos);
|
||||
}
|
||||
if (event->matches(QKeySequence::SelectPreviousChar))
|
||||
{
|
||||
int pos = _cursorPosition - 1;
|
||||
setSelection(pos);
|
||||
setCursorPos(pos);
|
||||
}
|
||||
if (event->matches(QKeySequence::SelectEndOfLine))
|
||||
{
|
||||
int pos = _cursorPosition - (_cursorPosition % (2 * BYTES_PER_LINE)) + (2 * BYTES_PER_LINE);
|
||||
setCursorPos(pos);
|
||||
setSelection(pos);
|
||||
}
|
||||
if (event->matches(QKeySequence::SelectStartOfLine))
|
||||
{
|
||||
int pos = _cursorPosition - (_cursorPosition % (2 * BYTES_PER_LINE));
|
||||
setCursorPos(pos);
|
||||
setSelection(pos);
|
||||
}
|
||||
if (event->matches(QKeySequence::SelectPreviousLine))
|
||||
{
|
||||
int pos = _cursorPosition - (2 * BYTES_PER_LINE);
|
||||
setCursorPos(pos);
|
||||
setSelection(pos);
|
||||
}
|
||||
if (event->matches(QKeySequence::SelectNextLine))
|
||||
{
|
||||
int pos = _cursorPosition + (2 * BYTES_PER_LINE);
|
||||
setCursorPos(pos);
|
||||
setSelection(pos);
|
||||
}
|
||||
|
||||
if (event->matches(QKeySequence::SelectNextPage))
|
||||
{
|
||||
int pos = _cursorPosition + (((_scrollArea->viewport()->height() / _charHeight) - 1) * 2 * BYTES_PER_LINE);
|
||||
setCursorPos(pos);
|
||||
setSelection(pos);
|
||||
}
|
||||
if (event->matches(QKeySequence::SelectPreviousPage))
|
||||
{
|
||||
int pos = _cursorPosition - (((_scrollArea->viewport()->height() / _charHeight) - 1) * 2 * BYTES_PER_LINE);
|
||||
setCursorPos(pos);
|
||||
setSelection(pos);
|
||||
}
|
||||
if (event->matches(QKeySequence::SelectEndOfDocument))
|
||||
{
|
||||
int pos = _xData.size() * 2;
|
||||
setCursorPos(pos);
|
||||
setSelection(pos);
|
||||
}
|
||||
if (event->matches(QKeySequence::SelectStartOfDocument))
|
||||
{
|
||||
int pos = 0;
|
||||
setCursorPos(pos);
|
||||
setSelection(pos);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Edit Commands */
|
||||
/*****************************************************************************/
|
||||
if (!_readOnly)
|
||||
{
|
||||
/* Hex input */
|
||||
int key = int(event->text()[0].toLatin1());
|
||||
if ((key>='0' && key<='9') || (key>='a' && key <= 'f'))
|
||||
{
|
||||
if (getSelectionBegin() != getSelectionEnd())
|
||||
{
|
||||
posBa = getSelectionBegin();
|
||||
remove(posBa, getSelectionEnd() - posBa);
|
||||
setCursorPos(2*posBa);
|
||||
resetSelection(2*posBa);
|
||||
}
|
||||
|
||||
// If insert mode, then insert a byte
|
||||
if (_overwriteMode == false)
|
||||
if ((charX % 3) == 0)
|
||||
{
|
||||
insert(posBa, char(0));
|
||||
}
|
||||
|
||||
// Change content
|
||||
if (_xData.size() > 0)
|
||||
{
|
||||
QByteArray hexValue = _xData.data().mid(posBa, 1).toHex();
|
||||
if ((charX % 3) == 0)
|
||||
hexValue[0] = key;
|
||||
else
|
||||
hexValue[1] = key;
|
||||
|
||||
replace(posBa, QByteArray().fromHex(hexValue)[0]);
|
||||
|
||||
setCursorPos(_cursorPosition + 1);
|
||||
resetSelection(_cursorPosition);
|
||||
}
|
||||
}
|
||||
|
||||
/* Cut & Paste */
|
||||
if (event->matches(QKeySequence::Cut))
|
||||
{
|
||||
QString result = QString();
|
||||
for (int idx = getSelectionBegin(); idx < getSelectionEnd(); idx++)
|
||||
{
|
||||
result += _xData.data().mid(idx, 1).toHex() + " ";
|
||||
if ((idx % 16) == 15)
|
||||
result.append("\n");
|
||||
}
|
||||
remove(getSelectionBegin(), getSelectionEnd() - getSelectionBegin());
|
||||
QClipboard *clipboard = QApplication::clipboard();
|
||||
clipboard->setText(result);
|
||||
setCursorPos(getSelectionBegin());
|
||||
resetSelection(getSelectionBegin());
|
||||
}
|
||||
|
||||
if (event->matches(QKeySequence::Paste))
|
||||
{
|
||||
QClipboard *clipboard = QApplication::clipboard();
|
||||
QByteArray ba = QByteArray().fromHex(clipboard->text().toLatin1());
|
||||
insert(_cursorPosition / 2, ba);
|
||||
setCursorPos(_cursorPosition + 2 * ba.length());
|
||||
resetSelection(getSelectionBegin());
|
||||
}
|
||||
|
||||
|
||||
/* Delete char */
|
||||
if (event->matches(QKeySequence::Delete))
|
||||
{
|
||||
if (getSelectionBegin() != getSelectionEnd())
|
||||
{
|
||||
posBa = getSelectionBegin();
|
||||
remove(posBa, getSelectionEnd() - posBa);
|
||||
setCursorPos(2*posBa);
|
||||
resetSelection(2*posBa);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (_overwriteMode)
|
||||
replace(posBa, char(0));
|
||||
else
|
||||
remove(posBa, 1);
|
||||
}
|
||||
}
|
||||
|
||||
/* Backspace */
|
||||
if ((event->key() == Qt::Key_Backspace) && (event->modifiers() == Qt::NoModifier))
|
||||
{
|
||||
if (getSelectionBegin() != getSelectionEnd())
|
||||
{
|
||||
posBa = getSelectionBegin();
|
||||
remove(posBa, getSelectionEnd() - posBa);
|
||||
setCursorPos(2*posBa);
|
||||
resetSelection(2*posBa);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (posBa > 0)
|
||||
{
|
||||
if (_overwriteMode)
|
||||
replace(posBa - 1, char(0));
|
||||
else
|
||||
remove(posBa - 1, 1);
|
||||
setCursorPos(_cursorPosition - 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* undo */
|
||||
if (event->matches(QKeySequence::Undo))
|
||||
{
|
||||
undo();
|
||||
}
|
||||
|
||||
/* redo */
|
||||
if (event->matches(QKeySequence::Redo))
|
||||
{
|
||||
redo();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (event->matches(QKeySequence::Copy))
|
||||
{
|
||||
QString result = QString();
|
||||
for (int idx = getSelectionBegin(); idx < getSelectionEnd(); idx++)
|
||||
{
|
||||
result += _xData.data().mid(idx, 1).toHex() + " ";
|
||||
if ((idx % 16) == 15)
|
||||
result.append('\n');
|
||||
}
|
||||
QClipboard *clipboard = QApplication::clipboard();
|
||||
clipboard->setText(result);
|
||||
}
|
||||
|
||||
// Switch between insert/overwrite mode
|
||||
if ((event->key() == Qt::Key_Insert) && (event->modifiers() == Qt::NoModifier))
|
||||
{
|
||||
_overwriteMode = !_overwriteMode;
|
||||
setCursorPos(_cursorPosition);
|
||||
overwriteModeChanged(_overwriteMode);
|
||||
}
|
||||
|
||||
ensureVisible();
|
||||
update();
|
||||
}
|
||||
|
||||
void QHexEditPrivate::mouseMoveEvent(QMouseEvent * event)
|
||||
{
|
||||
_blink = false;
|
||||
update();
|
||||
int actPos = cursorPos(event->pos());
|
||||
setCursorPos(actPos);
|
||||
setSelection(actPos);
|
||||
}
|
||||
|
||||
void QHexEditPrivate::mousePressEvent(QMouseEvent * event)
|
||||
{
|
||||
_blink = false;
|
||||
update();
|
||||
int cPos = cursorPos(event->pos());
|
||||
resetSelection(cPos);
|
||||
setCursorPos(cPos);
|
||||
}
|
||||
|
||||
void QHexEditPrivate::paintEvent(QPaintEvent *event)
|
||||
{
|
||||
QPainter painter(this);
|
||||
|
||||
// draw some patterns if needed
|
||||
painter.fillRect(event->rect(), this->palette().color(QPalette::Base));
|
||||
if (_addressArea)
|
||||
painter.fillRect(QRect(_xPosAdr, event->rect().top(), _xPosHex - GAP_ADR_HEX + 2, height()), _addressAreaColor);
|
||||
if (_asciiArea)
|
||||
{
|
||||
int linePos = _xPosAscii - (GAP_HEX_ASCII / 2);
|
||||
painter.setPen(Qt::gray);
|
||||
painter.drawLine(linePos, event->rect().top(), linePos, height());
|
||||
}
|
||||
|
||||
painter.setPen(this->palette().color(QPalette::WindowText));
|
||||
|
||||
// calc position
|
||||
int firstLineIdx = ((event->rect().top()/ _charHeight) - _charHeight) * BYTES_PER_LINE;
|
||||
if (firstLineIdx < 0)
|
||||
firstLineIdx = 0;
|
||||
int lastLineIdx = ((event->rect().bottom() / _charHeight) + _charHeight) * BYTES_PER_LINE;
|
||||
if (lastLineIdx > _xData.size())
|
||||
lastLineIdx = _xData.size();
|
||||
int yPosStart = ((firstLineIdx) / BYTES_PER_LINE) * _charHeight + _charHeight;
|
||||
|
||||
// paint address area
|
||||
if (_addressArea)
|
||||
{
|
||||
for (int lineIdx = firstLineIdx, yPos = yPosStart; lineIdx < lastLineIdx; lineIdx += BYTES_PER_LINE, yPos +=_charHeight)
|
||||
{
|
||||
QString address = QString("%1")
|
||||
.arg(lineIdx + _xData.addressOffset(), _xData.realAddressNumbers(), 16, QChar('0'));
|
||||
painter.drawText(_xPosAdr, yPos, address);
|
||||
}
|
||||
}
|
||||
|
||||
// paint hex area
|
||||
QByteArray hexBa(_xData.data().mid(firstLineIdx, lastLineIdx - firstLineIdx + 1).toHex());
|
||||
QBrush highLighted = QBrush(_highlightingColor);
|
||||
QPen colHighlighted = QPen(this->palette().color(QPalette::WindowText));
|
||||
QBrush selected = QBrush(_selectionColor);
|
||||
QPen colSelected = QPen(Qt::white);
|
||||
QPen colStandard = QPen(this->palette().color(QPalette::WindowText));
|
||||
|
||||
painter.setBackgroundMode(Qt::TransparentMode);
|
||||
|
||||
for (int lineIdx = firstLineIdx, yPos = yPosStart; lineIdx < lastLineIdx; lineIdx += BYTES_PER_LINE, yPos +=_charHeight)
|
||||
{
|
||||
QByteArray hex;
|
||||
int xPos = _xPosHex;
|
||||
for (int colIdx = 0; ((lineIdx + colIdx) < _xData.size() && (colIdx < BYTES_PER_LINE)); colIdx++)
|
||||
{
|
||||
int posBa = lineIdx + colIdx;
|
||||
if ((getSelectionBegin() <= posBa) && (getSelectionEnd() > posBa))
|
||||
{
|
||||
painter.setBackground(selected);
|
||||
painter.setBackgroundMode(Qt::OpaqueMode);
|
||||
painter.setPen(colSelected);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (_highlighting)
|
||||
{
|
||||
// hilight diff bytes
|
||||
painter.setBackground(highLighted);
|
||||
if (_xData.dataChanged(posBa))
|
||||
{
|
||||
painter.setPen(colHighlighted);
|
||||
painter.setBackgroundMode(Qt::OpaqueMode);
|
||||
}
|
||||
else
|
||||
{
|
||||
painter.setPen(colStandard);
|
||||
painter.setBackgroundMode(Qt::TransparentMode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// render hex value
|
||||
if (colIdx == 0)
|
||||
{
|
||||
hex = hexBa.mid((lineIdx - firstLineIdx) * 2, 2);
|
||||
painter.drawText(xPos, yPos, hex);
|
||||
xPos += 2 * _charWidth;
|
||||
} else {
|
||||
hex = hexBa.mid((lineIdx + colIdx - firstLineIdx) * 2, 2).prepend(" ");
|
||||
painter.drawText(xPos, yPos, hex);
|
||||
xPos += 3 * _charWidth;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
painter.setBackgroundMode(Qt::TransparentMode);
|
||||
painter.setPen(this->palette().color(QPalette::WindowText));
|
||||
|
||||
// paint ascii area
|
||||
if (_asciiArea)
|
||||
{
|
||||
for (int lineIdx = firstLineIdx, yPos = yPosStart; lineIdx < lastLineIdx; lineIdx += BYTES_PER_LINE, yPos +=_charHeight)
|
||||
{
|
||||
int xPosAscii = _xPosAscii;
|
||||
for (int colIdx = 0; ((lineIdx + colIdx) < _xData.size() && (colIdx < BYTES_PER_LINE)); colIdx++)
|
||||
{
|
||||
painter.drawText(xPosAscii, yPos, _xData.asciiChar(lineIdx + colIdx));
|
||||
xPosAscii += _charWidth;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// paint cursor
|
||||
if (_blink && !_readOnly && hasFocus())
|
||||
{
|
||||
if (_overwriteMode)
|
||||
painter.fillRect(_cursorX, _cursorY + _charHeight - 2, _charWidth, 2, this->palette().color(QPalette::WindowText));
|
||||
else
|
||||
painter.fillRect(_cursorX, _cursorY, 2, _charHeight, this->palette().color(QPalette::WindowText));
|
||||
}
|
||||
|
||||
if (_size != _xData.size())
|
||||
{
|
||||
_size = _xData.size();
|
||||
emit currentSizeChanged(_size);
|
||||
}
|
||||
}
|
||||
|
||||
void QHexEditPrivate::setCursorPos(int position)
|
||||
{
|
||||
// delete cursor
|
||||
_blink = false;
|
||||
update();
|
||||
|
||||
// cursor in range?
|
||||
if (_overwriteMode)
|
||||
{
|
||||
if (position > (_xData.size() * 2 - 1))
|
||||
position = _xData.size() * 2 - 1;
|
||||
} else {
|
||||
if (position > (_xData.size() * 2))
|
||||
position = _xData.size() * 2;
|
||||
}
|
||||
|
||||
if (position < 0)
|
||||
position = 0;
|
||||
|
||||
// calc position
|
||||
_cursorPosition = position;
|
||||
_cursorY = (position / (2 * BYTES_PER_LINE)) * _charHeight + 4;
|
||||
int x = (position % (2 * BYTES_PER_LINE));
|
||||
_cursorX = (((x / 2) * 3) + (x % 2)) * _charWidth + _xPosHex;
|
||||
|
||||
// immiadately draw cursor
|
||||
_blink = true;
|
||||
update();
|
||||
emit currentAddressChanged(_cursorPosition/2);
|
||||
}
|
||||
|
||||
int QHexEditPrivate::cursorPos(QPoint pos)
|
||||
{
|
||||
int result = -1;
|
||||
// find char under cursor
|
||||
if ((pos.x() >= _xPosHex) && (pos.x() < (_xPosHex + HEXCHARS_IN_LINE * _charWidth)))
|
||||
{
|
||||
int x = (pos.x() - _xPosHex) / _charWidth;
|
||||
if ((x % 3) == 0)
|
||||
x = (x / 3) * 2;
|
||||
else
|
||||
x = ((x / 3) * 2) + 1;
|
||||
int y = ((pos.y() - 3) / _charHeight) * 2 * BYTES_PER_LINE;
|
||||
result = x + y;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
int QHexEditPrivate::cursorPos()
|
||||
{
|
||||
return _cursorPosition;
|
||||
}
|
||||
|
||||
void QHexEditPrivate::resetSelection()
|
||||
{
|
||||
_selectionBegin = _selectionInit;
|
||||
_selectionEnd = _selectionInit;
|
||||
}
|
||||
|
||||
void QHexEditPrivate::resetSelection(int pos)
|
||||
{
|
||||
if (pos < 0)
|
||||
pos = 0;
|
||||
pos = pos / 2;
|
||||
_selectionInit = pos;
|
||||
_selectionBegin = pos;
|
||||
_selectionEnd = pos;
|
||||
}
|
||||
|
||||
void QHexEditPrivate::setSelection(int pos)
|
||||
{
|
||||
if (pos < 0)
|
||||
pos = 0;
|
||||
pos = pos / 2;
|
||||
if (pos >= _selectionInit)
|
||||
{
|
||||
_selectionEnd = pos;
|
||||
_selectionBegin = _selectionInit;
|
||||
}
|
||||
else
|
||||
{
|
||||
_selectionBegin = pos;
|
||||
_selectionEnd = _selectionInit;
|
||||
}
|
||||
}
|
||||
|
||||
int QHexEditPrivate::getSelectionBegin()
|
||||
{
|
||||
return _selectionBegin;
|
||||
}
|
||||
|
||||
int QHexEditPrivate::getSelectionEnd()
|
||||
{
|
||||
return _selectionEnd;
|
||||
}
|
||||
|
||||
|
||||
void QHexEditPrivate::updateCursor()
|
||||
{
|
||||
if (_blink)
|
||||
_blink = false;
|
||||
else
|
||||
_blink = true;
|
||||
update(_cursorX, _cursorY, _charWidth, _charHeight);
|
||||
}
|
||||
|
||||
void QHexEditPrivate::adjust()
|
||||
{
|
||||
_charWidth = fontMetrics().width(QLatin1Char('9'));
|
||||
_charHeight = fontMetrics().height();
|
||||
|
||||
_xPosAdr = 0;
|
||||
if (_addressArea)
|
||||
_xPosHex = _xData.realAddressNumbers()*_charWidth + GAP_ADR_HEX;
|
||||
else
|
||||
_xPosHex = 0;
|
||||
_xPosAscii = _xPosHex + HEXCHARS_IN_LINE * _charWidth + GAP_HEX_ASCII;
|
||||
|
||||
// tell QAbstractScollbar, how big we are
|
||||
setMinimumHeight(((_xData.size()/16 + 1) * _charHeight) + 5);
|
||||
if(_asciiArea)
|
||||
setMinimumWidth(_xPosAscii + (BYTES_PER_LINE * _charWidth));
|
||||
else
|
||||
setMinimumWidth(_xPosHex + HEXCHARS_IN_LINE * _charWidth);
|
||||
|
||||
update();
|
||||
}
|
||||
|
||||
void QHexEditPrivate::ensureVisible()
|
||||
{
|
||||
// scrolls to cursorx, cusory (which are set by setCursorPos)
|
||||
// x-margin is 3 pixels, y-margin is half of charHeight
|
||||
_scrollArea->ensureVisible(_cursorX, _cursorY + _charHeight/2, 3, _charHeight/2 + 2);
|
||||
}
|
||||
128
externals/qhexedit/qhexedit_p.h
vendored
128
externals/qhexedit/qhexedit_p.h
vendored
@@ -1,128 +0,0 @@
|
||||
#ifndef QHEXEDIT_P_H
|
||||
#define QHEXEDIT_P_H
|
||||
|
||||
/** \cond docNever */
|
||||
|
||||
|
||||
#include <QtGui>
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
|
||||
#include <QtWidgets>
|
||||
#endif
|
||||
#include "xbytearray.h"
|
||||
|
||||
class QHexEditPrivate : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
QHexEditPrivate(QScrollArea *parent);
|
||||
|
||||
void setAddressAreaColor(QColor const &color);
|
||||
QColor addressAreaColor();
|
||||
|
||||
void setAddressOffset(int offset);
|
||||
int addressOffset();
|
||||
|
||||
void setCursorPos(int position);
|
||||
int cursorPos();
|
||||
|
||||
void setData(QByteArray const &data);
|
||||
QByteArray data();
|
||||
|
||||
void setHighlightingColor(QColor const &color);
|
||||
QColor highlightingColor();
|
||||
|
||||
void setOverwriteMode(bool overwriteMode);
|
||||
bool overwriteMode();
|
||||
|
||||
void setReadOnly(bool readOnly);
|
||||
bool isReadOnly();
|
||||
|
||||
void setSelectionColor(QColor const &color);
|
||||
QColor selectionColor();
|
||||
|
||||
XByteArray & xData();
|
||||
|
||||
int indexOf(const QByteArray & ba, int from = 0);
|
||||
void insert(int index, const QByteArray & ba);
|
||||
void insert(int index, char ch);
|
||||
int lastIndexOf(const QByteArray & ba, int from = 0);
|
||||
void remove(int index, int len=1);
|
||||
void replace(int index, char ch);
|
||||
void replace(int index, const QByteArray & ba);
|
||||
void replace(int pos, int len, const QByteArray & after);
|
||||
|
||||
void setAddressArea(bool addressArea);
|
||||
void setAddressWidth(int addressWidth);
|
||||
void setAsciiArea(bool asciiArea);
|
||||
void setHighlighting(bool mode);
|
||||
virtual void setFont(const QFont &font);
|
||||
|
||||
void undo();
|
||||
void redo();
|
||||
|
||||
QString toRedableString();
|
||||
QString selectionToReadableString();
|
||||
|
||||
signals:
|
||||
void currentAddressChanged(int address);
|
||||
void currentSizeChanged(int size);
|
||||
void dataChanged();
|
||||
void overwriteModeChanged(bool state);
|
||||
|
||||
protected:
|
||||
void keyPressEvent(QKeyEvent * event);
|
||||
void mouseMoveEvent(QMouseEvent * event);
|
||||
void mousePressEvent(QMouseEvent * event);
|
||||
|
||||
void paintEvent(QPaintEvent *event);
|
||||
|
||||
int cursorPos(QPoint pos); // calc cursorpos from graphics position. DOES NOT STORE POSITION
|
||||
|
||||
void resetSelection(int pos); // set selectionStart and selectionEnd to pos
|
||||
void resetSelection(); // set selectionEnd to selectionStart
|
||||
void setSelection(int pos); // set min (if below init) or max (if greater init)
|
||||
int getSelectionBegin();
|
||||
int getSelectionEnd();
|
||||
|
||||
|
||||
private slots:
|
||||
void updateCursor();
|
||||
|
||||
private:
|
||||
void adjust();
|
||||
void ensureVisible();
|
||||
|
||||
QColor _addressAreaColor;
|
||||
QColor _highlightingColor;
|
||||
QColor _selectionColor;
|
||||
QScrollArea *_scrollArea;
|
||||
QTimer _cursorTimer;
|
||||
QUndoStack *_undoStack;
|
||||
|
||||
XByteArray _xData; // Hält den Inhalt des Hex Editors
|
||||
|
||||
bool _blink; // true: then cursor blinks
|
||||
bool _renderingRequired; // Flag to store that rendering is necessary
|
||||
bool _addressArea; // left area of QHexEdit
|
||||
bool _asciiArea; // medium area
|
||||
bool _highlighting; // highlighting of changed bytes
|
||||
bool _overwriteMode;
|
||||
bool _readOnly; // true: the user can only look and navigate
|
||||
|
||||
int _charWidth, _charHeight; // char dimensions (dpendend on font)
|
||||
int _cursorX, _cursorY; // graphics position of the cursor
|
||||
int _cursorPosition; // character positioin in stream (on byte ends in to steps)
|
||||
int _xPosAdr, _xPosHex, _xPosAscii; // graphics x-position of the areas
|
||||
|
||||
int _selectionBegin; // First selected char
|
||||
int _selectionEnd; // Last selected char
|
||||
int _selectionInit; // That's, where we pressed the mouse button
|
||||
|
||||
int _size;
|
||||
};
|
||||
|
||||
/** \endcond docNever */
|
||||
|
||||
#endif
|
||||
|
||||
167
externals/qhexedit/xbytearray.cpp
vendored
167
externals/qhexedit/xbytearray.cpp
vendored
@@ -1,167 +0,0 @@
|
||||
#include "xbytearray.h"
|
||||
|
||||
XByteArray::XByteArray()
|
||||
{
|
||||
_oldSize = -99;
|
||||
_addressNumbers = 4;
|
||||
_addressOffset = 0;
|
||||
|
||||
}
|
||||
|
||||
int XByteArray::addressOffset()
|
||||
{
|
||||
return _addressOffset;
|
||||
}
|
||||
|
||||
void XByteArray::setAddressOffset(int offset)
|
||||
{
|
||||
_addressOffset = offset;
|
||||
}
|
||||
|
||||
int XByteArray::addressWidth()
|
||||
{
|
||||
return _addressNumbers;
|
||||
}
|
||||
|
||||
void XByteArray::setAddressWidth(int width)
|
||||
{
|
||||
if ((width >= 0) && (width<=6))
|
||||
{
|
||||
_addressNumbers = width;
|
||||
}
|
||||
}
|
||||
|
||||
QByteArray & XByteArray::data()
|
||||
{
|
||||
return _data;
|
||||
}
|
||||
|
||||
void XByteArray::setData(QByteArray data)
|
||||
{
|
||||
_data = data;
|
||||
_changedData = QByteArray(data.length(), char(0));
|
||||
}
|
||||
|
||||
bool XByteArray::dataChanged(int i)
|
||||
{
|
||||
return bool(_changedData[i]);
|
||||
}
|
||||
|
||||
QByteArray XByteArray::dataChanged(int i, int len)
|
||||
{
|
||||
return _changedData.mid(i, len);
|
||||
}
|
||||
|
||||
void XByteArray::setDataChanged(int i, bool state)
|
||||
{
|
||||
_changedData[i] = char(state);
|
||||
}
|
||||
|
||||
void XByteArray::setDataChanged(int i, const QByteArray & state)
|
||||
{
|
||||
int length = state.length();
|
||||
int len;
|
||||
if ((i + length) > _changedData.length())
|
||||
len = _changedData.length() - i;
|
||||
else
|
||||
len = length;
|
||||
_changedData.replace(i, len, state);
|
||||
}
|
||||
|
||||
int XByteArray::realAddressNumbers()
|
||||
{
|
||||
if (_oldSize != _data.size())
|
||||
{
|
||||
// is addressNumbers wide enought?
|
||||
QString test = QString("%1")
|
||||
.arg(_data.size() + _addressOffset, _addressNumbers, 16, QChar('0'));
|
||||
_realAddressNumbers = test.size();
|
||||
}
|
||||
return _realAddressNumbers;
|
||||
}
|
||||
|
||||
int XByteArray::size()
|
||||
{
|
||||
return _data.size();
|
||||
}
|
||||
|
||||
QByteArray & XByteArray::insert(int i, char ch)
|
||||
{
|
||||
_data.insert(i, ch);
|
||||
_changedData.insert(i, char(1));
|
||||
return _data;
|
||||
}
|
||||
|
||||
QByteArray & XByteArray::insert(int i, const QByteArray & ba)
|
||||
{
|
||||
_data.insert(i, ba);
|
||||
_changedData.insert(i, QByteArray(ba.length(), char(1)));
|
||||
return _data;
|
||||
}
|
||||
|
||||
QByteArray & XByteArray::remove(int i, int len)
|
||||
{
|
||||
_data.remove(i, len);
|
||||
_changedData.remove(i, len);
|
||||
return _data;
|
||||
}
|
||||
|
||||
QByteArray & XByteArray::replace(int index, char ch)
|
||||
{
|
||||
_data[index] = ch;
|
||||
_changedData[index] = char(1);
|
||||
return _data;
|
||||
}
|
||||
|
||||
QByteArray & XByteArray::replace(int index, const QByteArray & ba)
|
||||
{
|
||||
int len = ba.length();
|
||||
return replace(index, len, ba);
|
||||
}
|
||||
|
||||
QByteArray & XByteArray::replace(int index, int length, const QByteArray & ba)
|
||||
{
|
||||
int len;
|
||||
if ((index + length) > _data.length())
|
||||
len = _data.length() - index;
|
||||
else
|
||||
len = length;
|
||||
_data.replace(index, len, ba.mid(0, len));
|
||||
_changedData.replace(index, len, QByteArray(len, char(1)));
|
||||
return _data;
|
||||
}
|
||||
|
||||
QChar XByteArray::asciiChar(int index)
|
||||
{
|
||||
char ch = _data[index];
|
||||
if ((ch < 0x20) || (ch > 0x7e))
|
||||
ch = '.';
|
||||
return QChar(ch);
|
||||
}
|
||||
|
||||
QString XByteArray::toRedableString(int start, int end)
|
||||
{
|
||||
int adrWidth = realAddressNumbers();
|
||||
if (_addressNumbers > adrWidth)
|
||||
adrWidth = _addressNumbers;
|
||||
if (end < 0)
|
||||
end = _data.size();
|
||||
|
||||
QString result;
|
||||
for (int i=start; i < end; i += 16)
|
||||
{
|
||||
QString adrStr = QString("%1").arg(_addressOffset + i, adrWidth, 16, QChar('0'));
|
||||
QString hexStr;
|
||||
QString ascStr;
|
||||
for (int j=0; j<16; j++)
|
||||
{
|
||||
if ((i + j) < _data.size())
|
||||
{
|
||||
hexStr.append(" ").append(_data.mid(i+j, 1).toHex());
|
||||
ascStr.append(asciiChar(i+j));
|
||||
}
|
||||
}
|
||||
result += adrStr + " " + QString("%1").arg(hexStr, -48) + " " + QString("%1").arg(ascStr, -17) + "\n";
|
||||
}
|
||||
return result;
|
||||
}
|
||||
66
externals/qhexedit/xbytearray.h
vendored
66
externals/qhexedit/xbytearray.h
vendored
@@ -1,66 +0,0 @@
|
||||
#ifndef XBYTEARRAY_H
|
||||
#define XBYTEARRAY_H
|
||||
|
||||
/** \cond docNever */
|
||||
|
||||
#include <QtCore>
|
||||
|
||||
/*! XByteArray represents the content of QHexEcit.
|
||||
XByteArray comprehend the data itself and informations to store if it was
|
||||
changed. The QHexEdit component uses these informations to perform nice
|
||||
rendering of the data
|
||||
|
||||
XByteArray also provides some functionality to insert, replace and remove
|
||||
single chars and QByteArras. Additionally some functions support rendering
|
||||
and converting to readable strings.
|
||||
*/
|
||||
class XByteArray
|
||||
{
|
||||
public:
|
||||
explicit XByteArray();
|
||||
|
||||
int addressOffset();
|
||||
void setAddressOffset(int offset);
|
||||
|
||||
int addressWidth();
|
||||
void setAddressWidth(int width);
|
||||
|
||||
QByteArray & data();
|
||||
void setData(QByteArray data);
|
||||
|
||||
bool dataChanged(int i);
|
||||
QByteArray dataChanged(int i, int len);
|
||||
void setDataChanged(int i, bool state);
|
||||
void setDataChanged(int i, const QByteArray & state);
|
||||
|
||||
int realAddressNumbers();
|
||||
int size();
|
||||
|
||||
QByteArray & insert(int i, char ch);
|
||||
QByteArray & insert(int i, const QByteArray & ba);
|
||||
|
||||
QByteArray & remove(int pos, int len);
|
||||
|
||||
QByteArray & replace(int index, char ch);
|
||||
QByteArray & replace(int index, const QByteArray & ba);
|
||||
QByteArray & replace(int index, int length, const QByteArray & ba);
|
||||
|
||||
QChar asciiChar(int index);
|
||||
QString toRedableString(int start=0, int end=-1);
|
||||
|
||||
signals:
|
||||
|
||||
public slots:
|
||||
|
||||
private:
|
||||
QByteArray _data;
|
||||
QByteArray _changedData;
|
||||
|
||||
int _addressNumbers; // wanted width of address area
|
||||
int _addressOffset; // will be added to the real addres inside bytearray
|
||||
int _realAddressNumbers; // real width of address area (can be greater then wanted width)
|
||||
int _oldSize; // size of data
|
||||
};
|
||||
|
||||
/** \endcond docNever */
|
||||
#endif // XBYTEARRAY_H
|
||||
1
externals/unicorn
vendored
Submodule
1
externals/unicorn
vendored
Submodule
Submodule externals/unicorn added at 73f4573535
1
externals/xbyak
vendored
Submodule
1
externals/xbyak
vendored
Submodule
Submodule externals/xbyak added at d512551e91
@@ -3,20 +3,22 @@
|
||||
# Enforce citra's whitespace policy
|
||||
git config --local core.whitespace tab-in-indent,trailing-space
|
||||
|
||||
paths_to_check="src/ CMakeLists.txt"
|
||||
|
||||
# If there are whitespace errors, print the offending file names and fail.
|
||||
if ! git diff --cached --check; then
|
||||
cat<<END;
|
||||
if ! git diff --cached --check -- $paths_to_check ; then
|
||||
cat<<END
|
||||
|
||||
Error: This commit would contain trailing spaces or tabs, which is against this repo's policy.
|
||||
Please correct those issues before commiting. (Use 'git diff --check' for more details)
|
||||
Please correct those issues before committing. (Use 'git diff --check' for more details)
|
||||
If you know what you are doing, you can try 'git commit --no-verify' to bypass the check
|
||||
END
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check for tabs, since tab-in-indent catches only those at the beginning of a line
|
||||
if git diff --cached | egrep '^\+.* '; then
|
||||
cat<<END;
|
||||
if git diff --cached -- $paths_to_check | egrep '^\+.* '; then
|
||||
cat<<END
|
||||
Error: This commit would contain a tab, which is against this repo's policy.
|
||||
If you know what you are doing, you can try 'git commit --no-verify' to bypass the check.
|
||||
END
|
||||
|
||||
88
src/.clang-format
Normal file
88
src/.clang-format
Normal file
@@ -0,0 +1,88 @@
|
||||
---
|
||||
Language: Cpp
|
||||
# BasedOnStyle: LLVM
|
||||
AccessModifierOffset: -4
|
||||
AlignAfterOpenBracket: Align
|
||||
AlignConsecutiveAssignments: false
|
||||
AlignConsecutiveDeclarations: false
|
||||
AlignEscapedNewlinesLeft: false
|
||||
AlignOperands: true
|
||||
AlignTrailingComments: true
|
||||
AllowAllParametersOfDeclarationOnNextLine: true
|
||||
AllowShortBlocksOnASingleLine: false
|
||||
AllowShortCaseLabelsOnASingleLine: false
|
||||
AllowShortFunctionsOnASingleLine: Empty
|
||||
AllowShortIfStatementsOnASingleLine: false
|
||||
AllowShortLoopsOnASingleLine: false
|
||||
AlwaysBreakAfterDefinitionReturnType: None
|
||||
AlwaysBreakAfterReturnType: None
|
||||
AlwaysBreakBeforeMultilineStrings: false
|
||||
AlwaysBreakTemplateDeclarations: true
|
||||
BinPackArguments: true
|
||||
BinPackParameters: true
|
||||
BraceWrapping:
|
||||
AfterClass: false
|
||||
AfterControlStatement: false
|
||||
AfterEnum: false
|
||||
AfterFunction: false
|
||||
AfterNamespace: false
|
||||
AfterObjCDeclaration: false
|
||||
AfterStruct: false
|
||||
AfterUnion: false
|
||||
BeforeCatch: false
|
||||
BeforeElse: false
|
||||
IndentBraces: false
|
||||
BreakBeforeBinaryOperators: None
|
||||
BreakBeforeBraces: Attach
|
||||
BreakBeforeTernaryOperators: true
|
||||
BreakConstructorInitializersBeforeComma: false
|
||||
ColumnLimit: 100
|
||||
CommentPragmas: '^ IWYU pragma:'
|
||||
ConstructorInitializerAllOnOneLineOrOnePerLine: false
|
||||
ConstructorInitializerIndentWidth: 4
|
||||
ContinuationIndentWidth: 4
|
||||
Cpp11BracedListStyle: true
|
||||
DerivePointerAlignment: false
|
||||
DisableFormat: false
|
||||
ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ]
|
||||
IncludeCategories:
|
||||
- Regex: '^\<[^Q][^/.>]*\>'
|
||||
Priority: -2
|
||||
- Regex: '^\<'
|
||||
Priority: -1
|
||||
- Regex: '^\"'
|
||||
Priority: 0
|
||||
IndentCaseLabels: false
|
||||
IndentWidth: 4
|
||||
IndentWrappedFunctionNames: false
|
||||
KeepEmptyLinesAtTheStartOfBlocks: true
|
||||
MacroBlockBegin: ''
|
||||
MacroBlockEnd: ''
|
||||
MaxEmptyLinesToKeep: 1
|
||||
NamespaceIndentation: None
|
||||
ObjCBlockIndentWidth: 2
|
||||
ObjCSpaceAfterProperty: false
|
||||
ObjCSpaceBeforeProtocolList: true
|
||||
PenaltyBreakBeforeFirstCallParameter: 19
|
||||
PenaltyBreakComment: 300
|
||||
PenaltyBreakFirstLessLess: 120
|
||||
PenaltyBreakString: 1000
|
||||
PenaltyExcessCharacter: 1000000
|
||||
PenaltyReturnTypeOnItsOwnLine: 150
|
||||
PointerAlignment: Left
|
||||
ReflowComments: true
|
||||
SortIncludes: true
|
||||
SpaceAfterCStyleCast: false
|
||||
SpaceBeforeAssignmentOperators: true
|
||||
SpaceBeforeParens: ControlStatements
|
||||
SpaceInEmptyParentheses: false
|
||||
SpacesBeforeTrailingComments: 1
|
||||
SpacesInAngles: false
|
||||
SpacesInContainerLiterals: true
|
||||
SpacesInCStyleCastParentheses: false
|
||||
SpacesInParentheses: false
|
||||
SpacesInSquareBrackets: false
|
||||
Standard: Cpp11
|
||||
TabWidth: 4
|
||||
UseTab: Never
|
||||
...
|
||||
@@ -4,9 +4,11 @@ include_directories(.)
|
||||
add_subdirectory(common)
|
||||
add_subdirectory(core)
|
||||
add_subdirectory(video_core)
|
||||
if (ENABLE_GLFW)
|
||||
add_subdirectory(citra)
|
||||
add_subdirectory(input_common)
|
||||
add_subdirectory(tests)
|
||||
if (ENABLE_SDL2)
|
||||
add_subdirectory(yuzu_cmd)
|
||||
endif()
|
||||
if (ENABLE_QT)
|
||||
add_subdirectory(citra_qt)
|
||||
add_subdirectory(yuzu)
|
||||
endif()
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
set(SRCS
|
||||
emu_window/emu_window_glfw.cpp
|
||||
citra.cpp
|
||||
config.cpp
|
||||
citra.rc
|
||||
)
|
||||
set(HEADERS
|
||||
emu_window/emu_window_glfw.h
|
||||
config.h
|
||||
default_ini.h
|
||||
resource.h
|
||||
)
|
||||
|
||||
create_directory_groups(${SRCS} ${HEADERS})
|
||||
|
||||
add_executable(citra ${SRCS} ${HEADERS})
|
||||
target_link_libraries(citra core common video_core)
|
||||
target_link_libraries(citra ${GLFW_LIBRARIES} ${OPENGL_gl_LIBRARY} inih)
|
||||
if (MSVC)
|
||||
target_link_libraries(citra getopt)
|
||||
endif()
|
||||
target_link_libraries(citra ${PLATFORM_LIBRARIES})
|
||||
|
||||
if(${CMAKE_SYSTEM_NAME} MATCHES "Linux|FreeBSD|OpenBSD|NetBSD")
|
||||
install(TARGETS citra RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}/bin")
|
||||
endif()
|
||||
@@ -1,92 +0,0 @@
|
||||
// Copyright 2014 Citra Emulator Project
|
||||
// Licensed under GPLv2 or any later version
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
#include <string>
|
||||
#include <thread>
|
||||
#include <iostream>
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#include <getopt.h>
|
||||
#else
|
||||
#include <unistd.h>
|
||||
#include <getopt.h>
|
||||
#endif
|
||||
|
||||
#include "common/logging/log.h"
|
||||
#include "common/logging/backend.h"
|
||||
#include "common/logging/filter.h"
|
||||
|
||||
#include "core/settings.h"
|
||||
#include "core/system.h"
|
||||
#include "core/core.h"
|
||||
#include "core/loader/loader.h"
|
||||
|
||||
#include "citra/config.h"
|
||||
#include "citra/emu_window/emu_window_glfw.h"
|
||||
|
||||
#include "video_core/video_core.h"
|
||||
|
||||
|
||||
static void PrintHelp()
|
||||
{
|
||||
std::cout << "Usage: citra <filename>" << std::endl;
|
||||
}
|
||||
|
||||
/// Application entry point
|
||||
int main(int argc, char **argv) {
|
||||
int option_index = 0;
|
||||
std::string boot_filename;
|
||||
static struct option long_options[] = {
|
||||
{ "help", no_argument, 0, 'h' },
|
||||
{ 0, 0, 0, 0 }
|
||||
};
|
||||
|
||||
while (optind < argc) {
|
||||
char arg = getopt_long(argc, argv, ":h", long_options, &option_index);
|
||||
if (arg != -1) {
|
||||
switch (arg) {
|
||||
case 'h':
|
||||
PrintHelp();
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
boot_filename = argv[optind];
|
||||
optind++;
|
||||
}
|
||||
}
|
||||
|
||||
Log::Filter log_filter(Log::Level::Debug);
|
||||
Log::SetFilter(&log_filter);
|
||||
|
||||
if (boot_filename.empty()) {
|
||||
LOG_CRITICAL(Frontend, "Failed to load ROM: No ROM specified");
|
||||
return -1;
|
||||
}
|
||||
|
||||
Config config;
|
||||
log_filter.ParseFilterString(Settings::values.log_filter);
|
||||
|
||||
|
||||
EmuWindow_GLFW* emu_window = new EmuWindow_GLFW;
|
||||
|
||||
VideoCore::g_hw_renderer_enabled = Settings::values.use_hw_renderer;
|
||||
|
||||
System::Init(emu_window);
|
||||
|
||||
Loader::ResultStatus load_result = Loader::LoadFile(boot_filename);
|
||||
if (Loader::ResultStatus::Success != load_result) {
|
||||
LOG_CRITICAL(Frontend, "Failed to load ROM (Error %i)!", load_result);
|
||||
return -1;
|
||||
}
|
||||
|
||||
while (emu_window->IsOpen()) {
|
||||
Core::RunLoop();
|
||||
}
|
||||
|
||||
System::Shutdown();
|
||||
|
||||
delete emu_window;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Icon
|
||||
//
|
||||
|
||||
// Icon with lowest ID value placed first to ensure application icon
|
||||
// remains consistent on all systems.
|
||||
GLFW_ICON ICON "..\\..\\dist\\citra.ico"
|
||||
|
||||
@@ -1,86 +0,0 @@
|
||||
// Copyright 2014 Citra Emulator Project
|
||||
// Licensed under GPLv2 or any later version
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
#define GLFW_INCLUDE_NONE
|
||||
#include <GLFW/glfw3.h>
|
||||
#include <inih/cpp/INIReader.h>
|
||||
|
||||
#include "citra/default_ini.h"
|
||||
|
||||
#include "common/file_util.h"
|
||||
#include "common/logging/log.h"
|
||||
|
||||
#include "core/settings.h"
|
||||
|
||||
#include "config.h"
|
||||
|
||||
Config::Config() {
|
||||
// TODO: Don't hardcode the path; let the frontend decide where to put the config files.
|
||||
glfw_config_loc = FileUtil::GetUserPath(D_CONFIG_IDX) + "glfw-config.ini";
|
||||
glfw_config = new INIReader(glfw_config_loc);
|
||||
|
||||
Reload();
|
||||
}
|
||||
|
||||
bool Config::LoadINI(INIReader* config, const char* location, const std::string& default_contents, bool retry) {
|
||||
if (config->ParseError() < 0) {
|
||||
if (retry) {
|
||||
LOG_WARNING(Config, "Failed to load %s. Creating file from defaults...", location);
|
||||
FileUtil::CreateFullPath(location);
|
||||
FileUtil::WriteStringToFile(true, default_contents, location);
|
||||
*config = INIReader(location); // Reopen file
|
||||
|
||||
return LoadINI(config, location, default_contents, false);
|
||||
}
|
||||
LOG_ERROR(Config, "Failed.");
|
||||
return false;
|
||||
}
|
||||
LOG_INFO(Config, "Successfully loaded %s", location);
|
||||
return true;
|
||||
}
|
||||
|
||||
static const std::array<int, Settings::NativeInput::NUM_INPUTS> defaults = {
|
||||
GLFW_KEY_A, GLFW_KEY_S, GLFW_KEY_Z, GLFW_KEY_X,
|
||||
GLFW_KEY_Q, GLFW_KEY_W, GLFW_KEY_1, GLFW_KEY_2,
|
||||
GLFW_KEY_M, GLFW_KEY_N, GLFW_KEY_B,
|
||||
GLFW_KEY_T, GLFW_KEY_G, GLFW_KEY_F, GLFW_KEY_H,
|
||||
GLFW_KEY_UP, GLFW_KEY_DOWN, GLFW_KEY_LEFT, GLFW_KEY_RIGHT,
|
||||
GLFW_KEY_I, GLFW_KEY_K, GLFW_KEY_J, GLFW_KEY_L
|
||||
};
|
||||
|
||||
void Config::ReadValues() {
|
||||
// Controls
|
||||
for (int i = 0; i < Settings::NativeInput::NUM_INPUTS; ++i) {
|
||||
Settings::values.input_mappings[Settings::NativeInput::All[i]] =
|
||||
glfw_config->GetInteger("Controls", Settings::NativeInput::Mapping[i], defaults[i]);
|
||||
}
|
||||
|
||||
// Core
|
||||
Settings::values.frame_skip = glfw_config->GetInteger("Core", "frame_skip", 0);
|
||||
|
||||
// Renderer
|
||||
Settings::values.use_hw_renderer = glfw_config->GetBoolean("Renderer", "use_hw_renderer", false);
|
||||
|
||||
Settings::values.bg_red = (float)glfw_config->GetReal("Renderer", "bg_red", 1.0);
|
||||
Settings::values.bg_green = (float)glfw_config->GetReal("Renderer", "bg_green", 1.0);
|
||||
Settings::values.bg_blue = (float)glfw_config->GetReal("Renderer", "bg_blue", 1.0);
|
||||
|
||||
// Data Storage
|
||||
Settings::values.use_virtual_sd = glfw_config->GetBoolean("Data Storage", "use_virtual_sd", true);
|
||||
|
||||
// System Region
|
||||
Settings::values.region_value = glfw_config->GetInteger("System Region", "region_value", 1);
|
||||
|
||||
// Miscellaneous
|
||||
Settings::values.log_filter = glfw_config->Get("Miscellaneous", "log_filter", "*:Info");
|
||||
}
|
||||
|
||||
void Config::Reload() {
|
||||
LoadINI(glfw_config, glfw_config_loc.c_str(), DefaultINI::glfw_config_file);
|
||||
ReadValues();
|
||||
}
|
||||
|
||||
Config::~Config() {
|
||||
delete glfw_config;
|
||||
}
|
||||
@@ -1,67 +0,0 @@
|
||||
// Copyright 2014 Citra Emulator Project
|
||||
// Licensed under GPLv2 or any later version
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
#pragma once
|
||||
|
||||
namespace DefaultINI {
|
||||
|
||||
const char* glfw_config_file = R"(
|
||||
[Controls]
|
||||
pad_start =
|
||||
pad_select =
|
||||
pad_home =
|
||||
pad_dup =
|
||||
pad_ddown =
|
||||
pad_dleft =
|
||||
pad_dright =
|
||||
pad_a =
|
||||
pad_b =
|
||||
pad_x =
|
||||
pad_y =
|
||||
pad_l =
|
||||
pad_r =
|
||||
pad_zl =
|
||||
pad_zr =
|
||||
pad_sup =
|
||||
pad_sdown =
|
||||
pad_sleft =
|
||||
pad_sright =
|
||||
pad_cup =
|
||||
pad_cdown =
|
||||
pad_cleft =
|
||||
pad_cright =
|
||||
|
||||
[Core]
|
||||
# The applied frameskip amount. Must be a power of two.
|
||||
# 0 (default): No frameskip, 1: x2 frameskip, 2: x4 frameskip, 3: x8 frameskip, etc.
|
||||
frame_skip =
|
||||
|
||||
[Renderer]
|
||||
# Whether to use software or hardware rendering.
|
||||
# 0 (default): Software, 1: Hardware
|
||||
use_hw_renderer =
|
||||
|
||||
# The clear color for the renderer. What shows up on the sides of the bottom screen.
|
||||
# Must be in range of 0.0-1.0. Defaults to 1.0 for all.
|
||||
bg_red =
|
||||
bg_blue =
|
||||
bg_green =
|
||||
|
||||
[Data Storage]
|
||||
# Whether to create a virtual SD card.
|
||||
# 1 (default): Yes, 0: No
|
||||
use_virtual_sd =
|
||||
|
||||
[System Region]
|
||||
# The system region that Citra will use during emulation
|
||||
# 0: Japan, 1: USA (default), 2: Europe, 3: Australia, 4: China, 5: Korea, 6: Taiwan
|
||||
region_value =
|
||||
|
||||
[Miscellaneous]
|
||||
# A filter which removes logs below a certain logging level.
|
||||
# Examples: *:Debug Kernel.SVC:Trace Service.*:Critical
|
||||
log_filter = *:Info
|
||||
)";
|
||||
|
||||
}
|
||||
@@ -1,168 +0,0 @@
|
||||
// Copyright 2014 Citra Emulator Project
|
||||
// Licensed under GPLv2 or any later version
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
#include <algorithm>
|
||||
#include <cstdlib>
|
||||
#include <string>
|
||||
|
||||
// Let’s use our own GL header, instead of one from GLFW.
|
||||
#include "video_core/renderer_opengl/generated/gl_3_2_core.h"
|
||||
#define GLFW_INCLUDE_NONE
|
||||
#include <GLFW/glfw3.h>
|
||||
|
||||
#include "common/assert.h"
|
||||
#include "common/key_map.h"
|
||||
#include "common/logging/log.h"
|
||||
#include "common/scm_rev.h"
|
||||
#include "common/string_util.h"
|
||||
|
||||
#include "video_core/video_core.h"
|
||||
|
||||
#include "core/settings.h"
|
||||
#include "core/hle/service/hid/hid.h"
|
||||
|
||||
#include "citra/emu_window/emu_window_glfw.h"
|
||||
|
||||
EmuWindow_GLFW* EmuWindow_GLFW::GetEmuWindow(GLFWwindow* win) {
|
||||
return static_cast<EmuWindow_GLFW*>(glfwGetWindowUserPointer(win));
|
||||
}
|
||||
|
||||
void EmuWindow_GLFW::OnMouseButtonEvent(GLFWwindow* win, int button, int action, int mods) {
|
||||
if (button == GLFW_MOUSE_BUTTON_LEFT) {
|
||||
auto emu_window = GetEmuWindow(win);
|
||||
auto layout = emu_window->GetFramebufferLayout();
|
||||
double x, y;
|
||||
glfwGetCursorPos(win, &x, &y);
|
||||
|
||||
if (action == GLFW_PRESS)
|
||||
emu_window->TouchPressed(static_cast<unsigned>(x), static_cast<unsigned>(y));
|
||||
else if (action == GLFW_RELEASE)
|
||||
emu_window->TouchReleased();
|
||||
}
|
||||
}
|
||||
|
||||
void EmuWindow_GLFW::OnCursorPosEvent(GLFWwindow* win, double x, double y) {
|
||||
GetEmuWindow(win)->TouchMoved(static_cast<unsigned>(std::max(x, 0.0)), static_cast<unsigned>(std::max(y, 0.0)));
|
||||
}
|
||||
|
||||
/// Called by GLFW when a key event occurs
|
||||
void EmuWindow_GLFW::OnKeyEvent(GLFWwindow* win, int key, int scancode, int action, int mods) {
|
||||
auto emu_window = GetEmuWindow(win);
|
||||
int keyboard_id = emu_window->keyboard_id;
|
||||
|
||||
if (action == GLFW_PRESS) {
|
||||
emu_window->KeyPressed({key, keyboard_id});
|
||||
} else if (action == GLFW_RELEASE) {
|
||||
emu_window->KeyReleased({key, keyboard_id});
|
||||
}
|
||||
}
|
||||
|
||||
/// Whether the window is still open, and a close request hasn't yet been sent
|
||||
const bool EmuWindow_GLFW::IsOpen() {
|
||||
return glfwWindowShouldClose(m_render_window) == 0;
|
||||
}
|
||||
|
||||
void EmuWindow_GLFW::OnFramebufferResizeEvent(GLFWwindow* win, int width, int height) {
|
||||
GetEmuWindow(win)->NotifyFramebufferLayoutChanged(EmuWindow::FramebufferLayout::DefaultScreenLayout(width, height));
|
||||
}
|
||||
|
||||
void EmuWindow_GLFW::OnClientAreaResizeEvent(GLFWwindow* win, int width, int height) {
|
||||
// NOTE: GLFW provides no proper way to set a minimal window size.
|
||||
// Hence, we just ignore the corresponding EmuWindow hint.
|
||||
OnFramebufferResizeEvent(win, width, height);
|
||||
}
|
||||
|
||||
/// EmuWindow_GLFW constructor
|
||||
EmuWindow_GLFW::EmuWindow_GLFW() {
|
||||
keyboard_id = KeyMap::NewDeviceId();
|
||||
|
||||
ReloadSetKeymaps();
|
||||
|
||||
glfwSetErrorCallback([](int error, const char *desc){
|
||||
LOG_ERROR(Frontend, "GLFW 0x%08x: %s", error, desc);
|
||||
});
|
||||
|
||||
// Initialize the window
|
||||
if(glfwInit() != GL_TRUE) {
|
||||
LOG_CRITICAL(Frontend, "Failed to initialize GLFW! Exiting...");
|
||||
exit(1);
|
||||
}
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
|
||||
// GLFW on OSX requires these window hints to be set to create a 3.2+ GL context.
|
||||
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
|
||||
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
||||
|
||||
std::string window_title = Common::StringFromFormat("Citra | %s-%s", Common::g_scm_branch, Common::g_scm_desc);
|
||||
m_render_window = glfwCreateWindow(VideoCore::kScreenTopWidth,
|
||||
(VideoCore::kScreenTopHeight + VideoCore::kScreenBottomHeight),
|
||||
window_title.c_str(), nullptr, nullptr);
|
||||
|
||||
if (m_render_window == nullptr) {
|
||||
LOG_CRITICAL(Frontend, "Failed to create GLFW window! Exiting...");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
glfwSetWindowUserPointer(m_render_window, this);
|
||||
|
||||
// Notify base interface about window state
|
||||
int width, height;
|
||||
glfwGetFramebufferSize(m_render_window, &width, &height);
|
||||
OnFramebufferResizeEvent(m_render_window, width, height);
|
||||
|
||||
glfwGetWindowSize(m_render_window, &width, &height);
|
||||
OnClientAreaResizeEvent(m_render_window, width, height);
|
||||
|
||||
// Setup callbacks
|
||||
glfwSetKeyCallback(m_render_window, OnKeyEvent);
|
||||
glfwSetMouseButtonCallback(m_render_window, OnMouseButtonEvent);
|
||||
glfwSetCursorPosCallback(m_render_window, OnCursorPosEvent);
|
||||
glfwSetFramebufferSizeCallback(m_render_window, OnFramebufferResizeEvent);
|
||||
glfwSetWindowSizeCallback(m_render_window, OnClientAreaResizeEvent);
|
||||
|
||||
DoneCurrent();
|
||||
}
|
||||
|
||||
/// EmuWindow_GLFW destructor
|
||||
EmuWindow_GLFW::~EmuWindow_GLFW() {
|
||||
glfwTerminate();
|
||||
}
|
||||
|
||||
/// Swap buffers to display the next frame
|
||||
void EmuWindow_GLFW::SwapBuffers() {
|
||||
glfwSwapBuffers(m_render_window);
|
||||
}
|
||||
|
||||
/// Polls window events
|
||||
void EmuWindow_GLFW::PollEvents() {
|
||||
glfwPollEvents();
|
||||
}
|
||||
|
||||
/// Makes the GLFW OpenGL context current for the caller thread
|
||||
void EmuWindow_GLFW::MakeCurrent() {
|
||||
glfwMakeContextCurrent(m_render_window);
|
||||
}
|
||||
|
||||
/// Releases (dunno if this is the "right" word) the GLFW context from the caller thread
|
||||
void EmuWindow_GLFW::DoneCurrent() {
|
||||
glfwMakeContextCurrent(nullptr);
|
||||
}
|
||||
|
||||
void EmuWindow_GLFW::ReloadSetKeymaps() {
|
||||
for (int i = 0; i < Settings::NativeInput::NUM_INPUTS; ++i) {
|
||||
KeyMap::SetKeyMapping({Settings::values.input_mappings[Settings::NativeInput::All[i]], keyboard_id}, Service::HID::pad_mapping[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void EmuWindow_GLFW::OnMinimalClientAreaChangeRequest(const std::pair<unsigned,unsigned>& minimal_size) {
|
||||
std::pair<int,int> current_size;
|
||||
glfwGetWindowSize(m_render_window, ¤t_size.first, ¤t_size.second);
|
||||
|
||||
DEBUG_ASSERT((int)minimal_size.first > 0 && (int)minimal_size.second > 0);
|
||||
int new_width = std::max(current_size.first, (int)minimal_size.first);
|
||||
int new_height = std::max(current_size.second, (int)minimal_size.second);
|
||||
|
||||
if (current_size != std::make_pair(new_width, new_height))
|
||||
glfwSetWindowSize(m_render_window, new_width, new_height);
|
||||
}
|
||||
@@ -1,54 +0,0 @@
|
||||
// Copyright 2014 Citra Emulator Project
|
||||
// Licensed under GPLv2 or any later version
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <utility>
|
||||
|
||||
#include "common/emu_window.h"
|
||||
|
||||
struct GLFWwindow;
|
||||
|
||||
class EmuWindow_GLFW : public EmuWindow {
|
||||
public:
|
||||
EmuWindow_GLFW();
|
||||
~EmuWindow_GLFW();
|
||||
|
||||
/// Swap buffers to display the next frame
|
||||
void SwapBuffers() override;
|
||||
|
||||
/// Polls window events
|
||||
void PollEvents() override;
|
||||
|
||||
/// Makes the graphics context current for the caller thread
|
||||
void MakeCurrent() override;
|
||||
|
||||
/// Releases (dunno if this is the "right" word) the GLFW context from the caller thread
|
||||
void DoneCurrent() override;
|
||||
|
||||
static void OnKeyEvent(GLFWwindow* win, int key, int scancode, int action, int mods);
|
||||
|
||||
static void OnMouseButtonEvent(GLFWwindow* window, int button, int action, int mods);
|
||||
|
||||
static void OnCursorPosEvent(GLFWwindow* window, double x, double y);
|
||||
|
||||
/// Whether the window is still open, and a close request hasn't yet been sent
|
||||
const bool IsOpen();
|
||||
|
||||
static void OnClientAreaResizeEvent(GLFWwindow* win, int width, int height);
|
||||
|
||||
static void OnFramebufferResizeEvent(GLFWwindow* win, int width, int height);
|
||||
|
||||
void ReloadSetKeymaps() override;
|
||||
|
||||
private:
|
||||
void OnMinimalClientAreaChangeRequest(const std::pair<unsigned,unsigned>& minimal_size) override;
|
||||
|
||||
static EmuWindow_GLFW* GetEmuWindow(GLFWwindow* win);
|
||||
|
||||
GLFWwindow* m_render_window; ///< Internal GLFW render window
|
||||
|
||||
/// Device id of keyboard for use with KeyMap
|
||||
int keyboard_id;
|
||||
};
|
||||
@@ -1,16 +0,0 @@
|
||||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Visual C++ generated include file.
|
||||
// Used by pcafe.rc
|
||||
//
|
||||
#define IDI_ICON3 103
|
||||
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NEXT_RESOURCE_VALUE 105
|
||||
#define _APS_NEXT_COMMAND_VALUE 40001
|
||||
#define _APS_NEXT_CONTROL_VALUE 1001
|
||||
#define _APS_NEXT_SYMED_VALUE 101
|
||||
#endif
|
||||
#endif
|
||||
@@ -1,116 +0,0 @@
|
||||
set(CMAKE_AUTOMOC ON)
|
||||
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||
|
||||
set(SRCS
|
||||
config/controller_config.cpp
|
||||
config/controller_config_util.cpp
|
||||
config.cpp
|
||||
debugger/callstack.cpp
|
||||
debugger/disassembler.cpp
|
||||
debugger/graphics.cpp
|
||||
debugger/graphics_breakpoint_observer.cpp
|
||||
debugger/graphics_breakpoints.cpp
|
||||
debugger/graphics_cmdlists.cpp
|
||||
debugger/graphics_framebuffer.cpp
|
||||
debugger/graphics_tracing.cpp
|
||||
debugger/graphics_vertex_shader.cpp
|
||||
debugger/profiler.cpp
|
||||
debugger/ramview.cpp
|
||||
debugger/registers.cpp
|
||||
util/spinbox.cpp
|
||||
bootmanager.cpp
|
||||
hotkeys.cpp
|
||||
main.cpp
|
||||
citra-qt.rc
|
||||
)
|
||||
|
||||
set(HEADERS
|
||||
config/controller_config.h
|
||||
config/controller_config_util.h
|
||||
config.h
|
||||
debugger/callstack.h
|
||||
debugger/disassembler.h
|
||||
debugger/graphics.h
|
||||
debugger/graphics_breakpoint_observer.h
|
||||
debugger/graphics_breakpoints.h
|
||||
debugger/graphics_breakpoints_p.h
|
||||
debugger/graphics_cmdlists.h
|
||||
debugger/graphics_framebuffer.h
|
||||
debugger/graphics_tracing.h
|
||||
debugger/graphics_vertex_shader.h
|
||||
debugger/profiler.h
|
||||
debugger/ramview.h
|
||||
debugger/registers.h
|
||||
util/spinbox.h
|
||||
bootmanager.h
|
||||
hotkeys.h
|
||||
main.h
|
||||
version.h
|
||||
)
|
||||
|
||||
set(UIS
|
||||
config/controller_config.ui
|
||||
debugger/callstack.ui
|
||||
debugger/disassembler.ui
|
||||
debugger/profiler.ui
|
||||
debugger/registers.ui
|
||||
hotkeys.ui
|
||||
main.ui
|
||||
)
|
||||
|
||||
create_directory_groups(${SRCS} ${HEADERS} ${UIS})
|
||||
|
||||
if (Qt5_FOUND)
|
||||
qt5_wrap_ui(UI_HDRS ${UIS})
|
||||
else()
|
||||
qt4_wrap_ui(UI_HDRS ${UIS})
|
||||
endif()
|
||||
|
||||
if (APPLE)
|
||||
add_executable(citra-qt MACOSX_BUNDLE ${SRCS} ${HEADERS} ${UI_HDRS})
|
||||
else()
|
||||
add_executable(citra-qt ${SRCS} ${HEADERS} ${UI_HDRS})
|
||||
endif()
|
||||
target_link_libraries(citra-qt core common video_core qhexedit)
|
||||
target_link_libraries(citra-qt ${OPENGL_gl_LIBRARY} ${CITRA_QT_LIBS})
|
||||
target_link_libraries(citra-qt ${PLATFORM_LIBRARIES})
|
||||
|
||||
if(${CMAKE_SYSTEM_NAME} MATCHES "Linux|FreeBSD|OpenBSD|NetBSD")
|
||||
install(TARGETS citra-qt RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}/bin")
|
||||
endif()
|
||||
|
||||
if (Qt5_FOUND AND MSVC)
|
||||
set(Qt5_DLL_DIR "${Qt5_DIR}/../../../bin")
|
||||
set(Qt5_PLATFORMS_DIR "${Qt5_DIR}/../../../plugins/platforms/")
|
||||
set(Qt5_DLLS
|
||||
icudt*.dll
|
||||
icuin*.dll
|
||||
icuuc*.dll
|
||||
Qt5Core$<$<CONFIG:Debug>:d>.*
|
||||
Qt5Gui$<$<CONFIG:Debug>:d>.*
|
||||
Qt5OpenGL$<$<CONFIG:Debug>:d>.*
|
||||
Qt5Widgets$<$<CONFIG:Debug>:d>.*
|
||||
)
|
||||
set(DLL_DEST "${CMAKE_BINARY_DIR}/bin/$<CONFIG>/")
|
||||
set(PLATFORMS ${DLL_DEST}platforms/)
|
||||
|
||||
# windows commandline expects the / to be \ so switch them
|
||||
string(REPLACE "/" "\\\\" Qt5_DLL_DIR ${Qt5_DLL_DIR})
|
||||
string(REPLACE "/" "\\\\" Qt5_PLATFORMS_DIR ${Qt5_PLATFORMS_DIR})
|
||||
string(REPLACE "/" "\\\\" DLL_DEST ${DLL_DEST})
|
||||
string(REPLACE "/" "\\\\" PLATFORMS ${PLATFORMS})
|
||||
|
||||
# /NJH /NJS /NDL /NFL /NC /NS /NP - Silence any output
|
||||
# cmake adds an extra check for command success which doesn't work too well with robocopy
|
||||
# so trick it into thinking the command was successful with the || cmd /c "exit /b 0"
|
||||
add_custom_command(TARGET citra-qt POST_BUILD
|
||||
COMMAND robocopy ${Qt5_DLL_DIR} ${DLL_DEST} ${Qt5_DLLS} /NJH /NJS /NDL /NFL /NC /NS /NP || cmd /c "exit /b 0"
|
||||
COMMAND if not exist ${PLATFORMS} mkdir ${PLATFORMS} 2> nul
|
||||
COMMAND robocopy ${Qt5_PLATFORMS_DIR} ${PLATFORMS} qwindows$<$<CONFIG:Debug>:d>.* /NJH /NJS /NDL /NFL /NC /NS /NP || cmd /c "exit /b 0"
|
||||
)
|
||||
unset(Qt5_DLLS)
|
||||
unset(Qt5_DLL_DIR)
|
||||
unset(Qt5_PLATFORMS_DIR)
|
||||
unset(DLL_DEST)
|
||||
unset(PLATFORMS)
|
||||
endif()
|
||||
@@ -1,271 +0,0 @@
|
||||
#include <QHBoxLayout>
|
||||
#include <QKeyEvent>
|
||||
#include <QApplication>
|
||||
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
|
||||
// Required for screen DPI information
|
||||
#include <QScreen>
|
||||
#include <QWindow>
|
||||
#endif
|
||||
|
||||
#include "bootmanager.h"
|
||||
#include "main.h"
|
||||
|
||||
#include "common/string_util.h"
|
||||
#include "common/scm_rev.h"
|
||||
#include "common/key_map.h"
|
||||
|
||||
#include "core/core.h"
|
||||
#include "core/settings.h"
|
||||
#include "core/system.h"
|
||||
|
||||
#include "video_core/debug_utils/debug_utils.h"
|
||||
|
||||
#include "video_core/video_core.h"
|
||||
|
||||
#include "citra_qt/version.h"
|
||||
|
||||
#define APP_NAME "citra"
|
||||
#define APP_VERSION "0.1-" VERSION
|
||||
#define APP_TITLE APP_NAME " " APP_VERSION
|
||||
#define COPYRIGHT "Copyright (C) 2013-2014 Citra Team"
|
||||
|
||||
EmuThread::EmuThread(GRenderWindow* render_window) :
|
||||
exec_step(false), running(false), stop_run(false), render_window(render_window) {
|
||||
}
|
||||
|
||||
void EmuThread::run() {
|
||||
render_window->MakeCurrent();
|
||||
|
||||
stop_run = false;
|
||||
|
||||
// holds whether the cpu was running during the last iteration,
|
||||
// so that the DebugModeLeft signal can be emitted before the
|
||||
// next execution step
|
||||
bool was_active = false;
|
||||
while (!stop_run) {
|
||||
if (running) {
|
||||
if (!was_active)
|
||||
emit DebugModeLeft();
|
||||
|
||||
Core::RunLoop();
|
||||
|
||||
was_active = running || exec_step;
|
||||
if (!was_active && !stop_run)
|
||||
emit DebugModeEntered();
|
||||
} else if (exec_step) {
|
||||
if (!was_active)
|
||||
emit DebugModeLeft();
|
||||
|
||||
exec_step = false;
|
||||
Core::SingleStep();
|
||||
emit DebugModeEntered();
|
||||
yieldCurrentThread();
|
||||
|
||||
was_active = false;
|
||||
} else {
|
||||
std::unique_lock<std::mutex> lock(running_mutex);
|
||||
running_cv.wait(lock, [this]{ return IsRunning() || exec_step || stop_run; });
|
||||
}
|
||||
}
|
||||
|
||||
render_window->moveContext();
|
||||
}
|
||||
|
||||
// This class overrides paintEvent and resizeEvent to prevent the GUI thread from stealing GL context.
|
||||
// The corresponding functionality is handled in EmuThread instead
|
||||
class GGLWidgetInternal : public QGLWidget
|
||||
{
|
||||
public:
|
||||
GGLWidgetInternal(QGLFormat fmt, GRenderWindow* parent)
|
||||
: QGLWidget(fmt, parent), parent(parent) {
|
||||
}
|
||||
|
||||
void paintEvent(QPaintEvent* ev) override {
|
||||
}
|
||||
|
||||
void resizeEvent(QResizeEvent* ev) override {
|
||||
parent->OnClientAreaResized(ev->size().width(), ev->size().height());
|
||||
parent->OnFramebufferSizeChanged();
|
||||
}
|
||||
|
||||
private:
|
||||
GRenderWindow* parent;
|
||||
};
|
||||
|
||||
GRenderWindow::GRenderWindow(QWidget* parent, EmuThread* emu_thread) :
|
||||
QWidget(parent), emu_thread(emu_thread), keyboard_id(0) {
|
||||
|
||||
std::string window_title = Common::StringFromFormat("Citra | %s-%s", Common::g_scm_branch, Common::g_scm_desc);
|
||||
setWindowTitle(QString::fromStdString(window_title));
|
||||
|
||||
keyboard_id = KeyMap::NewDeviceId();
|
||||
ReloadSetKeymaps();
|
||||
|
||||
// TODO: One of these flags might be interesting: WA_OpaquePaintEvent, WA_NoBackground, WA_DontShowOnScreen, WA_DeleteOnClose
|
||||
QGLFormat fmt;
|
||||
fmt.setVersion(3,2);
|
||||
fmt.setProfile(QGLFormat::CoreProfile);
|
||||
// Requests a forward-compatible context, which is required to get a 3.2+ context on OS X
|
||||
fmt.setOption(QGL::NoDeprecatedFunctions);
|
||||
|
||||
child = new GGLWidgetInternal(fmt, this);
|
||||
QBoxLayout* layout = new QHBoxLayout(this);
|
||||
|
||||
resize(VideoCore::kScreenTopWidth, VideoCore::kScreenTopHeight + VideoCore::kScreenBottomHeight);
|
||||
layout->addWidget(child);
|
||||
layout->setMargin(0);
|
||||
setLayout(layout);
|
||||
|
||||
OnMinimalClientAreaChangeRequest(GetActiveConfig().min_client_area_size);
|
||||
|
||||
OnFramebufferSizeChanged();
|
||||
NotifyClientAreaSizeChanged(std::pair<unsigned,unsigned>(child->width(), child->height()));
|
||||
|
||||
BackupGeometry();
|
||||
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
|
||||
connect(this->windowHandle(), SIGNAL(screenChanged(QScreen*)), this, SLOT(OnFramebufferSizeChanged()));
|
||||
#endif
|
||||
}
|
||||
|
||||
void GRenderWindow::moveContext()
|
||||
{
|
||||
DoneCurrent();
|
||||
// We need to move GL context to the swapping thread in Qt5
|
||||
#if QT_VERSION > QT_VERSION_CHECK(5, 0, 0)
|
||||
// If the thread started running, move the GL Context to the new thread. Otherwise, move it back.
|
||||
auto thread = (QThread::currentThread() == qApp->thread() && emu_thread != nullptr) ? emu_thread : qApp->thread();
|
||||
child->context()->moveToThread(thread);
|
||||
#endif
|
||||
}
|
||||
|
||||
void GRenderWindow::SwapBuffers()
|
||||
{
|
||||
#if !defined(QT_NO_DEBUG)
|
||||
// Qt debug runtime prints a bogus warning on the console if you haven't called makeCurrent
|
||||
// since the last time you called swapBuffers. This presumably means something if you're using
|
||||
// QGLWidget the "regular" way, but in our multi-threaded use case is harmless since we never
|
||||
// call doneCurrent in this thread.
|
||||
child->makeCurrent();
|
||||
#endif
|
||||
child->swapBuffers();
|
||||
}
|
||||
|
||||
void GRenderWindow::MakeCurrent()
|
||||
{
|
||||
child->makeCurrent();
|
||||
}
|
||||
|
||||
void GRenderWindow::DoneCurrent()
|
||||
{
|
||||
child->doneCurrent();
|
||||
}
|
||||
|
||||
void GRenderWindow::PollEvents() {
|
||||
}
|
||||
|
||||
// On Qt 5.0+, this correctly gets the size of the framebuffer (pixels).
|
||||
//
|
||||
// Older versions get the window size (density independent pixels),
|
||||
// and hence, do not support DPI scaling ("retina" displays).
|
||||
// The result will be a viewport that is smaller than the extent of the window.
|
||||
void GRenderWindow::OnFramebufferSizeChanged()
|
||||
{
|
||||
// Screen changes potentially incur a change in screen DPI, hence we should update the framebuffer size
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
|
||||
// windowHandle() might not be accessible until the window is displayed to screen.
|
||||
auto pixel_ratio = windowHandle() ? (windowHandle()->screen()->devicePixelRatio()) : 1.0;
|
||||
|
||||
unsigned width = child->QPaintDevice::width() * pixel_ratio;
|
||||
unsigned height = child->QPaintDevice::height() * pixel_ratio;
|
||||
#else
|
||||
unsigned width = child->QPaintDevice::width();
|
||||
unsigned height = child->QPaintDevice::height();
|
||||
#endif
|
||||
|
||||
NotifyFramebufferLayoutChanged(EmuWindow::FramebufferLayout::DefaultScreenLayout(width, height));
|
||||
}
|
||||
|
||||
void GRenderWindow::BackupGeometry()
|
||||
{
|
||||
geometry = ((QGLWidget*)this)->saveGeometry();
|
||||
}
|
||||
|
||||
void GRenderWindow::RestoreGeometry()
|
||||
{
|
||||
// We don't want to back up the geometry here (obviously)
|
||||
QWidget::restoreGeometry(geometry);
|
||||
}
|
||||
|
||||
void GRenderWindow::restoreGeometry(const QByteArray& geometry)
|
||||
{
|
||||
// Make sure users of this class don't need to deal with backing up the geometry themselves
|
||||
QWidget::restoreGeometry(geometry);
|
||||
BackupGeometry();
|
||||
}
|
||||
|
||||
QByteArray GRenderWindow::saveGeometry()
|
||||
{
|
||||
// If we are a top-level widget, store the current geometry
|
||||
// otherwise, store the last backup
|
||||
if (parent() == nullptr)
|
||||
return ((QGLWidget*)this)->saveGeometry();
|
||||
else
|
||||
return geometry;
|
||||
}
|
||||
|
||||
void GRenderWindow::keyPressEvent(QKeyEvent* event)
|
||||
{
|
||||
this->KeyPressed({event->key(), keyboard_id});
|
||||
}
|
||||
|
||||
void GRenderWindow::keyReleaseEvent(QKeyEvent* event)
|
||||
{
|
||||
this->KeyReleased({event->key(), keyboard_id});
|
||||
}
|
||||
|
||||
void GRenderWindow::mousePressEvent(QMouseEvent *event)
|
||||
{
|
||||
if (event->button() == Qt::LeftButton)
|
||||
{
|
||||
auto pos = event->pos();
|
||||
this->TouchPressed(static_cast<unsigned>(pos.x()), static_cast<unsigned>(pos.y()));
|
||||
}
|
||||
}
|
||||
|
||||
void GRenderWindow::mouseMoveEvent(QMouseEvent *event)
|
||||
{
|
||||
auto pos = event->pos();
|
||||
this->TouchMoved(static_cast<unsigned>(std::max(pos.x(), 0)), static_cast<unsigned>(std::max(pos.y(), 0)));
|
||||
}
|
||||
|
||||
void GRenderWindow::mouseReleaseEvent(QMouseEvent *event)
|
||||
{
|
||||
if (event->button() == Qt::LeftButton)
|
||||
this->TouchReleased();
|
||||
}
|
||||
|
||||
void GRenderWindow::ReloadSetKeymaps()
|
||||
{
|
||||
for (int i = 0; i < Settings::NativeInput::NUM_INPUTS; ++i) {
|
||||
KeyMap::SetKeyMapping({Settings::values.input_mappings[Settings::NativeInput::All[i]], keyboard_id}, Service::HID::pad_mapping[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void GRenderWindow::OnClientAreaResized(unsigned width, unsigned height)
|
||||
{
|
||||
NotifyClientAreaSizeChanged(std::make_pair(width, height));
|
||||
}
|
||||
|
||||
void GRenderWindow::OnMinimalClientAreaChangeRequest(const std::pair<unsigned,unsigned>& minimal_size) {
|
||||
setMinimumSize(minimal_size.first, minimal_size.second);
|
||||
}
|
||||
|
||||
void GRenderWindow::OnEmulationStarting(EmuThread* emu_thread) {
|
||||
this->emu_thread = emu_thread;
|
||||
}
|
||||
|
||||
void GRenderWindow::OnEmulationStopping() {
|
||||
emu_thread = nullptr;
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Icon
|
||||
//
|
||||
|
||||
// Icon with lowest ID value placed first to ensure application icon
|
||||
// remains consistent on all systems.
|
||||
IDI_ICON1 ICON "..\\..\\dist\\citra.ico"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user