mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-03-07 20:31:51 +09:00
Basic Latin, Ext-A
Former-commit-id: 82df422b6a9b9e9c0fba0d11762cbdf2ca5b6f40 Former-commit-id: ff29dc32eb21b9626c78eb53518f5eff12439832
This commit is contained in:
@@ -55,9 +55,8 @@ open class GameFontBase : Font {
|
||||
|
||||
}
|
||||
|
||||
private fun isExtAEF(c: Char) = extAEFList.contains(c)
|
||||
private fun isHangul(c: Char) = c.toInt() >= 0xAC00 && c.toInt() < 0xD7A4
|
||||
private fun isAscii(c: Char) = c.toInt() > 0x20 && c.toInt() <= 0xFF
|
||||
private fun isAscii(c: Char) = c.toInt() >= 0x20 && c.toInt() <= 0xFF
|
||||
private fun isRunic(c: Char) = runicList.contains(c)
|
||||
private fun isExtA(c: Char) = c.toInt() >= 0x100 && c.toInt() < 0x180
|
||||
private fun isKana(c: Char) = c.toInt() >= 0x3040 && c.toInt() < 0x3100
|
||||
@@ -82,19 +81,9 @@ open class GameFontBase : Font {
|
||||
|
||||
|
||||
|
||||
private fun asciiEFindexX(c: Char) = asciiEFList.indexOf(c) % 16
|
||||
private fun asciiEFindexY(c: Char) = asciiEFList.indexOf(c) / 16
|
||||
|
||||
private fun extAindexX(c: Char) = (c.toInt() - 0x100) % 16
|
||||
private fun extAindexY(c: Char) = (c.toInt() - 0x100) / 16
|
||||
|
||||
private fun extAEFindexX(c: Char) =
|
||||
if (isThaiEF(c)) 3 // thai เ
|
||||
else extAEFList.indexOf(c) % 16
|
||||
private fun extAEFindexY(c: Char) =
|
||||
if (isThaiEF(c)) 0 // thai เ
|
||||
else extAEFList.indexOf(c) / 16
|
||||
|
||||
private fun runicIndexX(c: Char) = runicList.indexOf(c) % 16
|
||||
private fun runicIndexY(c: Char) = runicList.indexOf(c) / 16
|
||||
|
||||
@@ -143,7 +132,6 @@ open class GameFontBase : Font {
|
||||
private fun keycapIndexY(c: Char) = (c.toInt() - 0xE000) / 16
|
||||
|
||||
private val narrowWidthSheets = arrayOf(
|
||||
SHEET_EXTA_EF,
|
||||
SHEET_CYRILIC_EF,
|
||||
SHEET_GREEK_EF,
|
||||
SHEET_EXTB_ROMANIAN_EF
|
||||
@@ -185,7 +173,7 @@ open class GameFontBase : Font {
|
||||
|
||||
if (chr.toInt() == 0x21B) // HAX!
|
||||
len += 6
|
||||
else if (ctype == SHEET_ASCII_VARW) // HAX!
|
||||
else if (ctype == SHEET_ASCII_VARW || ctype == SHEET_EXTA_VARW)
|
||||
len += asciiWidths[chr.toInt()]!!
|
||||
else if (zeroWidthSheets.contains(ctype))
|
||||
len += 0
|
||||
@@ -385,15 +373,11 @@ open class GameFontBase : Font {
|
||||
val sheetX: Int
|
||||
val sheetY: Int
|
||||
when (prevInstance) {
|
||||
SHEET_EXTA_EF -> {
|
||||
sheetX = extAEFindexX(ch)
|
||||
sheetY = extAEFindexY(ch)
|
||||
}
|
||||
SHEET_RUNIC -> {
|
||||
sheetX = runicIndexX(ch)
|
||||
sheetY = runicIndexY(ch)
|
||||
}
|
||||
SHEET_EXTA_EM -> {
|
||||
SHEET_EXTA_VARW -> {
|
||||
sheetX = extAindexX(ch)
|
||||
sheetY = extAindexY(ch)
|
||||
}
|
||||
@@ -492,16 +476,14 @@ open class GameFontBase : Font {
|
||||
|
||||
private fun getSheetType(c: Char): Int {
|
||||
// EFs
|
||||
if (isExtAEF(c))
|
||||
return SHEET_EXTA_EF
|
||||
else if (isCyrilicEF(c))
|
||||
if (isCyrilicEF(c))
|
||||
return SHEET_CYRILIC_EF
|
||||
else if (isGreekEF(c))
|
||||
return SHEET_GREEK_EF
|
||||
else if (isRomanianEF(c))
|
||||
return SHEET_EXTB_ROMANIAN_EF
|
||||
else if (isThaiEF(c))
|
||||
return SHEET_EXTA_EF // will use fourth glyph in EXTA_EF
|
||||
return SHEET_EXTA_VARW // will use fourth glyph in EXTA_EF
|
||||
else if (isRunic(c))
|
||||
return SHEET_RUNIC
|
||||
else if (isHangul(c))
|
||||
@@ -513,7 +495,7 @@ open class GameFontBase : Font {
|
||||
else if (isAscii(c))
|
||||
return SHEET_ASCII_VARW
|
||||
else if (isExtA(c))
|
||||
return SHEET_EXTA_EM
|
||||
return SHEET_EXTA_VARW
|
||||
else if (isCyrilic(c))
|
||||
return SHEET_CYRILIC_EM
|
||||
else if (isUniPunct(c))
|
||||
@@ -576,12 +558,10 @@ open class GameFontBase : Font {
|
||||
* Assumes spritesheet to has 16x16 cells
|
||||
*/
|
||||
fun buildAsciiWidthTable() {
|
||||
val binaryCodeOffset = 16
|
||||
val binaryCodeOffset = 15
|
||||
|
||||
val cellW = asciiSheet.getSubImage(0, 0).width // should be 16
|
||||
val cellH = asciiSheet.getSubImage(0, 0).height // should be 20
|
||||
|
||||
asciiWidths = HashMap()
|
||||
val cellW = asciiSheet.getSubImage(0, 0).width + 1 // should be 16
|
||||
val cellH = asciiSheet.getSubImage(0, 0).height + 1 // should be 20
|
||||
|
||||
// control chars
|
||||
for (ccode in 0..255) {
|
||||
@@ -594,26 +574,50 @@ open class GameFontBase : Font {
|
||||
var glyphWidth = 0
|
||||
for (downCtr in 0..3) {
|
||||
// if alpha is not zero, assume it's 1
|
||||
if (asciiSheet.texture.getPixel(codeStartX, codeStartY + downCtr)[3] != 0) {
|
||||
if (asciiSheet.texture.getPixel(codeStartX, codeStartY + downCtr)[3] == 255) {
|
||||
glyphWidth = glyphWidth or (1 shl downCtr)
|
||||
}
|
||||
}
|
||||
|
||||
println("Char $ccode, width: $glyphWidth")
|
||||
asciiWidths[ccode] = glyphWidth
|
||||
}
|
||||
}
|
||||
|
||||
fun buildLatinExtAWidthTable() {
|
||||
val binaryCodeOffset = 15
|
||||
|
||||
val cellW = extASheet.getSubImage(0, 0).width + 1 // should be 16
|
||||
val cellH = extASheet.getSubImage(0, 0).height + 1 // should be 20
|
||||
|
||||
// control chars
|
||||
for (ccode in 0..127) {
|
||||
val glyphX = ccode % 16
|
||||
val glyphY = ccode / 16
|
||||
|
||||
val codeStartX = (glyphX * cellW) + binaryCodeOffset
|
||||
val codeStartY = (glyphY * cellH)
|
||||
|
||||
var glyphWidth = 0
|
||||
for (downCtr in 0..3) {
|
||||
// if alpha is not zero, assume it's 1
|
||||
if (extASheet.texture.getPixel(codeStartX, codeStartY + downCtr)[3] == 255) {
|
||||
glyphWidth = glyphWidth or (1 shl downCtr)
|
||||
}
|
||||
}
|
||||
|
||||
asciiWidths[0x100 + ccode] = glyphWidth
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
||||
lateinit internal var hangulSheet: SpriteSheet
|
||||
lateinit internal var asciiSheet: SpriteSheet
|
||||
|
||||
lateinit internal var asciiWidths: HashMap<Int, Int>
|
||||
internal val asciiWidths: HashMap<Int, Int> = HashMap()
|
||||
|
||||
lateinit internal var runicSheet: SpriteSheet
|
||||
lateinit internal var extASheet: SpriteSheet
|
||||
lateinit internal var extASheetEF: SpriteSheet
|
||||
lateinit internal var kanaSheet: SpriteSheet
|
||||
lateinit internal var cjkPunct: SpriteSheet
|
||||
// static SpriteSheet uniHan;
|
||||
@@ -649,45 +653,30 @@ open class GameFontBase : Font {
|
||||
internal val SIZE_KEYCAP = 18
|
||||
|
||||
internal val SHEET_ASCII_VARW = 0
|
||||
internal val SHEET_HANGUL = 2
|
||||
internal val SHEET_RUNIC = 3
|
||||
internal val SHEET_EXTA_EM = 4
|
||||
internal val SHEET_EXTA_EF = 5
|
||||
internal val SHEET_KANA = 6
|
||||
internal val SHEET_CJK_PUNCT = 7
|
||||
internal val SHEET_UNIHAN = 8
|
||||
internal val SHEET_CYRILIC_EM = 9
|
||||
internal val SHEET_CYRILIC_EF = 10
|
||||
internal val SHEET_FW_UNI = 11
|
||||
internal val SHEET_UNI_PUNCT = 12
|
||||
internal val SHEET_WENQUANYI_1 = 13
|
||||
internal val SHEET_WENQUANYI_2 = 14
|
||||
internal val SHEET_GREEK_EM = 15
|
||||
internal val SHEET_GREEK_EF = 16
|
||||
internal val SHEET_EXTB_ROMANIAN_EM = 17
|
||||
internal val SHEET_EXTB_ROMANIAN_EF = 18
|
||||
internal val SHEET_THAI_EM = 19
|
||||
internal val SHEET_THAI_EF = 20
|
||||
internal val SHEET_KEYCAP = 21
|
||||
internal val SHEET_HANGUL = 1
|
||||
internal val SHEET_RUNIC = 2
|
||||
internal val SHEET_EXTA_VARW = 3
|
||||
internal val SHEET_KANA = 4
|
||||
internal val SHEET_CJK_PUNCT = 5
|
||||
internal val SHEET_UNIHAN = 6
|
||||
internal val SHEET_CYRILIC_EM = 7
|
||||
internal val SHEET_CYRILIC_EF = 8
|
||||
internal val SHEET_FW_UNI = 9
|
||||
internal val SHEET_UNI_PUNCT = 10
|
||||
internal val SHEET_WENQUANYI_1 = 11
|
||||
internal val SHEET_WENQUANYI_2 = 12
|
||||
internal val SHEET_GREEK_EM = 13
|
||||
internal val SHEET_GREEK_EF = 14
|
||||
internal val SHEET_EXTB_ROMANIAN_EM = 15
|
||||
internal val SHEET_EXTB_ROMANIAN_EF = 16
|
||||
internal val SHEET_THAI_EM = 17
|
||||
internal val SHEET_THAI_EF = 18
|
||||
internal val SHEET_KEYCAP = 19
|
||||
|
||||
internal val SHEET_UNKNOWN = 254
|
||||
internal val SHEET_COLOURCODE = 255
|
||||
|
||||
lateinit internal var sheetKey: Array<SpriteSheet?>
|
||||
internal val asciiEFList = arrayOf(' ', '!', '"', '\'', '(', ')', ',', '.', ':', ';', 'I', '[', ']', '`', 'f', 'i', 'j', 'l', 't', '{', '|', '}', 0xA1.toChar(), 'Ì', 'Í', 'Î', 'Ï', 'ì', 'í', 'î', 'ï', '·')
|
||||
internal val extAEFList = arrayOf(
|
||||
0x12E.toChar(),
|
||||
0x12F.toChar(),
|
||||
0x130.toChar(),
|
||||
0x131.toChar(),
|
||||
0x135.toChar(),
|
||||
0x13A.toChar(),
|
||||
0x13C.toChar(),
|
||||
0x142.toChar(),
|
||||
0x163.toChar(),
|
||||
0x167.toChar(),
|
||||
0x17F.toChar()
|
||||
)
|
||||
internal val cyrilecEFList = arrayOf(
|
||||
0x406.toChar(),
|
||||
0x407.toChar(),
|
||||
|
||||
@@ -12,13 +12,11 @@ class GameFontWhite : GameFontBase() {
|
||||
GameFontBase.hangulSheet = SpriteSheet(
|
||||
"./assets/graphics/fonts/hangul_johab.tga", GameFontBase.W_HANGUL, GameFontBase.H_HANGUL)
|
||||
GameFontBase.asciiSheet = SpriteSheet(
|
||||
"./assets/graphics/fonts/ascii_variable.tga", 16, 20)
|
||||
"./assets/graphics/fonts/ascii_variable.tga", 15, 19, 1)
|
||||
GameFontBase.runicSheet = SpriteSheet(
|
||||
"./assets/graphics/fonts/futhark.tga", GameFontBase.W_LATIN_WIDE, GameFontBase.H)
|
||||
GameFontBase.extASheet = SpriteSheet(
|
||||
"./assets/graphics/fonts/LatinExtA_fullwidth.tga", GameFontBase.W_LATIN_WIDE, GameFontBase.H)
|
||||
GameFontBase.extASheetEF = SpriteSheet(
|
||||
"./assets/graphics/fonts/LatinExtA_ef.tga", GameFontBase.W_LATIN_NARROW, GameFontBase.H)
|
||||
"./assets/graphics/fonts/LatinExtA_variable.tga", 15, 19, 1)
|
||||
GameFontBase.kanaSheet = SpriteSheet(
|
||||
"./assets/graphics/fonts/kana.tga", GameFontBase.W_KANA, GameFontBase.H_KANA)
|
||||
GameFontBase.cjkPunct = SpriteSheet(
|
||||
@@ -57,11 +55,9 @@ class GameFontWhite : GameFontBase() {
|
||||
|
||||
val shk = arrayOf(
|
||||
GameFontBase.asciiSheet,
|
||||
null,
|
||||
GameFontBase.hangulSheet,
|
||||
GameFontBase.runicSheet,
|
||||
GameFontBase.extASheet,
|
||||
GameFontBase.extASheetEF,
|
||||
GameFontBase.kanaSheet,
|
||||
GameFontBase.cjkPunct,
|
||||
null, // Full unihan, filler because we're using WenQuanYi
|
||||
@@ -83,5 +79,6 @@ class GameFontWhite : GameFontBase() {
|
||||
|
||||
|
||||
buildAsciiWidthTable()
|
||||
buildLatinExtAWidthTable()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -67,6 +67,7 @@ nopqrstuvwxyz
|
||||
//g.font = Terrarum.fontSmallNumbers
|
||||
//g.font = segfont
|
||||
//g.font = mtfont
|
||||
g.background = Color(0x282828)
|
||||
g.font = Terrarum.fontGame
|
||||
|
||||
val line = " **** TERRAN BASIC V0.5 **** "
|
||||
@@ -82,7 +83,7 @@ nopqrstuvwxyz
|
||||
|
||||
g.drawString("Syö salmiakkia perkele", 480f, 10f)
|
||||
|
||||
val text = arrayOf(
|
||||
/*val text = arrayOf(
|
||||
"Kedok Ketawa (The Laughing Mask) is a 1940 action film from the Dutch East Indies, in",
|
||||
"present-day Indonesia. After a young couple falls in love, the title character, a",
|
||||
"vigilante, helps them fight off criminals who have been sent to kidnap the woman by a",
|
||||
@@ -95,42 +96,48 @@ nopqrstuvwxyz
|
||||
"reviews, particularly for its cinematography. Following the success of the film, Union",
|
||||
"produced another six before being shut down in early 1942 during the Japanese",
|
||||
"occupation. Screened until at least August 1944, the film may be lost."
|
||||
)*/
|
||||
|
||||
val text = arrayOf(
|
||||
"The Olympic marmot (Marmota olympus) is a rodent in the squirrel family, Sciuridae.",
|
||||
"It lives only in the U.S. state of Washington, at middle elevations on the Olympic Peninsula.",
|
||||
"About the size of a domestic cat, an adult weighs around 8 kg (18 lb) in summer.",
|
||||
"",
|
||||
"Brná je část statutárního a krajského města Ústí nad Labem v České republice, spadající",
|
||||
"pod městský obvod Ústí nad Labem-Střekov. Nachází se asi pět kilometrů jižně od centra",
|
||||
"města v Českém středohoří na pravém břehu řeky Labe.",
|
||||
"",
|
||||
"Malaysia er en forholdsvis ung stat. Sin endelige udstrækning fik den først i 1965 efter,",
|
||||
"at Singapore trak sig ud. Staten blev grundlagt ved en sammenslutning af flere tidligere",
|
||||
"britiske besiddelser, foreløbigt i 1957 og endeligt i 1963.",
|
||||
"",
|
||||
"διαφυλάξτε γενικά τη ζωή σας από βαθειά ψυχικά τραύματα",
|
||||
"Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства.",
|
||||
"Příliš žluťoučký kůň úpěl ďábelské ódy. Árvíztűrő tükörfúrógép ",
|
||||
"Põdur Zagrebi tšellomängija-följetonist Ciqo külmetas kehvas garaažis ",
|
||||
"Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich",
|
||||
"Pijamalı hasta yağız şoföre çabucak güvendi. Kŕdeľ ďatľov učí koňa žrať kôru.",
|
||||
"Voix ambiguë d'un cœur qui au zéphyr préfère les jattes de kiwi",
|
||||
"",
|
||||
"Discografia Siei se compune din șase albume de studio, șase albume live, treizeci și",
|
||||
"patru discuri single (inclusiv unsprezece ca și artist secundar), și cincisprezece",
|
||||
"videoclipuri. Până în octombrie 2014, a vândut 25 de milioane de cântece în întreaga lume.",
|
||||
"",
|
||||
"Málið snerist um ofbeldi lögregluþjóna gegn fjölskyldu blökkumanna, en afar sjaldgæft var",
|
||||
"á þessum árum að slík mál kæmu fyrir æðstu dómstig. Fordæmið tryggði framgang sambærilegra",
|
||||
"mála sem einkenndust af því að opinberir aðilar virtu ekki stjórnarskrárvarin réttindi einstaklingsins.",
|
||||
"",
|
||||
"Also supports:",
|
||||
"키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다.",
|
||||
"とりなくこゑす ゆめさませ みよあけわたる ひんかしを そらいろはえて おきつへに ほふねむれゐぬ もやのうち",
|
||||
"鳥啼く声す 夢覚ませ 見よ明け渡る 東を 空色栄えて 沖つ辺に 帆船群れゐぬ 靄の中 (using WenQuanYi)",
|
||||
""
|
||||
)
|
||||
|
||||
text.forEachIndexed { i, s ->
|
||||
g.drawString(s, 10f, 70f + 20 * i)
|
||||
}
|
||||
|
||||
/*g.drawString("The Olympic marmot (Marmota olympus) is a rodent in the squirrel family, Sciuridae.", 10f, 70f)
|
||||
g.drawString("It lives only in the U.S. state of Washington, at middle elevations on the Olympic Peninsula.", 10f, 90f)
|
||||
g.drawString("About the size of a domestic cat, an adult weighs around 8 kg (18 lb) in summer.", 10f, 110f)
|
||||
|
||||
g.drawString("Brná je část statutárního a krajského města Ústí nad Labem v České republice, spadající", 10f, 150f)
|
||||
g.drawString("pod městský obvod Ústí nad Labem-Střekov. Nachází se asi pět kilometrů jižně od centra", 10f, 170f)
|
||||
g.drawString("města v Českém středohoří na pravém břehu řeky Labe.", 10f, 190f)
|
||||
|
||||
g.drawString("Malaysia er en forholdsvis ung stat. Sin endelige udstrækning fik den først i 1965 efter,", 10f, 230f)
|
||||
g.drawString("at Singapore trak sig ud. Staten blev grundlagt ved en sammenslutning af flere tidligere", 10f, 250f)
|
||||
g.drawString("britiske besiddelser, foreløbigt i 1957 og endeligt i 1963.", 10f, 270f)
|
||||
|
||||
g.drawString("Ο Αρθούρος Ρεμπώ ήταν Γάλλος ποιητής. Θεωρείται ένας από τους μείζονες εκπροσώπους του", 10f, 310f)
|
||||
g.drawString("συμβολισμού, με σημαντική επίδραση στη μοντέρνα ποίηση, παρά το γεγονός πως εγκατέλειψε", 10f, 330f)
|
||||
g.drawString("οριστικά τη λογοτεχνία στην ηλικία των είκοσι ετών.", 10f, 350f)
|
||||
|
||||
g.drawString("Discografia Siei se compune din șase albume de studio, șase albume live, treizeci și", 10f, 390f)
|
||||
g.drawString("patru discuri single (inclusiv unsprezece ca și artist secundar), și cincisprezece", 10f, 410f)
|
||||
g.drawString("videoclipuri. Până în octombrie 2014, a vândut 25 de milioane de cântece în întreaga lume.", 10f, 430f)
|
||||
|
||||
g.drawString("Квинт Серторий — римский политический деятель и военачальник, известный в первую очередь", 10f, 470f)
|
||||
g.drawString("как руководитель мятежа против сулланского режима в Испании в 80—72 годах до н. э. Квинт", 10f, 490f)
|
||||
g.drawString("Серторий принадлежал к италийской муниципальной аристократии.", 10f, 510f)
|
||||
|
||||
g.drawString("Málið snerist um ofbeldi lögregluþjóna gegn fjölskyldu blökkumanna, en afar sjaldgæft var", 10f, 550f)
|
||||
g.drawString("á þessum árum að slík mál kæmu fyrir æðstu dómstig. Fordæmið tryggði framgang sambærilegra", 10f, 570f)
|
||||
g.drawString("mála sem einkenndust af því að opinberir aðilar virtu ekki stjórnarskrárvarin réttindi einstaklingsins.", 10f, 590f)
|
||||
*/
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user