Compare commits
367 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
069b1c853d | ||
|
|
d5b912a64e | ||
|
|
07a4988f5f | ||
|
|
13ef2f586e | ||
|
|
5882ddd974 | ||
|
|
2000438c16 | ||
|
|
bdb4e9f03f | ||
|
|
3e395defb5 | ||
|
|
71371e147b | ||
|
|
fbc8aef956 | ||
|
|
32bdc98de5 | ||
|
|
1614260ce7 | ||
|
|
fb60edb9a4 | ||
|
|
47eae57418 | ||
|
|
2a15785f57 | ||
|
|
95dfcb91b5 | ||
|
|
033fcab9ec | ||
|
|
b7521ccabf | ||
|
|
3cc397d2db | ||
|
|
1f37ee1f4f | ||
|
|
2205e1bc44 | ||
|
|
3500f17e08 | ||
|
|
7c8a1be3e5 | ||
|
|
39ff4cd92c | ||
|
|
2c10407c17 | ||
|
|
1f318837e7 | ||
|
|
a5fc22661c | ||
|
|
d8dc1c8cfd | ||
|
|
42c72a6a90 | ||
|
|
385dc8bdff | ||
|
|
a58abd813f | ||
|
|
8b38e3e47d | ||
|
|
bd333293c4 | ||
|
|
c415c29fb5 | ||
|
|
d31b5e4068 | ||
|
|
e2d6d3724c | ||
|
|
48339b0599 | ||
|
|
0dade179d8 | ||
|
|
fb4cfb6e6d | ||
|
|
06fcffde56 | ||
|
|
accbecfb3e | ||
|
|
b3e6f61f96 | ||
|
|
c2b491cc8d | ||
|
|
74695f519b | ||
|
|
adcf84140c | ||
|
|
b7ecfd910e | ||
|
|
a719d872c2 | ||
|
|
2d99f39a99 | ||
|
|
d43a2d5bec | ||
|
|
b2acb83848 | ||
|
|
949187345d | ||
|
|
07d4504a89 | ||
|
|
aa45f942e3 | ||
|
|
7384d970d5 | ||
|
|
8e29db9c4a | ||
|
|
8bf0642b3f | ||
|
|
87492c1f0b | ||
|
|
2196a4b2e7 | ||
|
|
ee51cafa6c | ||
|
|
57ce0363f2 | ||
|
|
77e01151b5 | ||
|
|
869d424292 | ||
|
|
631e60bb73 | ||
|
|
6410256e6a | ||
|
|
66c1a1357a | ||
|
|
d87b0dce7c | ||
|
|
c695a9c5f0 | ||
|
|
6c63504497 | ||
|
|
8fd3f0e99a | ||
|
|
373af27873 | ||
|
|
30327776ba | ||
|
|
32c859fdf8 | ||
|
|
06782fdc55 | ||
|
|
46a57e8e50 | ||
|
|
78333b3fe1 | ||
|
|
35325cb852 | ||
|
|
1bf78cc5bb | ||
|
|
5f1f740fab | ||
|
|
e9c9ae4aab | ||
|
|
09b3a8c759 | ||
|
|
cfc52386ab | ||
|
|
c9474fac1c | ||
|
|
9e85cae502 | ||
|
|
eacbd4fdb0 | ||
|
|
258f70dbf4 | ||
|
|
f69b39df95 | ||
|
|
9b554d3524 | ||
|
|
d6ba2eb7ce | ||
|
|
a9883fc029 | ||
|
|
0ebbcfb8c4 | ||
|
|
4d04f368c6 | ||
|
|
ab04e6b735 | ||
|
|
c1b7d3e036 | ||
|
|
f60454229b | ||
|
|
bba02d9f40 | ||
|
|
1a20283bb3 | ||
|
|
c644d4ad1a | ||
|
|
b9e0366512 | ||
|
|
e81b9f4e53 | ||
|
|
67481f9e44 | ||
|
|
95f42a9126 | ||
|
|
84ea79b069 | ||
|
|
3f1364c982 | ||
|
|
28b902b6c0 | ||
|
|
a19ce0d833 | ||
|
|
b042af1881 | ||
|
|
1d57958db9 | ||
|
|
a9d28510a7 | ||
|
|
b944cf3585 | ||
|
|
de23edcbda | ||
|
|
68382370a4 | ||
|
|
29c7c20844 | ||
|
|
7037a758cf | ||
|
|
75a3bb2198 | ||
|
|
473b34dc7c | ||
|
|
6f88e37df6 | ||
|
|
4ca39b3742 | ||
|
|
3cc44d4421 | ||
|
|
0ea7bf8c1b | ||
|
|
f5bc1f8178 | ||
|
|
2a39ff0d35 | ||
|
|
ecffe22d01 | ||
|
|
e1c48ace6b | ||
|
|
efff35f0e3 | ||
|
|
f10962ceda | ||
|
|
37d21c6f6c | ||
|
|
ff7c0f8df3 | ||
|
|
c863148f13 | ||
|
|
69e12f0205 | ||
|
|
6bf4a5a995 | ||
|
|
38bdb28b64 | ||
|
|
8ba1a4a005 | ||
|
|
70da6a5142 | ||
|
|
2f6126d0ea | ||
|
|
189a427edc | ||
|
|
21dbf348d0 | ||
|
|
ff455ef2fd | ||
|
|
d7029c3841 | ||
|
|
2d894613df | ||
|
|
60a1da1336 | ||
|
|
123d856853 | ||
|
|
617e0bc5b1 | ||
|
|
0a873b3801 | ||
|
|
3c97253c9a | ||
|
|
f228c331cf | ||
|
|
464ac151bd | ||
|
|
8f70306540 | ||
|
|
28166bb2ec | ||
|
|
ac85217998 | ||
|
|
44b2450fbf | ||
|
|
9221373c53 | ||
|
|
bfaa190e49 | ||
|
|
23c7ae15a2 | ||
|
|
077a832767 | ||
|
|
8c9e912491 | ||
|
|
8a7cf85982 | ||
|
|
bae9af79e9 | ||
|
|
374dc1dd66 | ||
|
|
2812460a9c | ||
|
|
83a885d214 | ||
|
|
0dbb32b575 | ||
|
|
4fea10583c | ||
|
|
ebdb0c499c | ||
|
|
4e6f473b6f | ||
|
|
7fdb7a7a91 | ||
|
|
f8a1c4cfdf | ||
|
|
afa59255cc | ||
|
|
23a5a8997f | ||
|
|
4e705e5c7d | ||
|
|
c57f8e191b | ||
|
|
ed97bafc41 | ||
|
|
eebff767ce | ||
|
|
baee9a62aa | ||
|
|
305dbb548c | ||
|
|
0ccdf67f1e | ||
|
|
60aad1b24d | ||
|
|
e31e088744 | ||
|
|
824f11412d | ||
|
|
1445404005 | ||
|
|
dd851cdbc9 | ||
|
|
7abfb2d2f0 | ||
|
|
5e7237fb17 | ||
|
|
0cba7b96be | ||
|
|
1705b2752e | ||
|
|
4614ffab92 | ||
|
|
225d908f70 | ||
|
|
09e7483389 | ||
|
|
57ab00b6e1 | ||
|
|
23b6be74e2 | ||
|
|
905a235a1b | ||
|
|
d6b1dbd1d6 | ||
|
|
e9c4f0723a | ||
|
|
ac6733469c | ||
|
|
a7ecba905a | ||
|
|
d7c48b1f88 | ||
|
|
0c74660396 | ||
|
|
b3c1327dc4 | ||
|
|
489da04d1d | ||
|
|
a58ad756ff | ||
|
|
702f1b2e2f | ||
|
|
f10413d9c4 | ||
|
|
80aa9d0e52 | ||
|
|
64c13571f9 | ||
|
|
a36c5df477 | ||
|
|
7c3069e8cf | ||
|
|
1e66cfec51 | ||
|
|
1e0a820817 | ||
|
|
4623975858 | ||
|
|
23aac0c1c1 | ||
|
|
54d983013a | ||
|
|
c7507a6357 | ||
|
|
0714581866 | ||
|
|
095b8e65fb | ||
|
|
e60652d705 | ||
|
|
f3aeba3d70 | ||
|
|
ee2b1027b7 | ||
|
|
3b05624de5 | ||
|
|
4c0582184f | ||
|
|
5e6b2363b7 | ||
|
|
dbe93a26eb | ||
|
|
b128312e2c | ||
|
|
07ca429483 | ||
|
|
9675c40216 | ||
|
|
0870856674 | ||
|
|
3c6f18efbf | ||
|
|
2fdc6f85f5 | ||
|
|
4ed2c26b35 | ||
|
|
3ef7410e45 | ||
|
|
ba730fafe3 | ||
|
|
ab925bc8c5 | ||
|
|
b1362f3a3b | ||
|
|
f60eb6b3fc | ||
|
|
88f013a304 | ||
|
|
ea9f8fae4c | ||
|
|
a6363131ac | ||
|
|
fc60356b8b | ||
|
|
755420d5b3 | ||
|
|
0200aa5f85 | ||
|
|
7dff623b75 | ||
|
|
49f5e649b7 | ||
|
|
1656e50c3b | ||
|
|
99a1648734 | ||
|
|
9672aa8e05 | ||
|
|
d72ecb5cfd | ||
|
|
39fccbe6cb | ||
|
|
84efb253cf | ||
|
|
4c63860dc1 | ||
|
|
36acc7e523 | ||
|
|
700397a995 | ||
|
|
dc6bd89497 | ||
|
|
c2ed83d511 | ||
|
|
0a41da1659 | ||
|
|
96e412414a | ||
|
|
483476b5fa | ||
|
|
ed8bcf7dc8 | ||
|
|
376c7cf9a4 | ||
|
|
05d34d563d | ||
|
|
e59db6954a | ||
|
|
9c05fb399b | ||
|
|
40d4bc41c6 | ||
|
|
1f9a79db48 | ||
|
|
0943d38926 | ||
|
|
5469b56841 | ||
|
|
d31730b5c3 | ||
|
|
bd36ee7399 | ||
|
|
b8f5f57878 | ||
|
|
63de646eae | ||
|
|
e70ee44a37 | ||
|
|
6ee66fdccc | ||
|
|
5ecffa1352 | ||
|
|
46efc42e24 | ||
|
|
35829ce982 | ||
|
|
756ef4fae5 | ||
|
|
ce31a5a6ef | ||
|
|
14ea4d8d84 | ||
|
|
f2eb1464f6 | ||
|
|
45b464ee13 | ||
|
|
c3f9ea47fd | ||
|
|
87012d7671 | ||
|
|
1fce4055d7 | ||
|
|
b83dd501fc | ||
|
|
94a40a4a87 | ||
|
|
2fa867ce44 | ||
|
|
4d1a599263 | ||
|
|
8641c95169 | ||
|
|
4f6584ac27 | ||
|
|
cb25c5bf56 | ||
|
|
5c534ed388 | ||
|
|
368bf0ee15 | ||
|
|
c9ccf3e7f8 | ||
|
|
0ced94cb57 | ||
|
|
b158e11e25 | ||
|
|
f4658daa9a | ||
|
|
56b4ccb848 | ||
|
|
2748eeb367 | ||
|
|
8647578802 | ||
|
|
3422c20322 | ||
|
|
4561b06428 | ||
|
|
652f239af3 | ||
|
|
c2428ff7c2 | ||
|
|
2d5e592622 | ||
|
|
3a569a2e2e | ||
|
|
f600764364 | ||
|
|
ab2669b555 | ||
|
|
f43a81de3f | ||
|
|
33ae3fa48a | ||
|
|
12fc3eee03 | ||
|
|
396954e0ee | ||
|
|
d65aaa6da6 | ||
|
|
ae67833cb2 | ||
|
|
4261652bdf | ||
|
|
49d83a297f | ||
|
|
b3a48b23ee | ||
|
|
b802f9b02e | ||
|
|
0afdb9c2cf | ||
|
|
c295430866 | ||
|
|
883375dc9b | ||
|
|
6a1208b45d | ||
|
|
25084b7a94 | ||
|
|
c325c9c30c | ||
|
|
d89409cc73 | ||
|
|
0ff564a192 | ||
|
|
930804cf48 | ||
|
|
699981d9a2 | ||
|
|
947c966660 | ||
|
|
554d9a5d0b | ||
|
|
45e5c39739 | ||
|
|
74e540cb61 | ||
|
|
c1ec50e166 | ||
|
|
58ce18f981 | ||
|
|
f1fa98880f | ||
|
|
0c754d09ed | ||
|
|
b40e4fcc26 | ||
|
|
a7bb33c3a0 | ||
|
|
c3930b2e08 | ||
|
|
979180860e | ||
|
|
61fb70975c | ||
|
|
1af9f7c915 | ||
|
|
810411de7e | ||
|
|
b9bf9ca10d | ||
|
|
526c16daa9 | ||
|
|
e58104d5b5 | ||
|
|
92aeb3c8aa | ||
|
|
3841611780 | ||
|
|
06bc8c9e2d | ||
|
|
21415c6f8d | ||
|
|
22c2a7aa52 | ||
|
|
0eb181f315 | ||
|
|
45b431f953 | ||
|
|
bbee554fec | ||
|
|
c4c67f489e | ||
|
|
4d867d6523 | ||
|
|
6620c11178 | ||
|
|
db06cab07c | ||
|
|
90b11cdd97 | ||
|
|
7bb92d1b4e | ||
|
|
b5dd744bd5 | ||
|
|
34903b10d4 | ||
|
|
0c5b7c8b70 | ||
|
|
cdffca98ef | ||
|
|
ce30d1d5fd | ||
|
|
ab067044f8 | ||
|
|
3e04b8bbe6 | ||
|
|
4556a9e244 | ||
|
|
e5d04de250 | ||
|
|
b7df181729 | ||
|
|
2fd3fcfd46 |
13
.gitattributes
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
*.psd filter=lfs diff=lfs merge=lfs -text
|
||||
*.ogg filter=lfs diff=lfs merge=lfs -text
|
||||
*.tga filter=lfs diff=lfs merge=lfs -text
|
||||
*.gz filter=lfs diff=lfs merge=lfs -text
|
||||
*.opus filter=lfs diff=lfs merge=lfs -text
|
||||
*.pdf filter=lfs diff=lfs merge=lfs -text
|
||||
*.zip filter=lfs diff=lfs merge=lfs -text
|
||||
*.kra filter=lfs diff=lfs merge=lfs -text
|
||||
*.png filter=lfs diff=lfs merge=lfs -text
|
||||
*.wav filter=lfs diff=lfs merge=lfs -text
|
||||
|
||||
*.tga binary diff=hex
|
||||
*.kra binary diff=hex
|
||||
6
.gitignore
vendored
Normal file → Executable file
@@ -7,3 +7,9 @@ Terrarum-sans-bitmap*.zip
|
||||
TerrarumSansBitmap*.jar
|
||||
Font*.jar
|
||||
tmp_*
|
||||
*~
|
||||
.tmp*
|
||||
tmp_*
|
||||
*.bak
|
||||
*-autosave.kra
|
||||
.directory
|
||||
|
||||
0
.idea/.name
generated
Normal file → Executable file
76
.idea/artifacts/FontDemoGDX.xml
generated
Normal file → Executable file
@@ -6,6 +6,82 @@
|
||||
<element id="directory" name="META-INF">
|
||||
<element id="file-copy" path="$PROJECT_DIR$/FontTestGDX/META-INF/MANIFEST.MF" />
|
||||
</element>
|
||||
<element id="artifact" artifact-name="TerrarumSansBitmap" />
|
||||
<element id="extracted-dir" path="$KOTLIN_BUNDLED$/lib/kotlin-stdlib.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$KOTLIN_BUNDLED$/lib/kotlin-reflect.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$KOTLIN_BUNDLED$/lib/kotlin-test.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$KOTLIN_BUNDLED$/lib/kotlin-stdlib-jdk7.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$KOTLIN_BUNDLED$/lib/kotlin-stdlib-jdk8.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/jnlp.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/gdx-1.10.0.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.2.3.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/jinput-2.0.5.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/jutils-1.0.0.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/jorbis-0.0.17.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/jlayer-1.0.1-gdx.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.2.3.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/TerrarumSansBitmap.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/gdx-1.10.0-javadoc.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/gdx-1.10.0-sources.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.2.3.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.2.3.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/gdx-platform-1.10.0.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.2.3-javadoc.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.2.3-sources.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/jinput-2.0.5-javadoc.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/jinput-2.0.5-sources.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/jutils-1.0.0-javadoc.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/jutils-1.0.0-sources.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.2.3.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/jorbis-0.0.17-javadoc.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/jorbis-0.0.17-sources.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/jlayer-1.0.1-gdx-javadoc.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/jlayer-1.0.1-gdx-sources.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.2.3-javadoc.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.2.3-sources.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/gdx-backend-lwjgl3-1.10.0.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.2.3-natives-linux.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.2.3-natives-macos.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.2.3-javadoc.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.2.3-sources.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.2.3-javadoc.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.2.3-sources.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.2.3-natives-windows.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.2.3-javadoc.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.2.3-sources.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.2.3-natives-linux.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.2.3-natives-macos.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.2.3-natives-linux-arm32.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.2.3-natives-linux-arm64.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.2.3-natives-windows-x86.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.2.3-natives-windows.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.2.3-natives-linux.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.2.3-natives-macos.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.2.3-natives-linux.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.2.3-natives-macos.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/gdx-backend-lwjgl3-1.10.0-javadoc.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/gdx-backend-lwjgl3-1.10.0-sources.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/jinput-platform-2.0.5-natives-osx.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.2.3-natives-linux.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.2.3-natives-macos.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.2.3-natives-windows.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.2.3-natives-windows.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/gdx-platform-1.10.0-natives-desktop.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/jinput-platform-2.0.5-natives-linux.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.2.3-natives-linux-arm32.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.2.3-natives-linux-arm64.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.2.3-natives-windows-x86.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.2.3-natives-windows.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/jinput-platform-2.0.5-natives-windows.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.2.3-natives-linux-arm32.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.2.3-natives-linux-arm64.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.2.3-natives-windows-x86.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.2.3-natives-linux-arm32.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.2.3-natives-linux-arm64.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.2.3-natives-windows-x86.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.2.3-natives-linux-arm32.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.2.3-natives-linux-arm64.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.2.3-natives-windows-x86.jar" path-in-jar="/" />
|
||||
</root>
|
||||
</artifact>
|
||||
</component>
|
||||
2
.idea/artifacts/TerrarumSansBitmap.xml
generated
Normal file → Executable file
@@ -1,6 +1,6 @@
|
||||
<component name="ArtifactManager">
|
||||
<artifact type="jar" name="TerrarumSansBitmap">
|
||||
<output-path>$PROJECT_DIR$/FontTestGDX/lib</output-path>
|
||||
<output-path>$PROJECT_DIR$/lib</output-path>
|
||||
<root id="archive" name="TerrarumSansBitmap.jar">
|
||||
<element id="module-output" name="BuildJAR_TerrarumSansBitmap" />
|
||||
<element id="directory" name="META-INF">
|
||||
|
||||
0
.idea/codeStyles/Project.xml
generated
Normal file → Executable file
0
.idea/codeStyles/codeStyleConfig.xml
generated
Normal file → Executable file
7
.idea/kotlinc.xml
generated
Normal file → Executable file
@@ -1,10 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Kotlin2JvmCompilerArguments">
|
||||
<option name="jvmTarget" value="1.8" />
|
||||
</component>
|
||||
<component name="KotlinCommonCompilerArguments">
|
||||
<option name="apiVersion" value="1.2" />
|
||||
<option name="languageVersion" value="1.2" />
|
||||
<option name="apiVersion" value="1.4" />
|
||||
<option name="languageVersion" value="1.4" />
|
||||
</component>
|
||||
</project>
|
||||
11
.idea/libraries/KotlinJavaRuntime.xml
generated
@@ -1,12 +1,19 @@
|
||||
<component name="libraryTable">
|
||||
<library name="KotlinJavaRuntime">
|
||||
<CLASSES>
|
||||
<root url="jar://$KOTLIN_BUNDLED$/lib/kotlin-runtime.jar!/" />
|
||||
<root url="jar://$KOTLIN_BUNDLED$/lib/kotlin-stdlib.jar!/" />
|
||||
<root url="jar://$KOTLIN_BUNDLED$/lib/kotlin-reflect.jar!/" />
|
||||
<root url="jar://$KOTLIN_BUNDLED$/lib/kotlin-test.jar!/" />
|
||||
<root url="jar://$KOTLIN_BUNDLED$/lib/kotlin-stdlib-jdk7.jar!/" />
|
||||
<root url="jar://$KOTLIN_BUNDLED$/lib/kotlin-stdlib-jdk8.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES>
|
||||
<root url="jar://$KOTLIN_BUNDLED$/lib/kotlin-runtime-sources.jar!/" />
|
||||
<root url="jar://$KOTLIN_BUNDLED$/lib/kotlin-stdlib-sources.jar!/" />
|
||||
<root url="jar://$KOTLIN_BUNDLED$/lib/kotlin-reflect-sources.jar!/" />
|
||||
<root url="jar://$KOTLIN_BUNDLED$/lib/kotlin-test-sources.jar!/" />
|
||||
<root url="jar://$KOTLIN_BUNDLED$/lib/kotlin-stdlib-jdk7-sources.jar!/" />
|
||||
<root url="jar://$KOTLIN_BUNDLED$/lib/kotlin-stdlib-jdk8-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
||||
10
.idea/libraries/TesterLib.xml
generated
@@ -1,10 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="TesterLib">
|
||||
<CLASSES>
|
||||
<root url="file://$PROJECT_DIR$/FontTestGDX/lib" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/FontTestGDX/lib" recursive="false" />
|
||||
</library>
|
||||
</component>
|
||||
@@ -1,5 +1,5 @@
|
||||
<component name="libraryTable">
|
||||
<library name="GdxLib">
|
||||
<library name="lib">
|
||||
<CLASSES>
|
||||
<root url="file://$PROJECT_DIR$/lib" />
|
||||
</CLASSES>
|
||||
@@ -9,7 +9,6 @@
|
||||
</NATIVE>
|
||||
<SOURCES>
|
||||
<root url="file://$PROJECT_DIR$/lib" />
|
||||
<root url="jar://$PROJECT_DIR$/lib/gdx.jar!/" />
|
||||
</SOURCES>
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib" recursive="false" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib" recursive="false" type="SOURCES" />
|
||||
0
.idea/markdown-navigator.xml
generated
Normal file → Executable file
0
.idea/markdown-navigator/profiles_settings.xml
generated
Normal file → Executable file
2
.idea/misc.xml
generated
Normal file → Executable file
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8.0_242" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/out" />
|
||||
</component>
|
||||
</project>
|
||||
0
.idea/modules.xml
generated
Normal file → Executable file
124
.idea/uiDesigner.xml
generated
Normal file
@@ -0,0 +1,124 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Palette2">
|
||||
<group name="Swing">
|
||||
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
|
||||
</item>
|
||||
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
|
||||
</item>
|
||||
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
|
||||
</item>
|
||||
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true">
|
||||
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
|
||||
</item>
|
||||
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
|
||||
<initial-values>
|
||||
<property name="text" value="Button" />
|
||||
</initial-values>
|
||||
</item>
|
||||
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
|
||||
<initial-values>
|
||||
<property name="text" value="RadioButton" />
|
||||
</initial-values>
|
||||
</item>
|
||||
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
|
||||
<initial-values>
|
||||
<property name="text" value="CheckBox" />
|
||||
</initial-values>
|
||||
</item>
|
||||
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
|
||||
<initial-values>
|
||||
<property name="text" value="Label" />
|
||||
</initial-values>
|
||||
</item>
|
||||
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
|
||||
<preferred-size width="150" height="-1" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
|
||||
<preferred-size width="150" height="-1" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
|
||||
<preferred-size width="150" height="-1" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
|
||||
<preferred-size width="200" height="200" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
|
||||
<preferred-size width="200" height="200" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
|
||||
</item>
|
||||
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
|
||||
<preferred-size width="-1" height="20" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
|
||||
</item>
|
||||
</group>
|
||||
</component>
|
||||
</project>
|
||||
0
.idea/vcs.xml
generated
Normal file → Executable file
1042
.idea/workspace.xml
generated
@@ -5,9 +5,9 @@
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="jdk" jdkName="1.8.0_242" jdkType="JavaSDK" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="library" name="KotlinJavaRuntime" level="project" />
|
||||
<orderEntry type="library" name="GdxLib" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="lib" level="project" />
|
||||
</component>
|
||||
</module>
|
||||
110
CONTRIBUTING.md
Normal file → Executable file
@@ -7,7 +7,7 @@ Font Spritesheets are stored in ```assets/graphics/fonts``` directory. Image for
|
||||
|
||||
#### Before getting started, you did read our design goals, right? Good. Now you may continue your awesome work.
|
||||
|
||||
### Ascenders, descenders, width informations (aka Glyph Tags)
|
||||
## Ascenders, descenders, width informations (aka Glyph Tags)
|
||||
|
||||

