From 5799cc39ce6622c9e8d6daf48d2644b83cfef20b Mon Sep 17 00:00:00 2001 From: Song Minjae Date: Sat, 11 Feb 2017 23:22:35 +0900 Subject: [PATCH] Basic Latin, Ext-A Former-commit-id: 82df422b6a9b9e9c0fba0d11762cbdf2ca5b6f40 Former-commit-id: ff29dc32eb21b9626c78eb53518f5eff12439832 --- src/net/torvald/imagefont/GameFontBase.kt | 123 +++++++++----------- src/net/torvald/imagefont/GameFontWhite.kt | 9 +- src/net/torvald/terrarum/StateFontTester.kt | 69 ++++++----- 3 files changed, 97 insertions(+), 104 deletions(-) diff --git a/src/net/torvald/imagefont/GameFontBase.kt b/src/net/torvald/imagefont/GameFontBase.kt index 4a16fe1e2..e52ad212f 100644 --- a/src/net/torvald/imagefont/GameFontBase.kt +++ b/src/net/torvald/imagefont/GameFontBase.kt @@ -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 + internal val asciiWidths: HashMap = 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 - 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(), diff --git a/src/net/torvald/imagefont/GameFontWhite.kt b/src/net/torvald/imagefont/GameFontWhite.kt index d93bf1afe..57f266368 100644 --- a/src/net/torvald/imagefont/GameFontWhite.kt +++ b/src/net/torvald/imagefont/GameFontWhite.kt @@ -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() } } diff --git a/src/net/torvald/terrarum/StateFontTester.kt b/src/net/torvald/terrarum/StateFontTester.kt index db2c01c98..d3822ad22 100644 --- a/src/net/torvald/terrarum/StateFontTester.kt +++ b/src/net/torvald/terrarum/StateFontTester.kt @@ -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) - */ - - }