From 07ca429483646c793fb42affaa3a8f2fb490df1c Mon Sep 17 00:00:00 2001 From: minjaesong Date: Wed, 19 Jan 2022 10:20:42 +0900 Subject: [PATCH] more devanagari ligatures --- assets/devanagari_variable.tga | 2 +- .../gdx/TerrarumSansBitmap.kt | 30 +++++++++++++----- testing.PNG | Bin 16556 -> 16651 bytes testtext.txt | 4 +-- work_files/devanagari_variable.psd | 4 +-- 5 files changed, 27 insertions(+), 13 deletions(-) diff --git a/assets/devanagari_variable.tga b/assets/devanagari_variable.tga index 953b8c0..008d26f 100644 --- a/assets/devanagari_variable.tga +++ b/assets/devanagari_variable.tga @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:709d4bc0804e7267f83a3ecec4c8e0a61879f8a8532c51713f55ae17e8c35799 +oid sha256:dfe372a7dd72b36f6b496321c6604990110304bfdc80dc7c6eadac4f92fdf813 size 409618 diff --git a/src/net/torvald/terrarumsansbitmap/gdx/TerrarumSansBitmap.kt b/src/net/torvald/terrarumsansbitmap/gdx/TerrarumSansBitmap.kt index 624a04c..31cd85c 100755 --- a/src/net/torvald/terrarumsansbitmap/gdx/TerrarumSansBitmap.kt +++ b/src/net/torvald/terrarumsansbitmap/gdx/TerrarumSansBitmap.kt @@ -490,8 +490,6 @@ class TerrarumSansBitmap( return null } - private fun Int.charInfo() = "U+${this.toString(16).padStart(4, '0').toUpperCase()}: ${Character.getName(this)}" - override fun dispose() { super.dispose() @@ -1683,6 +1681,9 @@ class TerrarumSansBitmap( 'j'.toInt() to 0x237 ) + internal fun Int.charInfo() = "U+${this.toString(16).padStart(4, '0').toUpperCase()}: ${Character.getName(this)}" + + private val ZWNJ = 0x200C private val ZWJ = 0x200D private val tamilLigatingConsonants = listOf('க','ங','ச','ஞ','ட','ண','த','ந','ன','ப','ம','ய','ர','ற','ல','ள','ழ','வ').map { it.toInt() }.toIntArray() @@ -1699,6 +1700,10 @@ class TerrarumSansBitmap( private val DEVANAGARI_VIRAMA = 0x94D private val DEVANAGARI_RA = 0x930 private val DEVANAGARI_RRA = 0x931 + + private val DEVANAGARI_SYLL_RU = 0xF0100 + private val DEVANAGARI_SYLL_RUU = 0xF0101 + private val DEVANAGARI_OPEN_YA = 0xF0103 private val DEVANAGARI_RA_SUPER = 0xF0104 private val DEVANAGARI_EYELASH_RA = 0xF012A @@ -1707,15 +1712,17 @@ class TerrarumSansBitmap( private val DEVANAGARI_LIG_T_T = 0xF018B private val DEVANAGARI_LIG_T_R = 0xF0154 private val DEVANAGARI_LIG_SH_R = 0xF0166 + + private val DEVANAGARI_LIG_K_SS_R = 0xF016B + private val DEVANAGARI_LIG_J_NY_R = 0xF016C + private val DEVANAGARI_LIG_T_T_R = 0xF016D + private val DEVANAGARI_HALFLIG_K_SS = 0xF012B private val DEVANAGARI_HALFLIG_J_NY = 0xF012C private val DEVANAGARI_HALFLIG_T_T = 0xF012D private val DEVANAGARI_HALFLIG_T_R = 0xF012E private val DEVANAGARI_HALFLIG_SH_R = 0xF012F - private val DEVANAGARI_SYLL_RU = 0xF0100 - private val DEVANAGARI_SYLL_RUU = 0xF0101 - private val DEVANAGARI_HALF_FORMS = 0xF0100 // starting point for Devanagari half forms private val DEVANAGARI_LIG_X_R = 0xF0140 // starting point for Devanagari ligature CONSONANT+RA @@ -1739,15 +1746,20 @@ class TerrarumSansBitmap( // TODO use proper version of Virama for respective scripts private fun toRaAppended(c: CodePoint): List { if (c in devanagariBaseConsonants) return listOf(c - 0x0910 + DEVANAGARI_LIG_X_R) + else if (c == DEVANAGARI_LIG_K_SS) return listOf(DEVANAGARI_LIG_K_SS_R) + else if (c == DEVANAGARI_LIG_J_NY) return listOf(DEVANAGARI_LIG_J_NY_R) + else if (c == DEVANAGARI_LIG_T_T) return listOf(DEVANAGARI_LIG_T_T_R) else return listOf(c, DEVANAGARI_VIRAMA, DEVANAGARI_RA) } private fun ligateIndicConsonants(c1: CodePoint, c2: CodePoint): List { + println("[TerrarumSansBitmap] Indic ligation ${c1.charInfo()} - ${c2.charInfo()}") if (c2 == DEVANAGARI_RA) return toRaAppended(c1) // Devanagari @.RA when (c1) { 0x0915 -> /* Devanagari KA */ when (c2) { - 0x0924 -> return listOf(0xF0180) // K.TA - 0x0937 -> return listOf(DEVANAGARI_LIG_K_SS) // K.SSA + 0x0924 -> return listOf(0xF0180) // K.T + 0x0937 -> return listOf(DEVANAGARI_LIG_K_SS) // K.SS + 0xF0167 -> return listOf(DEVANAGARI_LIG_K_SS_R) // K.SS.R else -> return c1.toHalfFormOrVirama() + c2 } 0x0919 -> /* Devanagari NGA */ when (c2) { @@ -1757,6 +1769,7 @@ class TerrarumSansBitmap( } 0x091C -> /* Devanagari JA */ when (c2) { 0x091E -> return listOf(DEVANAGARI_LIG_J_NY) // J.NY + 0xF014E -> return listOf(DEVANAGARI_LIG_J_NY_R) // J.NY.R else -> return c1.toHalfFormOrVirama() + c2 } 0x091F -> /* Devanagari TTA */ when (c2) { @@ -1779,6 +1792,7 @@ class TerrarumSansBitmap( } 0x0924 -> /* Devanagari TA */ when (c2) { 0x0924 -> return listOf(DEVANAGARI_LIG_T_T) // T.T + DEVANAGARI_LIG_T_R -> return listOf(DEVANAGARI_LIG_T_T_R) // T.T.R else -> return c1.toHalfFormOrVirama() + c2 } 0x0926 -> /* Devanagari DA */ when (c2) { @@ -1801,7 +1815,7 @@ class TerrarumSansBitmap( 0x092E -> return listOf(0xF0196) // H.M 0x092F -> return listOf(0xF0197) // H.Y 0x0932 -> return listOf(0xF0198) // H.L - 0x0935 -> return listOf(0xF0199) // H.v + 0x0935 -> return listOf(0xF0199) // H.V else -> return c1.toHalfFormOrVirama() + c2 } else -> return c1.toHalfFormOrVirama() + c2 // TODO use proper version of Virama for respective scripts diff --git a/testing.PNG b/testing.PNG index 97d30fab0deb911fe56ce9a379061b4761db99a6..c420425859ab865947e68d23df76e5abab51c737 100755 GIT binary patch delta 2693 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 ZT>dY}u)C*PvHs8Uk;BP{S`K`3?LX?7{(Jxc delta 2609 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 diff --git a/testtext.txt b/testtext.txt index 5fcec6e..86627de 100755 --- a/testtext.txt +++ b/testtext.txt @@ -1,3 +1,3 @@ -फ़ॊण्ज़ीणू क्की क्कि र्क र्त्सा र्र्ल ऱ्ड क्राप् ठ्री त्र् त्र्मोत्र्यो ज्ञज्ञ्रत्त न्न -ह्णह्नह्मह्यह्लह्वह्र णनमयलव ज़्लतान +फ़ॊण्ज़ीणू क्की क्कि र्क र्त्सा र्र्ल ऱ्ड क्राप् ठ्री त्र् त्र्मोत्र्यो +ह्णह्नह्मह्यह्लह्वह्र णनमयलव ज़्लतान छात्त्र क्ष्र ज्ञ्र diff --git a/work_files/devanagari_variable.psd b/work_files/devanagari_variable.psd index 2bd4d2f..251b79e 100644 --- a/work_files/devanagari_variable.psd +++ b/work_files/devanagari_variable.psd @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d224d6b0941ec2f947672d76b801033cb189851e848b936e352f453fd1fb1554 -size 446470 +oid sha256:649fe18658de750206c08dad8c9b0f69dfa00b25c680e9f4601ac19dca41d1e7 +size 448154