|
||||
|
||||
@@ -26,11 +26,11 @@ Each cell is 16 px wide, and any glyph you draw **must be contained within lefts
|
||||
|
||||
|
||||
|
||||
### Font Metrics
|
||||
## Font Metrics for variable-width font sheets
|
||||
|
||||
Although the font is basically a Spritesheet, some of the sheet expects variable widths to be supported. Any sheets with ```_variable``` means it expects variable widths. Anything else expects fixed width (regular Spritesheet behaviour). ```cjkpunct``` has width of 10, ```kana``` and ```hangul_johab``` has width of 12, ```wenquanyi``` has width of 16.
|
||||
|
||||
### Parsing glyph widths for variable font sheets
|
||||
### Parsing Glyph Tags
|
||||
|
||||

|
||||
|
||||
@@ -38,21 +38,95 @@ Width is encoded in binary bits, on pixels. On the font spritesheet, every glyph
|
||||
|
||||
### Glyph Tags
|
||||
|
||||
Green-tinted area (should be 10 px tall) contains the tags. Tags are defined as following:
|
||||
Rightmost vertical column (should be 20 px tall) contains the tags. Tags are defined as following:
|
||||
|
||||
```
|
||||
(LSB) 0 == Use Compiler Directive (Undefined right now, keep it as 0)
|
||||
1 -, 1 = Align to this X pos of prev char,
|
||||
1 | 2 = only valid if write-on-top is 1
|
||||
1 | 4 = and is centre-aligned and non-zero
|
||||
1 -' 8 = (if this is zero, floorOf(width/2) will be used instead)
|
||||
0 -, 0 Align 1 Align 0 Align 1 Align before
|
||||
1 -' 0 left 0 right 1 centre 1 the glyph
|
||||
1 == write-on-top, usually it's diatritics but not always (e.g. devanagari vowel sign O)
|
||||
1 -, 0 Stack 1 Stack 0 Before 1 Up &
|
||||
(MSB) 0 -' 0 up 0 down 1 &After 1 Down (e.g. U+0C48)
|
||||
(LSB) W -,
|
||||
W |
|
||||
W |= Width of the character
|
||||
W |
|
||||
W -'
|
||||
m --Is this character lowheight?
|
||||
K -,
|
||||
K |= Tags used by the "Keming Machine"
|
||||
K -'
|
||||
Q ---Compiler Directive (see below)
|
||||
n --,
|
||||
Y -, `-Nudging Bits (see below)
|
||||
X |
|
||||
Y |= Diacritics Anchor Points (see below)
|
||||
X -'
|
||||
A -,_ 0 Align 1 Align 0 Align 1 Align before
|
||||
A -' 0 Left 0 Right 1 Centre 1 the glyph
|
||||
D --Diacritics Type Bit (see below; not all diacritics are actually marked as a diacritics on the spritesheet)
|
||||
S -,_ 0 Stack 1 Stack 0 Before 1 Up &
|
||||
(MSB) S -' 0 up 0 down 1 &After 1 Down* (e.g. U+0C48)
|
||||
|
||||
Align Centre and Align Right will respect the diacritics anchor points.
|
||||
The Align Right AND Custom anchor point is being used for Thai diacritics.
|
||||
When a width AND diacritics type bit is set, the entire glyph is shifted to the right as specified and the space of same width will be inserted.
|
||||
(See SUNDANESE PAMINGKAL U+1BA1)
|
||||
|
||||
Up&Down:
|
||||
1. when two pixels are both #00FF00 it's "don't stack"
|
||||
2. otherwise, it's actually up&down
|
||||
|
||||
```
|
||||
|
||||
#### Nudging Bits Encoding
|
||||
|
||||
<MSB,Red> SXXXXXXX SYYYYYYY 00000000 <LSB,Blue>
|
||||
|
||||
Each X and Y numbers are Signed 8-Bit Integer.
|
||||
|
||||
X-positive: nudges towards left
|
||||
Y-positive: nudges towards up
|
||||
|
||||
#### Diacritics Anchor Point Encoding
|
||||
|
||||
4 Pixels are further divided as follows:
|
||||
|
||||
| LSB | | Red | Green | Blue |
|
||||
| ------------ | ------------ | ------------ | ------------ | ------------ |
|
||||
| Y | Anchor point Y for: | undefined | undefined | undefined |
|
||||
| X | Anchor point X for: | undefined | undefined | undefined |
|
||||
| Y | Anchor point Y for: | (unused) | (unused) | (unused) |
|
||||
| X | Anchor point X for: | Type-0 | Type-1 | Type-2 |
|
||||
| **MSB** | | | | |
|
||||
|
||||
<MSB,Red> 1Y1Y1Y1Y 1Y2Y2Y2Y 1Y3Y3Y3Y <LSB,Blue>
|
||||
<MSB,Red> 1X1X1X1X 1X2X2X2X 1X3X3X3X <LSB,Blue>
|
||||
|
||||
where Red is first, Green is second, Blue is the third diacritics.
|
||||
MSB for each word must be set so that the pixel would appear brighter on the image editor.
|
||||
(the font program will only read low 7 bits for each RGB channel)
|
||||
|
||||
#### Diacritics Type Bit Encoding
|
||||
|
||||
<MSB,Red> FFFFFFFF FFFFFFFF FFFFFFFF <LSB,Blue> (For Type-0)
|
||||
<MSB,Red> TTTT0000 00000000 00000000 <LSB,Blue> (For Type-1 to Type-15)
|
||||
|
||||
Certain types of diacritics have predefined meanings (but some writing systems define their own meaning e.g. Devanagari):
|
||||
|
||||
* Type-0: Above
|
||||
* Type-1: Below (when it should be separated from being above)
|
||||
* Type-2: Overlaid (will shift down 2 pixels for lowheight glyphs instead of the default of 4 pixels)
|
||||
|
||||
|
||||
#### Compiler Directives
|
||||
|
||||
<MSB,Red> [Opcode] [arg1] [arg2] <LSB,Blue>
|
||||
|
||||
Currently supported opcodes:
|
||||
|
||||
*00000000: No-operation; does not use the Compiler Directive system.
|
||||
|
||||
*10000111: Replace a character with maximum 7 subchars.
|
||||
Replacement characters are encoded vertically from X-zero, bit by bit
|
||||
(colour of the pixel doesn't matter) with LSB sitting on Y-zero.
|
||||
|
||||
*11111111: Tagging Used by the Subsystems. e.g. #FF0000 marks invalid combination.
|
||||
|
||||
#### Stack Up/Down
|
||||
|
||||
When the tag is stack-up, it'll be drawn 4 px lower if the underlying
|
||||
@@ -80,6 +154,10 @@ This tag can be used as a general "replace this with these" directive, as long a
|
||||
|
||||
Also note that the font compiler will not "stack" these diacritics.
|
||||
|
||||
#### The Keming Machine Tags
|
||||
|
||||
Keming Machine Tags define the rough shape of the glyph. Please read `keming_machine.txt` for further information.
|
||||
|
||||
|
||||
#### NOTES
|
||||
- If glyphs are right or centre aligned, they must be aligned in the same way inside of the bitmap; the font compiler assumes every variable-width glyphs to have a width of 15, regardless of the tagged width.
|
||||
@@ -89,13 +167,13 @@ Also note that the font compiler will not "stack" these diacritics.
|
||||
|
||||
(fun fact: it was drawn on Rhodia memopad with Lamy 2000, then photographed and edited on my iPhone. Letter used is a Cherokee WE Ꮺ)
|
||||
|
||||
### Technical Limitations
|
||||
## Technical Limitations
|
||||
|
||||
- Each spritesheet is 4096x4096 maximum, which is a size of 4K Texture. However it is recommended to be smaller or equal to 1024x1024.
|
||||
- Glyphs exceeding 15px of width needs to be broken down with 2 or more characters. Wider sheets WILL NOT BE IMPLEMENTED, can't waste much pixels just for few superwide glyphs.
|
||||
- Due to how the compiler is coded, actual glyph must have alpha value of 255, the tags must have alpha values LESS THAN 255 (and obviously greater than zero). RGB plane of the TGA image doesn't do anything, keep it as #FFFFFF white.
|
||||
|
||||
### Implementing the Korean writing system
|
||||
## Implementation of the Korean writing system
|
||||
|
||||
On this font, Hangul letters are printed by assemblying two or three letter pieces. There are 10 sets of Hangul letter pieces on the font. Top 6 are initials, middle 2 are medials, and bottom 2 are finals. On the rightmost side, there's eight assembled glyphs to help you with (assuming you have basic knowledge on the writing system). Top 6 tells you how to use 6 initials, and bottom 2 tells you how to use 2 finals.
|
||||
|
||||
|
||||
0
CONTRIBUTORS.txt
Normal file → Executable file
BIN
FontDemoGDX.jar
@@ -5,10 +5,10 @@
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="jdk" jdkName="1.8.0_242" jdkType="JavaSDK" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="module" module-name="BuildJAR_TerrarumSansBitmap" />
|
||||
<orderEntry type="library" name="KotlinJavaRuntime" level="project" />
|
||||
<orderEntry type="library" name="GdxLib" level="project" />
|
||||
<orderEntry type="library" name="TesterLib" level="project" />
|
||||
<orderEntry type="library" name="lib" level="project" />
|
||||
</component>
|
||||
</module>
|
||||
9
FontTestGDX/META-INF/MANIFEST.MF
Normal file → Executable file
@@ -1,6 +1,3 @@
|
||||
Manifest-Version: 1.0
|
||||
Class-Path: lib/gdx.jar lib/gdx-backend-lwjgl.jar lib/gdx-backend-lwjg
|
||||
l-natives.jar lib/gdx-natives.jar lib/kotlin-stdlib.jar TerrarumSansB
|
||||
itmap.jar
|
||||
Main-Class: FontTestGDXKt
|
||||
|
||||
Manifest-Version: 1.0
|
||||
Main-Class: FontTestGDXKt
|
||||
|
||||
|
||||
276
FontTestGDX/src/FontTestGDX.kt
Normal file → Executable file
@@ -1,22 +1,30 @@
|
||||
import com.badlogic.gdx.*
|
||||
import com.badlogic.gdx.backends.lwjgl.LwjglApplication
|
||||
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration
|
||||
import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application
|
||||
import com.badlogic.gdx.backends.lwjgl3.Lwjgl3ApplicationConfiguration
|
||||
import com.badlogic.gdx.files.FileHandle
|
||||
import com.badlogic.gdx.graphics.*
|
||||
import com.badlogic.gdx.graphics.g2d.SpriteBatch
|
||||
import com.badlogic.gdx.graphics.g2d.TextureRegion
|
||||
import com.badlogic.gdx.graphics.glutils.FrameBuffer
|
||||
import com.badlogic.gdx.utils.ScreenUtils
|
||||
import net.torvald.terrarumsansbitmap.gdx.GameFontBase
|
||||
import com.badlogic.gdx.utils.StreamUtils
|
||||
import net.torvald.terrarumsansbitmap.MovableType
|
||||
import net.torvald.terrarumsansbitmap.gdx.CodepointSequence
|
||||
import net.torvald.terrarumsansbitmap.gdx.TerrarumSansBitmap
|
||||
import java.io.File
|
||||
import java.io.IOException
|
||||
import java.io.OutputStream
|
||||
|
||||
/**
|
||||
* Created by minjaesong on 2018-07-26.
|
||||
*/
|
||||
class FontTestGDX : Game() {
|
||||
|
||||
lateinit var font: GameFontBase
|
||||
lateinit var font: TerrarumSansBitmap
|
||||
|
||||
lateinit var inputText: List<String>
|
||||
lateinit var inputText: String
|
||||
|
||||
lateinit var batch: SpriteBatch
|
||||
lateinit var batch: FlippingSpriteBatch
|
||||
|
||||
lateinit var frameBuffer: FrameBuffer
|
||||
|
||||
@@ -24,35 +32,64 @@ class FontTestGDX : Game() {
|
||||
|
||||
private val testing = false
|
||||
|
||||
private val demotextName = if (testing) "testtext.txt" else "demotext.txt"
|
||||
private val demotextName = if (testing) "testtext.txt" else "demotext_unaligned.txt"
|
||||
private val outimageName = if (testing) "testing.PNG" else "demo.PNG"
|
||||
|
||||
private lateinit var faketex: Texture
|
||||
|
||||
private val lineHeight = 24
|
||||
|
||||
|
||||
lateinit var layout: MovableType
|
||||
|
||||
private lateinit var testtex: TextureRegion
|
||||
|
||||
override fun create() {
|
||||
font = GameFontBase("./assets", flipY = false, errorOnUnknownChar = false) // must test for two flipY cases
|
||||
font = TerrarumSansBitmap("./assets", debug = true, flipY = false, errorOnUnknownChar = false, shadowAlpha = 0.5f) // must test for two flipY cases
|
||||
// font.scale = 2
|
||||
// font.interchar = 1
|
||||
|
||||
testtex = TextureRegion(Texture("./testtex.tga"))
|
||||
|
||||
val inTextFile = Gdx.files.internal("./$demotextName")
|
||||
val reader = inTextFile.reader("UTF-8")
|
||||
inputText = reader.readLines()
|
||||
inputText = reader.readLines().joinToString("\n")
|
||||
reader.close()
|
||||
|
||||
batch = SpriteBatch()
|
||||
batch = FlippingSpriteBatch()
|
||||
|
||||
|
||||
|
||||
|
||||
println(font.charsetOverrideDefault)
|
||||
println(font.charsetOverrideBulgarian)
|
||||
println(font.charsetOverrideSerbian)
|
||||
// create faketex
|
||||
val fakepix = Pixmap(1,1,Pixmap.Format.RGBA8888)
|
||||
fakepix.drawPixel(0,0,-1)
|
||||
faketex = Texture(fakepix)
|
||||
fakepix.dispose()
|
||||
|
||||
frameBuffer = FrameBuffer(Pixmap.Format.RGBA8888, TEXW, TEXH, true)
|
||||
|
||||
camera = OrthographicCamera(TEXW.toFloat(), TEXH.toFloat())
|
||||
camera.translate(TEXW.div(2f), 0f)
|
||||
camera.setToOrtho(true, TEXW.toFloat(), TEXH.toFloat())
|
||||
camera.translate(0f, 0f)
|
||||
camera.setToOrtho(false, TEXW.toFloat(), TEXH.toFloat())
|
||||
camera.update()
|
||||
|
||||
|
||||
Gdx.input.inputProcessor = Navigator(this)
|
||||
|
||||
|
||||
println(font.charsetOverrideCodestyle)
|
||||
println(font.charsetOverrideDefault)
|
||||
|
||||
val cs1 = CodepointSequence(listOf(0, 65, 0))
|
||||
val cs2 = CodepointSequence(listOf(0, 65))
|
||||
val cs3 = CodepointSequence(listOf(65, 0))
|
||||
val cs4 = CodepointSequence(listOf(65))
|
||||
println("w1: ${font.getWidthNormalised(cs1)}; ${font.getWidth(cs1)}")
|
||||
println("w2: ${font.getWidthNormalised(cs2)}; ${font.getWidth(cs2)}")
|
||||
println("w3: ${font.getWidthNormalised(cs3)}; ${font.getWidth(cs3)}")
|
||||
println("w4: ${font.getWidthNormalised(cs4)}; ${font.getWidth(cs4)}")
|
||||
println("These four numbers must match, even with interchar > 0")
|
||||
|
||||
layout = font.typesetParagraph(batch, inputText, TEXW - 48)
|
||||
}
|
||||
|
||||
override fun getScreen(): Screen? {
|
||||
@@ -67,6 +104,8 @@ class FontTestGDX : Game() {
|
||||
var tex: Texture? = null
|
||||
var screenshotExported = false
|
||||
|
||||
private val backcol = Color(.141f, .141f, .141f, 1f)
|
||||
|
||||
override fun render() {
|
||||
|
||||
if (tex == null) {
|
||||
@@ -76,15 +115,27 @@ class FontTestGDX : Game() {
|
||||
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT)
|
||||
Gdx.gl.glEnable(GL20.GL_TEXTURE_2D)
|
||||
Gdx.gl.glEnable(GL20.GL_BLEND)
|
||||
Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA)
|
||||
batch.setBlendFunctionSeparate(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA, GL20.GL_ONE, GL20.GL_ONE_MINUS_SRC_ALPHA) // for not premultiplied textures
|
||||
|
||||
batch.projectionMatrix = camera.combined
|
||||
batch.begin()
|
||||
|
||||
batch.color = Color(0xeeeeeeff.toInt())
|
||||
inputText.forEachIndexed { index, s ->
|
||||
font.draw(batch, s, 10f, TEXH - 30f - index * font.lineHeight)
|
||||
}
|
||||
batch.color = backcol
|
||||
batch.draw(faketex, 0f, 0f, TEXW.toFloat(), TEXH.toFloat())
|
||||
batch.flush()
|
||||
|
||||
batch.color = Color.WHITE
|
||||
// inputText.forEachIndexed { index, s ->
|
||||
// font.draw(batch, s, 10f, TEXH - 30f - index * lineHeight)
|
||||
// }
|
||||
|
||||
// draw position debuggers
|
||||
// font.draw(batch, "soft\uFE0F\u00ADhyphen\uFE0F\u00ADated", 24f, 12f)
|
||||
// batch.draw(testtex, 24f, 12f)
|
||||
// val layoutDrawCall = { x: Float, y: Float, _: Int -> batch.draw(testtex, x, y) }
|
||||
// layout.draw(batch, 24f, 12f, mapOf(0 to layoutDrawCall))
|
||||
// end of draw position debuggers
|
||||
layout.draw(batch, 24f, 12f)
|
||||
|
||||
batch.end()
|
||||
|
||||
@@ -94,6 +145,7 @@ class FontTestGDX : Game() {
|
||||
val pixmap = ScreenUtils.getFrameBufferPixmap(0, 0, frameBuffer.width, frameBuffer.height)
|
||||
|
||||
PixmapIO.writePNG(Gdx.files.local(outimageName), pixmap)
|
||||
// writeTGA(Gdx.files.local(outimageName), pixmap, false)
|
||||
pixmap.dispose()
|
||||
|
||||
screenshotExported = true
|
||||
@@ -107,11 +159,19 @@ class FontTestGDX : Game() {
|
||||
tex = frameBuffer.colorBufferTexture
|
||||
}
|
||||
|
||||
|
||||
Gdx.gl.glClearColor(.141f, .141f, .141f, 1f)
|
||||
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT)
|
||||
Gdx.gl.glEnable(GL20.GL_TEXTURE_2D)
|
||||
Gdx.gl.glEnable(GL20.GL_BLEND)
|
||||
batch.setBlendFunctionSeparate(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA, GL20.GL_ONE, GL20.GL_ONE_MINUS_SRC_ALPHA) // for not premultiplied textures
|
||||
|
||||
camera.setToOrtho(true, WIDTH.toFloat(), HEIGHT.toFloat())
|
||||
|
||||
batch.projectionMatrix = camera.combined
|
||||
batch.begin()
|
||||
batch.color = Color.WHITE
|
||||
batch.draw(tex, 0f, (TEXH.toFloat()/appConfig.height)*TEXH - scrollOffsetY, TEXW.toFloat(), -(TEXH.toFloat() / appConfig.height) * TEXH.toFloat())
|
||||
|
||||
|
||||
batch.draw(tex!!, 0f, scrollOffsetY)
|
||||
batch.end()
|
||||
}
|
||||
|
||||
@@ -126,22 +186,24 @@ class FontTestGDX : Game() {
|
||||
|
||||
override fun dispose() {
|
||||
font.dispose()
|
||||
faketex.dispose()
|
||||
testtex.texture.dispose()
|
||||
}
|
||||
|
||||
fun scrollAdd(x: Int = 1) {
|
||||
scrollOffsetY -= (TEXH.toFloat() / appConfig.height) * 20f * x
|
||||
scrollOffsetY += lineHeight * x
|
||||
}
|
||||
|
||||
fun scrollSub(x: Int = 1) {
|
||||
scrollOffsetY += (TEXH.toFloat() / appConfig.height) * 20f * x
|
||||
scrollOffsetY -= lineHeight * x
|
||||
}
|
||||
|
||||
class Navigator(val main: FontTestGDX) : InputAdapter() {
|
||||
override fun scrolled(amount: Int): Boolean {
|
||||
if (amount >= 0)
|
||||
main.scrollSub(amount)
|
||||
override fun scrolled(amountX: Float, amountY: Float): Boolean {
|
||||
if (amountY >= 0)
|
||||
main.scrollSub(amountY.toInt())
|
||||
else
|
||||
main.scrollAdd(-amount)
|
||||
main.scrollAdd(-amountY.toInt())
|
||||
|
||||
return true
|
||||
}
|
||||
@@ -155,19 +217,149 @@ class FontTestGDX : Game() {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Throws(IOException::class)
|
||||
private fun writeTGA(file: FileHandle, pixmap: Pixmap, flipY: Boolean) {
|
||||
val output = file.write(false)
|
||||
try {
|
||||
_writeTGA(output, pixmap, true, flipY)
|
||||
} finally {
|
||||
StreamUtils.closeQuietly(output)
|
||||
}
|
||||
}
|
||||
|
||||
@Throws(IOException::class)
|
||||
private fun _writeTGA(out: OutputStream, pixmap: Pixmap, verbatim: Boolean, flipY: Boolean) {
|
||||
val width: ByteArray = toShortLittle(pixmap.width)
|
||||
val height: ByteArray = toShortLittle(pixmap.height)
|
||||
val zero: ByteArray = toShortLittle(0)
|
||||
out.write(0) // ID field: empty
|
||||
out.write(0) // no colour map, but should be ignored anyway as it being unmapped RGB
|
||||
out.write(2) // 2 means unmapped RGB
|
||||
out.write(byteArrayOf(0, 0, 0, 0, 0)) // color map spec: empty
|
||||
out.write(zero) // x origin: 0
|
||||
out.write(zero) // y origin: 0
|
||||
out.write(width) // width
|
||||
out.write(height) // height
|
||||
out.write(32) // image pixel size: we're writing 32-bit image (8bpp BGRA)
|
||||
out.write(8) // image descriptor: dunno, Photoshop writes 8 in there
|
||||
|
||||
// write actual image data
|
||||
// since we're following Photoshop's conventional header, we also follows Photoshop's
|
||||
// TGA saving scheme, that is:
|
||||
// 1. BGRA order
|
||||
// 2. Y-Flipped but not X-Flipped
|
||||
if (!flipY) {
|
||||
for (y in pixmap.height - 1 downTo 0) {
|
||||
for (x in 0 until pixmap.width) {
|
||||
writeTga(x, y, verbatim, pixmap, out)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (y in 0 until pixmap.height) {
|
||||
for (x in 0 until pixmap.width) {
|
||||
writeTga(x, y, verbatim, pixmap, out)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// write footer
|
||||
// 00 00 00 00 00 00 00 00 TRUEVISION-XFILE 2E 00
|
||||
out.write(byteArrayOf(0, 0, 0, 0, 0, 0, 0, 0))
|
||||
if (verbatim) out.write("TRUEVISION-XFILE".toByteArray()) else out.write("TerrarumHappyTGA".toByteArray())
|
||||
out.write(byteArrayOf(0x2E, 0))
|
||||
out.flush()
|
||||
out.close()
|
||||
}
|
||||
|
||||
private val zeroalpha = byteArrayOf(0, 0, 0, 0)
|
||||
@Throws(IOException::class)
|
||||
private fun writeTga(x: Int, y: Int, verbatim: Boolean, pixmap: Pixmap, out: OutputStream) {
|
||||
val color = pixmap.getPixel(x, y)
|
||||
|
||||
// if alpha == 0, write special value instead
|
||||
if (verbatim && color and 0xFF == 0) {
|
||||
out.write(zeroalpha)
|
||||
} else {
|
||||
out.write(RGBAtoBGRA(color))
|
||||
}
|
||||
}
|
||||
|
||||
private fun toShortLittle(i: Int): ByteArray {
|
||||
return byteArrayOf(
|
||||
(i and 0xFF).toByte(),
|
||||
(i ushr 8 and 0xFF).toByte()
|
||||
)
|
||||
}
|
||||
|
||||
private fun RGBAtoBGRA(rgba: Int): ByteArray {
|
||||
return byteArrayOf(
|
||||
(rgba ushr 8 and 0xFF).toByte(),
|
||||
(rgba ushr 16 and 0xFF).toByte(),
|
||||
(rgba ushr 24 and 0xFF).toByte(),
|
||||
(rgba and 0xFF).toByte()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
lateinit var appConfig: LwjglApplicationConfiguration
|
||||
const val TEXW = 874
|
||||
const val TEXH = 2400
|
||||
class FlippingSpriteBatch(size: Int = 1000) : SpriteBatch(size) {
|
||||
|
||||
/**
|
||||
* This function draws the flipped version of the image by giving flipped uv-coord to the SpriteBatch
|
||||
*/
|
||||
override fun draw(texture: Texture, x: Float, y: Float, width: Float, height: Float) =
|
||||
draw(texture, x, y, width, height, 0f, 0f, 1f, 1f)
|
||||
|
||||
override fun draw(texture: Texture, x: Float, y: Float) =
|
||||
draw(texture, x, y, texture.width.toFloat(), texture.height.toFloat(), 0f, 0f, 1f, 1f)
|
||||
|
||||
fun drawFlipped(texture: Texture, x: Float, y: Float, width: Float, height: Float) =
|
||||
draw(texture, x, y, width, height, 0f, 1f, 1f, 0f)
|
||||
fun drawFlipped(texture: Texture, x: Float, y: Float) =
|
||||
draw(texture, x, y, texture.width.toFloat(), texture.height.toFloat(), 0f, 1f, 1f, 0f)
|
||||
|
||||
|
||||
/**
|
||||
* This function does obey the flipping set to the TextureRegion and try to draw flipped version of it,
|
||||
* without touching the flipping setting of the given region.
|
||||
*/
|
||||
override fun draw(region: TextureRegion, x: Float, y: Float, width: Float, height: Float) =
|
||||
draw(region.texture, x, y, width, height, region.u, region.v, region.u2, region.v2)
|
||||
|
||||
override fun draw(region: TextureRegion, x: Float, y: Float) =
|
||||
draw(region.texture, x, y, region.regionWidth.toFloat(), region.regionHeight.toFloat(), region.u, region.v, region.u2, region.v2)
|
||||
|
||||
fun drawFlipped(region: TextureRegion, x: Float, y: Float, width: Float, height: Float) =
|
||||
draw(region.texture, x, y, width, height, region.u, region.v2, region.u2, region.v)
|
||||
fun drawFlipped(region: TextureRegion, x: Float, y: Float) =
|
||||
draw(region.texture, x, y, region.regionWidth.toFloat(), region.regionHeight.toFloat(), region.u, region.v2, region.u2, region.v)
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* NOTE TO SELF:
|
||||
*
|
||||
* It seems that original SpriteBatch Y-flips when it's drawing a texture, but NOT when it's drawing a textureregion
|
||||
*
|
||||
* (textureregion's default uv-coord is (0,0,1,1)
|
||||
*/
|
||||
}
|
||||
|
||||
lateinit var appConfig: Lwjgl3ApplicationConfiguration
|
||||
const val TEXW = 800
|
||||
const val TEXH = 24 * 171
|
||||
|
||||
const val WIDTH = TEXW
|
||||
const val HEIGHT = 768
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
appConfig = LwjglApplicationConfiguration()
|
||||
appConfig.vSyncEnabled = false
|
||||
appConfig.resizable = false//true;
|
||||
appConfig.width = TEXW
|
||||
appConfig.height = 768
|
||||
appConfig.title = "Terrarum Sans Bitmap Test (GDX)"
|
||||
|
||||
LwjglApplication(FontTestGDX(), appConfig)
|
||||
appConfig = Lwjgl3ApplicationConfiguration()
|
||||
appConfig.useVsync(false)
|
||||
appConfig.setResizable(false)
|
||||
appConfig.setWindowedMode(WIDTH, HEIGHT)
|
||||
appConfig.setTitle("Terrarum Sans Bitmap Test")
|
||||
|
||||
Lwjgl3Application(FontTestGDX(), appConfig)
|
||||
}
|
||||
|
||||
247
FontTestGDX/src/TypewriterGDX.kt
Normal file
@@ -0,0 +1,247 @@
|
||||
import com.badlogic.gdx.Game
|
||||
import com.badlogic.gdx.Gdx
|
||||
import com.badlogic.gdx.Input
|
||||
import com.badlogic.gdx.InputAdapter
|
||||
import com.badlogic.gdx.audio.AudioDevice
|
||||
import com.badlogic.gdx.audio.Sound
|
||||
import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application
|
||||
import com.badlogic.gdx.backends.lwjgl3.Lwjgl3ApplicationConfiguration
|
||||
import com.badlogic.gdx.graphics.Color
|
||||
import com.badlogic.gdx.graphics.GL20
|
||||
import com.badlogic.gdx.graphics.OrthographicCamera
|
||||
import com.badlogic.gdx.graphics.g2d.SpriteBatch
|
||||
import com.badlogic.gdx.utils.GdxRuntimeException
|
||||
import net.torvald.terrarum.gamecontroller.InputStrober
|
||||
import net.torvald.terrarumsansbitmap.gdx.CodepointSequence
|
||||
import net.torvald.terrarumtypewriterbitmap.gdx.TerrarumTypewriterBitmap
|
||||
import java.io.StringReader
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
/**
|
||||
* Created by minjaesong on 2021-11-05.
|
||||
*/
|
||||
class TypewriterGDX(val width: Int, val height: Int, val cols: Int, val hmargin: Int, val vmargin: Int) : Game() {
|
||||
|
||||
lateinit var font: TerrarumTypewriterBitmap
|
||||
lateinit var batch: SpriteBatch
|
||||
// lateinit var frameBuffer: FrameBuffer
|
||||
lateinit var camera: OrthographicCamera
|
||||
|
||||
lateinit var inputStrober: InputStrober
|
||||
|
||||
lateinit var sndMovingkey: Sound
|
||||
lateinit var sndDeadkey: Sound
|
||||
lateinit var sndShiftin: Sound
|
||||
lateinit var sndShiftout: Sound
|
||||
lateinit var sndSpace: Sound
|
||||
lateinit var sndCRs: Array<Sound>
|
||||
lateinit var sndLF: Sound
|
||||
|
||||
override fun create() {
|
||||
font = TerrarumTypewriterBitmap(
|
||||
"./assets/typewriter",
|
||||
StringReader(
|
||||
"""ko_kr_3set-390_typewriter,typewriter_ko_3set-390.tga,16
|
||||
|en_intl_qwerty_typewriter,typewriter_intl_qwerty.tga,0
|
||||
""".trimMargin()
|
||||
),
|
||||
true, false, 256, true
|
||||
)
|
||||
|
||||
batch = SpriteBatch()
|
||||
|
||||
// frameBuffer = FrameBuffer(Pixmap.Format.RGBA8888, TEXW, TEXH, true)
|
||||
|
||||
camera = OrthographicCamera(width.toFloat(), height.toFloat())
|
||||
camera.translate(width.div(2f), 0f)
|
||||
camera.setToOrtho(true, width.toFloat(), height.toFloat())
|
||||
camera.update()
|
||||
|
||||
|
||||
inputStrober = InputStrober(this)
|
||||
|
||||
try {
|
||||
sndMovingkey = Gdx.audio.newSound(Gdx.files.internal("assets/typewriter/audio/movingkey.wav"))
|
||||
sndDeadkey = Gdx.audio.newSound(Gdx.files.internal("assets/typewriter/audio/deadkey.wav"))
|
||||
sndShiftin = Gdx.audio.newSound(Gdx.files.internal("assets/typewriter/audio/shiftin.wav"))
|
||||
sndShiftout = Gdx.audio.newSound(Gdx.files.internal("assets/typewriter/audio/shiftout.wav"))
|
||||
sndSpace = Gdx.audio.newSound(Gdx.files.internal("assets/typewriter/audio/space.wav"))
|
||||
|
||||
sndCRs = Array(6) {
|
||||
Gdx.audio.newSound(Gdx.files.internal("assets/typewriter/audio/cr$it.wav"))
|
||||
}
|
||||
|
||||
sndLF = Gdx.audio.newSound(Gdx.files.internal("assets/typewriter/audio/crlf.wav"))
|
||||
}
|
||||
catch (e: GdxRuntimeException) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
|
||||
private val intro = listOf(
|
||||
39,50,29, // kva (HANG_GONG)
|
||||
42,31, // nc (HANG_SE)
|
||||
74,48,51, // ;tw (HANG_BEOL)
|
||||
62, // space
|
||||
0x561F71, // shiftin
|
||||
184,164,171,170, // >HON (ASC_3-90)
|
||||
0x561F70, // shiftout
|
||||
62, // space
|
||||
74,48, // ;t (HANG_BEO)
|
||||
43,12, // o5 (HANG_CYU)
|
||||
38,48,51, // jtw (HANG_EOL)
|
||||
0x561F71, // shiftin
|
||||
164, // H (ASC_-)
|
||||
0x561F70, // shiftout
|
||||
75,34, // 'f (HANG_TA)
|
||||
40,34, // lf (HANG_JA)
|
||||
39,32, // kd (HANG_GI)
|
||||
Input.Keys.ENTER,Input.Keys.ENTER
|
||||
)
|
||||
|
||||
private val textbuf: ArrayList<CodepointSequence> = arrayListOf(
|
||||
CodepointSequence()
|
||||
)
|
||||
|
||||
var keylayoutbase = 0xFA000
|
||||
private val printableKeys = ((Input.Keys.NUM_0..Input.Keys.NUM_9) + (Input.Keys.A..Input.Keys.PERIOD) + 62 + (Input.Keys.BACKSPACE..Input.Keys.SLASH)).toHashSet()
|
||||
|
||||
var initDone = false
|
||||
var initTimer = 0f
|
||||
var initTypingCursor = 0
|
||||
var keystrokeDelay = 0.08f
|
||||
|
||||
fun acceptKey(keycode: Int, force: Boolean = false) {
|
||||
if (initDone || force) {
|
||||
// println("[TypewriterGDX] Accepting key: $keycode")
|
||||
|
||||
val lowkeycode = keycode and 127
|
||||
|
||||
if (keycode == Input.Keys.ENTER) {
|
||||
val tbufsize = textbuf.last().size.div(cols.toFloat()).times(6f).coerceIn(0f, 6f).roundToInt() // 0..6
|
||||
textbuf.add(CodepointSequence())
|
||||
if (tbufsize == 0) sndLF.play()
|
||||
else sndCRs[tbufsize - 1].play()
|
||||
} else if (printableKeys.contains(lowkeycode)) {
|
||||
val cp = keycode + keylayoutbase
|
||||
textbuf.last().add(cp)
|
||||
// println("[TypewriterGDX] width: ${font.glyphProps[cp]}")
|
||||
|
||||
// play audio
|
||||
val isDeadkey = font.glyphProps[cp]?.width == 0
|
||||
if (isDeadkey) {
|
||||
sndDeadkey.play()
|
||||
} else if (lowkeycode == Input.Keys.SPACE || lowkeycode == Input.Keys.BACKSPACE) {
|
||||
sndSpace.play()
|
||||
} else {
|
||||
sndMovingkey.play()
|
||||
}
|
||||
} else if (lowkeycode == Input.Keys.SHIFT_LEFT || lowkeycode == Input.Keys.SHIFT_RIGHT) {
|
||||
sndShiftin.play()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* For Shift-out only
|
||||
*/
|
||||
fun shiftOut() {
|
||||
sndShiftout.play()
|
||||
}
|
||||
|
||||
|
||||
private val textCol = Color(0.1f,0.1f,0.1f,1f)
|
||||
override fun render() {
|
||||
Gdx.gl.glClearColor(0.97f,0.96f,0.95f,1f)
|
||||
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT)
|
||||
Gdx.gl.glEnable(GL20.GL_TEXTURE_2D)
|
||||
Gdx.gl.glEnable(GL20.GL_BLEND)
|
||||
Gdx.gl.glBlendFuncSeparate(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA, GL20.GL_ONE, GL20.GL_ONE)
|
||||
|
||||
batch.projectionMatrix = camera.combined
|
||||
batch.begin()
|
||||
|
||||
batch.color = textCol
|
||||
|
||||
try {
|
||||
textbuf.forEachIndexed { index, s ->
|
||||
font.draw(batch, s, hmargin.toFloat(), vmargin.toFloat() + 20 * index)
|
||||
}
|
||||
}
|
||||
catch (e: ConcurrentModificationException) {}
|
||||
|
||||
batch.end()
|
||||
|
||||
if (!initDone) {
|
||||
while (initTimer > keystrokeDelay) {
|
||||
val keyToType = intro[initTypingCursor]
|
||||
|
||||
if (keyToType < 256) {
|
||||
acceptKey(keyToType, true)
|
||||
}
|
||||
else if (keyToType == 0x561F71) {
|
||||
acceptKey(Input.Keys.SHIFT_LEFT + 128, true)
|
||||
}
|
||||
else if (keyToType == 0x561F70) {
|
||||
shiftOut()
|
||||
}
|
||||
initTypingCursor += 1
|
||||
initTimer -= keystrokeDelay
|
||||
|
||||
if (keyToType == Input.Keys.ENTER)
|
||||
initTimer -= 0.35f
|
||||
else if (keyToType == 0x561F71)
|
||||
initTimer -= 0.15f
|
||||
else if (keyToType == 0x561F70)
|
||||
initTimer -= 0.1f
|
||||
else
|
||||
initTimer -= Math.random().toFloat() * 0.04f
|
||||
}
|
||||
|
||||
initTimer += Gdx.graphics.deltaTime
|
||||
|
||||
if (initTypingCursor >= intro.size) {
|
||||
initDone = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun dispose() {
|
||||
font.dispose()
|
||||
batch.dispose()
|
||||
inputStrober.dispose()
|
||||
sndMovingkey.dispose()
|
||||
sndDeadkey.dispose()
|
||||
sndShiftin.dispose()
|
||||
sndShiftout.dispose()
|
||||
sndSpace.dispose()
|
||||
sndCRs.forEach { it.dispose() }
|
||||
sndLF.dispose()
|
||||
}
|
||||
}
|
||||
|
||||
class TypewriterInput(val main: TypewriterGDX) : InputAdapter() {
|
||||
|
||||
private var shiftIn = false
|
||||
|
||||
override fun keyDown(keycode: Int): Boolean {
|
||||
// FIXME this shiftIn would not work at all...
|
||||
shiftIn = (keycode == Input.Keys.SHIFT_LEFT || keycode == Input.Keys.SHIFT_RIGHT)
|
||||
if (keycode < 128 && keycode != Input.Keys.SHIFT_LEFT && keycode != Input.Keys.SHIFT_RIGHT) {
|
||||
main.acceptKey(shiftIn.toInt() * 128 + keycode)
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
private fun Boolean.toInt() = if (this) 1 else 0
|
||||
}
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
appConfig = Lwjgl3ApplicationConfiguration()
|
||||
appConfig.useVsync(false)
|
||||
appConfig.setResizable(false)
|
||||
appConfig.setWindowedMode(534, 668)
|
||||
appConfig.setTitle("Terrarum Typewriter Bitmap Test")
|
||||
|
||||
Lwjgl3Application(TypewriterGDX(534, 668, 64, 32, 24), appConfig)
|
||||
}
|
||||
@@ -0,0 +1,401 @@
|
||||
package net.torvald.terrarum.gamecontroller
|
||||
|
||||
import TypewriterGDX
|
||||
import com.badlogic.gdx.Gdx
|
||||
import com.badlogic.gdx.Input
|
||||
|
||||
/**
|
||||
* Created by minjaesong on 2021-11-06.
|
||||
*/
|
||||
class InputStrober(val typewriter: TypewriterGDX) {
|
||||
|
||||
companion object {
|
||||
const val KEY_DOWN = 0
|
||||
const val KEY_CHANGE = 1
|
||||
const val N_KEY_ROLLOVER = 8
|
||||
}
|
||||
|
||||
var KEYBOARD_DELAYS = longArrayOf(0L,250000000L,0L,25000000L,0L)
|
||||
private var stroboTime = 0L
|
||||
private var stroboStatus = 0
|
||||
private var repeatCount = 0
|
||||
private var oldKeys = IntArray(N_KEY_ROLLOVER) { 0 }
|
||||
/** always Low Layer */
|
||||
// private var keymap = IME.getLowLayerByName(App.getConfigString("basekeyboardlayout"))
|
||||
|
||||
private val thread = Thread { while (!Thread.interrupted()) {
|
||||
if (Gdx.input != null) withKeyboardEvent()
|
||||
} }
|
||||
|
||||
init {
|
||||
// println("InputStrobe start")
|
||||
thread.start()
|
||||
}
|
||||
|
||||
fun dispose() {
|
||||
thread.interrupt()
|
||||
}
|
||||
|
||||
fun resetKeyboardStrobo() {
|
||||
stroboStatus = 0
|
||||
repeatCount = 0
|
||||
}
|
||||
|
||||
// code proudly stolen from tsvm's TVDOS.SYS
|
||||
private fun withKeyboardEvent() {
|
||||
val keys = strobeKeys()
|
||||
var keyChanged = !arrayEq(keys, oldKeys)
|
||||
val keyDiff = arrayDiff(keys, oldKeys)
|
||||
|
||||
// println("Key strobed: ${keys.joinToString()}")
|
||||
|
||||
if (stroboStatus % 2 == 0 && (keys[0] != 0 || oldKeys[0] != 0)) {
|
||||
stroboStatus += 1
|
||||
stroboTime = System.nanoTime()
|
||||
repeatCount += 1
|
||||
|
||||
val shiftin = keys.contains(Input.Keys.SHIFT_LEFT) || keys.contains(Input.Keys.SHIFT_RIGHT)
|
||||
val newKeysym0 = keysToStr(keyDiff)
|
||||
|
||||
val newKeysym = if (newKeysym0 == null) null
|
||||
else if (shiftin && newKeysym0.size > 1 && newKeysym0[1]?.isNotBlank() == true) newKeysym0[1]
|
||||
else newKeysym0[0]
|
||||
|
||||
val headKeyCode = (if (keyDiff.size < 1) keys[0] else keyDiff[0]).and(127) or (if (shiftin) 128 else 0)
|
||||
|
||||
if (repeatCount == 1) {
|
||||
if (!keyChanged) {
|
||||
// println("KEY_DOWN '$keysym' ($headKeyCode) $repeatCount; ${keys.joinToString()}")
|
||||
// App.inputStrobed(TerrarumKeyboardEvent(KEY_DOWN, keysym, headKeyCode, repeatCount, keys))
|
||||
typewriter.acceptKey(headKeyCode)
|
||||
} else if (newKeysym != null) {
|
||||
// println("KEY_DOWC '$newKeysym' ($headKeyCode) $repeatCount; ${keys.joinToString()}")
|
||||
// App.inputStrobed(TerrarumKeyboardEvent(KEY_DOWN, newKeysym, headKeyCode, repeatCount, keys))
|
||||
typewriter.acceptKey(headKeyCode)
|
||||
}
|
||||
|
||||
|
||||
// println("shiftin=${shiftin} oldkeys=${oldKeys.joinToString()}")
|
||||
|
||||
if (!shiftin && (oldKeys.contains(Input.Keys.SHIFT_LEFT) || oldKeys.contains(Input.Keys.SHIFT_RIGHT))) {
|
||||
typewriter.shiftOut()
|
||||
}
|
||||
}
|
||||
|
||||
oldKeys = keys // don't put this outside of if-cascade
|
||||
}
|
||||
else if (keyChanged || keys[0] == 0) {
|
||||
stroboStatus = 0
|
||||
repeatCount = 0
|
||||
|
||||
if (keys[0] == 0) keyChanged = false
|
||||
}
|
||||
else if (stroboStatus % 2 == 1 && System.nanoTime() - stroboTime < KEYBOARD_DELAYS[stroboStatus]) {
|
||||
Thread.sleep(1L)
|
||||
}
|
||||
else {
|
||||
stroboStatus += 1
|
||||
if (stroboStatus >= 4)
|
||||
stroboStatus = 2
|
||||
}
|
||||
}
|
||||
|
||||
private fun keysToStr(keys: IntArray): Array<String?>? {
|
||||
if (keys.isEmpty()) return null
|
||||
val headkey = keys[0]
|
||||
return keymap[headkey]
|
||||
}
|
||||
|
||||
private fun strobeKeys(): IntArray {
|
||||
var keysPushed = 0
|
||||
val keyEventBuffers = IntArray(N_KEY_ROLLOVER) { 0 }
|
||||
for (k in 1..254) {
|
||||
if (Gdx.input.isKeyPressed(k)) {
|
||||
keyEventBuffers[keysPushed] = k
|
||||
keysPushed += 1
|
||||
}
|
||||
|
||||
if (keysPushed >= N_KEY_ROLLOVER) break
|
||||
}
|
||||
return keyEventBuffers
|
||||
}
|
||||
|
||||
private fun arrayEq(a: IntArray, b: IntArray): Boolean {
|
||||
for (i in a.indices) {
|
||||
if (a[i] != b.getOrNull(i)) return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
private fun arrayDiff(a: IntArray, b: IntArray): IntArray {
|
||||
return a.filter { !b.contains(it) }.toIntArray()
|
||||
}
|
||||
|
||||
|
||||
private val keymap = arrayOf(arrayOf<String?>(""),arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>("<HOME>"),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>("<CALL>"),
|
||||
arrayOf<String?>("<ENDCALL>"),
|
||||
arrayOf<String?>("0",")"),
|
||||
arrayOf<String?>("1","!"),
|
||||
arrayOf<String?>("2","@"),
|
||||
arrayOf<String?>("3","#"),
|
||||
arrayOf<String?>("4","$"),
|
||||
arrayOf<String?>("5","%"),
|
||||
arrayOf<String?>("6","^"),
|
||||
arrayOf<String?>("7","&"),
|
||||
arrayOf<String?>("8","*"),
|
||||
arrayOf<String?>("9","("),
|
||||
arrayOf<String?>("*"),
|
||||
arrayOf<String?>("#"),
|
||||
arrayOf<String?>("<UP>"),
|
||||
arrayOf<String?>("<DOWN>"),
|
||||
arrayOf<String?>("<LEFT>"),
|
||||
arrayOf<String?>("<RIGHT>"),
|
||||
arrayOf<String?>("<CENTER>"),
|
||||
arrayOf<String?>("<VOL_UP>"),
|
||||
arrayOf<String?>("<VOL_DOWN>"),
|
||||
arrayOf<String?>("<POWER>"),
|
||||
arrayOf<String?>("<CAMERA>"),
|
||||
arrayOf<String?>("<CLEAR>"),
|
||||
arrayOf<String?>("a","A"),
|
||||
arrayOf<String?>("b","B"),
|
||||
arrayOf<String?>("c","C"),
|
||||
arrayOf<String?>("d","D"),
|
||||
arrayOf<String?>("e","E"),
|
||||
arrayOf<String?>("f","F"),
|
||||
arrayOf<String?>("g","G"),
|
||||
arrayOf<String?>("h","H"),
|
||||
arrayOf<String?>("i","I"),
|
||||
arrayOf<String?>("j","J"),
|
||||
arrayOf<String?>("k","K"),
|
||||
arrayOf<String?>("l","L"),
|
||||
arrayOf<String?>("m","M"),
|
||||
arrayOf<String?>("n","N"),
|
||||
arrayOf<String?>("o","O"),
|
||||
arrayOf<String?>("p","P"),
|
||||
arrayOf<String?>("q","Q"),
|
||||
arrayOf<String?>("r","R"),
|
||||
arrayOf<String?>("s","S"),
|
||||
arrayOf<String?>("t","T"),
|
||||
arrayOf<String?>("u","U"),
|
||||
arrayOf<String?>("v","V"),
|
||||
arrayOf<String?>("w","W"),
|
||||
arrayOf<String?>("x","X"),
|
||||
arrayOf<String?>("y","Y"),
|
||||
arrayOf<String?>("z","Z"),
|
||||
arrayOf<String?>(",","<"),
|
||||
arrayOf<String?>(".",">"),
|
||||
arrayOf<String?>("<ALT_L>"),
|
||||
arrayOf<String?>("<ALT_R>"),
|
||||
arrayOf<String?>("<SHIFT_L>"),
|
||||
arrayOf<String?>("<SHIFT_R>"),
|
||||
arrayOf<String?>("<TAB>"),
|
||||
arrayOf<String?>(" "),
|
||||
arrayOf<String?>("<SYM>"),
|
||||
arrayOf<String?>("<EXPLORER>"),
|
||||
arrayOf<String?>("<ENVELOPE>"),
|
||||
arrayOf<String?>("\n"),
|
||||
arrayOf<String?>("\u0008"),
|
||||
arrayOf<String?>("`","~"),
|
||||
arrayOf<String?>("-","_"),
|
||||
arrayOf<String?>("=","+"),
|
||||
arrayOf<String?>("arrayOf<String?>(","{"),
|
||||
arrayOf<String?>(")","}"),
|
||||
arrayOf<String?>("\\","|"),
|
||||
arrayOf<String?>(";",":"),
|
||||
arrayOf<String?>("'","\""),
|
||||
arrayOf<String?>("/","?"),
|
||||
arrayOf<String?>("<AT>"),
|
||||
arrayOf<String?>("<NUM_LOCK>"),
|
||||
arrayOf<String?>("<HEADSETHOOK>"),
|
||||
arrayOf<String?>("<FOCUS>"),
|
||||
arrayOf<String?>("+"),
|
||||
arrayOf<String?>("<MENU>"),
|
||||
arrayOf<String?>("<NOTIFICATION>"),
|
||||
arrayOf<String?>("<SEARCH>"),
|
||||
arrayOf<String?>("<PLAY_PAUSE>"),
|
||||
arrayOf<String?>("<STOP>"),
|
||||
arrayOf<String?>("<NEXT>"),
|
||||
arrayOf<String?>("<PREV>"),
|
||||
arrayOf<String?>("<REW>"),
|
||||
arrayOf<String?>("<FFWD>"),
|
||||
arrayOf<String?>("<MUTE>"),
|
||||
arrayOf<String?>("<PAGE_UP>"),
|
||||
arrayOf<String?>("<PAGE_DOWN>"),
|
||||
arrayOf<String?>("<PICTSYMBOLS>"),
|
||||
arrayOf<String?>("<SW:>TCH_CHARSET>"),
|
||||
arrayOf<String?>("<:A:>"),
|
||||
arrayOf<String?>("<:B:>"),
|
||||
arrayOf<String?>("<:C:>"),
|
||||
arrayOf<String?>("<:X:>"),
|
||||
arrayOf<String?>("<:Y:>"),
|
||||
arrayOf<String?>("<:Z:>"),
|
||||
arrayOf<String?>("<:L1:>"),
|
||||
arrayOf<String?>("<:R1:>"),
|
||||
arrayOf<String?>("<:L2:>"),
|
||||
arrayOf<String?>("<:R2:>"),
|
||||
arrayOf<String?>("<:TL:>"),
|
||||
arrayOf<String?>("<:TR:>"),
|
||||
arrayOf<String?>("<:START:>"),
|
||||
arrayOf<String?>("<:SELECT:>"),
|
||||
arrayOf<String?>("<:MODE:>"),
|
||||
arrayOf<String?>("<ESC>"),
|
||||
arrayOf<String?>("<DEL>"),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>("<CAPS_LOCK>"),
|
||||
arrayOf<String?>("<SCROLL_LOCK>"),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>("<PRINT_SCREEN_SYS_RQ>"),
|
||||
arrayOf<String?>("<PAUSE_BREAK>"),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>("<END>"),
|
||||
arrayOf<String?>("<INSERT>"),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>("<CTRL_L>"),
|
||||
arrayOf<String?>("<CTRL_R>"),
|
||||
arrayOf<String?>("<F1>"),
|
||||
arrayOf<String?>("<F2>"),
|
||||
arrayOf<String?>("<F3>"),
|
||||
arrayOf<String?>("<F4>"),
|
||||
arrayOf<String?>("<F5>"),
|
||||
arrayOf<String?>("<F6>"),
|
||||
arrayOf<String?>("<F7>"),
|
||||
arrayOf<String?>("<F8>"),
|
||||
arrayOf<String?>("<F9>"),
|
||||
arrayOf<String?>("<F10>"),
|
||||
arrayOf<String?>("<F11>"),
|
||||
arrayOf<String?>("<F12>"),
|
||||
arrayOf<String?>("<NUM_LOCK>"),
|
||||
arrayOf<String?>("0"),
|
||||
arrayOf<String?>("1"),
|
||||
arrayOf<String?>("2"),
|
||||
arrayOf<String?>("3"),
|
||||
arrayOf<String?>("4"),
|
||||
arrayOf<String?>("5"),
|
||||
arrayOf<String?>("6"),
|
||||
arrayOf<String?>("7"),
|
||||
arrayOf<String?>("8"),
|
||||
arrayOf<String?>("9"),
|
||||
arrayOf<String?>("/"),
|
||||
arrayOf<String?>("*"),
|
||||
arrayOf<String?>("-"),
|
||||
arrayOf<String?>("+"),
|
||||
arrayOf<String?>("."),
|
||||
arrayOf<String?>("."),
|
||||
arrayOf<String?>("\n"),
|
||||
arrayOf<String?>("="),
|
||||
arrayOf<String?>("("),
|
||||
arrayOf<String?>(")"),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>(null),
|
||||
arrayOf<String?>("<:CIRCLE:>")
|
||||
)
|
||||
|
||||
}
|
||||
|
||||
|
||||
data class TerrarumKeyboardEvent(
|
||||
val type: Int,
|
||||
val character: String?, // representative key symbol
|
||||
val headkey: Int, // representative keycode
|
||||
val repeatCount: Int,
|
||||
val keycodes: IntArray
|
||||
)
|
||||
2
LICENSE.md
Normal file → Executable file
@@ -1,4 +1,4 @@
|
||||
Copyright (c) 2017-2020 see CONTRIBUTORS.txt
|
||||
Copyright (c) 2017-2024 CuriousTorvald (minjaesong)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
||||
0
META-INF/MANIFEST.MF
Normal file → Executable file
BIN
PUA_allocation_chart.xlsx
Normal file → Executable file
57
README.md
Normal file → Executable file
@@ -2,16 +2,16 @@
|
||||
|
||||

