From 15fb3d15c06bfa04d872c1cc1174d6122b574adf Mon Sep 17 00:00:00 2001 From: minjaesong Date: Thu, 9 Aug 2018 15:34:08 +0900 Subject: [PATCH] Kana suppelements and Insular script --- .idea/workspace.xml | 93 ++++++++++-------- FontTestGDX/demotext.txt | 1 + assets/insular_variable.tga | Bin 40978 -> 41004 bytes assets/kana.tga | Bin 215084 -> 215084 bytes .../terrarumsansbitmap/gdx/GameFontBase.kt | 35 ++++++- 5 files changed, 82 insertions(+), 47 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index d8f0866..d571c65 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -10,7 +10,7 @@ - + @@ -32,8 +32,8 @@ - - + + @@ -81,26 +81,35 @@ - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - + + @@ -132,7 +141,6 @@ - fun getWidth fun dispo xHei not copy @@ -162,6 +170,7 @@ ArrayList<Int> har.toInt() println + !! .141 @@ -183,10 +192,10 @@ @@ -823,13 +832,6 @@ - - - - - - - @@ -849,13 +851,6 @@ - - - - - - - @@ -877,13 +872,6 @@ - - - - - - - @@ -903,10 +891,31 @@ + + + + + + + + + + + + + + + + + + + + + - - + + diff --git a/FontTestGDX/demotext.txt b/FontTestGDX/demotext.txt index 61155e1..abb62c3 100644 --- a/FontTestGDX/demotext.txt +++ b/FontTestGDX/demotext.txt @@ -36,6 +36,7 @@ How multilingual? Real multilingual! 􌿽ΔΙΑΦΥΛΆΞΤΕ ΓΕΝΙΚΆ ΤΗ ΖΩΉ ΣΑΣ ΑΠΌ ΒΑΘΕΙΆ ΨΥΧΙΚΆ ΤΡΑΎΜΑΤΑ􀀀 􌿽სწრაფი ყავისფერი მელა გადაახტა ზარმაც ძაღლს􀀀 􌿽Kæmi ný öxi hér, ykist þjófum nú bæði víl og ádrepa􀀀 + 􌿽Ꝺꝼuaꞅcail Íoꞅa Úꞃṁac na hÓiᵹe Beannaiꞇe póꞃ Éaḃa aᵹus Áꝺaiṁ􀀀 􌿽Ċuaiġ bé ṁórṡáċ le dlúṫspád fíorḟinn trí hata mo ḋea-ṗorcáin ḃig􀀀 􌿽あめつちほしそら やまかはみねたに くもきりむろこけ ひといぬうへすゑ ゆわさるおふせよ えの𛀁をなれゐて􀀀 􌿽トリナクコヱス ユメサマセ ミヨアケワタル ヒンカシヲ ソライロハエテ オキツヘニ ホフネムレヰヌ モヤノウチ􀀀 diff --git a/assets/insular_variable.tga b/assets/insular_variable.tga index a906a018bb6c9aa9c761930dcf333eff63a7b31b..ee5186cf24f10aaf2b18b9d50b89bbc468a0efec 100644 GIT binary patch delta 727 zcmZuvL2DCH5bkbLyN4*du!W5@&_e?$_{2-0hb-(N6$7=3M#*6piY_FeYYPo1G)N9T z)fQ97Ll17xJ#=B0@!+M9V=n;@ULSbKLBaPADmd>Ym5NH5_13ir` z5FHy*D-Y50Wfay)4n)y_D6}EA3>f0*e}%aaORiM%esqmC=1fXxz|zqIp-dQtCh%DYPY=Io6de!&--iA6oZ7ym sLs4dc`>KG+r;&ERybJwEGWX`x7vhuY4xc*>`HSg9}S8h-J0fZMUtpET3 delta 588 zcmZ8eJxCm35M_UeSFGU{Rye_fD{nA~Ao; z19St-j?K8D1FunIg1v+>%08!RC@z##9-?^ngzAwN3PWQqgE=ZM(KKu1ul&$lQ6XjxBX?y0V*{$GmXat+1Ra*Ek{na!I(EOJ=r<8D!RImq7+G}s^eu9$<^t)gAeWBBkJ?D}i?mO;mzKgvL!WUr=#;#vW_ zO0w%PVdtNbnYqcG{gay)q4=2;8hCeJ;-Wl$vqC&lpsTNcnI&TOB@4&S7|Z40w>Zh` TOl=tCpWSe0gZEuzyY==Xn%wve diff --git a/assets/kana.tga b/assets/kana.tga index 79adc1013728ef81ee24f920de97bc2752dea968..4325d3bfdc08f73538af097eaec331b76e3f36b6 100644 GIT binary patch delta 2985 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 YrFIsCQ?h=ys*ObEz|3`fRsL}JUl5j>KL7v# diff --git a/src/net/torvald/terrarumsansbitmap/gdx/GameFontBase.kt b/src/net/torvald/terrarumsansbitmap/gdx/GameFontBase.kt index 0ccda55..31b3cc1 100644 --- a/src/net/torvald/terrarumsansbitmap/gdx/GameFontBase.kt +++ b/src/net/torvald/terrarumsansbitmap/gdx/GameFontBase.kt @@ -116,7 +116,7 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo private fun isRunic(c: Int) = c in codeRange[SHEET_RUNIC] private fun isExtA(c: Int) = c in codeRange[SHEET_EXTA_VARW] private fun isExtB(c: Int) = c in codeRange[SHEET_EXTB_VARW] - private fun isKana(c: Int) = c in codeRange[SHEET_KANA] + private fun isKana(c: Int) = c in codeRange[SHEET_KANA] || c in 0x31F0..0x31FF || c in 0x1B000..0x1B001 private fun isCJKPunct(c: Int) = c in codeRange[SHEET_CJK_PUNCT] private fun isUniHan(c: Int) = c in codeRange[SHEET_UNIHAN] private fun isCyrilic(c: Int) = c in codeRange[SHEET_CYRILIC_VARW] @@ -136,6 +136,7 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo private fun isColourCode(c: Int) = c in 0x100000..0x10FFFF private fun isCharsetOverride(c: Int) = c in 0xFFFF8..0xFFFFF private fun isCherokee(c: Int) = c in codeRange[SHEET_TSALAGI_VARW] + private fun isInsular(c: Int) = c == 0x1D79 || c in 0xA779..0xA787 private fun extAindexX(c: Int) = (c - 0x100) % 16 @@ -150,7 +151,7 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo private fun kanaIndexX(c: Int) = (c - 0x3040) % 16 private fun kanaIndexY(c: Int) = if (c in 0x31F0..0x31FF) 12 - else if (c in 0x31F0..0x31FF) 13 + else if (c in 0x1B000..0x1B00F) 13 else (c - 0x3040) / 16 private fun cjkPunctIndexX(c: Int) = (c - 0x3000) % 16 @@ -192,6 +193,11 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo private fun cherokeeIndexX(c: Int) = (c - 0x13A0) % 16 private fun cherokeeIndexY(c: Int) = (c - 0x13A0) / 16 + private fun insularIndexX(c: Int) = + if (c == 0x1D79) 0 else (c - 0xA770) % 16 + private fun insularIndexY(c: Int) = + if (c == 0x1D79) 0 else (c - 0xA770) / 16 + private fun getColour(codePoint: Int): Color { // input: 0x10ARGB, out: RGBA8888 if (colourBuffer.containsKey(codePoint)) return colourBuffer[codePoint]!! @@ -228,7 +234,8 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo SHEET_LATIN_EXT_ADD_VARW, SHEET_BULGARIAN_VARW, SHEET_SERBIAN_VARW, - SHEET_TSALAGI_VARW + SHEET_TSALAGI_VARW, + SHEET_INSUAR_VARW ) private val fontParentDir = if (fontDir.endsWith('/') || fontDir.endsWith('\\')) fontDir else "$fontDir/" @@ -253,7 +260,8 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo "puae000-e0ff.tga", "cyrilic_bulgarian_variable.tga", "cyrilic_serbian_variable.tga", - "tsalagi_variable.tga" + "tsalagi_variable.tga", + "insular_variable.tga" ) private val codeRange = arrayOf( // MUST BE MATCHING WITH SHEET INDICES!! 0..0xFF, @@ -276,7 +284,8 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo 0xE000..0xE0FF, 0xF00000..0xF0005F, // assign them to PUA 0xF00060..0xF000BF, // assign them to PUA - 0x13A0..0x13F5 + 0x13A0..0x13F5, + 0xA770..0xA787 ) private val glyphProps: HashMap = HashMap() private val sheets: Array @@ -724,6 +733,8 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo return SHEET_LATIN_EXT_ADD_VARW else if (isCherokee(c)) return SHEET_TSALAGI_VARW + else if (isInsular(c)) + return SHEET_INSUAR_VARW else return SHEET_UNKNOWN // fixed width @@ -805,6 +816,10 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo sheetX = cherokeeIndexX(ch) sheetY = cherokeeIndexY(ch) } + SHEET_INSUAR_VARW -> { + sheetX = insularIndexX(ch) + sheetY = insularIndexY(ch) + } else -> { sheetX = ch % 16 sheetY = ch / 16 @@ -868,6 +883,15 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo (0xD800..0xDFFF).forEach { glyphProps[it] = GlyphProps(0, 0) } (0x100000..0x10FFFF).forEach { glyphProps[it] = GlyphProps(0, 0) } (0xFFFF8..0xFFFFF).forEach { glyphProps[it] = GlyphProps(0, 0) } + + + // manually build width table of Kana Supplements + (0x31F0..0x31FF).forEach { glyphProps[it] = GlyphProps(W_KANA, 0) } + (0x1B000..0x1B001).forEach { glyphProps[it] = GlyphProps(W_KANA, 0) } + + // manually add width of one orphan insular letter + // WARNING: glyphs in 0xA770..0xA778 has invalid data, further care is required + glyphProps[0x1D79] = GlyphProps(9, 0) } private val glyphLayout = GlyphLayout() @@ -1001,6 +1025,7 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo internal val SHEET_BULGARIAN_VARW = 18 internal val SHEET_SERBIAN_VARW = 19 internal val SHEET_TSALAGI_VARW = 20 + internal val SHEET_INSUAR_VARW = 21 internal val SHEET_UNKNOWN = 254