Font implementation for GDX (issue #4), various format changes on the spritesheets
@@ -1,73 +0,0 @@
|
|||||||
package net.torvald.imagefont
|
|
||||||
|
|
||||||
import net.torvald.terrarum.imagefont.GameFontDemo
|
|
||||||
import org.newdawn.slick.*
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by minjaesong on 16-01-20.
|
|
||||||
*/
|
|
||||||
class GameFontImpl : GameFontBase() {
|
|
||||||
|
|
||||||
init {
|
|
||||||
|
|
||||||
GameFontBase.hangulSheet = SpriteSheet(
|
|
||||||
"./assets/graphics/fonts/hangul_johab.tga", GameFontBase.W_HANGUL, GameFontBase.H)
|
|
||||||
GameFontBase.asciiSheet = SpriteSheet(
|
|
||||||
"./assets/graphics/fonts/ascii_variable.tga", 15, 19, 1)
|
|
||||||
GameFontBase.extASheet = SpriteSheet(
|
|
||||||
"./assets/graphics/fonts/LatinExtA_variable.tga", 15, 19, 1)
|
|
||||||
GameFontBase.extBSheet = SpriteSheet(
|
|
||||||
"./assets/graphics/fonts/LatinExtB_variable.tga", 15, 19, 1)
|
|
||||||
GameFontBase.kanaSheet = SpriteSheet(
|
|
||||||
"./assets/graphics/fonts/kana.tga", GameFontBase.W_KANA, GameFontBase.H)
|
|
||||||
GameFontBase.cjkPunct = SpriteSheet(
|
|
||||||
"./assets/graphics/fonts/cjkpunct.tga", GameFontBase.W_ASIAN_PUNCT, GameFontBase.H)
|
|
||||||
GameFontBase.cyrilic = SpriteSheet(
|
|
||||||
when (GameFontDemo.gameLocale.substring(0..1)) {
|
|
||||||
"bg" -> "./assets/graphics/fonts/cyrilic_bulgarian_variable.tga"
|
|
||||||
"sr" -> "./assets/graphics/fonts/cyrilic_serbian_variable.tga"
|
|
||||||
else -> "./assets/graphics/fonts/cyrilic_variable.tga"
|
|
||||||
}, 15, 19, 1)
|
|
||||||
GameFontBase.fullwidthForms = SpriteSheet(
|
|
||||||
"./assets/graphics/fonts/fullwidth_forms.tga", GameFontBase.W_UNIHAN, GameFontBase.H_UNIHAN)
|
|
||||||
GameFontBase.uniPunct = SpriteSheet(
|
|
||||||
"./assets/graphics/fonts/unipunct.tga", GameFontBase.W_LATIN_WIDE, GameFontBase.H)
|
|
||||||
GameFontBase.uniHan = SpriteSheet(
|
|
||||||
"./assets/graphics/fonts/wenquanyi.tga", 16, 16)
|
|
||||||
GameFontBase.greekSheet = SpriteSheet(
|
|
||||||
"./assets/graphics/fonts/greek_variable.tga", 15, 19, 1)
|
|
||||||
|
|
||||||
val shk = arrayOf(
|
|
||||||
GameFontBase.asciiSheet,
|
|
||||||
GameFontBase.hangulSheet,
|
|
||||||
null, // here was customised runic sheet
|
|
||||||
GameFontBase.extASheet,
|
|
||||||
GameFontBase.extBSheet,
|
|
||||||
GameFontBase.kanaSheet,
|
|
||||||
GameFontBase.cjkPunct,
|
|
||||||
GameFontBase.uniHan,
|
|
||||||
GameFontBase.cyrilic,
|
|
||||||
GameFontBase.fullwidthForms,
|
|
||||||
GameFontBase.uniPunct,
|
|
||||||
GameFontBase.greekSheet
|
|
||||||
)
|
|
||||||
GameFontBase.sheetKey = shk
|
|
||||||
|
|
||||||
|
|
||||||
buildWidthTable(asciiSheet, 0, 0..0xFF)
|
|
||||||
buildWidthTable(extASheet, 0x100, 0..0x7F)
|
|
||||||
buildWidthTable(extBSheet, 0x180, 0..0xCF)
|
|
||||||
buildWidthTable(cyrilic, 0x400, 0..0x5F)
|
|
||||||
buildWidthTable(greekSheet, 0x370, 0..0x5F)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun reload() {
|
|
||||||
GameFontBase.cyrilic.destroy()
|
|
||||||
GameFontBase.cyrilic = SpriteSheet(
|
|
||||||
when (GameFontDemo.gameLocale.substring(0..1)) {
|
|
||||||
"bg" -> "./assets/graphics/fonts/cyrilic_bulgarian_variable.tga"
|
|
||||||
"sr" -> "./assets/graphics/fonts/cyrilic_serbian_variable.tga"
|
|
||||||
else -> "./assets/graphics/fonts/cyrilic_variable.tga"
|
|
||||||
}, 15, 19, 1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
Font implementations for Slick2d
|
|
||||||
|
Before Width: | Height: | Size: 160 KiB After Width: | Height: | Size: 160 KiB |
|
Before Width: | Height: | Size: 260 KiB After Width: | Height: | Size: 260 KiB |
|
Before Width: | Height: | Size: 320 KiB After Width: | Height: | Size: 320 KiB |
|
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 120 KiB After Width: | Height: | Size: 120 KiB |
|
Before Width: | Height: | Size: 120 KiB After Width: | Height: | Size: 120 KiB |
|
Before Width: | Height: | Size: 120 KiB After Width: | Height: | Size: 120 KiB |
BIN
assets/fullwidth_forms.tga
Normal file
|
After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 27 MiB |
|
Before Width: | Height: | Size: 120 KiB After Width: | Height: | Size: 120 KiB |
|
Before Width: | Height: | Size: 262 KiB After Width: | Height: | Size: 262 KiB |
|
Before Width: | Height: | Size: 180 KiB After Width: | Height: | Size: 180 KiB |
BIN
assets/puae000-e0ff.tga
Normal file
|
After Width: | Height: | Size: 324 KiB |
|
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 120 KiB |
|
Before Width: | Height: | Size: 96 KiB After Width: | Height: | Size: 120 KiB |
BIN
assets/wenquanyi.tga.gz
Normal file
79
demo/.idea/workspace.xml
generated
@@ -29,7 +29,7 @@
|
|||||||
<file leaf-file-name="GameFontDemo.kt" pinned="false" current-in-tab="false">
|
<file leaf-file-name="GameFontDemo.kt" pinned="false" current-in-tab="false">
|
||||||
<entry file="file://$PROJECT_DIR$/src/net/torvald/terrarum/imagefont/GameFontDemo.kt">
|
<entry file="file://$PROJECT_DIR$/src/net/torvald/terrarum/imagefont/GameFontDemo.kt">
|
||||||
<provider selected="true" editor-type-id="text-editor">
|
<provider selected="true" editor-type-id="text-editor">
|
||||||
<state relative-caret-position="1008">
|
<state relative-caret-position="924">
|
||||||
<caret line="72" column="55" lean-forward="false" selection-start-line="72" selection-start-column="55" selection-end-line="72" selection-end-column="55" />
|
<caret line="72" column="55" lean-forward="false" selection-start-line="72" selection-start-column="55" selection-end-line="72" selection-end-column="55" />
|
||||||
<folding>
|
<folding>
|
||||||
<element signature="e#40#238#0" expanded="true" />
|
<element signature="e#40#238#0" expanded="true" />
|
||||||
@@ -41,8 +41,8 @@
|
|||||||
<file leaf-file-name="GameFontImpl.kt" pinned="false" current-in-tab="true">
|
<file leaf-file-name="GameFontImpl.kt" pinned="false" current-in-tab="true">
|
||||||
<entry file="file://$PROJECT_DIR$/src/net/torvald/terrarum/imagefont/GameFontImpl.kt">
|
<entry file="file://$PROJECT_DIR$/src/net/torvald/terrarum/imagefont/GameFontImpl.kt">
|
||||||
<provider selected="true" editor-type-id="text-editor">
|
<provider selected="true" editor-type-id="text-editor">
|
||||||
<state relative-caret-position="375">
|
<state relative-caret-position="308">
|
||||||
<caret line="36" column="22" lean-forward="false" selection-start-line="36" selection-start-column="22" selection-end-line="36" selection-end-column="22" />
|
<caret line="22" column="42" lean-forward="false" selection-start-line="22" selection-start-column="42" selection-end-line="22" selection-end-column="42" />
|
||||||
<folding>
|
<folding>
|
||||||
<element signature="e#31#108#0" expanded="true" />
|
<element signature="e#31#108#0" expanded="true" />
|
||||||
</folding>
|
</folding>
|
||||||
@@ -121,10 +121,10 @@
|
|||||||
</option>
|
</option>
|
||||||
</component>
|
</component>
|
||||||
<component name="ProjectFrameBounds">
|
<component name="ProjectFrameBounds">
|
||||||
<option name="x" value="-8" />
|
<option name="x" value="1912" />
|
||||||
<option name="y" value="-8" />
|
<option name="y" value="136" />
|
||||||
<option name="width" value="1936" />
|
<option name="width" value="1696" />
|
||||||
<option name="height" value="1176" />
|
<option name="height" value="1026" />
|
||||||
</component>
|
</component>
|
||||||
<component name="ProjectView">
|
<component name="ProjectView">
|
||||||
<navigator currentView="ProjectPane" proportions="" version="1">
|
<navigator currentView="ProjectPane" proportions="" version="1">
|
||||||
@@ -141,6 +141,8 @@
|
|||||||
<foldersAlwaysOnTop value="true" />
|
<foldersAlwaysOnTop value="true" />
|
||||||
</navigator>
|
</navigator>
|
||||||
<panes>
|
<panes>
|
||||||
|
<pane id="Scope" />
|
||||||
|
<pane id="PackagesPane" />
|
||||||
<pane id="ProjectPane">
|
<pane id="ProjectPane">
|
||||||
<subPane>
|
<subPane>
|
||||||
<PATH>
|
<PATH>
|
||||||
@@ -187,14 +189,11 @@
|
|||||||
</PATH>
|
</PATH>
|
||||||
</subPane>
|
</subPane>
|
||||||
</pane>
|
</pane>
|
||||||
<pane id="PackagesPane" />
|
|
||||||
<pane id="Scratches" />
|
<pane id="Scratches" />
|
||||||
<pane id="Scope" />
|
|
||||||
</panes>
|
</panes>
|
||||||
</component>
|
</component>
|
||||||
<component name="PropertiesComponent">
|
<component name="PropertiesComponent">
|
||||||
<property name="settings.editor.selected.configurable" value="project.kotlinCompiler" />
|
<property name="settings.editor.selected.configurable" value="project.kotlinCompiler" />
|
||||||
<property name="settings.editor.splitter.proportion" value="0.2" />
|
|
||||||
<property name="last_opened_file_path" value="$PROJECT_DIR$" />
|
<property name="last_opened_file_path" value="$PROJECT_DIR$" />
|
||||||
<property name="project.structure.last.edited" value="Artifacts" />
|
<property name="project.structure.last.edited" value="Artifacts" />
|
||||||
<property name="project.structure.proportion" value="0.15" />
|
<property name="project.structure.proportion" value="0.15" />
|
||||||
@@ -414,12 +413,11 @@
|
|||||||
<servers />
|
<servers />
|
||||||
</component>
|
</component>
|
||||||
<component name="ToolWindowManager">
|
<component name="ToolWindowManager">
|
||||||
<frame x="-8" y="-8" width="1936" height="1176" extended-state="6" />
|
<frame x="1912" y="136" width="1696" height="1026" extended-state="6" />
|
||||||
<editor active="true" />
|
<editor active="true" />
|
||||||
<layout>
|
<layout>
|
||||||
<window_info id="Palette" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
|
<window_info id="Palette" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
|
||||||
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
|
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
|
||||||
<window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32917467" sideWeight="0.5" order="10" side_tool="false" content_ui="tabs" />
|
|
||||||
<window_info id="Palette	" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
|
<window_info id="Palette	" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
|
||||||
<window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="true" content_ui="tabs" />
|
<window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="true" content_ui="tabs" />
|
||||||
<window_info id="Maven Projects" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32960597" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
|
<window_info id="Maven Projects" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32960597" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
|
||||||
@@ -427,8 +425,7 @@
|
|||||||
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="false" weight="0.33" sideWeight="0.5" order="8" side_tool="false" content_ui="tabs" />
|
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="false" weight="0.33" sideWeight="0.5" order="8" side_tool="false" content_ui="tabs" />
|
||||||
<window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="9" side_tool="false" content_ui="tabs" />
|
<window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="9" side_tool="false" content_ui="tabs" />
|
||||||
<window_info id="Designer" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
|
<window_info id="Designer" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
|
||||||
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.21634616" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
|
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.25061125" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
|
||||||
<window_info id="LuaJ" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32960597" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
|
|
||||||
<window_info id="Structure" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.3054371" sideWeight="0.5" order="11" side_tool="false" content_ui="tabs" />
|
<window_info id="Structure" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.3054371" sideWeight="0.5" order="11" side_tool="false" content_ui="tabs" />
|
||||||
<window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
|
<window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
|
||||||
<window_info id="UI Designer" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
|
<window_info id="UI Designer" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
|
||||||
@@ -439,7 +436,9 @@
|
|||||||
<window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
|
<window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
|
||||||
<window_info id="Capture Tool" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
|
<window_info id="Capture Tool" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
|
||||||
<window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="9" side_tool="false" content_ui="combo" />
|
<window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="9" side_tool="false" content_ui="combo" />
|
||||||
|
<window_info id="LuaJ" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32960597" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
|
||||||
<window_info id="Code Iris" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="false" weight="0.32960597" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
|
<window_info id="Code Iris" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="false" weight="0.32960597" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
|
||||||
|
<window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32917467" sideWeight="0.5" order="10" side_tool="false" content_ui="tabs" />
|
||||||
<window_info id="Capture Analysis" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="8" side_tool="false" content_ui="tabs" />
|
<window_info id="Capture Analysis" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="8" side_tool="false" content_ui="tabs" />
|
||||||
<window_info id="Documentation" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.1544196" sideWeight="0.4651163" order="10" side_tool="false" content_ui="tabs" x="1380" y="-157" width="1720" height="857" />
|
<window_info id="Documentation" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.1544196" sideWeight="0.4651163" order="10" side_tool="false" content_ui="tabs" x="1380" y="-157" width="1720" height="857" />
|
||||||
<window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
|
<window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
|
||||||
@@ -459,6 +458,44 @@
|
|||||||
<option name="FILTER_TARGETS" value="false" />
|
<option name="FILTER_TARGETS" value="false" />
|
||||||
</component>
|
</component>
|
||||||
<component name="editorHistoryManager">
|
<component name="editorHistoryManager">
|
||||||
|
<entry file="file://$PROJECT_DIR$/src/net/torvald/terrarum/imagefont/GameFontDemo.kt">
|
||||||
|
<provider selected="true" editor-type-id="text-editor">
|
||||||
|
<state relative-caret-position="924">
|
||||||
|
<caret line="72" column="55" lean-forward="false" selection-start-line="72" selection-start-column="55" selection-end-line="72" selection-end-column="55" />
|
||||||
|
<folding>
|
||||||
|
<element signature="e#40#238#0" expanded="true" />
|
||||||
|
</folding>
|
||||||
|
</state>
|
||||||
|
</provider>
|
||||||
|
</entry>
|
||||||
|
<entry file="file://$PROJECT_DIR$/text.txt">
|
||||||
|
<provider selected="true" editor-type-id="text-editor">
|
||||||
|
<state relative-caret-position="252">
|
||||||
|
<caret line="18" column="0" lean-forward="false" selection-start-line="18" selection-start-column="0" selection-end-line="18" selection-end-column="0" />
|
||||||
|
<folding />
|
||||||
|
</state>
|
||||||
|
</provider>
|
||||||
|
</entry>
|
||||||
|
<entry file="file://$PROJECT_DIR$/src/net/torvald/terrarum/imagefont/GameFontImpl.kt">
|
||||||
|
<provider selected="true" editor-type-id="text-editor">
|
||||||
|
<state relative-caret-position="490">
|
||||||
|
<caret line="36" column="22" lean-forward="false" selection-start-line="36" selection-start-column="22" selection-end-line="36" selection-end-column="22" />
|
||||||
|
<folding>
|
||||||
|
<element signature="e#31#108#0" expanded="true" />
|
||||||
|
</folding>
|
||||||
|
</state>
|
||||||
|
</provider>
|
||||||
|
</entry>
|
||||||
|
<entry file="file://$PROJECT_DIR$/src/net/torvald/terrarum/imagefont/GameFontBase.kt">
|
||||||
|
<provider selected="true" editor-type-id="text-editor">
|
||||||
|
<state relative-caret-position="0">
|
||||||
|
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
|
||||||
|
<folding>
|
||||||
|
<element signature="e#31#171#0" expanded="true" />
|
||||||
|
</folding>
|
||||||
|
</state>
|
||||||
|
</provider>
|
||||||
|
</entry>
|
||||||
<entry file="file://$PROJECT_DIR$/src/net/torvald/terrarum/imagefont/GameFontDemo.kt">
|
<entry file="file://$PROJECT_DIR$/src/net/torvald/terrarum/imagefont/GameFontDemo.kt">
|
||||||
<provider selected="true" editor-type-id="text-editor">
|
<provider selected="true" editor-type-id="text-editor">
|
||||||
<state relative-caret-position="1008">
|
<state relative-caret-position="1008">
|
||||||
@@ -617,13 +654,7 @@
|
|||||||
</state>
|
</state>
|
||||||
</provider>
|
</provider>
|
||||||
</entry>
|
</entry>
|
||||||
<entry file="file://$PROJECT_DIR$/../../Ba-AA/src/net/torvald/aa/demoplayer/BaAA.java">
|
<entry file="file://$PROJECT_DIR$/../../Ba-AA/src/net/torvald/aa/demoplayer/BaAA.java" />
|
||||||
<provider selected="true" editor-type-id="text-editor">
|
|
||||||
<state relative-caret-position="273">
|
|
||||||
<caret line="428" column="8" lean-forward="false" selection-start-line="428" selection-start-column="8" selection-end-line="429" selection-end-column="87" />
|
|
||||||
</state>
|
|
||||||
</provider>
|
|
||||||
</entry>
|
|
||||||
<entry file="file://$PROJECT_DIR$/config.properties">
|
<entry file="file://$PROJECT_DIR$/config.properties">
|
||||||
<provider selected="true" editor-type-id="text-editor">
|
<provider selected="true" editor-type-id="text-editor">
|
||||||
<state relative-caret-position="0">
|
<state relative-caret-position="0">
|
||||||
@@ -658,7 +689,7 @@
|
|||||||
</entry>
|
</entry>
|
||||||
<entry file="file://$PROJECT_DIR$/src/net/torvald/terrarum/imagefont/GameFontDemo.kt">
|
<entry file="file://$PROJECT_DIR$/src/net/torvald/terrarum/imagefont/GameFontDemo.kt">
|
||||||
<provider selected="true" editor-type-id="text-editor">
|
<provider selected="true" editor-type-id="text-editor">
|
||||||
<state relative-caret-position="1008">
|
<state relative-caret-position="924">
|
||||||
<caret line="72" column="55" lean-forward="false" selection-start-line="72" selection-start-column="55" selection-end-line="72" selection-end-column="55" />
|
<caret line="72" column="55" lean-forward="false" selection-start-line="72" selection-start-column="55" selection-end-line="72" selection-end-column="55" />
|
||||||
<folding>
|
<folding>
|
||||||
<element signature="e#40#238#0" expanded="true" />
|
<element signature="e#40#238#0" expanded="true" />
|
||||||
@@ -668,8 +699,8 @@
|
|||||||
</entry>
|
</entry>
|
||||||
<entry file="file://$PROJECT_DIR$/src/net/torvald/terrarum/imagefont/GameFontImpl.kt">
|
<entry file="file://$PROJECT_DIR$/src/net/torvald/terrarum/imagefont/GameFontImpl.kt">
|
||||||
<provider selected="true" editor-type-id="text-editor">
|
<provider selected="true" editor-type-id="text-editor">
|
||||||
<state relative-caret-position="375">
|
<state relative-caret-position="308">
|
||||||
<caret line="36" column="22" lean-forward="false" selection-start-line="36" selection-start-column="22" selection-end-line="36" selection-end-column="22" />
|
<caret line="22" column="42" lean-forward="false" selection-start-line="22" selection-start-column="42" selection-end-line="22" selection-end-column="42" />
|
||||||
<folding>
|
<folding>
|
||||||
<element signature="e#31#108#0" expanded="true" />
|
<element signature="e#31#108#0" expanded="true" />
|
||||||
</folding>
|
</folding>
|
||||||
|
|||||||
@@ -2,31 +2,13 @@
|
|||||||
<module type="JAVA_MODULE" version="4">
|
<module type="JAVA_MODULE" version="4">
|
||||||
<component name="FacetManager">
|
<component name="FacetManager">
|
||||||
<facet type="kotlin-language" name="Kotlin">
|
<facet type="kotlin-language" name="Kotlin">
|
||||||
<configuration version="1">
|
<configuration version="2" platform="JVM 1.6" useProjectSettings="false">
|
||||||
<option name="compilerInfo">
|
<compilerSettings />
|
||||||
<KotlinCompilerInfo>
|
<compilerArguments>
|
||||||
<option name="compilerSettings">
|
<option name="jvmTarget" value="1.6" />
|
||||||
<CompilerSettings />
|
<option name="languageVersion" value="1.0" />
|
||||||
</option>
|
<option name="apiVersion" value="1.0" />
|
||||||
<option name="k2jsCompilerArguments">
|
</compilerArguments>
|
||||||
<K2JSCompilerArguments />
|
|
||||||
</option>
|
|
||||||
<option name="k2jvmCompilerArguments">
|
|
||||||
<K2JVMCompilerArguments />
|
|
||||||
</option>
|
|
||||||
<option name="_commonCompilerArguments">
|
|
||||||
<DummyImpl />
|
|
||||||
</option>
|
|
||||||
</KotlinCompilerInfo>
|
|
||||||
</option>
|
|
||||||
<option name="useProjectSettings" value="false" />
|
|
||||||
<option name="versionInfo">
|
|
||||||
<KotlinVersionInfo>
|
|
||||||
<option name="apiLevel" value="1.0" />
|
|
||||||
<option name="languageLevel" value="1.0" />
|
|
||||||
<option name="targetPlatformName" value="JVM 1.6" />
|
|
||||||
</KotlinVersionInfo>
|
|
||||||
</option>
|
|
||||||
</configuration>
|
</configuration>
|
||||||
</facet>
|
</facet>
|
||||||
</component>
|
</component>
|
||||||
|
|||||||
648
terrarumsansbitmap/gdx/GameFontBase.kt
Normal file
@@ -0,0 +1,648 @@
|
|||||||
|
package net.torvald.terrarumsansbitmap.gdx
|
||||||
|
|
||||||
|
import com.badlogic.gdx.Gdx
|
||||||
|
import com.badlogic.gdx.graphics.Pixmap
|
||||||
|
import com.badlogic.gdx.graphics.Texture
|
||||||
|
import com.badlogic.gdx.graphics.g2d.*
|
||||||
|
import java.io.BufferedOutputStream
|
||||||
|
import java.io.File
|
||||||
|
import java.io.FileOutputStream
|
||||||
|
import java.util.zip.GZIPInputStream
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LibGDX port of Terrarum Sans Bitmap implementation
|
||||||
|
*
|
||||||
|
* Filename and Extension for the spritesheet is hard-coded, which are:
|
||||||
|
*
|
||||||
|
* - ascii_variable.tga
|
||||||
|
* - hangul_johab.tga
|
||||||
|
* - LatinExtA_variable.tga
|
||||||
|
* - LatinExtB_variable.tga
|
||||||
|
* - kana.tga
|
||||||
|
* - cjkpunct.tga
|
||||||
|
* - wenquanyi.tga.gz
|
||||||
|
* - cyrillic_variable.tga
|
||||||
|
* - fullwidth_forms.tga
|
||||||
|
* - unipunct_variable.tga
|
||||||
|
* - greek_variable.tga
|
||||||
|
* - thai_variable.tga
|
||||||
|
* - puae000-e0ff.tga
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Glyphs are drawn lazily (calculated on-the-fly, rather than load up all), which is inevitable as we just can't load
|
||||||
|
* up 40k+ characters on the machine, which will certainly make loading time painfully long.
|
||||||
|
*
|
||||||
|
* Created by minjaesong on 2017-06-15.
|
||||||
|
*/
|
||||||
|
class GameFontBase(fontDir: String, val noShadow: Boolean = false) : BitmapFont() {
|
||||||
|
|
||||||
|
private fun getHanChosung(hanIndex: Int) = hanIndex / (JUNG_COUNT * JONG_COUNT)
|
||||||
|
private fun getHanJungseong(hanIndex: Int) = hanIndex / JONG_COUNT % JUNG_COUNT
|
||||||
|
private fun getHanJongseong(hanIndex: Int) = hanIndex % JONG_COUNT
|
||||||
|
|
||||||
|
private val jungseongWide = arrayOf(8, 12, 13, 17, 18, 21)
|
||||||
|
private val jungseongComplex = arrayOf(9, 10, 11, 14, 15, 16, 22)
|
||||||
|
|
||||||
|
private fun isJungseongWide(hanIndex: Int) = jungseongWide.contains(getHanJungseong(hanIndex))
|
||||||
|
private fun isJungseongComplex(hanIndex: Int) = jungseongComplex.contains(getHanJungseong(hanIndex))
|
||||||
|
|
||||||
|
private fun getHanInitialRow(hanIndex: Int): Int {
|
||||||
|
val ret: Int
|
||||||
|
|
||||||
|
if (isJungseongWide(hanIndex))
|
||||||
|
ret = 2
|
||||||
|
else if (isJungseongComplex(hanIndex))
|
||||||
|
ret = 4
|
||||||
|
else
|
||||||
|
ret = 0
|
||||||
|
|
||||||
|
return if (getHanJongseong(hanIndex) == 0) ret else ret + 1
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getHanMedialRow(hanIndex: Int) = if (getHanJongseong(hanIndex) == 0) 6 else 7
|
||||||
|
|
||||||
|
private fun getHanFinalRow(hanIndex: Int): Int {
|
||||||
|
val jungseongIndex = getHanJungseong(hanIndex)
|
||||||
|
|
||||||
|
return if (jungseongWide.contains(jungseongIndex))
|
||||||
|
8
|
||||||
|
else
|
||||||
|
9
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun isHangul(c: Char) = c.toInt() in 0xAC00..0xD7A3
|
||||||
|
private fun isAscii(c: Char) = c.toInt() in 0..0xFF
|
||||||
|
//private fun isRunic(c: Char) = runicList.contains(c)
|
||||||
|
private fun isExtA(c: Char) = c.toInt() in 0x100..0x17F
|
||||||
|
private fun isExtB(c: Char) = c.toInt() in 0x180..0x24F
|
||||||
|
private fun isKana(c: Char) = c.toInt() in 0x3040..0x30FF
|
||||||
|
private fun isCJKPunct(c: Char) = c.toInt() in 0x3000..0x303F
|
||||||
|
private fun isUniHan(c: Char) = c.toInt() in 0x3400..0x9FFF
|
||||||
|
private fun isCyrilic(c: Char) = c.toInt() in 0x400..0x4FF // 4FF: futureproof; currently only up to 45F is supported
|
||||||
|
private fun isFullwidthUni(c: Char) = c.toInt() in 0xFF00..0xFF1F
|
||||||
|
private fun isUniPunct(c: Char) = c.toInt() in 0x2000..0x206F
|
||||||
|
private fun isGreek(c: Char) = c.toInt() in 0x370..0x3CE
|
||||||
|
private fun isThai(c: Char) = c.toInt() in 0xE00..0xE7F
|
||||||
|
private fun isThaiDiacritics(c: Char) = c.toInt() in 0xE34..0xE3A
|
||||||
|
|| c.toInt() in 0xE47..0xE4E
|
||||||
|
|| c.toInt() == 0xE31
|
||||||
|
private fun isCustomSym(c: Char) = c.toInt() in 0xE000..0xE0FF
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private fun extAindexX(c: Char) = (c.toInt() - 0x100) % 16
|
||||||
|
private fun extAindexY(c: Char) = (c.toInt() - 0x100) / 16
|
||||||
|
|
||||||
|
private fun extBindexX(c: Char) = (c.toInt() - 0x180) % 16
|
||||||
|
private fun extBindexY(c: Char) = (c.toInt() - 0x180) / 16
|
||||||
|
|
||||||
|
//private fun runicIndexX(c: Char) = runicList.indexOf(c) % 16
|
||||||
|
//private fun runicIndexY(c: Char) = runicList.indexOf(c) / 16
|
||||||
|
|
||||||
|
private fun kanaIndexX(c: Char) = (c.toInt() - 0x3040) % 16
|
||||||
|
private fun kanaIndexY(c: Char) = (c.toInt() - 0x3040) / 16
|
||||||
|
|
||||||
|
private fun cjkPunctIndexX(c: Char) = (c.toInt() - 0x3000) % 16
|
||||||
|
private fun cjkPunctIndexY(c: Char) = (c.toInt() - 0x3000) / 16
|
||||||
|
|
||||||
|
private fun cyrilicIndexX(c: Char) = (c.toInt() - 0x400) % 16
|
||||||
|
private fun cyrilicIndexY(c: Char) = (c.toInt() - 0x400) / 16
|
||||||
|
|
||||||
|
private fun fullwidthUniIndexX(c: Char) = (c.toInt() - 0xFF00) % 16
|
||||||
|
private fun fullwidthUniIndexY(c: Char) = (c.toInt() - 0xFF00) / 16
|
||||||
|
|
||||||
|
private fun uniPunctIndexX(c: Char) = (c.toInt() - 0x2000) % 16
|
||||||
|
private fun uniPunctIndexY(c: Char) = (c.toInt() - 0x2000) / 16
|
||||||
|
|
||||||
|
private fun unihanIndexX(c: Char) = (c.toInt() - 0x3400) % 256
|
||||||
|
private fun unihanIndexY(c: Char) = (c.toInt() - 0x3400) / 256
|
||||||
|
|
||||||
|
private fun greekIndexX(c: Char) = (c.toInt() - 0x370) % 16
|
||||||
|
private fun greekIndexY(c: Char) = (c.toInt() - 0x370) / 16
|
||||||
|
|
||||||
|
private fun thaiIndexX(c: Char) = (c.toInt() - 0xE00) % 16
|
||||||
|
private fun thaiIndexY(c: Char) = (c.toInt() - 0xE00) / 16
|
||||||
|
|
||||||
|
private fun symbolIndexX(c: Char) = (c.toInt() - 0xE000) % 16
|
||||||
|
private fun symbolIndexY(c: Char) = (c.toInt() - 0xE000) / 16
|
||||||
|
|
||||||
|
private val unihanWidthSheets = arrayOf(
|
||||||
|
SHEET_UNIHAN,
|
||||||
|
SHEET_FW_UNI
|
||||||
|
)
|
||||||
|
private val variableWidthSheets = arrayOf(
|
||||||
|
SHEET_ASCII_VARW,
|
||||||
|
SHEET_EXTA_VARW,
|
||||||
|
SHEET_EXTB_VARW,
|
||||||
|
SHEET_CYRILIC_VARW,
|
||||||
|
SHEET_UNI_PUNCT,
|
||||||
|
SHEET_GREEK_VARW,
|
||||||
|
SHEET_THAI_VARW
|
||||||
|
)
|
||||||
|
|
||||||
|
private val fontParentDir = if (fontDir.endsWith('/') || fontDir.endsWith('\\')) fontDir else "$fontDir/"
|
||||||
|
private val fileList = arrayOf( // MUST BE MATCHING WITH SHEET INDICES!!
|
||||||
|
"ascii_variable.tga",
|
||||||
|
"hangul_johab.tga",
|
||||||
|
"LatinExtA_variable.tga",
|
||||||
|
"LatinExtB_variable.tga",
|
||||||
|
"kana.tga",
|
||||||
|
"cjkpunct.tga",
|
||||||
|
"wenquanyi.tga.gz",
|
||||||
|
"cyrilic_variable.tga",
|
||||||
|
"fullwidth_forms.tga",
|
||||||
|
"unipunct_variable.tga",
|
||||||
|
"greek_variable.tga",
|
||||||
|
"thai_variable.tga",
|
||||||
|
"puae000-e0ff.tga"
|
||||||
|
)
|
||||||
|
private val cyrilic_bg = "cyrilic_bulgarian_variable.tga"
|
||||||
|
private val cyrilic_sr = "cyrilic_serbian_variable.tga"
|
||||||
|
private val codeRange = arrayOf( // MUST BE MATCHING WITH SHEET INDICES!!
|
||||||
|
0..0xFF,
|
||||||
|
0xAC00..0xD7A3,
|
||||||
|
0x100..0x17F,
|
||||||
|
0x180..0x24F,
|
||||||
|
0x3040..0x30FF,
|
||||||
|
0x3000..0x303F,
|
||||||
|
0x3400..0x9FFF,
|
||||||
|
0x400..0x4FF,
|
||||||
|
0xFF00..0xFF1F,
|
||||||
|
0x2000..0x206F,
|
||||||
|
0x370..0x3CE,
|
||||||
|
0xE00..0xE7F,
|
||||||
|
0xE000..0xE0FF
|
||||||
|
)
|
||||||
|
private val glyphWidths: HashMap<Int, Int> = HashMap()
|
||||||
|
private val sheets: Array<TextureRegionPack>
|
||||||
|
|
||||||
|
|
||||||
|
init {
|
||||||
|
val sheetsPack = ArrayList<TextureRegionPack>()
|
||||||
|
|
||||||
|
// first we create pixmap to read pixels, then make texture using pixmap
|
||||||
|
fileList.forEachIndexed { index, it ->
|
||||||
|
val isVariable1 = it.endsWith("_variable.tga")
|
||||||
|
val isVariable2 = variableWidthSheets.contains(index)
|
||||||
|
val isVariable = isVariable1 && isVariable2
|
||||||
|
|
||||||
|
// idiocity check
|
||||||
|
if (isVariable1 && !isVariable2)
|
||||||
|
throw Error("[TerrarumSansBitmap] font is named as variable on the name but not enlisted as")
|
||||||
|
else if (!isVariable1 && isVariable2)
|
||||||
|
throw Error("[TerrarumSansBitmap] font is enlisted as variable on the name but not named as")
|
||||||
|
|
||||||
|
|
||||||
|
val pixmap: Pixmap
|
||||||
|
|
||||||
|
|
||||||
|
// unpack gz if applicable
|
||||||
|
if (it.endsWith(".gz")) {
|
||||||
|
val gzi = GZIPInputStream(Gdx.files.internal(fontParentDir + it).read(8192))
|
||||||
|
val wholeFile = gzi.readBytes()
|
||||||
|
gzi.close()
|
||||||
|
val fos = BufferedOutputStream(FileOutputStream("tmp_wenquanyi.tga"))
|
||||||
|
fos.write(wholeFile)
|
||||||
|
fos.flush()
|
||||||
|
fos.close()
|
||||||
|
|
||||||
|
pixmap = Pixmap(Gdx.files.internal("tmp_wenquanyi.tga"))
|
||||||
|
|
||||||
|
File("tmp_wenquanyi.tga").delete()
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pixmap = Pixmap(Gdx.files.internal(fontParentDir + it))
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (isVariable) {
|
||||||
|
println("[TerrarumSansBitmap] loading texture $it [VARIABLE]")
|
||||||
|
buildWidthTable(pixmap, codeRange[index], 16)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
println("[TerrarumSansBitmap] loading texture $it")
|
||||||
|
}
|
||||||
|
|
||||||
|
val texture = Texture(pixmap)
|
||||||
|
val texRegPack = if (isVariable) {
|
||||||
|
TextureRegionPack(texture, W_VAR_INIT, H, HGAP_VAR, 0)
|
||||||
|
}
|
||||||
|
else if (index == SHEET_UNIHAN) {
|
||||||
|
TextureRegionPack(texture, W_UNIHAN, H_UNIHAN) // the only exception that is height is 16
|
||||||
|
}
|
||||||
|
// below they all have height of 20 'H'
|
||||||
|
else if (index == SHEET_FW_UNI) {
|
||||||
|
TextureRegionPack(texture, W_UNIHAN, H)
|
||||||
|
}
|
||||||
|
else if (index == SHEET_CJK_PUNCT) {
|
||||||
|
TextureRegionPack(texture, W_ASIAN_PUNCT, H)
|
||||||
|
}
|
||||||
|
else if (index == SHEET_KANA) {
|
||||||
|
TextureRegionPack(texture, W_KANA, H)
|
||||||
|
}
|
||||||
|
else if (index == SHEET_HANGUL) {
|
||||||
|
TextureRegionPack(texture, W_HANGUL, H)
|
||||||
|
}
|
||||||
|
else if (index == SHEET_CUSTOM_SYM) {
|
||||||
|
TextureRegionPack(texture, SIZE_CUSTOM_SYM, SIZE_CUSTOM_SYM) // TODO variable
|
||||||
|
}
|
||||||
|
else throw IllegalArgumentException("[TerrarumSansBitmap] Unknown sheet index: $index")
|
||||||
|
|
||||||
|
|
||||||
|
sheetsPack.add(texRegPack)
|
||||||
|
|
||||||
|
pixmap.dispose() // you are terminated
|
||||||
|
}
|
||||||
|
|
||||||
|
sheets = sheetsPack.toTypedArray()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun reload(locale: String) {
|
||||||
|
if (locale.startsWith("ru")) {
|
||||||
|
val pixmap = Pixmap(Gdx.files.internal(fontParentDir + fileList[SHEET_CYRILIC_VARW]))
|
||||||
|
val texture = Texture(pixmap)
|
||||||
|
sheets[SHEET_CYRILIC_VARW].dispose()
|
||||||
|
sheets[SHEET_CYRILIC_VARW] = TextureRegionPack(texture, W_VAR_INIT, H, HGAP_VAR, 0)
|
||||||
|
pixmap.dispose()
|
||||||
|
}
|
||||||
|
else if (locale.startsWith("bg")) {
|
||||||
|
val pixmap = Pixmap(Gdx.files.internal(fontParentDir + cyrilic_bg))
|
||||||
|
val texture = Texture(pixmap)
|
||||||
|
sheets[SHEET_CYRILIC_VARW].dispose()
|
||||||
|
sheets[SHEET_CYRILIC_VARW] = TextureRegionPack(texture, W_VAR_INIT, H, HGAP_VAR, 0)
|
||||||
|
pixmap.dispose()
|
||||||
|
}
|
||||||
|
else if (locale.startsWith("sr")) {
|
||||||
|
val pixmap = Pixmap(Gdx.files.internal(fontParentDir + cyrilic_sr))
|
||||||
|
val texture = Texture(pixmap)
|
||||||
|
sheets[SHEET_CYRILIC_VARW].dispose()
|
||||||
|
sheets[SHEET_CYRILIC_VARW] = TextureRegionPack(texture, W_VAR_INIT, H, HGAP_VAR, 0)
|
||||||
|
pixmap.dispose()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
override fun getLineHeight(): Float = H.toFloat()
|
||||||
|
|
||||||
|
override fun getXHeight() = lineHeight
|
||||||
|
override fun getCapHeight() = lineHeight
|
||||||
|
override fun getAscent() = 0f
|
||||||
|
override fun getDescent() = 0f
|
||||||
|
|
||||||
|
override fun isFlipped() = false
|
||||||
|
|
||||||
|
override fun setFixedWidthGlyphs(glyphs: CharSequence) {
|
||||||
|
throw UnsupportedOperationException("Nope, no monospace, and figures are already fixed width, bruv.")
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
init {
|
||||||
|
setUseIntegerPositions(true)
|
||||||
|
setOwnsTexture(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
private val offsetUnihan = (H - H_UNIHAN) / 2
|
||||||
|
private val offsetCustomSym = (H - SIZE_CUSTOM_SYM) / 2
|
||||||
|
|
||||||
|
private var textBuffer: CharSequence = ""
|
||||||
|
private var textBWidth = intArrayOf() // absolute posX of glyphs from print-origin
|
||||||
|
|
||||||
|
override fun draw(batch: Batch, str: CharSequence, x: Float, y: Float): GlyphLayout? {
|
||||||
|
if (textBuffer != str) {
|
||||||
|
textBuffer = str
|
||||||
|
val widths = getWidthOfCharSeq(str)
|
||||||
|
|
||||||
|
textBWidth = Array(str.length, { charIndex ->
|
||||||
|
if (charIndex == 0)
|
||||||
|
0
|
||||||
|
else {
|
||||||
|
var acc = 0
|
||||||
|
(0..charIndex - 1).forEach { acc += widths[it] }
|
||||||
|
/*return*/acc
|
||||||
|
}
|
||||||
|
}).toIntArray()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//print("[TerrarumSansBitmap] widthTable for $textBuffer: ")
|
||||||
|
//textBWidth.forEach { print("$it ") }; println()
|
||||||
|
|
||||||
|
|
||||||
|
val mainCol = this.color.cpy()
|
||||||
|
val shadowCol = this.color.cpy().mul(0.5f)
|
||||||
|
|
||||||
|
|
||||||
|
textBuffer.forEachIndexed { index, c ->
|
||||||
|
val sheetID = getSheetType(c)
|
||||||
|
val sheetXY = getSheetwisePosition(c)
|
||||||
|
|
||||||
|
//println("[TerrarumSansBitmap] sprite: $sheetID:${sheetXY[0]}x${sheetXY[1]}")
|
||||||
|
|
||||||
|
if (sheetID != SHEET_HANGUL) {
|
||||||
|
|
||||||
|
if (!noShadow) {
|
||||||
|
batch.color = shadowCol
|
||||||
|
batch.draw(
|
||||||
|
sheets[sheetID].get(sheetXY[0], sheetXY[1]),
|
||||||
|
x + textBWidth[index] + 1,
|
||||||
|
y +
|
||||||
|
if (sheetID == SHEET_UNIHAN) // evil exceptions
|
||||||
|
offsetUnihan
|
||||||
|
else if (sheetID == SHEET_CUSTOM_SYM)
|
||||||
|
offsetCustomSym
|
||||||
|
else 0
|
||||||
|
)
|
||||||
|
batch.draw(
|
||||||
|
sheets[sheetID].get(sheetXY[0], sheetXY[1]),
|
||||||
|
x + textBWidth[index],
|
||||||
|
y - 1 +
|
||||||
|
if (sheetID == SHEET_UNIHAN) // evil exceptions
|
||||||
|
offsetUnihan
|
||||||
|
else if (sheetID == SHEET_CUSTOM_SYM)
|
||||||
|
offsetCustomSym
|
||||||
|
else 0
|
||||||
|
)
|
||||||
|
batch.draw(
|
||||||
|
sheets[sheetID].get(sheetXY[0], sheetXY[1]),
|
||||||
|
x + textBWidth[index] + 1,
|
||||||
|
y - 1 +
|
||||||
|
if (sheetID == SHEET_UNIHAN) // evil exceptions
|
||||||
|
offsetUnihan
|
||||||
|
else if (sheetID == SHEET_CUSTOM_SYM)
|
||||||
|
offsetCustomSym
|
||||||
|
else 0
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
batch.color = mainCol
|
||||||
|
batch.draw(
|
||||||
|
sheets[sheetID].get(sheetXY[0], sheetXY[1]),
|
||||||
|
x + textBWidth[index],
|
||||||
|
y +
|
||||||
|
if (sheetID == SHEET_UNIHAN) // evil exceptions
|
||||||
|
offsetUnihan
|
||||||
|
else if (sheetID == SHEET_CUSTOM_SYM)
|
||||||
|
offsetCustomSym
|
||||||
|
else 0
|
||||||
|
)
|
||||||
|
}
|
||||||
|
else { // JOHAB (assemble) HANGUL
|
||||||
|
val hangulSheet = sheets[SHEET_HANGUL]
|
||||||
|
val hIndex = c.toInt() - 0xAC00
|
||||||
|
|
||||||
|
val indexCho = getHanChosung(hIndex)
|
||||||
|
val indexJung = getHanJungseong(hIndex)
|
||||||
|
val indexJong = getHanJongseong(hIndex)
|
||||||
|
|
||||||
|
val choRow = getHanInitialRow(hIndex)
|
||||||
|
val jungRow = getHanMedialRow(hIndex)
|
||||||
|
val jongRow = getHanFinalRow(hIndex)
|
||||||
|
|
||||||
|
|
||||||
|
if (!noShadow) {
|
||||||
|
batch.color = shadowCol
|
||||||
|
|
||||||
|
batch.draw(hangulSheet.get(indexCho, choRow), x + textBWidth[index] + 1, y)
|
||||||
|
batch.draw(hangulSheet.get(indexJung, jungRow), x + textBWidth[index], y - 1)
|
||||||
|
batch.draw(hangulSheet.get(indexJong, jongRow), x + textBWidth[index] + 1, y - 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
batch.color = mainCol
|
||||||
|
batch.draw(hangulSheet.get(indexCho, choRow), x + textBWidth[index], y)
|
||||||
|
batch.draw(hangulSheet.get(indexJung, jungRow), x + textBWidth[index], y)
|
||||||
|
batch.draw(hangulSheet.get(indexJong, jongRow), x + textBWidth[index], y)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.color = mainCol
|
||||||
|
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
override fun dispose() {
|
||||||
|
super.dispose()
|
||||||
|
|
||||||
|
sheets.forEach { it.dispose() }
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getWidthOfCharSeq(s: CharSequence): IntArray {
|
||||||
|
val len = IntArray(s.length)
|
||||||
|
for (i in 0..s.lastIndex) {
|
||||||
|
val chr = s[i]
|
||||||
|
val ctype = getSheetType(s[i])
|
||||||
|
|
||||||
|
if (variableWidthSheets.contains(ctype)) {
|
||||||
|
len[i] = try {
|
||||||
|
glyphWidths[chr.toInt()]!!
|
||||||
|
}
|
||||||
|
catch (e: kotlin.KotlinNullPointerException) {
|
||||||
|
println("[TerrarumSansBitmap] no width data for glyph number ${Integer.toHexString(chr.toInt()).toUpperCase()}")
|
||||||
|
//System.exit(1)
|
||||||
|
W_LATIN_WIDE // failsafe
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (ctype == SHEET_CJK_PUNCT)
|
||||||
|
len[i] = W_ASIAN_PUNCT
|
||||||
|
else if (ctype == SHEET_HANGUL)
|
||||||
|
len[i] = W_HANGUL
|
||||||
|
else if (ctype == SHEET_KANA)
|
||||||
|
len[i] = W_KANA
|
||||||
|
else if (unihanWidthSheets.contains(ctype))
|
||||||
|
len[i] = W_UNIHAN
|
||||||
|
else if (isThaiDiacritics(s[i]))
|
||||||
|
len[i] = 0 // set width of the glyph as -W_LATIN_WIDE
|
||||||
|
else if (ctype == SHEET_CUSTOM_SYM)
|
||||||
|
len[i] = SIZE_CUSTOM_SYM
|
||||||
|
else
|
||||||
|
len[i] = W_LATIN_WIDE
|
||||||
|
|
||||||
|
if (scale > 1) len[i] *= scale
|
||||||
|
|
||||||
|
if (i < s.lastIndex) len[i] += interchar
|
||||||
|
}
|
||||||
|
return len
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getSheetType(c: Char): Int {
|
||||||
|
if (isHangul(c))
|
||||||
|
return SHEET_HANGUL
|
||||||
|
else if (isKana(c))
|
||||||
|
return SHEET_KANA
|
||||||
|
else if (isUniHan(c))
|
||||||
|
return SHEET_UNIHAN
|
||||||
|
else if (isAscii(c))
|
||||||
|
return SHEET_ASCII_VARW
|
||||||
|
else if (isExtA(c))
|
||||||
|
return SHEET_EXTA_VARW
|
||||||
|
else if (isExtB(c))
|
||||||
|
return SHEET_EXTB_VARW
|
||||||
|
else if (isCyrilic(c))
|
||||||
|
return SHEET_CYRILIC_VARW
|
||||||
|
else if (isUniPunct(c))
|
||||||
|
return SHEET_UNI_PUNCT
|
||||||
|
else if (isCJKPunct(c))
|
||||||
|
return SHEET_CJK_PUNCT
|
||||||
|
else if (isFullwidthUni(c))
|
||||||
|
return SHEET_FW_UNI
|
||||||
|
else if (isGreek(c))
|
||||||
|
return SHEET_GREEK_VARW
|
||||||
|
else if (isThai(c))
|
||||||
|
return SHEET_THAI_VARW
|
||||||
|
else if (isCustomSym(c))
|
||||||
|
return SHEET_CUSTOM_SYM
|
||||||
|
else
|
||||||
|
return SHEET_UNKNOWN
|
||||||
|
// fixed width
|
||||||
|
// fallback
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getSheetwisePosition(ch: Char): IntArray {
|
||||||
|
val sheetX: Int; val sheetY: Int
|
||||||
|
when (getSheetType(ch)) {
|
||||||
|
SHEET_UNIHAN -> {
|
||||||
|
sheetX = unihanIndexX(ch)
|
||||||
|
sheetY = unihanIndexY(ch)
|
||||||
|
}
|
||||||
|
SHEET_EXTA_VARW -> {
|
||||||
|
sheetX = extAindexX(ch)
|
||||||
|
sheetY = extAindexY(ch)
|
||||||
|
}
|
||||||
|
SHEET_EXTB_VARW -> {
|
||||||
|
sheetX = extBindexX(ch)
|
||||||
|
sheetY = extBindexY(ch)
|
||||||
|
}
|
||||||
|
SHEET_KANA -> {
|
||||||
|
sheetX = kanaIndexX(ch)
|
||||||
|
sheetY = kanaIndexY(ch)
|
||||||
|
}
|
||||||
|
SHEET_CJK_PUNCT -> {
|
||||||
|
sheetX = cjkPunctIndexX(ch)
|
||||||
|
sheetY = cjkPunctIndexY(ch)
|
||||||
|
}
|
||||||
|
SHEET_CYRILIC_VARW -> {
|
||||||
|
sheetX = cyrilicIndexX(ch)
|
||||||
|
sheetY = cyrilicIndexY(ch)
|
||||||
|
}
|
||||||
|
SHEET_FW_UNI -> {
|
||||||
|
sheetX = fullwidthUniIndexX(ch)
|
||||||
|
sheetY = fullwidthUniIndexY(ch)
|
||||||
|
}
|
||||||
|
SHEET_UNI_PUNCT -> {
|
||||||
|
sheetX = uniPunctIndexX(ch)
|
||||||
|
sheetY = uniPunctIndexY(ch)
|
||||||
|
}
|
||||||
|
SHEET_GREEK_VARW -> {
|
||||||
|
sheetX = greekIndexX(ch)
|
||||||
|
sheetY = greekIndexY(ch)
|
||||||
|
}
|
||||||
|
SHEET_THAI_VARW -> {
|
||||||
|
sheetX = thaiIndexX(ch)
|
||||||
|
sheetY = thaiIndexY(ch)
|
||||||
|
}
|
||||||
|
SHEET_CUSTOM_SYM -> {
|
||||||
|
sheetX = symbolIndexX(ch)
|
||||||
|
sheetY = symbolIndexY(ch)
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
sheetX = ch.toInt() % 16
|
||||||
|
sheetY = ch.toInt() / 16
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return intArrayOf(sheetX, sheetY)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun buildWidthTable(pixmap: Pixmap, codeRange: IntRange, cols: Int = 16) {
|
||||||
|
val binaryCodeOffset = W_VAR_INIT
|
||||||
|
|
||||||
|
val cellW = W_VAR_INIT + 1
|
||||||
|
val cellH = H
|
||||||
|
|
||||||
|
for (code in codeRange) {
|
||||||
|
|
||||||
|
val cellX = ((code - codeRange.start) % cols) * cellW
|
||||||
|
val cellY = ((code - codeRange.start) / cols) * cellH
|
||||||
|
|
||||||
|
val codeStartX = cellX + binaryCodeOffset
|
||||||
|
val codeStartY = cellY
|
||||||
|
|
||||||
|
var glyphWidth = 0
|
||||||
|
for (downCtr in 0..3) {
|
||||||
|
// if ALPHA is not zero, assume it's 1
|
||||||
|
if (pixmap.getPixel(codeStartX, codeStartY + downCtr).and(0xFF) != 0) {
|
||||||
|
glyphWidth = glyphWidth or (1 shl downCtr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
glyphWidths[code] = glyphWidth
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
|
||||||
|
internal val JUNG_COUNT = 21
|
||||||
|
internal val JONG_COUNT = 28
|
||||||
|
|
||||||
|
internal val W_ASIAN_PUNCT = 10
|
||||||
|
internal val W_HANGUL = 12
|
||||||
|
internal val W_KANA = 12
|
||||||
|
internal val W_UNIHAN = 16
|
||||||
|
internal val W_LATIN_WIDE = 9 // width of regular letters
|
||||||
|
internal val W_VAR_INIT = 15
|
||||||
|
|
||||||
|
internal val HGAP_VAR = 1
|
||||||
|
|
||||||
|
internal val H = 20
|
||||||
|
internal val H_UNIHAN = 16
|
||||||
|
|
||||||
|
internal val SIZE_CUSTOM_SYM = 18
|
||||||
|
|
||||||
|
internal val SHEET_ASCII_VARW = 0
|
||||||
|
internal val SHEET_HANGUL = 1
|
||||||
|
internal val SHEET_EXTA_VARW = 2
|
||||||
|
internal val SHEET_EXTB_VARW = 3
|
||||||
|
internal val SHEET_KANA = 4
|
||||||
|
internal val SHEET_CJK_PUNCT = 5
|
||||||
|
internal val SHEET_UNIHAN = 6
|
||||||
|
internal val SHEET_CYRILIC_VARW = 7
|
||||||
|
internal val SHEET_FW_UNI = 8
|
||||||
|
internal val SHEET_UNI_PUNCT = 9
|
||||||
|
internal val SHEET_GREEK_VARW = 10
|
||||||
|
internal val SHEET_THAI_VARW = 11
|
||||||
|
internal val SHEET_CUSTOM_SYM = 12
|
||||||
|
|
||||||
|
internal val SHEET_UNKNOWN = 254
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Runic letters list used for game. The set is
|
||||||
|
* Younger Futhark + Medieval rune 'e' + Punct + Runic Almanac
|
||||||
|
|
||||||
|
* BEWARE OF SIMILAR-LOOKING RUNES, especially:
|
||||||
|
|
||||||
|
* * Algiz ᛉ instead of Maðr ᛘ
|
||||||
|
|
||||||
|
* * Short-Twig Hagall ᚽ instead of Runic Letter E ᛂ
|
||||||
|
|
||||||
|
* * Runic Letter OE ᚯ instead of Óss ᚬ
|
||||||
|
|
||||||
|
* Examples:
|
||||||
|
* ᛭ᛋᛁᚴᚱᛁᚦᛦ᛭
|
||||||
|
* ᛭ᛂᛚᛋᛅ᛭ᛏᚱᚢᛏᚾᛁᚾᚴᚢᚾᛅ᛬ᛅᚱᚾᛅᛏᛅᛚᛋ
|
||||||
|
*/
|
||||||
|
//internal val runicList = arrayOf('ᚠ', 'ᚢ', 'ᚦ', 'ᚬ', 'ᚱ', 'ᚴ', 'ᚼ', 'ᚾ', 'ᛁ', 'ᛅ', 'ᛋ', 'ᛏ', 'ᛒ', 'ᛘ', 'ᛚ', 'ᛦ', 'ᛂ', '᛬', '᛫', '᛭', 'ᛮ', 'ᛯ', 'ᛰ')
|
||||||
|
// TODO expand to full Unicode runes
|
||||||
|
|
||||||
|
var interchar = 0
|
||||||
|
var scale = 1
|
||||||
|
set(value) {
|
||||||
|
if (value > 0) field = value
|
||||||
|
else throw IllegalArgumentException("Font scale cannot be zero or negative (input: $value)")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
45
terrarumsansbitmap/gdx/TextureRegionPack.kt
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
package net.torvald.terrarumsansbitmap.gdx
|
||||||
|
|
||||||
|
import com.badlogic.gdx.graphics.Texture
|
||||||
|
import com.badlogic.gdx.graphics.g2d.TextureRegion
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by minjaesong on 2017-06-15.
|
||||||
|
*/
|
||||||
|
class TextureRegionPack(
|
||||||
|
val texture: Texture,
|
||||||
|
val tileW: Int,
|
||||||
|
val tileH: Int,
|
||||||
|
val hGap: Int = 0,
|
||||||
|
val vGap: Int = 0,
|
||||||
|
val hFrame: Int = 0,
|
||||||
|
val vFrame: Int = 0
|
||||||
|
) {
|
||||||
|
|
||||||
|
val regions: Array<TextureRegion>
|
||||||
|
|
||||||
|
private val horizontalCount = (texture.width - 2 * hFrame + hGap) / (tileW + hGap)
|
||||||
|
private val verticalCount = (texture.height - 2 * vFrame + vGap) / (tileH + vGap)
|
||||||
|
|
||||||
|
init {
|
||||||
|
//println("texture: $texture, dim: ${texture.width} x ${texture.height}, grid: $horizontalCount x $verticalCount, cellDim: $tileW x $tileH")
|
||||||
|
|
||||||
|
regions = Array<TextureRegion>(horizontalCount * verticalCount, {
|
||||||
|
val region = TextureRegion()
|
||||||
|
val rx = (it % horizontalCount * (tileW + hGap)) + hFrame
|
||||||
|
val ry = (it / horizontalCount * (tileH + vGap)) + vFrame
|
||||||
|
|
||||||
|
region.setRegion(texture)
|
||||||
|
region.setRegion(rx, ry, tileW, tileH)
|
||||||
|
|
||||||
|
/*return*/region
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fun get(x: Int, y: Int) = regions[y * horizontalCount + x]
|
||||||
|
|
||||||
|
fun dispose() {
|
||||||
|
texture.dispose()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
1
terrarumsansbitmap/readme.md
Normal file
@@ -0,0 +1 @@
|
|||||||
|
This directory contains implementation of the font in various frameworks.
|
||||||
@@ -1,27 +1,17 @@
|
|||||||
package net.torvald.imagefont
|
package net.torvald.terrarumsansbitmap.slick2d
|
||||||
|
|
||||||
|
import net.torvald.terrarum.getPixel
|
||||||
import org.lwjgl.opengl.GL11
|
import org.lwjgl.opengl.GL11
|
||||||
import org.newdawn.slick.*
|
import org.newdawn.slick.*
|
||||||
import org.newdawn.slick.opengl.Texture
|
|
||||||
import java.nio.ByteOrder
|
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by minjaesong on 16-01-27.
|
* Created by minjaesong on 16-01-27.
|
||||||
*/
|
*/
|
||||||
open class GameFontBase : Font {
|
open class GameFontBase(val noShadow: Boolean) : Font {
|
||||||
|
|
||||||
private fun getHan(hanIndex: Int): IntArray {
|
|
||||||
val han_x = hanIndex % JONG_COUNT
|
|
||||||
val han_y = hanIndex / JONG_COUNT
|
|
||||||
val ret = intArrayOf(han_x, han_y)
|
|
||||||
return ret
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getHanChosung(hanIndex: Int) = hanIndex / (JUNG_COUNT * JONG_COUNT)
|
private fun getHanChosung(hanIndex: Int) = hanIndex / (JUNG_COUNT * JONG_COUNT)
|
||||||
|
|
||||||
private fun getHanJungseong(hanIndex: Int) = hanIndex / JONG_COUNT % JUNG_COUNT
|
private fun getHanJungseong(hanIndex: Int) = hanIndex / JONG_COUNT % JUNG_COUNT
|
||||||
|
|
||||||
private fun getHanJongseong(hanIndex: Int) = hanIndex % JONG_COUNT
|
private fun getHanJongseong(hanIndex: Int) = hanIndex % JONG_COUNT
|
||||||
|
|
||||||
private val jungseongWide = arrayOf(8, 12, 13, 17, 18, 21)
|
private val jungseongWide = arrayOf(8, 12, 13, 17, 18, 21)
|
||||||
@@ -66,6 +56,11 @@ open class GameFontBase : Font {
|
|||||||
private fun isFullwidthUni(c: Char) = c.toInt() in 0xFF00..0xFF1F
|
private fun isFullwidthUni(c: Char) = c.toInt() in 0xFF00..0xFF1F
|
||||||
private fun isUniPunct(c: Char) = c.toInt() in 0x2000..0x206F
|
private fun isUniPunct(c: Char) = c.toInt() in 0x2000..0x206F
|
||||||
private fun isGreek(c: Char) = c.toInt() in 0x370..0x3CE
|
private fun isGreek(c: Char) = c.toInt() in 0x370..0x3CE
|
||||||
|
private fun isThai(c: Char) = c.toInt() in 0xE00..0xE7F
|
||||||
|
private fun isThaiDiacritics(c: Char) = c.toInt() in 0xE34..0xE3A
|
||||||
|
|| c.toInt() in 0xE47..0xE4E
|
||||||
|
|| c.toInt() == 0xE31
|
||||||
|
private fun isCustomSym(c: Char) = c.toInt() in 0xE000..0xE0FF
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -84,9 +79,6 @@ open class GameFontBase : Font {
|
|||||||
private fun cjkPunctIndexX(c: Char) = (c.toInt() - 0x3000) % 16
|
private fun cjkPunctIndexX(c: Char) = (c.toInt() - 0x3000) % 16
|
||||||
private fun cjkPunctIndexY(c: Char) = (c.toInt() - 0x3000) / 16
|
private fun cjkPunctIndexY(c: Char) = (c.toInt() - 0x3000) / 16
|
||||||
|
|
||||||
private fun unihanIndexX(c: Char) = (c.toInt() - 0x3400) % 256
|
|
||||||
private fun unihanIndexY(c: Char) = (c.toInt() - 0x3400) / 256
|
|
||||||
|
|
||||||
private fun cyrilicIndexX(c: Char) = (c.toInt() - 0x400) % 16
|
private fun cyrilicIndexX(c: Char) = (c.toInt() - 0x400) % 16
|
||||||
private fun cyrilicIndexY(c: Char) = (c.toInt() - 0x400) / 16
|
private fun cyrilicIndexY(c: Char) = (c.toInt() - 0x400) / 16
|
||||||
|
|
||||||
@@ -96,23 +88,30 @@ open class GameFontBase : Font {
|
|||||||
private fun uniPunctIndexX(c: Char) = (c.toInt() - 0x2000) % 16
|
private fun uniPunctIndexX(c: Char) = (c.toInt() - 0x2000) % 16
|
||||||
private fun uniPunctIndexY(c: Char) = (c.toInt() - 0x2000) / 16
|
private fun uniPunctIndexY(c: Char) = (c.toInt() - 0x2000) / 16
|
||||||
|
|
||||||
|
private fun unihanIndexX(c: Char) = (c.toInt() - 0x3400) % 256
|
||||||
|
private fun unihanIndexY(c: Char) = (c.toInt() - 0x3400) / 256
|
||||||
|
|
||||||
private fun greekIndexX(c: Char) = (c.toInt() - 0x370) % 16
|
private fun greekIndexX(c: Char) = (c.toInt() - 0x370) % 16
|
||||||
private fun greekIndexY(c: Char) = (c.toInt() - 0x370) / 16
|
private fun greekIndexY(c: Char) = (c.toInt() - 0x370) / 16
|
||||||
|
|
||||||
|
private fun thaiIndexX(c: Char) = (c.toInt() - 0xE00) % 16
|
||||||
|
private fun thaiIndexY(c: Char) = (c.toInt() - 0xE00) / 16
|
||||||
|
|
||||||
|
private fun symbolIndexX(c: Char) = (c.toInt() - 0xE000) % 16
|
||||||
|
private fun symbolIndexY(c: Char) = (c.toInt() - 0xE000) / 16
|
||||||
|
|
||||||
private val unihanWidthSheets = arrayOf(
|
private val unihanWidthSheets = arrayOf(
|
||||||
SHEET_UNIHAN,
|
SHEET_UNIHAN,
|
||||||
SHEET_FW_UNI,
|
SHEET_FW_UNI,
|
||||||
SHEET_UNIHAN
|
SHEET_UNIHAN
|
||||||
)
|
)
|
||||||
private val zeroWidthSheets = arrayOf(
|
|
||||||
SHEET_COLOURCODE
|
|
||||||
)
|
|
||||||
private val variableWidthSheets = arrayOf(
|
private val variableWidthSheets = arrayOf(
|
||||||
SHEET_ASCII_VARW,
|
SHEET_ASCII_VARW,
|
||||||
SHEET_CYRILIC_VARW,
|
SHEET_CYRILIC_VARW,
|
||||||
SHEET_EXTA_VARW,
|
SHEET_EXTA_VARW,
|
||||||
SHEET_GREEK_VARW,
|
SHEET_GREEK_VARW,
|
||||||
SHEET_EXTB_VARW
|
SHEET_EXTB_VARW,
|
||||||
|
SHEET_THAI_VARW
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -126,7 +125,7 @@ open class GameFontBase : Font {
|
|||||||
|
|
||||||
if (variableWidthSheets.contains(ctype)) {
|
if (variableWidthSheets.contains(ctype)) {
|
||||||
len += try {
|
len += try {
|
||||||
asciiWidths[chr.toInt()]!!
|
glyphWidths[chr.toInt()]!!
|
||||||
}
|
}
|
||||||
catch (e: kotlin.KotlinNullPointerException) {
|
catch (e: kotlin.KotlinNullPointerException) {
|
||||||
println("KotlinNullPointerException on glyph number ${Integer.toHexString(chr.toInt()).toUpperCase()}")
|
println("KotlinNullPointerException on glyph number ${Integer.toHexString(chr.toInt()).toUpperCase()}")
|
||||||
@@ -134,8 +133,6 @@ open class GameFontBase : Font {
|
|||||||
W_LATIN_WIDE // failsafe
|
W_LATIN_WIDE // failsafe
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (zeroWidthSheets.contains(ctype))
|
|
||||||
len += 0
|
|
||||||
else if (ctype == SHEET_CJK_PUNCT)
|
else if (ctype == SHEET_CJK_PUNCT)
|
||||||
len += W_ASIAN_PUNCT
|
len += W_ASIAN_PUNCT
|
||||||
else if (ctype == SHEET_HANGUL)
|
else if (ctype == SHEET_HANGUL)
|
||||||
@@ -144,6 +141,10 @@ open class GameFontBase : Font {
|
|||||||
len += W_KANA
|
len += W_KANA
|
||||||
else if (unihanWidthSheets.contains(ctype))
|
else if (unihanWidthSheets.contains(ctype))
|
||||||
len += W_UNIHAN
|
len += W_UNIHAN
|
||||||
|
else if (isThaiDiacritics(s[i]))
|
||||||
|
len += 0 // set width of the glyph as -W_LATIN_WIDE
|
||||||
|
else if (ctype == SHEET_CUSTOM_SYM)
|
||||||
|
len += SIZE_KEYCAP
|
||||||
else
|
else
|
||||||
len += W_LATIN_WIDE
|
len += W_LATIN_WIDE
|
||||||
|
|
||||||
@@ -187,22 +188,20 @@ open class GameFontBase : Font {
|
|||||||
val jungRow = getHanMedialRow(hIndex)
|
val jungRow = getHanMedialRow(hIndex)
|
||||||
val jongRow = getHanFinalRow(hIndex)
|
val jongRow = getHanFinalRow(hIndex)
|
||||||
|
|
||||||
val glyphW = getWidth(ch.toString())
|
|
||||||
|
|
||||||
hangulSheet.getSubImage(indexCho, choRow).drawWithShadow(
|
hangulSheet.getSubImage(indexCho, choRow).drawWithShadow(
|
||||||
Math.round(x + getWidthSubstr(s, i + 1) - glyphW).toFloat(),
|
Math.round(x + getWidthSubstr(s, i + 1) - W_HANGUL).toFloat(),
|
||||||
Math.round(y).toFloat(),
|
Math.round(y).toFloat(),
|
||||||
scale.toFloat(), thisCol
|
scale.toFloat(), thisCol, noShadow
|
||||||
)
|
)
|
||||||
hangulSheet.getSubImage(indexJung, jungRow).drawWithShadow(
|
hangulSheet.getSubImage(indexJung, jungRow).drawWithShadow(
|
||||||
Math.round(x + getWidthSubstr(s, i + 1) - glyphW).toFloat(),
|
Math.round(x + getWidthSubstr(s, i + 1) - W_HANGUL).toFloat(),
|
||||||
Math.round(y).toFloat(),
|
Math.round(y).toFloat(),
|
||||||
scale.toFloat(), thisCol
|
scale.toFloat(), thisCol, noShadow
|
||||||
)
|
)
|
||||||
hangulSheet.getSubImage(indexJong, jongRow).drawWithShadow(
|
hangulSheet.getSubImage(indexJong, jongRow).drawWithShadow(
|
||||||
Math.round(x + getWidthSubstr(s, i + 1) - glyphW).toFloat(),
|
Math.round(x + getWidthSubstr(s, i + 1) - W_HANGUL).toFloat(),
|
||||||
Math.round(y).toFloat(),
|
Math.round(y).toFloat(),
|
||||||
scale.toFloat(), thisCol
|
scale.toFloat(), thisCol, noShadow
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -224,7 +223,7 @@ open class GameFontBase : Font {
|
|||||||
uniHan.getSubImage(unihanIndexX(ch), unihanIndexY(ch)).drawWithShadow(
|
uniHan.getSubImage(unihanIndexX(ch), unihanIndexY(ch)).drawWithShadow(
|
||||||
Math.round(x + getWidthSubstr(s, i + 1) - glyphW).toFloat(),
|
Math.round(x + getWidthSubstr(s, i + 1) - glyphW).toFloat(),
|
||||||
Math.round((H - H_UNIHAN) / 2 + y).toFloat(),
|
Math.round((H - H_UNIHAN) / 2 + y).toFloat(),
|
||||||
scale.toFloat(), thisCol
|
scale.toFloat(), thisCol, noShadow
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -253,19 +252,23 @@ open class GameFontBase : Font {
|
|||||||
val sheetX: Int
|
val sheetX: Int
|
||||||
val sheetY: Int
|
val sheetY: Int
|
||||||
when (prevInstance) {
|
when (prevInstance) {
|
||||||
SHEET_EXTA_VARW -> {
|
SHEET_UNIHAN -> {
|
||||||
|
sheetX = unihanIndexX(ch)
|
||||||
|
sheetY = unihanIndexY(ch)
|
||||||
|
}
|
||||||
|
SHEET_EXTA_VARW -> {
|
||||||
sheetX = extAindexX(ch)
|
sheetX = extAindexX(ch)
|
||||||
sheetY = extAindexY(ch)
|
sheetY = extAindexY(ch)
|
||||||
}
|
}
|
||||||
SHEET_EXTB_VARW -> {
|
SHEET_EXTB_VARW -> {
|
||||||
sheetX = extBindexX(ch)
|
sheetX = extBindexX(ch)
|
||||||
sheetY = extBindexY(ch)
|
sheetY = extBindexY(ch)
|
||||||
}
|
}
|
||||||
SHEET_KANA -> {
|
SHEET_KANA -> {
|
||||||
sheetX = kanaIndexX(ch)
|
sheetX = kanaIndexX(ch)
|
||||||
sheetY = kanaIndexY(ch)
|
sheetY = kanaIndexY(ch)
|
||||||
}
|
}
|
||||||
SHEET_CJK_PUNCT -> {
|
SHEET_CJK_PUNCT -> {
|
||||||
sheetX = cjkPunctIndexX(ch)
|
sheetX = cjkPunctIndexX(ch)
|
||||||
sheetY = cjkPunctIndexY(ch)
|
sheetY = cjkPunctIndexY(ch)
|
||||||
}
|
}
|
||||||
@@ -273,19 +276,27 @@ open class GameFontBase : Font {
|
|||||||
sheetX = cyrilicIndexX(ch)
|
sheetX = cyrilicIndexX(ch)
|
||||||
sheetY = cyrilicIndexY(ch)
|
sheetY = cyrilicIndexY(ch)
|
||||||
}
|
}
|
||||||
SHEET_FW_UNI -> {
|
SHEET_FW_UNI -> {
|
||||||
sheetX = fullwidthUniIndexX(ch)
|
sheetX = fullwidthUniIndexX(ch)
|
||||||
sheetY = fullwidthUniIndexY(ch)
|
sheetY = fullwidthUniIndexY(ch)
|
||||||
}
|
}
|
||||||
SHEET_UNI_PUNCT -> {
|
SHEET_UNI_PUNCT -> {
|
||||||
sheetX = uniPunctIndexX(ch)
|
sheetX = uniPunctIndexX(ch)
|
||||||
sheetY = uniPunctIndexY(ch)
|
sheetY = uniPunctIndexY(ch)
|
||||||
}
|
}
|
||||||
SHEET_GREEK_VARW -> {
|
SHEET_GREEK_VARW -> {
|
||||||
sheetX = greekIndexX(ch)
|
sheetX = greekIndexX(ch)
|
||||||
sheetY = greekIndexY(ch)
|
sheetY = greekIndexY(ch)
|
||||||
}
|
}
|
||||||
else -> {
|
SHEET_THAI_VARW -> {
|
||||||
|
sheetX = thaiIndexX(ch)
|
||||||
|
sheetY = thaiIndexY(ch)
|
||||||
|
}
|
||||||
|
SHEET_CUSTOM_SYM -> {
|
||||||
|
sheetX = symbolIndexX(ch)
|
||||||
|
sheetY = symbolIndexY(ch)
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
sheetX = ch.toInt() % 16
|
sheetX = ch.toInt() % 16
|
||||||
sheetY = ch.toInt() / 16
|
sheetY = ch.toInt() / 16
|
||||||
}
|
}
|
||||||
@@ -295,8 +306,13 @@ open class GameFontBase : Font {
|
|||||||
try {
|
try {
|
||||||
sheetKey[prevInstance]!!.getSubImage(sheetX, sheetY).drawWithShadow(
|
sheetKey[prevInstance]!!.getSubImage(sheetX, sheetY).drawWithShadow(
|
||||||
Math.round(x + getWidthSubstr(s, i + 1) - glyphW).toFloat(),
|
Math.round(x + getWidthSubstr(s, i + 1) - glyphW).toFloat(),
|
||||||
Math.round(y).toFloat(),
|
|
||||||
scale.toFloat(), thisCol
|
// to deal with the height difference of the sheets
|
||||||
|
Math.round(y).toFloat() +
|
||||||
|
(if (prevInstance == SHEET_CUSTOM_SYM) (H - SIZE_KEYCAP) / 2 // completely legit height adjustment
|
||||||
|
else 0).toFloat(),
|
||||||
|
|
||||||
|
scale.toFloat(), thisCol, noShadow
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
catch (e: ArrayIndexOutOfBoundsException) {
|
catch (e: ArrayIndexOutOfBoundsException) {
|
||||||
@@ -339,8 +355,10 @@ open class GameFontBase : Font {
|
|||||||
return SHEET_FW_UNI
|
return SHEET_FW_UNI
|
||||||
else if (isGreek(c))
|
else if (isGreek(c))
|
||||||
return SHEET_GREEK_VARW
|
return SHEET_GREEK_VARW
|
||||||
else if (c.isColourCode())
|
else if (isThai(c))
|
||||||
return SHEET_COLOURCODE
|
return SHEET_THAI_VARW
|
||||||
|
else if (isCustomSym(c))
|
||||||
|
return SHEET_CUSTOM_SYM
|
||||||
else
|
else
|
||||||
return SHEET_UNKNOWN// fixed width punctuations
|
return SHEET_UNKNOWN// fixed width punctuations
|
||||||
// fixed width
|
// fixed width
|
||||||
@@ -372,37 +390,6 @@ open class GameFontBase : Font {
|
|||||||
fun Char.isColourCode() = colourKey.containsKey(this)
|
fun Char.isColourCode() = colourKey.containsKey(this)
|
||||||
|
|
||||||
fun buildWidthTable(sheet: SpriteSheet, codeOffset: Int, codeRange: IntRange, rows: Int = 16) {
|
fun buildWidthTable(sheet: SpriteSheet, codeOffset: Int, codeRange: IntRange, rows: Int = 16) {
|
||||||
fun Byte.toUint() = java.lang.Byte.toUnsignedInt(this)
|
|
||||||
|
|
||||||
/** @return Intarray(R, G, B, A) */
|
|
||||||
fun Texture.getPixel(x: Int, y: Int): IntArray {
|
|
||||||
val textureWidth = this.textureWidth
|
|
||||||
val hasAlpha = this.hasAlpha()
|
|
||||||
|
|
||||||
val offset = (if (hasAlpha) 4 else 3) * (textureWidth * y + x) // 4: # of channels (RGBA)
|
|
||||||
|
|
||||||
if (ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN) {
|
|
||||||
return intArrayOf(
|
|
||||||
this.textureData[offset].toUint(),
|
|
||||||
this.textureData[offset + 1].toUint(),
|
|
||||||
this.textureData[offset + 2].toUint(),
|
|
||||||
if (hasAlpha)
|
|
||||||
this.textureData[offset + 3].toUint()
|
|
||||||
else 255
|
|
||||||
)
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return intArrayOf(
|
|
||||||
this.textureData[offset + 2].toUint(),
|
|
||||||
this.textureData[offset + 1].toUint(),
|
|
||||||
this.textureData[offset].toUint(),
|
|
||||||
if (hasAlpha)
|
|
||||||
this.textureData[offset + 3].toUint()
|
|
||||||
else 255
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val binaryCodeOffset = 15
|
val binaryCodeOffset = 15
|
||||||
|
|
||||||
val cellW = sheet.getSubImage(0, 0).width + 1 // should be 16
|
val cellW = sheet.getSubImage(0, 0).width + 1 // should be 16
|
||||||
@@ -424,17 +411,17 @@ open class GameFontBase : Font {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
asciiWidths[codeOffset + ccode] = glyphWidth
|
glyphWidths[codeOffset + ccode] = glyphWidth
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
||||||
|
internal val glyphWidths: HashMap<Int, Int> = HashMap()
|
||||||
|
|
||||||
lateinit internal var hangulSheet: SpriteSheet
|
lateinit internal var hangulSheet: SpriteSheet
|
||||||
lateinit internal var asciiSheet: SpriteSheet
|
lateinit internal var asciiSheet: SpriteSheet
|
||||||
|
lateinit internal var runicSheet: SpriteSheet
|
||||||
internal val asciiWidths: HashMap<Int, Int> = HashMap()
|
|
||||||
|
|
||||||
lateinit internal var extASheet: SpriteSheet
|
lateinit internal var extASheet: SpriteSheet
|
||||||
lateinit internal var extBSheet: SpriteSheet
|
lateinit internal var extBSheet: SpriteSheet
|
||||||
lateinit internal var kanaSheet: SpriteSheet
|
lateinit internal var kanaSheet: SpriteSheet
|
||||||
@@ -444,6 +431,8 @@ open class GameFontBase : Font {
|
|||||||
lateinit internal var fullwidthForms: SpriteSheet
|
lateinit internal var fullwidthForms: SpriteSheet
|
||||||
lateinit internal var uniPunct: SpriteSheet
|
lateinit internal var uniPunct: SpriteSheet
|
||||||
lateinit internal var greekSheet: SpriteSheet
|
lateinit internal var greekSheet: SpriteSheet
|
||||||
|
lateinit internal var thaiSheet: SpriteSheet
|
||||||
|
lateinit internal var customSheet: SpriteSheet
|
||||||
|
|
||||||
internal val JUNG_COUNT = 21
|
internal val JUNG_COUNT = 21
|
||||||
internal val JONG_COUNT = 28
|
internal val JONG_COUNT = 28
|
||||||
@@ -457,21 +446,23 @@ open class GameFontBase : Font {
|
|||||||
internal val H = 20
|
internal val H = 20
|
||||||
internal val H_UNIHAN = 16
|
internal val H_UNIHAN = 16
|
||||||
|
|
||||||
internal val SHEET_ASCII_VARW = 0
|
internal val SIZE_KEYCAP = 18
|
||||||
internal val SHEET_HANGUL = 1
|
|
||||||
internal val SHEET_EXTA_VARW = 3
|
|
||||||
internal val SHEET_EXTB_VARW = 4
|
|
||||||
internal val SHEET_KANA = 5
|
|
||||||
internal val SHEET_CJK_PUNCT = 6
|
|
||||||
internal val SHEET_UNIHAN = 7
|
|
||||||
internal val SHEET_CYRILIC_VARW = 8
|
|
||||||
internal val SHEET_FW_UNI = 9
|
|
||||||
internal val SHEET_UNI_PUNCT = 10
|
|
||||||
internal val SHEET_GREEK_VARW = 11
|
|
||||||
|
|
||||||
|
internal val SHEET_ASCII_VARW = 0
|
||||||
|
internal val SHEET_HANGUL = 1
|
||||||
|
internal val SHEET_EXTA_VARW = 2
|
||||||
|
internal val SHEET_EXTB_VARW = 3
|
||||||
|
internal val SHEET_KANA = 4
|
||||||
|
internal val SHEET_CJK_PUNCT = 5
|
||||||
|
internal val SHEET_UNIHAN = 6
|
||||||
|
internal val SHEET_CYRILIC_VARW = 7
|
||||||
|
internal val SHEET_FW_UNI = 8
|
||||||
|
internal val SHEET_UNI_PUNCT = 9
|
||||||
|
internal val SHEET_GREEK_VARW = 10
|
||||||
|
internal val SHEET_THAI_VARW = 11
|
||||||
|
internal val SHEET_CUSTOM_SYM = 12
|
||||||
|
|
||||||
internal val SHEET_UNKNOWN = 254
|
internal val SHEET_UNKNOWN = 254
|
||||||
internal val SHEET_COLOURCODE = 255
|
|
||||||
|
|
||||||
lateinit internal var sheetKey: Array<SpriteSheet?>
|
lateinit internal var sheetKey: Array<SpriteSheet?>
|
||||||
|
|
||||||
@@ -493,8 +484,8 @@ open class GameFontBase : Font {
|
|||||||
*/
|
*/
|
||||||
internal val runicList = arrayOf('ᚠ', 'ᚢ', 'ᚦ', 'ᚬ', 'ᚱ', 'ᚴ', 'ᚼ', 'ᚾ', 'ᛁ', 'ᛅ', 'ᛋ', 'ᛏ', 'ᛒ', 'ᛘ', 'ᛚ', 'ᛦ', 'ᛂ', '᛬', '᛫', '᛭', 'ᛮ', 'ᛯ', 'ᛰ')
|
internal val runicList = arrayOf('ᚠ', 'ᚢ', 'ᚦ', 'ᚬ', 'ᚱ', 'ᚴ', 'ᚼ', 'ᚾ', 'ᛁ', 'ᛅ', 'ᛋ', 'ᛏ', 'ᛒ', 'ᛘ', 'ᛚ', 'ᛦ', 'ᛂ', '᛬', '᛫', '᛭', 'ᛮ', 'ᛯ', 'ᛰ')
|
||||||
|
|
||||||
internal var interchar = 0
|
var interchar = 0
|
||||||
internal var scale = 1
|
var scale = 1
|
||||||
set(value) {
|
set(value) {
|
||||||
if (value > 0) field = value
|
if (value > 0) field = value
|
||||||
else throw IllegalArgumentException("Font scale cannot be zero or negative (input: $value)")
|
else throw IllegalArgumentException("Font scale cannot be zero or negative (input: $value)")
|
||||||
@@ -546,13 +537,15 @@ open class GameFontBase : Font {
|
|||||||
}// end of companion object
|
}// end of companion object
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Image.drawWithShadow(x: Float, y: Float, color: Color) =
|
fun Image.drawWithShadow(x: Float, y: Float, color: Color, noShadow: Boolean) =
|
||||||
this.drawWithShadow(x, y, 1f, color)
|
this.drawWithShadow(x, y, 1f, color, noShadow)
|
||||||
|
|
||||||
fun Image.drawWithShadow(x: Float, y: Float, scale: Float, color: Color) {
|
fun Image.drawWithShadow(x: Float, y: Float, scale: Float, color: Color, noShadow: Boolean) {
|
||||||
this.draw(x + 1, y + 1, scale, color.darker(0.5f))
|
if (!noShadow) {
|
||||||
this.draw(x , y + 1, scale, color.darker(0.5f))
|
this.draw(x + 1, y + 1, scale, color.darker(0.5f))
|
||||||
this.draw(x + 1, y , scale, color.darker(0.5f))
|
this.draw(x, y + 1, scale, color.darker(0.5f))
|
||||||
|
this.draw(x + 1, y, scale, color.darker(0.5f))
|
||||||
|
}
|
||||||
|
|
||||||
this.draw(x, y, scale, color)
|
this.draw(x, y, scale, color)
|
||||||
}
|
}
|
||||||
81
terrarumsansbitmap/slick2d/GameFontImpl.kt
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
package net.torvald.terrarumsansbitmap.slick2d
|
||||||
|
|
||||||
|
import net.torvald.terrarum.Terrarum
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by minjaesong on 16-01-20.
|
||||||
|
*/
|
||||||
|
class GameFontImpl(noShadow: Boolean = false) : GameFontBase(noShadow = noShadow) {
|
||||||
|
|
||||||
|
init {
|
||||||
|
|
||||||
|
GameFontBase.hangulSheet = org.newdawn.slick.SpriteSheet(
|
||||||
|
"./assets/graphics/fonts/hangul_johab.tga", GameFontBase.W_HANGUL, GameFontBase.H)
|
||||||
|
GameFontBase.asciiSheet = org.newdawn.slick.SpriteSheet(
|
||||||
|
"./assets/graphics/fonts/ascii_variable.tga", 15, 19, 1)
|
||||||
|
GameFontBase.runicSheet = org.newdawn.slick.SpriteSheet(
|
||||||
|
"./assets/graphics/fonts/futhark.tga", GameFontBase.W_LATIN_WIDE, GameFontBase.H)
|
||||||
|
GameFontBase.extASheet = org.newdawn.slick.SpriteSheet(
|
||||||
|
"./assets/graphics/fonts/LatinExtA_variable.tga", 15, 19, 1)
|
||||||
|
GameFontBase.extBSheet = org.newdawn.slick.SpriteSheet(
|
||||||
|
"./assets/graphics/fonts/LatinExtB_variable.tga", 15, 19, 1)
|
||||||
|
GameFontBase.kanaSheet = org.newdawn.slick.SpriteSheet(
|
||||||
|
"./assets/graphics/fonts/kana.tga", GameFontBase.W_KANA, GameFontBase.H)
|
||||||
|
GameFontBase.cjkPunct = org.newdawn.slick.SpriteSheet(
|
||||||
|
"./assets/graphics/fonts/cjkpunct.tga", GameFontBase.W_ASIAN_PUNCT, GameFontBase.H)
|
||||||
|
GameFontBase.cyrilic = org.newdawn.slick.SpriteSheet(
|
||||||
|
when (Terrarum.gameLocale.substring(0..1)) {
|
||||||
|
"bg" -> "./assets/graphics/fonts/cyrilic_bulgarian_variable.tga"
|
||||||
|
"sr" -> "./assets/graphics/fonts/cyrilic_serbian_variable.tga"
|
||||||
|
else -> "./assets/graphics/fonts/cyrilic_variable.tga"
|
||||||
|
}, 15, 19, 1)
|
||||||
|
GameFontBase.fullwidthForms = org.newdawn.slick.SpriteSheet(
|
||||||
|
"./assets/graphics/fonts/fullwidth_forms.tga", GameFontBase.W_UNIHAN, GameFontBase.H_UNIHAN)
|
||||||
|
GameFontBase.uniPunct = org.newdawn.slick.SpriteSheet(
|
||||||
|
"./assets/graphics/fonts/unipunct.tga", GameFontBase.W_LATIN_WIDE, GameFontBase.H)
|
||||||
|
GameFontBase.uniHan = org.newdawn.slick.SpriteSheet(
|
||||||
|
"./assets/graphics/fonts/wenquanyi.tga.gz", 16, 16) // ~32 MB
|
||||||
|
GameFontBase.greekSheet = org.newdawn.slick.SpriteSheet(
|
||||||
|
"./assets/graphics/fonts/greek_variable.tga", 15, 19, 1)
|
||||||
|
GameFontBase.thaiSheet = org.newdawn.slick.SpriteSheet(
|
||||||
|
"./assets/graphics/fonts/thai_variable.tga", 15, 19, 1)
|
||||||
|
GameFontBase.customSheet = org.newdawn.slick.SpriteSheet(
|
||||||
|
"./assets/graphics/fonts/puae000-e0ff.tga", GameFontBase.SIZE_KEYCAP, GameFontBase.SIZE_KEYCAP)
|
||||||
|
|
||||||
|
val shk = arrayOf(
|
||||||
|
GameFontBase.asciiSheet,
|
||||||
|
GameFontBase.hangulSheet,
|
||||||
|
GameFontBase.runicSheet,
|
||||||
|
GameFontBase.extASheet,
|
||||||
|
GameFontBase.extBSheet,
|
||||||
|
GameFontBase.kanaSheet,
|
||||||
|
GameFontBase.cjkPunct,
|
||||||
|
GameFontBase.uniHan,
|
||||||
|
GameFontBase.cyrilic,
|
||||||
|
GameFontBase.fullwidthForms,
|
||||||
|
GameFontBase.uniPunct,
|
||||||
|
GameFontBase.greekSheet,
|
||||||
|
GameFontBase.thaiSheet,
|
||||||
|
null, // Thai EF, filler because not being used right now
|
||||||
|
GameFontBase.customSheet
|
||||||
|
)
|
||||||
|
GameFontBase.sheetKey = shk
|
||||||
|
|
||||||
|
|
||||||
|
buildWidthTable(GameFontBase.asciiSheet, 0, 0..0xFF)
|
||||||
|
buildWidthTable(GameFontBase.extASheet, 0x100, 0..0x7F)
|
||||||
|
buildWidthTable(GameFontBase.extBSheet, 0x180, 0..0xCF)
|
||||||
|
buildWidthTable(GameFontBase.cyrilic, 0x400, 0..0x5F)
|
||||||
|
buildWidthTable(GameFontBase.greekSheet, 0x370, 0..0x5F)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun reload() {
|
||||||
|
GameFontBase.cyrilic.destroy()
|
||||||
|
GameFontBase.cyrilic = org.newdawn.slick.SpriteSheet(
|
||||||
|
when (Terrarum.gameLocale.substring(0..1)) {
|
||||||
|
"bg" -> "./assets/graphics/fonts/cyrilic_bulgarian_variable.tga"
|
||||||
|
"sr" -> "./assets/graphics/fonts/cyrilic_serbian_variable.tga"
|
||||||
|
else -> "./assets/graphics/fonts/cyrilic_variable.tga"
|
||||||
|
}, 15, 19, 1)
|
||||||
|
}
|
||||||
|
}
|
||||||