|
||||
|
||||
This font is a bitmap font used in [my game project called Terrarum](https://github.com/minjaesong/Terrarum) (hence the name). The font supports more than 90 % of european languages, as well as Chinese, Japanese and Korean. More technical side, it supports Latin-1 Supplement, Latin Ext-A/B/C, IPA Extension, Greek, Cyrillic (+ Bulgarian, Serbian variants) and the supplement, Armenian, Devanagari, Bengali, Thai, Georgian (Mkhedruli and Mtavruli), General Punctuations, Super/Subscrips, CJK Punctuations, All of the Kana (minus the Hentaigana), Chinese (limited to Unihan and Ext-A), Hangul (every possible syllables) and Fullwidth forms.
|
||||
This font is a bitmap font used in [my game project called Terrarum](https://github.com/minjaesong/Terrarum) (hence the name). The font supports more than 90 % of european languages, as well as Chinese, Japanese, and Korean.
|
||||
|
||||
The JAR package is meant to be used with LibGDX (extends ```BitmapFont``` class). If you are not using the framework, please refer to the __Font metrics__ section to implement the font metrics correctly on your system.
|
||||
|
||||
The issue page is open. If you have some issues to submit, or have a question, please leave it on the page.
|
||||
|
||||
#### Little notes
|
||||
- To display Bulgarian/Serbian variants, you need special Control Characters. (GameFontBase.charsetOverrideBulgarian -- U+FFFC1; GameFontBase.charsetOverrideSerbian -- U+FFFC2)
|
||||
- All Han characters are in Chinese variant, no other variants are to be supported as most Chinese, Japanese and Korean people can understand other's variant and as long as I can, we don't bother anyway.
|
||||
- Indian script in general is not perfect: right now this font will never do the proper ligatures (I can't draw all the 1 224 possible combinations). Hopefully it's still be able to understand without them.
|
||||
#### Notes and Limitations
|
||||
- Displaying Bulgarian/Serbian variants of Cyrillic requires special Control Characters. (`GameFontBase.charsetOverrideBulgarian` -- U+FFFC1; `GameFontBase.charsetOverrideSerbian` -- U+FFFC2)
|
||||
- All Han characters are in Mainland Chinese variant. There is no plan to support the other variants unless there is someone willing to do the drawing of the characters
|
||||
- Only the Devanagari and Tamil has full (as much as I can) ligature support for Indic scripts -- Bengali script does not have any ligature support
|
||||
- Slick2d versions are now unsupported. I couldn't extend myself to work on both versions, but I'm still welcome to merge your pull requests.
|
||||
|
||||
### Design Goals
|
||||
@@ -33,12 +33,14 @@ The issue page is open. If you have some issues to submit, or have a question, p
|
||||
|
||||
On your code (Kotlin):
|
||||
|
||||
import net.torvald.terrarumsansbitmap.gdx.TerrarumSansBitmap
|
||||
|
||||
class YourGame : Game() {
|
||||
|
||||
lateinit var fontGame: Font
|
||||
|
||||
override fun create() {
|
||||
fontGame = GameFontBase(path_to_assets)
|
||||
fontGame = TerrarumSansBitmap(path_to_assets, ...)
|
||||
...
|
||||
}
|
||||
|
||||
@@ -53,12 +55,14 @@ On your code (Kotlin):
|
||||
|
||||
On your code (Java):
|
||||
|
||||
import net.torvald.terrarumsansbitmap.gdx.TerrarumSansBitmap;
|
||||
|
||||
class YourGame extends BasicGame {
|
||||
|
||||
Font fontGame;
|
||||
|
||||
@Override void create() {
|
||||
fontGame = new GameFontBase(path_to_assets);
|
||||
fontGame = new TerrarumSansBitmap(path_to_assets, ...);
|
||||
...
|
||||
}
|
||||
|
||||
@@ -71,43 +75,6 @@ On your code (Java):
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
### Using on Slick2d (legacy version only)
|
||||
|
||||
On your code (Kotlin):
|
||||
|
||||
class YourGame : BasicGame("YourGameName") {
|
||||
|
||||
lateinit var fontGame: Font
|
||||
|
||||
override fun init(gc: GameContainer) {
|
||||
fontGame = GameFontBase(path_to_assets)
|
||||
...
|
||||
}
|
||||
|
||||
override fun render(gc: GameContainer, g: Graphics) {
|
||||
g.font = fontGame
|
||||
g.drawString(...)
|
||||
}
|
||||
}
|
||||
|
||||
On your code (Java):
|
||||
|
||||
class YourGame extends BasicGame {
|
||||
|
||||
Font fontGame;
|
||||
|
||||
@Override void init(GameContainer gc) {
|
||||
fontGame = new GameFontBase(path_to_assets);
|
||||
...
|
||||
}
|
||||
|
||||
@Override void render(GameContainer gc, Graphics g) {
|
||||
g.setFont(fontGame);
|
||||
g.drawString(...);
|
||||
}
|
||||
}
|
||||
|
||||
### How to Use Color Code
|
||||
|
||||
Color codes are individual unicode characters. While you can somehow make a raw character and paste in on your code, it's certainly not desirable. Fortunately, we're also providing utility functions for the color codes.
|
||||
@@ -130,4 +97,4 @@ Please refer to [CONTRIBUTING.md](https://github.com/minjaesong/Terrarum-sans-bi
|
||||
|
||||
Thanks to kind people of [/r/Typography](https://www.reddit.com/r/typography/) for amazing feedbacks.
|
||||
|
||||
CJK Ideographs are powered by [WenQuanYi Font](http://wenq.org/wqy2/index.cgi?BitmapSong). The font is distributed under the GNU GPL version 2. Although the shapes of typefaces are not copyrightable (the program codes—e.g. TTF—do), we would like to give a credit for the font and the people behind it.
|
||||
CJK Ideographs are powered by [WenQuanYi Font](http://wenq.org/wqy2/index.cgi?BitmapSong). The font is distributed under the GNU GPL version 2. Although the shapes of typefaces are not copyrightable (the program codes—e.g. TTF—do), we would like to give a credit to the font and the people behind it.
|
||||
|
||||
0
alignment_illustration.jpg
Normal file → Executable file
|
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 59 KiB |
BIN
assets/alphabetic_presentation_forms_extrawide_variable.tga
LFS
Normal file
BIN
assets/ascii_variable.tga
Normal file → Executable file
|
Before Width: | Height: | Size: 320 KiB After Width: | Height: | Size: 131 B |
BIN
assets/bengali_variable.tga
LFS
Executable file
BIN
assets/braille_variable.tga
LFS
Normal file
|
Before Width: | Height: | Size: 50 KiB |
BIN
assets/cjkpunct_variable.tga
LFS
Normal file
BIN
assets/control_pictures_variable.tga
LFS
Normal file
BIN
assets/currencies_variable.tga
LFS
Normal file
BIN
assets/cyrilic_bulgarian_variable.tga
Normal file → Executable file
|
Before Width: | Height: | Size: 120 KiB After Width: | Height: | Size: 131 B |
BIN
assets/cyrilic_serbian_variable.tga
Normal file → Executable file
|
Before Width: | Height: | Size: 120 KiB After Width: | Height: | Size: 131 B |
BIN
assets/cyrilic_variable.tga
Normal file → Executable file
|
Before Width: | Height: | Size: 380 KiB After Width: | Height: | Size: 131 B |
|
Before Width: | Height: | Size: 320 KiB |
BIN
assets/devanagari_internal_extrawide_variable.tga
LFS
Normal file
BIN
assets/devanagari_variable.tga
LFS
Normal file
BIN
assets/diacritical_marks_variable.tga
Normal file → Executable file
|
Before Width: | Height: | Size: 140 KiB After Width: | Height: | Size: 131 B |
BIN
assets/enclosed_alphanumeric_supplement_variable.tga
LFS
Normal file
|
Before Width: | Height: | Size: 40 KiB |
BIN
assets/futhark.tga
Normal file → Executable file
|
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 130 B |
BIN
assets/greek_polytonic_xyswap_variable.tga
Normal file → Executable file
|
Before Width: | Height: | Size: 320 KiB After Width: | Height: | Size: 131 B |
BIN
assets/greek_variable.tga
Normal file → Executable file
|
Before Width: | Height: | Size: 120 KiB After Width: | Height: | Size: 131 B |
BIN
assets/halfwidth_fullwidth_variable.tga
LFS
Normal file
|
Before Width: | Height: | Size: 1.5 MiB After Width: | Height: | Size: 132 B |
BIN
assets/hayeren_variable.tga
Normal file → Executable file
|
Before Width: | Height: | Size: 120 KiB After Width: | Height: | Size: 131 B |
BIN
assets/hentaigana_variable.tga
LFS
Normal file
|
Before Width: | Height: | Size: 40 KiB |
BIN
assets/internal_variable.tga
LFS
Normal file
BIN
assets/ipa_ext_variable.tga
Normal file → Executable file
|
Before Width: | Height: | Size: 220 KiB After Width: | Height: | Size: 131 B |
BIN
assets/kana.tga
|
Before Width: | Height: | Size: 210 KiB |
BIN
assets/kana_variable.tga
LFS
Normal file
BIN
assets/kartuli_allcaps_variable.tga
Normal file → Executable file
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 130 B |
BIN
assets/kartuli_variable.tga
Normal file → Executable file
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 130 B |
|
Before Width: | Height: | Size: 160 KiB After Width: | Height: | Size: 131 B |
|
Before Width: | Height: | Size: 260 KiB After Width: | Height: | Size: 131 B |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 130 B |
BIN
assets/latinExtD_variable.tga
LFS
Normal file
BIN
assets/latinExt_additional_variable.tga
Normal file → Executable file
|
Before Width: | Height: | Size: 320 KiB After Width: | Height: | Size: 131 B |
BIN
assets/letterlike_symbols_variable.tga
LFS
Normal file
BIN
assets/phonetic_extensions_variable.tga
LFS
Normal file
BIN
assets/pua_codestyle_ascii_variable.tga
LFS
Normal file
BIN
assets/puae000-e0ff.tga
Normal file → Executable file
|
Before Width: | Height: | Size: 324 KiB After Width: | Height: | Size: 131 B |
BIN
assets/richtext_furigana.tga
Normal file → Executable file
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 130 B |
BIN
assets/sundanese_variable.tga
LFS
Normal file
BIN
assets/tamil_extrawide_variable.tga
LFS
Normal file
BIN
assets/thai_variable.tga
Normal file → Executable file
|
Before Width: | Height: | Size: 120 KiB After Width: | Height: | Size: 131 B |
BIN
assets/tsalagi_variable.tga
Normal file → Executable file
|
Before Width: | Height: | Size: 120 KiB After Width: | Height: | Size: 131 B |
BIN
assets/typewriter/audio/cr0.wav
LFS
Normal file
BIN
assets/typewriter/audio/cr1.wav
LFS
Normal file
BIN
assets/typewriter/audio/cr2.wav
LFS
Normal file
BIN
assets/typewriter/audio/cr3.wav
LFS
Normal file
BIN
assets/typewriter/audio/cr4.wav
LFS
Normal file
BIN
assets/typewriter/audio/cr5.wav
LFS
Normal file
BIN
assets/typewriter/audio/crlf.wav
LFS
Normal file
BIN
assets/typewriter/audio/deadkey.wav
LFS
Normal file
BIN
assets/typewriter/audio/movingkey.wav
LFS
Normal file
BIN
assets/typewriter/audio/shiftin.wav
LFS
Normal file
BIN
assets/typewriter/audio/shiftout.wav
LFS
Normal file
BIN
assets/typewriter/audio/space.wav
LFS
Normal file
BIN
assets/typewriter/typewriter_intl_qwerty.tga
Normal file
|
After Width: | Height: | Size: 320 KiB |
BIN
assets/typewriter/typewriter_ko_3set-390.tga
Normal file
|
After Width: | Height: | Size: 320 KiB |
BIN
assets/unipunct_variable.tga
Normal file → Executable file
|
Before Width: | Height: | Size: 200 KiB After Width: | Height: | Size: 131 B |
0
assets/wenquanyi.tga.gz
Normal file → Executable file
BIN
demo.PNG
|
Before Width: | Height: | Size: 146 KiB After Width: | Height: | Size: 167 KiB |
41
demotext.txt
Normal file → Executable file
@@ -1,18 +1,19 @@
|
||||
The bitmap font for games developers who seek good font that has real multilingual support,
|
||||
The bitmap font for game developers who seek good font that has real multilingual support,
|
||||
for free (as in freedom and without cost)
|
||||
|
||||
There are many bitmap fonts on the internet. You care for the multilingual support, but alas!
|
||||
most of them do not support your language, vector fonts take too much time to load, and even
|
||||
then their legibility suffers because fuck built-in antialias.
|
||||
then their legibility suffers because screw built-in antialias.
|
||||
|
||||
You somehow found a multilingual one, and it makes your game look like an old computer, and you say:
|
||||
You somehow found a multilingual one, and it makes your text as if they came straight from an old
|
||||
computer terminal, and you say:
|
||||
|
||||
“Well, better than nothing… no, it’s ugly.”
|
||||
|
||||
You speak japanese and you wish to support it, but then このクソなfont only goot for displaying
|
||||
Japanese, it’s not even multilingual, and their English look uncanny and inconsistent as hell.
|
||||
You speak Japanese and wish to support it, but then このクソなfont only good for displaying
|
||||
Japanese, it’s not even truly multilingual, and their English look uncanny and inconsistent.
|
||||
|
||||
Eventually you just mix different fonts together, and the results were always infuriating.
|
||||
Eventually you just mix different fonts together, and the results were always mildly infuriating.
|
||||
|
||||
No more suffering. This font has everything you need.
|
||||
|
||||
@@ -41,7 +42,7 @@ How multilingual? Real multilingual!
|
||||
სწრაფი ყავისფერი მელა გადაახტა ზარმაც ძაღლს ᲘᲜᲢᲔᲚ ᲞᲔᲜᲢᲘᲣᲛᲘ ᲛᲘᲙᲠᲝᲞᲠᲝᲪᲔᲡᲝᲠᲘ
|
||||
ऋषियों को सताने वाले दुष्ट राक्षसों के राजा रावण का सर्वनाश करने वाले विष्णुवतार भगवान श्रीराम अयोध्या के महाराज दशरथ के
|
||||
Kæmi ný öxi hér, ykist þjófum nú bæði víl og ádrepa
|
||||
Ċuaiġ bé ṁórṡáċ le dlúṫspád fíorḟinn trí hata mo ḋea-ṗorcáin ḃig
|
||||
Ċuaiġ bé ṁórṡáċ le dlúṫspád fíoꝛḟinn trí hata mo ḋea-ṗoꝛcáin ḃig
|
||||
あめつちほしそら やまかはみねたに くもきりむろこけ ひといぬうへすゑ ゆわさるおふせよ えの𛀁をなれゐて
|
||||
トリナクコヱス ユメサマセ ミヨアケワタル ヒンカシヲ ソライロハエテ オキツヘニ ホフネムレヰヌ モヤノウチ
|
||||
田居に出で 菜摘むわれをぞ 君召すと 求食り追ひゆく 山城の 打酔へる子ら 藻葉干せよ え舟繋けぬ
|
||||
@@ -51,17 +52,20 @@ How multilingual? Real multilingual!
|
||||
Ѕидарски пејзаж: шугав билмез со чудење џвака ќофте и кељ на туѓ цех
|
||||
Щётканы фермд пийшин цувъя. Бөгж зогсч хэльюү
|
||||
Pchnąć w tę łódź jeża lub ośm skrzyń fig
|
||||
कः खगौघाङचिच्छौजा झाञ्ज्ञोऽटौठीडडण्ढणः। तथोदधीन् पफर्बाभीर्मयोऽरिल्वाशिषां सहः॥
|
||||
Înjurând pițigăiat, zoofobul comandă vexat whisky și tequila
|
||||
Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства
|
||||
अद्वैतामृवर्षिणीं भगवतीमष्टादशाध्यायिनीम् अम्ब त्वामनुसन्दधामि भगवद्गीते भवद्वेषिणीम् ॥
|
||||
Ајшо, лепото и чежњо, за љубав срца мога дођи у Хаџиће на кафу
|
||||
ᮙᮛᮔᮨᮂᮔ ᮓᮤᮘᮨᮛᮨ ᮃᮊᮜ᮪ ᮏᮩᮀ ᮠᮒᮨ ᮔᮥᮛᮔᮤ, ᮎᮙ᮪ᮕᮥᮁ-ᮌᮅᮜ᮪ ᮏᮩᮀ ᮞᮞᮙᮔ ᮃᮚ ᮓᮤᮔ ᮞᮥᮙᮔᮨᮒ᮪ ᮓᮥᮓᮥᮜᮥᮛᮔ᮪
|
||||
Jovencillo emponzoñado de whisky: ¡qué figurota exhibe!
|
||||
எழுத்து வடிவங்களுக்கு வார்த்தைகள் மற்றும் வாக்கியங்கள் போலவே தொனி, ஒலி பண்பு, தன்மை உண்டு
|
||||
นายสังฆภัณฑ์ เฮงพิทักษ์ฝั่ง ผู้เฒ่าซึ่งมีอาชีพเป็นฅนขายฃวด ถูกตำรวจปฏิบัติการจับฟ้องศาล ฐานลักนาฬิกาคุณหญิงฉัตรชฎา ฌานสมาธิ
|
||||
Pijamalı hasta yağız şoföre çabucak güvendi
|
||||
Жебракують філософи при ґанку церкви в Гадячі, ще й шатро їхнє п’яне знаємо
|
||||
Do bạch kim rất quý nên sẽ dùng để lắp vô xương
|
||||
日堀油告観観藤村抄海評業庁経賃室弁市。太撮収改売週法所何都慣次現。価紙一無三洋日話転手治稿載末替付致治。
|
||||
[pʰnɣɬɥi.m͡ŋχɫʍɨnaɸ.cθʊɫɯ.ɹɨɫʏ͡ɛx.ɯ͡ɣaxɲaɣɫ.ɸtʰɑɣɴ]
|
||||
⠑⠥⠊⠵⠀⠟⠫⠒⠵⠀⠓⠗⠎⠉⠂⠀⠠⠊⠗⠘⠍⠓⠎⠀⠨⠣⠩⠐⠥⠍⠑⠱⠀⠈⠪⠀⠨⠷⠎⠢⠈⠧⠀⠈⠏⠒⠐⠕⠝⠀⠕⠌⠎⠀⠊⠿⠊⠪⠶⠚⠊
|
||||
|
||||
Features:
|
||||
|
||||
@@ -103,14 +107,21 @@ How multilingual? Real multilingual!
|
||||
|
||||
Rejoice, now we can render Old Korean in a correct way!
|
||||
|
||||
Unicode References:
|
||||
Supported Unicode Blocks:
|
||||
|
||||
Basic Latin Latin-1 Supplement Latin Extended-A Latin Extended-B IPA Extension Greek Cyrillic
|
||||
Cyrillic Supplement Armenian Devanagari Bengali Thai Georgian Hangul Jamo Cherokee Runic
|
||||
Georgian Extended Greek Extended General Punctuations Superscripts and Subscripts CJK Symbols
|
||||
Latin Extended-C Kana Hangul Compatibility Jamo Kana Phonetic Extensions CJK Unihan Extension A
|
||||
CJK Unihan Hangul Jamo Extended-A Hangul Syllables Hangul Jamo Extended-B Fullwidth Forms
|
||||
Kana Supplement
|
||||
Basic Latin Latin-1 Supplement Latin Extended-A Latin Extended-B IPA Extensions Spacing Modifier Letters
|
||||
Combining Diacritical Marks Greek and Copticᴱ Cyrillicᴭ Cyrillic Supplementᴭ Armenian Devanagari
|
||||
Bengaliᶠⁱ Tamil Thai Georgianჼ Hangul Jamo Cherokee⁷ Runic Sundanese Georgian Extended
|
||||
Sundanese Supplement Phonetic Extensions Phonetic Extensions Supplement Latin Extended Additional
|
||||
Greek Extended General Punctuations Superscripts and Subscripts Currency Symbols Letterlike Symbols
|
||||
Braile Patterns Latin Extended-C CJK Symbols and Punctuation Hiragana Katakana
|
||||
Hangul Compatibility Jamo Katakana Phonetic Extensions CJK Unified Ideographs Extension A¹²·¹
|
||||
CJK Unified Ideographs⁶ Latin Extended-D Hangul Jamo Extended-A Hangul Syllables
|
||||
Hangul Jamo Extended-B Halfwidth and Fullwidth Forms Kana Supplement⁹ Enclosed Alphanumeric Supplement
|
||||
|
||||
ᴭ No support for archæic letters ᴱ No support for Coptic
|
||||
ᶠⁱ No support for ligatures ჼ Mkhedruli only
|
||||
⁶ ⁷ ⁹ ¹²·¹ Up to the specified Unicode version
|
||||
|
||||
GitHub’s issue page is open! You can report any errors, or leave suggestions.
|
||||
You can help this font to be more versatile. (for more languages, more frameworks) Clone this repo, make
|
||||
|
||||
158
demotext_unaligned.txt
Executable file
@@ -0,0 +1,158 @@
|
||||
The bitmap font for game developers who seek good font that has real multilingual support, for free (as in freedom and without cost)
|
||||
|
||||
There are many bitmap fonts on the internet. You care for the multilingual support, but alas! most of them do not support your language, vector fonts take too much time to load, and even then their legibility suffers because screw built-in antialias.
|
||||
|
||||
You somehow found a multilingual one, and it makes your text as if they came straight from an old computer terminal, and you say:
|
||||
|
||||
“Well, better than nothing… no, it’s ugly.”
|
||||
|
||||
You speak Japanese and wish to support it, but then このクソなfont only good for displaying Japanese, it’s not even truly multilingual, and their English look uncanny and inconsistent.
|
||||
|
||||
Eventually you just mix different fonts together, and the results were always mildly infuriating.
|
||||
|
||||
No more suffering. This font has everything you need.
|
||||
|
||||
while (isVisible(BAD_FONTS)) {
|
||||
ripAndTear(BAD_FONTS).where { GUTS };
|
||||
}
|
||||
|
||||
How multilingual? Real multilingual!
|
||||
|
||||
Ианҵоуп ақьаад, нусхур аҩырала, ҩ ҽшьаҟакла, иҧшӡоу анапҩырала
|
||||
գրիչս վայր դրի, վեր կացա և պատրաստվում էի, որ քնեմ, երբ հանկարծ դռանս զանգակը հնչեց
|
||||
ՄՇԱԿԻՉ ԿԱՄ ԿԵՆՏՐՈՆԱԿԱՆ ՄՇԱԿԻՉ ՀԱՆԳՈՒՅՑԸ ՀԱՆԴԻՍԱՆՈՒՄ Է ՀԱՄԱԿԱՐԳՉԻ ՍԱՐՔԱՎՈՐՈՒՄՆԵՐԻՑ
|
||||
Zəfər, jaketini də papağını da götür, bu axşam hava çox soyuq olacaq
|
||||
আমি কাঁচ খেতে পারি, তাতে আমার কোনো ক্ষতি হয় না।
|
||||
Под южно дърво, цъфтящо в синьо, бягаше малко пухкаво зайче
|
||||
ᎠᏍᎦᏯᎡᎦᎢᎾᎨᎢᎣᏍᏓᎤᎩᏍᏗᎥᎴᏓᎯᎲᎢᏔᎵᏕᎦᏟᏗᏖᎸᎳᏗᏗᎧᎵᎢᏘᎴᎩ ᏙᏱᏗᏜᏫᏗᏣᏚᎦᏫᏛᏄᏓᎦᏝᏃᎠᎾᏗᎭᏞᎦᎯᎦᏘᏓᏠᎨᏏᏕᏡᎬᏢᏓᏥᏩᏝᎡᎢᎪᎢ ᎠᎦᏂᏗᎮᎢᎫᎩᎬᏩᎴᎢᎠᏆᏅᏛᎫᏊᎾᎥᎠᏁᏙᎲᏐᏈᎵᎤᎩᎸᏓᏭᎷᏤᎢᏏᏉᏯᏌᏊ ᎤᏂᏋᎢᏡᎬᎢᎰᏩᎬᏤᎵᏍᏗᏱᎩᎱᎱᎤᎩᎴᎢᏦᎢᎠᏂᏧᏣᏨᎦᏥᎪᎥᏌᏊᎤᎶᏒᎢᎢᏡᎬᎢ ᎹᎦᎺᎵᏥᎻᎼᏏᎽᏗᏩᏂᎦᏘᎾᎿᎠᏁᎬᎢᏅᎩᎾᏂᎡᎢᏌᎶᎵᏎᎷᎠᏑᏍᏗᏪᎩ ᎠᎴ ᏬᏗᏲᏭᎾᏓᏍᏓᏴᏁᎢᎤᎦᏅᏮᏰᎵᏳᏂᎨᎢ
|
||||
Příliš žluťoučký kůň úpěl ďábelské ódy
|
||||
Quizdeltagerne spiste jordbær med fløde, mens cirkusklovnen Walther spillede på xylofon
|
||||
PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS
|
||||
hƿæt ƿe ᵹardena inᵹear ꝺaᵹum þeoꝺ cynninᵹa þꞃym ᵹeꝼꞃumon
|
||||
Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich GROẞEN GROẞE
|
||||
ζαφείρι δέξου πάγκαλο, βαθῶν ψυχῆς τὸ σῆμα
|
||||
ΔΙΑΦΥΛΆΞΤΕ ΓΕΝΙΚΆ ΤΗ ΖΩΉ ΣΑΣ ΑΠΌ ΒΑΘΕΙΆ ΨΥΧΙΚΆ ΤΡΑΎΜΑΤΑ
|
||||
სწრაფი ყავისფერი მელა გადაახტა ზარმაც ძაღლს ᲘᲜᲢᲔᲚ ᲞᲔᲜᲢᲘᲣᲛᲘ ᲛᲘᲙᲠᲝᲞᲠᲝᲪᲔᲡᲝᲠᲘ
|
||||
ऋषियों को सताने वाले दुष्ट राक्षसों के राजा रावण का सर्वनाश करने वाले विष्णुवतार भगवान श्रीराम अयोध्या के महाराज दशरथ के
|
||||
Kæmi ný öxi hér, ykist þjófum nú bæði víl og ádrepa
|
||||
Ċuaiġ bé ṁórṡáċ le dlúṫspád fíoꝛḟinn trí hata mo ḋea-ṗoꝛcáin ḃig
|
||||
あめつちほしそら やまかはみねたに くもきりむろこけ ひといぬうへすゑ ゆわさるおふせよ えの𛀁をなれゐて
|
||||
トリナクコヱス ユメサマセ ミヨアケワタル ヒンカシヲ ソライロハエテ オキツヘニ ホフネムレヰヌ モヤノウチ
|
||||
田居に出で 菜摘むわれをぞ 君召すと 求食り追ひゆく 山城の 打酔へる子ら 藻葉干せよ え舟繋けぬ
|
||||
정 참판 양반댁 규수 큰 교자 타고 혼례 치른 날 찦차를 타고 온 펲시맨과 쑛다리 똠방각하
|
||||
쾅 ᄒᆞ는 소리 헨 “아이구 베락 털어져ᇝ인가?” 영 걷어진 쥥은 몰르곡 경헨 ᄇᆞᆰ도록 ᄌᆞᆷ ᄒᆞᆫᄌᆞᆷ들 안 잣수다
|
||||
Četri psihi faķīri vēlu vakarā zāģēja guļbūvei durvis, fonā šņācot mežam
|
||||
Įlinkdama fechtuotojo špaga sublykčiojusi pragręžė apvalų arbūzą
|
||||
Ѕидарски пејзаж: шугав билмез со чудење џвака ќофте и кељ на туѓ цех
|
||||
Щётканы фермд пийшин цувъя. Бөгж зогсч хэльюү
|
||||
Pchnąć w tę łódź jeża lub ośm skrzyń fig
|
||||
Înjurând pițigăiat, zoofobul comandă vexat whisky și tequila
|
||||
Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства
|
||||
अद्वैतामृवर्षिणीं भगवतीमष्टादशाध्यायिनीम् अम्ब त्वामनुसन्दधामि भगवद्गीते भवद्वेषिणीम् ॥
|
||||
Ајшо, лепото и чежњо, за љубав срца мога дођи у Хаџиће на кафу
|
||||
ᮙᮛᮔᮨᮂᮔ ᮓᮤᮘᮨᮛᮨ ᮃᮊᮜ᮪ ᮏᮩᮀ ᮠᮒᮨ ᮔᮥᮛᮔᮤ, ᮎᮙ᮪ᮕᮥᮁ-ᮌᮅᮜ᮪ ᮏᮩᮀ ᮞᮞᮙᮔ ᮃᮚ ᮓᮤᮔ ᮞᮥᮙᮔᮨᮒ᮪ ᮓᮥᮓᮥᮜᮥᮛᮔ᮪
|
||||
Jovencillo emponzoñado de whisky: ¡qué figurota exhibe!
|
||||
எழுத்து வடிவங்களுக்கு வார்த்தைகள் மற்றும் வாக்கியங்கள் போலவே தொனி, ஒலி பண்பு, தன்மை உண்டு
|
||||
นายสังฆภัณฑ์ เฮงพิทักษ์ฝั่ง ผู้เฒ่าซึ่งมีอาชีพเป็นฅนขายฃวด ถูกตำรวจปฏิบัติการจับฟ้องศาล ฐานลักนาฬิกาคุณหญิงฉัตรชฎา ฌานสมาธิ
|
||||
Pijamalı hasta yağız şoföre çabucak güvendi
|
||||
Жебракують філософи при ґанку церкви в Гадячі, ще й шатро їхнє п’яне знаємо
|
||||
Do bạch kim rất quý nên sẽ dùng để lắp vô xương
|
||||
日堀油告観観藤村抄海評業庁経賃室弁市。太撮収改売週法所何都慣次現。価紙一無三洋日話転手治稿載末替付致治。
|
||||
[pʰnɣɬɥi.m͡ŋχɫʍɨnaɸ.cθʊɫɯ.ɹɨɫʏ͡ɛx.ɯ͡ɣaxɲaɣɫ.ɸtʰɑɣɴ]
|
||||
⠑⠥⠊⠵⠀⠟⠫⠒⠵⠀⠓⠗⠎⠉⠂⠀⠠⠊⠗⠘⠍⠓⠎⠀⠨⠣⠩⠐⠥⠍⠑⠱⠀⠈⠪⠀⠨⠷⠎⠢⠈⠧⠀⠈⠏⠒⠐⠕⠝⠀⠕⠌⠎⠀⠊⠿⠊⠪⠶⠚⠊
|
||||
|
||||
Features:
|
||||
|
||||
Heard of « Guillemets »? You speak „Nederlands” or „Deutsch“? ”suomi”? 「日本語」しゃべる?或《中文》?
|
||||
|
||||
‣ Multilingual brackets; these are the most basic things, right?
|
||||
|
||||
99406 91902 59186 29182 45814 57862 34368 08240
|
||||
31485 65379 04348 28952 42927 26157 42615 39526
|
||||
|
||||
‣ Fixed-width (tabulated) numbers, because number-crunching matters
|
||||
|
||||
ᚱᛂᚴᛋᛂᛋᛏᛋᚮᚾᛔᚢᛏᛚᚮᛋ᛬ᚱᛂᚴᛋᛋᚢᚼᚾᚢᛘᚢᛚᚾᛏᚮ᛬ᛏᚮᛋᛁᚮᚵᛂᚢᛏᚮᚱᛘᛔᚱᛂᚴᛋᛏ᛭ᛋᚢᚼᚾᚢᛋᛘᚮᛁᚵᚾᛁᛂᛏᚮᛑ᛭ᚵᛂᚢᛏᚮᚱ
|
||||
|
||||
‣ Colour-code that supports 4096 colours via 4 bit RGB
|
||||
|
||||
Щиглецът се яде само пържен в юфка без чушки и хвойна (Bulgarian)
|
||||
Љубазни фењерџија чађавог лица хоће да ми покаже штос (Serbian)
|
||||
Разъяренный чтец эгоистично бьёт пятью жердями шустрого фехтовальщика (Russian)
|
||||
|
||||
‣ Control characters to support Bulgarian and Serbian letter shapes on the fly
|
||||
|
||||
Press to pay respects—or is it , or …
|
||||
|
||||
‣ Custom symbols for video games
|
||||
|
||||
Can you distinguish following dashes: - – — - – — – - ――――――――――― 48–63 48-63
|
||||
|
||||
‣ For all those dash-pedants, we have en-dash, em-dash, and even horizontal bars!
|
||||
|
||||
5¹⁹⁄₃₂ inch is 142.1 mm · (C₂F₄)ₙ is godly · Error = MoreCode²
|
||||
NOTE: we don’t do fractions. 142¹⁄₁₀ mm is illegal!
|
||||
|
||||
‣ Unicode fractions, also known as super/subscripts
|
||||
|
||||
ᄀᆞᄅᆞᇝ ᄀᆞᅀᅢ 자거늘 밀므리 사ᄋᆞ리로ᄃᆡ 나거ᅀᅡ ᄌᆞᄆᆞ니ᅌᅵ다 셤 안해 자시ᇙ 제 한비 사ᄋᆞ리로ᄃᆡ 뷔어ᅀᅡ ᄌᆞᄆᆞ니ᅌᅵ다
|
||||
쾅 ᄒᆞ는 소리 헨 “아이구, 베락 털어져ᇝ인가?” 영 걷어진 쥥은 몰르곡 경헨 나왕 보고들랑 영헤연 ᄇᆞᆰ도록 ᄌᆞᆷ ᄒᆞᆫᄌᆞᆷ들 안 잣수다 이 시간 동네 사람들.
|
||||
|
||||
‣ Full support for Old Korean/Jeju dialect orthography
|
||||
|
||||
𛀆𛄆𛂦𛂌𛂻𛂶𛁻𛁦𛃶𛂑𛃺𛄚𛄋𛀙𛃫𛁟𛄀𛁛𛁫𛂗𛂁𛃭𛃑𛀋𛂜𛀕𛀬𛃟𛃅𛀴𛂱𛀸𛀁𛁲𛀄𛀿𛀣𛃥𛃔𛃎𛁈ゑ𛂯𛃙𛁕𛁏𛄝
|
||||
|
||||
‣ Full support for Archaic Kana/Hentaigana
|
||||
|
||||
Supported Unicode Blocks:
|
||||
|
||||
⁃ Basic Latin
|
||||
⁃ Latin-1 Supplement
|
||||
⁃ Latin Extended Additional
|
||||
⁃ Latin Extended-A/B/C/D
|
||||
⁃ Armenian
|
||||
⁃ Bengaliᶠⁱ
|
||||
⁃ Braile Patterns
|
||||
⁃ Cherokee⁷
|
||||
⁃ CJK Symbols and Punctuation
|
||||
⁃ CJK Unified Ideographs⁶
|
||||
⁃ CJK Unified Ideographs Extension A¹²·¹
|
||||
⁃ Combining Diacritical Marks
|
||||
⁃ Currency Symbols
|
||||
⁃ Cyrillicᴭ
|
||||
⁃ Cyrillic Supplementᴭ
|
||||
⁃ Devanagari
|
||||
⁃ Enclosed Alphanumeric Supplement
|
||||
⁃ General Punctuations
|
||||
⁃ Georgianჼ
|
||||
⁃ Georgian Extended
|
||||
⁃ Greek and Copticᴱ
|
||||
⁃ Greek Extended
|
||||
⁃ Halfwidth and Fullwidth Forms
|
||||
⁃ Hangul Compatibility Jamo
|
||||
⁃ Hangul Jamo
|
||||
⁃ Hangul Jamo Extended-A/B
|
||||
⁃ Hangul Syllables
|
||||
⁃ IPA Extensions
|
||||
⁃ Hiragana
|
||||
⁃ Katakana
|
||||
⁃ Katakana Phonetic Extensions
|
||||
⁃ Kana Supplement
|
||||
⁃ Kana Extended-A
|
||||
⁃ Small Kana Extension
|
||||
⁃ Letterlike Symbols
|
||||
⁃ Phonetic Extensions
|
||||
⁃ Phonetic Extensions Supplement
|
||||
⁃ Runic
|
||||
⁃ Spacing Modifier Letters
|
||||
⁃ Sundanese
|
||||
⁃ Sundanese Supplement
|
||||
⁃ Superscripts and Subscripts
|
||||
⁃ Tamil
|
||||
⁃ Thai
|
||||
|
||||
ᴭ No support for archæic letters ᴱ No support for Coptic
|
||||
ᶠⁱ No support for ligatures ჼ Mkhedruli only
|
||||
⁶ ⁷ ⁹ ¹²·¹ Up to the specified Unicode version
|
||||
|
||||
GitHub’s issue page is open! You can report any errors, or leave suggestions. You can help this font to be more versatile. (for more languages, more frameworks) Clone this repo, make changes, and make a pull request! I appreciate any and all supports.
|
||||
BIN
font_drawing_template.png
Normal file → Executable file
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 129 B |
BIN
glyph_height_pos_annotation.png
Normal file → Executable file
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 129 B |
108
keming_machine.txt
Normal file
@@ -0,0 +1,108 @@
|
||||
--- Pixel 0
|
||||
- Lowheight bit
|
||||
- encoding: has pixel - it's low height
|
||||
- used by the diacritics system to quickly look up if the character is low height without parsing the Pixel 1
|
||||
|
||||
### Legends
|
||||
#
|
||||
# A·B < unset for lowheight miniscules, as in e
|
||||
# |·| < space we don't care
|
||||
# C·D < middle hole for majuscules, as in C
|
||||
# E·F < middle hole for miniscules, as in c
|
||||
# G·H
|
||||
# ――― < baseline
|
||||
# |·|
|
||||
# J·K
|
||||
|
||||
--- Pixel 1
|
||||
- A..K Occupied (1024)
|
||||
- Is ABGH are all Ys instead of Bars? (2)
|
||||
- Say, A is Bar but E is wye (e.g. Ꮨ), this condition is false; this character must be encoded as ABDFGH(B).
|
||||
- encoding:
|
||||
- <MSB> Y0000000 JK000000 ABCDEFGH <LSB>
|
||||
- Y: Bar/Wye Mode
|
||||
- A..K: arguments
|
||||
- B-type will contract the space by 2 pixels, while Y-type will do it by 1
|
||||
|
||||
# Capital/lower itself is given using the pixel 0 due to the diacritics processing
|
||||
|
||||
--- Examples
|
||||
- AB(B): T
|
||||
- ABCEGH(B): C
|
||||
- ABCEFGH(Y): K
|
||||
- ABCDEG: Ꮅ
|
||||
- ABCDEFGH: B,D,O
|
||||
- ABCDFH: Ч
|
||||
- ABCEG: Г
|
||||
- ABGH: Ꮖ
|
||||
- ACDEG: Ꮀ
|
||||
- ACDEFGH: h,Ƅ
|
||||
- ACDFH: ߆
|
||||
- ACEGH: L
|
||||
- AH(Y): \
|
||||
- BDEFGH: J
|
||||
- BDFGH: ɺ,ป
|
||||
- BG(Y): /
|
||||
- CD: Ⴕ
|
||||
- CDEF(Y): Φ
|
||||
- CDEFGH: a,c,e,i,o,φ,ϕ
|
||||
- CDEFGHJK: g
|
||||
- CDEFGHK: ƞ
|
||||
|
||||
- AB(Y): Y
|
||||
- ABCD(Y): V
|
||||
- CDEF(Y): v
|
||||
- EFGH(Y): ʌ
|
||||
- CDGH(Y): A
|
||||
|
||||
--- Rules
|
||||
# Legend: _ dont care
|
||||
# @ must have a bit set
|
||||
# ` must have a bit unset
|
||||
- ͟A͟B͟C͟D͟E͟F͟G͟H͟J͟K͟ ͟ ͟ ͟A͟B͟C͟D͟E͟F͟G͟H͟J͟K͟
|
||||
- _@_`___`__ — `_________ # Γe,TJ ; Ye,YJ,Ve,VJ,TA,ΓA,VA,Vʌ,YA,Yʌ,yA,yʌ,/a,/d
|
||||
- _@_@___`__ — `___`_@___ # Pɺ but NOT Po,PJ
|
||||
- _@_@___`__ — `___@_____ # Fo,PJ (always 1 px)
|
||||
- ___`_`____ — `___@_`___ # Cꟶ,Kꟶ,Lꟶ,Γꟶ
|
||||
- ___`_`____ — `_@___`___ # CꟵ,KꟵ,LꟵ,ΓꟵ
|
||||
-----------------------------------------------------
|
||||
- _`________ — @_`___`___ # eꞀ,LT ; eY,LY,eV,LV,AT,AꞀ,AY,Ay,λY,λy,a\,b\
|
||||
- _`___`_@__ — @_@___`___ # Lꟼ but NOT oꟼ,bꟼ
|
||||
- _`___@____ — @_@___`___ # oꟼ,bꟼ (always 1 px)
|
||||
- _`___@_`__ — __`_`_____ # ⱶƆ,ⱶJ
|
||||
- _`_@___`__ — __`_`_____ # ⱵƆ,ⱵJ
|
||||
|
||||
|
||||
--- Implementation
|
||||
code: |
|
||||
val posTable = intArrayOf(7,6,5,4,3,2,1,0,9,8)
|
||||
|
||||
class RuleMask(s: String) {
|
||||
|
||||
private var careBits = 0
|
||||
private var ruleBits = 0
|
||||
|
||||
init {
|
||||
s.forEachIndexed { index, char ->
|
||||
when (char) {
|
||||
'@' -> {
|
||||
careBits = careBits or (1 shl posTable[index])
|
||||
ruleBits = ruleBits or (1 shl posTable[index])
|
||||
}
|
||||
'`' -> {
|
||||
careBits = careBits or (1 shl posTable[index])
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun matches(shapeBits: Int) = ((shapeBits and careBits) and ruleBits) == 0
|
||||
|
||||
}
|
||||
|
||||
--- Pixel 2
|
||||
dot removal for diacritics:
|
||||
- All 24 bits are used to put replacement character
|
||||
- encoding:
|
||||
- <MSB> RRRRRRRR GGGGGGGG BBBBBBBB <LSB>
|
||||
|
||||