From 6714bbb5108eec8735b292b72b26d6cc7dddcbca Mon Sep 17 00:00:00 2001 From: minjaesong Date: Thu, 9 Aug 2018 02:44:29 +0900 Subject: [PATCH] now everything is converted to UTF-32 internally - To make working with other planes easier --- .idea/workspace.xml | 161 ++++++----- FontTestGDX/demotext.txt | 3 +- FontTestGDX/lib/TerrarumSansBitmap.jar | Bin 47833 -> 49770 bytes assets/ascii_variable.tga | Bin 327724 -> 327724 bytes assets/kana.tga | Bin 184364 -> 215084 bytes .../terrarumsansbitmap/gdx/GameFontBase.kt | 258 +++++++++++------- 6 files changed, 239 insertions(+), 183 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 41f2737..d8f0866 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -10,7 +10,8 @@ - + + @@ -31,8 +32,26 @@ - - + + + + + + + + + + + + + + + + + + + + @@ -49,22 +68,8 @@ - - - - - - - - - - - - - - - - + + @@ -85,8 +90,8 @@ - - + + @@ -94,8 +99,8 @@ - - + + @@ -127,10 +132,6 @@ - getG - getWidt - batch.color = - f fun getWidth fun dispo xHei @@ -157,9 +158,15 @@ GlyphProps.LE buildWidthTable lastNonDiacriticChar + c.toInt() + ArrayList<Int> + har.toInt() + println .141 + c + har @@ -514,37 +521,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -840,25 +816,6 @@ - - - - - - - - - - - - - - - - - - - @@ -899,17 +856,57 @@ - + - - + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FontTestGDX/demotext.txt b/FontTestGDX/demotext.txt index 3ae791f..61155e1 100644 --- a/FontTestGDX/demotext.txt +++ b/FontTestGDX/demotext.txt @@ -37,7 +37,8 @@ How multilingual? Real multilingual! 􌿽სწრაფი ყავისფერი მელა გადაახტა ზარმაც ძაღლს􀀀 􌿽Kæmi ný öxi hér, ykist þjófum nú bæði víl og ádrepa􀀀 􌿽Ċuaiġ bé ṁórṡáċ le dlúṫspád fíorḟinn trí hata mo ḋea-ṗorcáin ḃig􀀀 - 􌿽とりなくこゑす ゆめさませ みよあけわたる ひんかしを そらいろはえて おきつへに ほふねむれゐぬ もやのうち􀀀 + 􌿽あめつちほしそら やまかはみねたに くもきりむろこけ ひといぬうへすゑ ゆわさるおふせよ えの𛀁をなれゐて􀀀 + 􌿽トリナクコヱス ユメサマセ ミヨアケワタル ヒンカシヲ ソライロハエテ オキツヘニ ホフネムレヰヌ モヤノウチ􀀀 􌿽田居に出で 菜摘むわれをぞ 君召すと 求食り追ひゆく 山城の 打酔へる子ら 藻葉干せよ え舟繋けぬ􀀀 􌿽정 참판 양반댁 규수 큰 교자 타고 혼례 치른 날 하얬다 도럄직한 퀡봹퉪헰􀀀 􌿽Četri psihi faķīri vēlu vakarā zāģēja guļbūvei durvis, fonā šņācot mežam􀀀 diff --git a/FontTestGDX/lib/TerrarumSansBitmap.jar b/FontTestGDX/lib/TerrarumSansBitmap.jar index 9cb2b257a513e84cd921e5ea124bdba3fd4abb43..5dc7bc5c77af8e95b1f34fc65def5d42431e728c 100644 GIT binary patch delta 32871 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 diff --git a/assets/ascii_variable.tga b/assets/ascii_variable.tga index 7908e1ff981b585594c5ede49a4fd6d10b4ca4f9..2c2cd6f2bf17435d4bd6aaedff8271c00fbd5fce 100644 GIT binary patch delta 651 zcmcIiF>BjE6z1J2B!k-+s=-6lLdoF42OgXtVhRdm$Y4WDol*iCk}Mu75@;YE4ABs1 zD0Faccw`X8BwzwgK-eHdT*%O&g9rZsje(Y+(4k|YeNSmH{Q((Hr}y4>-}l~k*Y(Y= zZ~A?BwcJ+FaW93`?vJca++iDPW0L!sTIpl(ST@joZhVcbLvbY{>eT@Z{)ig8nMa!Gr7rGF z>D!GmCL^$Qyp~OkX7?OznKsRyLsgb_bTeQw7%v{dO-nVkH!!JM#Q0j&^ov6WlaI2= z%@EBVo0gv(j-NpVlLC;P4bI+Ic~3{d^Ea~ouTo4Oiuc6E^GnER&(8C6Sm7*si?SP8 ipZWSeT?muAE_AG80b1o4>Y!RM`X2~EOA^wU-S`WXaQip_ delta 396 zcmZ3}AhM=Gq+ttVpyP7cjZBQ&V|O!gFi!_Ek4%p(VszN3`-cg{yRaQd>|lh7Suldc z&OpWP{$_UBsB6JEIrb&b^t(ySJkxcH84V`tasUMcHouK6VVr!o++lleFyjtWkoh^x zlVkH|OrD#pv0PT0kr7O62eLRAH|qWXyMTuYq^^N^qHY7o4hOK{0VZVj^jHU$Jri|( zfW}yCpSzH;#R6*E28bgk>J~uEoTzI7vF7e1CdSQk>wQ=^>gur52AhDxB?9F57mU;A nUSkG^Ujsty1DM$`eJ&q!#q?MumLu)5JxoB%yj`}3g}(#3W6ku#nuXSp&)u{u=F5`MEnE2c@l%p>?V6y_RYNc=9_Q6ZND0AZ|hVd z0g2&rm>5?V;$z!8i5&&mnRE>OdT>A-vd>feM)V0M7Q-ztv_ z)pB5#fQ(kfz#IaaI~Hc{mjbg5n3<^sW{qRN(u{fzwd2rf0M#hyr>()E45W)-;odQ~ z+KKymt1wRfku-lU5qm$p0_7xEj$$L3$6m>z&aSFRr6XT?s=tGr+{Dw1F4M?TjPXpR zq&ao|s5G@UR82~<=sk7GALOvNlM_U)&S9oGjXj^W&}t1cKa-rWF`TdjQl=ySv5Nah zvd%ZVZ@{8Y8)}|951=4V9F_% zOj@l`cT$a^S9X|=L%lt4slKXMjT1E$0mR2BmT7Q8zOetrM(=Btx`z8T+mOP{C5z0I zS`k8mWl{Z~NZ_j+>GR-V_c$9#OugG`3Nznw)M`TkPn%`gc7@Cqvtl`@zs_*sbzb1h zoG_RdTiEi-iO4p2%Uma$4<`!P{85bTFq|VFpBCN=i)5M_4^=@dB6)}BY zR~{SUk~hH<$F>}y@D}hKTWWe3VLw>ty>1VH7MHMpuf+ev6NRm7bLdqc#cmvW^7sr7 WJxlegswSnIT5oBs_O*t|kN*KP#6t@J delta 143 zcmZ28fp^UUZUF`cCI%Qd!0>@#qW~|@blZJQE|brCX-v + /** * LibGDX port of Terrarum Sans Bitmap implementation * @@ -109,89 +111,88 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo 9 } - private fun isHangul(c: Char) = c.toInt() in codeRange[SHEET_HANGUL] - private fun isAscii(c: Char) = c.toInt() in codeRange[SHEET_ASCII_VARW] - private fun isRunic(c: Char) = c.toInt() in codeRange[SHEET_RUNIC] - private fun isExtA(c: Char) = c.toInt() in codeRange[SHEET_EXTA_VARW] - private fun isExtB(c: Char) = c.toInt() in codeRange[SHEET_EXTB_VARW] - private fun isKana(c: Char) = c.toInt() in codeRange[SHEET_KANA] - private fun isCJKPunct(c: Char) = c.toInt() in codeRange[SHEET_CJK_PUNCT] - private fun isUniHan(c: Char) = c.toInt() in codeRange[SHEET_UNIHAN] - private fun isCyrilic(c: Char) = c.toInt() in codeRange[SHEET_CYRILIC_VARW] - private fun isFullwidthUni(c: Char) = c.toInt() in codeRange[SHEET_FW_UNI] - private fun isUniPunct(c: Char) = c.toInt() in codeRange[SHEET_UNI_PUNCT_VARW] - private fun isGreek(c: Char) = c.toInt() in codeRange[SHEET_GREEK_VARW] - private fun isThai(c: Char) = c.toInt() in codeRange[SHEET_THAI_VARW] - /*private fun isDiacritics(c: Char) = c.toInt() in 0xE34..0xE3A - || c.toInt() in 0xE47..0xE4E - || c.toInt() == 0xE31*/ - private fun isCustomSym(c: Char) = c.toInt() in codeRange[SHEET_CUSTOM_SYM] - private fun isArmenian(c: Char) = c.toInt() in codeRange[SHEET_HAYEREN_VARW] - private fun isKartvelian(c: Char) = c.toInt() in codeRange[SHEET_KARTULI_VARW] - private fun isIPA(c: Char) = c.toInt() in codeRange[SHEET_IPA_VARW] - private fun isColourCodeHigh(c: Char) = c.toInt() in 0xDC00..0xDFFF // only works with JVM (which uses UTF-16 internally) - private fun isColourCodeLow(c: Char) = c.toInt() in 0xDBC0..0xDBFF // only works with JVM (which uses UTF-16 internally) - private fun isLatinExtAdd(c: Char) = c.toInt() in 0x1E00..0x1EFF - private fun isCharsetOverrideHigh(c: Char) = c.toInt() in 0xDFF8..0xDFFF // only works with JVM (which uses UTF-16 internally) - private fun isCharsetOverrideLow(c: Char) = c.toInt() == 0xDBBF // only works with JVM (which uses UTF-16 internally) - private fun isBulgarian(c: Char) = c.toInt() in 0x400..0x45F - private fun isCherokee(c: Char) = c.toInt() in codeRange[SHEET_TSALAGI_VARW] + private fun isHangul(c: Int) = c in codeRange[SHEET_HANGUL] + private fun isAscii(c: Int) = c in codeRange[SHEET_ASCII_VARW] + 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 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] + private fun isFullwidthUni(c: Int) = c in codeRange[SHEET_FW_UNI] + private fun isUniPunct(c: Int) = c in codeRange[SHEET_UNI_PUNCT_VARW] + private fun isGreek(c: Int) = c in codeRange[SHEET_GREEK_VARW] + private fun isThai(c: Int) = c in codeRange[SHEET_THAI_VARW] + /*private fun isDiacritics(c: Int) = c in 0xE34..0xE3A + || c in 0xE47..0xE4E + || c == 0xE31*/ + private fun isCustomSym(c: Int) = c in codeRange[SHEET_CUSTOM_SYM] + private fun isArmenian(c: Int) = c in codeRange[SHEET_HAYEREN_VARW] + private fun isKartvelian(c: Int) = c in codeRange[SHEET_KARTULI_VARW] + private fun isIPA(c: Int) = c in codeRange[SHEET_IPA_VARW] + private fun isLatinExtAdd(c: Int) = c in 0x1E00..0x1EFF + private fun isBulgarian(c: Int) = c in 0x400..0x45F + 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 extAindexX(c: Char) = (c.toInt() - 0x100) % 16 - private fun extAindexY(c: Char) = (c.toInt() - 0x100) / 16 + private fun extAindexX(c: Int) = (c - 0x100) % 16 + private fun extAindexY(c: Int) = (c - 0x100) / 16 - private fun extBindexX(c: Char) = (c.toInt() - 0x180) % 16 - private fun extBindexY(c: Char) = (c.toInt() - 0x180) / 16 + private fun extBindexX(c: Int) = (c - 0x180) % 16 + private fun extBindexY(c: Int) = (c - 0x180) / 16 - private fun runicIndexX(c: Char) = (c.toInt() - 0x16A0) % 16 - private fun runicIndexY(c: Char) = (c.toInt() - 0x16A0) / 16 + private fun runicIndexX(c: Int) = (c - 0x16A0) % 16 + private fun runicIndexY(c: Int) = (c - 0x16A0) / 16 - private fun kanaIndexX(c: Char) = (c.toInt() - 0x3040) % 16 - private fun kanaIndexY(c: Char) = (c.toInt() - 0x3040) / 16 + 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 (c - 0x3040) / 16 - private fun cjkPunctIndexX(c: Char) = (c.toInt() - 0x3000) % 16 - private fun cjkPunctIndexY(c: Char) = (c.toInt() - 0x3000) / 16 + private fun cjkPunctIndexX(c: Int) = (c - 0x3000) % 16 + private fun cjkPunctIndexY(c: Int) = (c - 0x3000) / 16 - private fun cyrilicIndexX(c: Char) = (c.toInt() - 0x400) % 16 - private fun cyrilicIndexY(c: Char) = (c.toInt() - 0x400) / 16 + private fun cyrilicIndexX(c: Int) = (c - 0x400) % 16 + private fun cyrilicIndexY(c: Int) = (c - 0x400) / 16 - private fun fullwidthUniIndexX(c: Char) = (c.toInt() - 0xFF00) % 16 - private fun fullwidthUniIndexY(c: Char) = (c.toInt() - 0xFF00) / 16 + private fun fullwidthUniIndexX(c: Int) = (c - 0xFF00) % 16 + private fun fullwidthUniIndexY(c: Int) = (c - 0xFF00) / 16 - private fun uniPunctIndexX(c: Char) = (c.toInt() - 0x2000) % 16 - private fun uniPunctIndexY(c: Char) = (c.toInt() - 0x2000) / 16 + private fun uniPunctIndexX(c: Int) = (c - 0x2000) % 16 + private fun uniPunctIndexY(c: Int) = (c - 0x2000) / 16 - private fun unihanIndexX(c: Char) = (c.toInt() - 0x3400) % 256 - private fun unihanIndexY(c: Char) = (c.toInt() - 0x3400) / 256 + private fun unihanIndexX(c: Int) = (c - 0x3400) % 256 + private fun unihanIndexY(c: Int) = (c - 0x3400) / 256 - private fun greekIndexX(c: Char) = (c.toInt() - 0x370) % 16 - private fun greekIndexY(c: Char) = (c.toInt() - 0x370) / 16 + private fun greekIndexX(c: Int) = (c - 0x370) % 16 + private fun greekIndexY(c: Int) = (c - 0x370) / 16 - private fun thaiIndexX(c: Char) = (c.toInt() - 0xE00) % 16 - private fun thaiIndexY(c: Char) = (c.toInt() - 0xE00) / 16 + private fun thaiIndexX(c: Int) = (c - 0xE00) % 16 + private fun thaiIndexY(c: Int) = (c - 0xE00) / 16 - private fun symbolIndexX(c: Char) = (c.toInt() - 0xE000) % 16 - private fun symbolIndexY(c: Char) = (c.toInt() - 0xE000) / 16 + private fun symbolIndexX(c: Int) = (c - 0xE000) % 16 + private fun symbolIndexY(c: Int) = (c - 0xE000) / 16 - private fun armenianIndexX(c: Char) = (c.toInt() - 0x530) % 16 - private fun armenianIndexY(c: Char) = (c.toInt() - 0x530) / 16 + private fun armenianIndexX(c: Int) = (c - 0x530) % 16 + private fun armenianIndexY(c: Int) = (c - 0x530) / 16 - private fun kartvelianIndexX(c: Char) = (c.toInt() - 0x10D0) % 16 - private fun kartvelianIndexY(c: Char) = (c.toInt() - 0x10D0) / 16 + private fun kartvelianIndexX(c: Int) = (c - 0x10D0) % 16 + private fun kartvelianIndexY(c: Int) = (c - 0x10D0) / 16 - private fun ipaIndexX(c: Char) = (c.toInt() - 0x250) % 16 - private fun ipaIndexY(c: Char) = (c.toInt() - 0x250) / 16 + private fun ipaIndexX(c: Int) = (c - 0x250) % 16 + private fun ipaIndexY(c: Int) = (c - 0x250) / 16 - private fun latinExtAddX(c: Char) = (c.toInt() - 0x1E00) % 16 - private fun latinExtAddY(c: Char) = (c.toInt() - 0x1E00) / 16 + private fun latinExtAddX(c: Int) = (c - 0x1E00) % 16 + private fun latinExtAddY(c: Int) = (c - 0x1E00) / 16 - private fun cherokeeIndexX(c: Char) = (c.toInt() - 0x13A0) % 16 - private fun cherokeeIndexY(c: Char) = (c.toInt() - 0x13A0) / 16 - - private fun getColour(charHigh: Char, charLow: Char): Color { // input: 0x10ARGB, out: RGBA8888 - val codePoint = Character.toCodePoint(charHigh, charLow) + private fun cherokeeIndexX(c: Int) = (c - 0x13A0) % 16 + private fun cherokeeIndexY(c: Int) = (c - 0x13A0) / 16 + private fun getColour(codePoint: Int): Color { // input: 0x10ARGB, out: RGBA8888 if (colourBuffer.containsKey(codePoint)) return colourBuffer[codePoint]!! @@ -390,7 +391,7 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo private val offsetUnihan = (H - H_UNIHAN) / 2 private val offsetCustomSym = (H - SIZE_CUSTOM_SYM) / 2 - private var textBuffer: CharSequence = "" + private var textBuffer = CodepointSequence(256) private var posXbuffer = intArrayOf() // absolute posX of glyphs from print-origin private var posYbuffer = intArrayOf() // absolute posY of glyphs from print-origin private var glyphWidthBuffer = intArrayOf() // width of each glyph @@ -398,6 +399,7 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo private lateinit var originalColour: Color override fun draw(batch: Batch, str: CharSequence, x: Float, y: Float): GlyphLayout? { + val str = str.toCodePoints() fun Int.flipY() = this * if (flipY) 1 else -1 @@ -413,8 +415,8 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo glyphWidthBuffer = widths - posXbuffer = IntArray(str.length, { 0 }) - posYbuffer = IntArray(str.length, { 0 }) + posXbuffer = IntArray(str.size, { 0 }) + posYbuffer = IntArray(str.size, { 0 }) var nonDiacriticCounter = 0 // index of last instance of non-diacritic char @@ -425,12 +427,12 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo // nonDiacriticCounter allows multiple diacritics val thisChar = textBuffer[charIndex] - if (glyphProps[thisChar.toInt()] == null) { - throw InternalError("No props for char '$thisChar' (${thisChar.toInt().toString(16)})") + if (glyphProps[thisChar] == null) { + throw InternalError("No props for char '$thisChar' (${thisChar.toString(16)})") } - val thisProp = glyphProps[thisChar.toInt()]!! + val thisProp = glyphProps[thisChar]!! val lastNonDiacriticChar = textBuffer[nonDiacriticCounter] - val itsProp = glyphProps[lastNonDiacriticChar.toInt()]!! + val itsProp = glyphProps[lastNonDiacriticChar]!! //println("char: $thisChar; properties: $thisProp") @@ -497,35 +499,22 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo //println("[TerrarumSansBitmap] sprite: $sheetID:${sheetX}x${sheetY}") - if (isColourCodeLow(c)) { - val cchigh = c - val cclow = textBuffer[index + 1] - - if (Character.toCodePoint(cchigh, cclow) == 0x100000) { + if (isColourCode(c)) { + if (c == 0x100000) { mainCol = originalColour shadowCol = mainCol.cpy().mul(0.5f,0.5f,0.5f,1f) } else { - mainCol = getColour(cchigh, cclow) + mainCol = getColour(c) shadowCol = mainCol.cpy().mul(0.5f, 0.5f, 0.5f, 1f) } - - index += 1 } - else if (isCharsetOverrideLow(c)) { - val cchigh = c - val cclow = textBuffer[index + 1] - - charsetOverride = Character.toCodePoint(cchigh, cclow) - CHARSET_OVERRIDE_NULL - - index += 1 - } - else if (isCharsetOverrideHigh(c) || isColourCodeHigh(c)) { - /* do nothing and advance */ + else if (isCharsetOverride(c)) { + charsetOverride = c - CHARSET_OVERRIDE_NULL } else if (sheetID == SHEET_HANGUL) { val hangulSheet = sheets[SHEET_HANGUL] - val hIndex = c.toInt() - 0xAC00 + val hIndex = c - 0xAC00 val indexCho = getHanChosung(hIndex) val indexJung = getHanJungseong(hIndex) @@ -648,23 +637,23 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo sheets.forEach { it.dispose() } } - private fun getWidthOfCharSeq(s: CharSequence): IntArray { - val len = IntArray(s.length) + private fun getWidthOfCharSeq(s: CodepointSequence): IntArray { + val len = IntArray(s.size) for (i in 0..s.lastIndex) { val chr = s[i] val ctype = getSheetType(s[i]) if (variableWidthSheets.contains(ctype)) { - if (!glyphProps.containsKey(chr.toInt())) { + if (!glyphProps.containsKey(chr)) { System.err.println("[TerrarumSansBitmap] no width data for glyph number ${Integer.toHexString(chr.toInt()).toUpperCase()}") len[i] = W_LATIN_WIDE } - val prop = glyphProps[chr.toInt()]!! + val prop = glyphProps[chr]!! //println("${chr.toInt()} -> $prop") len[i] = prop.width * (if (prop.writeOnTop) -1 else 1) } - else if (isColourCodeHigh(chr) || isColourCodeLow(chr) || isCharsetOverrideHigh(chr) || isCharsetOverrideLow(chr)) + else if (isColourCode(chr) || isCharsetOverride(chr)) len[i] = 0 else if (ctype == SHEET_CJK_PUNCT) len[i] = W_ASIAN_PUNCT @@ -686,7 +675,7 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo return len } - private fun getSheetType(c: Char): Int { + private fun getSheetType(c: Int): Int { if (charsetOverride == 1 && isBulgarian(c)) return SHEET_BULGARIAN_VARW else if (charsetOverride == 2 && isBulgarian(c)) @@ -735,7 +724,7 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo // fallback } - private fun getSheetwisePosition(ch: Char): IntArray { + private fun getSheetwisePosition(ch: Int): IntArray { val sheetX: Int; val sheetY: Int when (getSheetType(ch)) { SHEET_UNIHAN -> { @@ -811,8 +800,8 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo sheetY = cherokeeIndexY(ch) } else -> { - sheetX = ch.toInt() % 16 - sheetY = ch.toInt() / 16 + sheetX = ch % 16 + sheetY = ch / 16 } } @@ -871,15 +860,84 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo this.codeRange[SHEET_RUNIC].forEach { glyphProps[it] = GlyphProps(9, 0) } this.codeRange[SHEET_UNIHAN].forEach { glyphProps[it] = GlyphProps(W_UNIHAN, 0) } (0xD800..0xDFFF).forEach { glyphProps[it] = GlyphProps(0, 0) } + (0x100000..0x10FFFF).forEach { glyphProps[it] = GlyphProps(0, 0) } + (0xFFFF8..0xFFFFF).forEach { glyphProps[it] = GlyphProps(0, 0) } } private val glyphLayout = GlyphLayout() fun getWidth(text: String): Int { - return getWidthOfCharSeq(text).sum() + return getWidthOfCharSeq(text.toCodePoints()).sum() } + /** UTF-16 to ArrayList of Int. UTF-16 is because of Java */ + private fun CharSequence.toCodePoints(): CodepointSequence { + val seq = ArrayList() + + var i = 0 + while (i < this.length) { + val c = this[i] + + if (i < this.lastIndex && c.isHighSurrogate()) { + val cNext = this[i + 1] + + if (!cNext.isLowSurrogate()) + throw IllegalArgumentException("Malformed UTF-16 String: High surrogate must be paired with low surrogate") + + val H = c + val L = cNext + + seq.add(Character.toCodePoint(H, L)) + + i++ // skip next char (guaranteed to be Low Surrogate) + } + else { + seq.add(c.toInt()) + } + + i++ + } + + return seq + } + + /** As CharSequence is just an Interface, copy-pasting the code would be the fastest way */ + private fun String.toCodePoints(): CodepointSequence { + val seq = ArrayList() + + var i = 0 + while (i < this.length) { + val c = this[i] + + if (i < this.lastIndex) { + if (c.isHighSurrogate()) { + val cNext = this[i + 1] + + if (!cNext.isLowSurrogate()) + throw IllegalArgumentException("Malformed UTF-16 String: High surrogate must be paired with low surrogate") + + val H = c + val L = cNext + + seq.add(Character.toCodePoint(H, L)) + + i++ // skip next char (guaranteed to be Low Surrogate) + } + } + else { + seq.add(c.toInt()) + } + } + + return seq + } + + /** High surrogate comes before the low. */ + private fun Char.isHighSurrogate() = (this.toInt() in 0xD800..0xDBFF) + /** CodePoint = 0x10000 + (H - 0xD800) * 0x400 + (L - 0xDC00) */ + private fun Char.isLowSurrogate() = (this.toInt() in 0xDC00..0xDFFF) + var interchar = 0 var scale = 1