diff --git a/assets/devanagari_variable.tga b/assets/devanagari_variable.tga index 25baa07..0a74395 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:d3e551e6c4e767c4e0b3dba8dd9f3275171122db88c9be8221741a13e06599e6 +oid sha256:c5960f1779bd8740a91f156976d5fd479843ed51b438f0d0227bdd9b169dc112 size 1474578 diff --git a/src/net/torvald/terrarumsansbitmap/gdx/TerrarumSansBitmap.kt b/src/net/torvald/terrarumsansbitmap/gdx/TerrarumSansBitmap.kt index c1ce3a5..ee97291 100755 --- a/src/net/torvald/terrarumsansbitmap/gdx/TerrarumSansBitmap.kt +++ b/src/net/torvald/terrarumsansbitmap/gdx/TerrarumSansBitmap.kt @@ -1412,19 +1412,28 @@ class TerrarumSansBitmap( private fun CodePoint.toCh() = if (this >= 0xF0000) this.puaToUni() else if (this < 65536) "${this.toChar()}" else this.toHex() + private val devaSyll = listOf("K","KH","G","GH","NG","C","CH","J","JH","NY","TT","TTH","DD","DDH","NN","T", + "TH","D","DH","N","NNN","P","PH","B","BH","M","Y","R","RR","L","LL","LLL", + "V","SH","SS","S","H","Q","KHH","GHH","Z","DDDH","RH","F","YY","x","x","x", + "D.R.Y","K.SS","J.NY","T.T","N.T","N.N","S.P","SS.V","SH.C","SH.N","SH.V","x","x","x","x","x", + "D.G","D.GH","D.D","D.DH","D.N","D.SS","D.BH","D.M","D.Y","D.V","mDD.DD","mDD.DDH","K.T","GH.TT","GH.TTH","GH.DDH", + "P.TT","P.TTH","P.DDH","SS.TT","SS.TTH","SS.DDH","H.NN","H.T","H.M","H.Y","H.L","H.V","x","x","x","x", + "DD.G","DD.BH","NG.G","NG.V","NG.M","CH.V","TT.TT","TT.TTH","TT.V","TTH.TTH","TTH.V","DD.DD","DD.DDH","DD.V","DDH.DDH","DDH.V" + ) // nuke this function when the time that compiled bytecode exceeds 64 kb finally arrives private fun CodePoint.puaToUni() = when (this) { - 0xF0100 -> "रु" - 0xF0101 -> "रू" - 0xF0102 -> "ऱु" - 0xF0103 -> "ऱू" - 0xF0104 -> "हु" - 0xF0105 -> "हू" - 0xF010B -> "˓" - in 0xF0140..0xF0164 -> "${(this - 0xf0140 + 0x915).toChar()}" - in 0xF0230..0xF0254 -> "${(this - 0xf0230 + 0x915).toChar()}${DEVANAGARI_VIRAMA.toChar()}${ZWJ.toChar()}" - in 0xF0320..0xF0344 -> "${(this - 0xf0320 + 0x915).toChar()}${DEVANAGARI_VIRAMA.toChar()}\u0930" - in 0xF0410..0xF0434 -> "${(this - 0xf0410 + 0x915).toChar()}${DEVANAGARI_VIRAMA.toChar()}\u0930${ZWJ.toChar()}" + 0xF0100 -> "Ru" + 0xF0101 -> "Ruu" + 0xF0102 -> "RRu" + 0xF0103 -> "RRuu" + 0xF0104 -> "Hu" + 0xF0105 -> "Huu" + 0xF010B -> "ᴿᵃ" + 0xF024C -> "Resh" + in 0xF0140 until 0xF0140+devaSyll.size -> devaSyll[this - 0xF0140] + in 0xF0230 until 0xF0230+devaSyll.size -> devaSyll[this - 0xF0230] + "ʰ" + in 0xF0320 until 0xF0320+devaSyll.size -> devaSyll[this - 0xF0320] + ".R" + in 0xF0410 until 0xF0410+devaSyll.size -> devaSyll[this - 0xF0410] + ".Rʰ" else -> this.toHex() } @@ -1727,14 +1736,32 @@ class TerrarumSansBitmap( - private fun ligateIndicConsonants(c1: CodePoint, c2: CodePoint): List { -// println("[TerrarumSansBitmap] Indic ligation ${c1.charInfo()} - ${c2.charInfo()}") + private fun ligateIndicConsonants(c1: CodePoint, c2: CodePoint, rec: Int = 0): List { +// dbgprn("Indic ligation${if (rec > 0) "$rec" else ""} ${c1.toCh()} - ${c2.toCh()}") if (c1 != DEVANAGARI_RA && c2 == DEVANAGARI_RA) return toRaAppended(c1) // Devanagari @.RA + // when the font try to ligate KSSR, the arguments are K and SSR (for some reason I don't understand). + // This method drops last Ra on c2 and then recursively ligates the remainder KSS, finally + // attaches Ra on the conjunct and returns the results. + else if (c1 != DEVANAGARI_RA && isRaAppended(c2)) { +// dbgprn("Ends with RA, trying Rlig...") + val c12WithNoRa = ligateIndicConsonants(c1, c2 - 480, rec + 1) + if (c12WithNoRa.size == 1) { + val c12andRa = toRaAppended(c12WithNoRa[0]) + if (c12andRa.size == 1) { +// dbgprn("Rligation successful: ${c12WithNoRa[0].toCh()} + R = ${c12andRa[0].toCh()}") + return c12andRa + } +// dbgprn("Rligation failed: ${c12WithNoRa[0].toCh()} + R = ${c12WithNoRa.map { it.toCh() }.joinToString(" + ")}") + } + // only return when ligation is possible, otherwise let the process continue so that + // Ka-Vir-SSRa form could be returned +// else dbgprn("Ligation failed, trying ${c1.toCh()} - ${c2.toCh()}") + } +// dbgprn("continue$rec: ${c1.toCh()} - ${c2.toCh()}") when (c1) { 0x0915.toDevaInternal() -> /* Devanagari KA */ when (c2) { 0x0924.toDevaInternal() -> return listOf(DEVANAGARI_LIG_K_T) // K.T 0x0937.toDevaInternal() -> return listOf(DEVANAGARI_LIG_K_SS) // K.SS - 0xF0337 -> return listOf(0xF0351) // K+SS.R DEVANAGARI_YA -> return c1.toHalfFormOrVirama() + DEVANAGARI_OPEN_YA // K.Y else -> return c1.toHalfFormOrVirama() + c2 } @@ -1742,14 +1769,11 @@ class TerrarumSansBitmap( 0x091F.toDevaInternal() -> return listOf(0xF018D) // GH.TT 0x0920.toDevaInternal() -> return listOf(0xF018E) // GH.TTH 0x0922.toDevaInternal() -> return listOf(0xF018F) // GH.DDH - 0xF032A -> return listOf(0xF036D) // GH+TT.R - 0xF032B -> return listOf(0xF036E) // GH+TTH.R - 0xF032D -> return listOf(0xF036F) // GH+DDH.R else -> return c1.toHalfFormOrVirama() + c2 } 0x0919.toDevaInternal() -> /* Devanagari NGA */ when (c2) { 0x0917.toDevaInternal() -> return listOf(0xF01A2) // NG.G - DEVANAGARI_VA -> return listOf(0xF01A3) // NG.V + 0x0918.toDevaInternal() -> return listOf(0xF01A3) // NG.GH 0x092E.toDevaInternal() -> return listOf(0xF01A4) // NG.M DEVANAGARI_YA -> return c1.toHalfFormOrVirama() + DEVANAGARI_OPEN_YA // NG.Y else -> return c1.toHalfFormOrVirama() + c2 @@ -1762,7 +1786,6 @@ class TerrarumSansBitmap( 0x091C.toDevaInternal() -> /* Devanagari JA */ when (c2) { 0x091E.toDevaInternal() -> return listOf(DEVANAGARI_LIG_J_NY) // J.NY DEVANAGARI_YA -> return c1.toHalfFormOrVirama() + DEVANAGARI_OPEN_YA // J.Y - 0xF0329 -> return listOf(0xF0352) // J.NY.R else -> return c1.toHalfFormOrVirama() + c2 } 0x091F.toDevaInternal() -> /* Devanagari TTA */ when (c2) { @@ -1781,6 +1804,8 @@ class TerrarumSansBitmap( 0x0921.toDevaInternal() -> /* Devanagari DDA */ when (c2) { 0x0921.toDevaInternal() -> return listOf(0xF01AB) // DD.DD 0x0922.toDevaInternal() -> return listOf(0xF01AC) // DD.DDH + 0x0917.toDevaInternal() -> return listOf(0xF01A0) // DD.G + 0x092D.toDevaInternal() -> return listOf(0xF01A1) // DD.BH DEVANAGARI_VA -> return listOf(0xF01AD) // DD.V DEVANAGARI_YA -> return c1.toHalfFormOrVirama() + DEVANAGARI_OPEN_YA // DD.Y else -> return c1.toHalfFormOrVirama() + c2 @@ -1793,7 +1818,6 @@ class TerrarumSansBitmap( } 0x0924.toDevaInternal() -> /* Devanagari TA */ when (c2) { 0x0924.toDevaInternal() -> return listOf(DEVANAGARI_LIG_T_T) // T.T - 0xF032F -> return listOf(0xF0353) // T.T.R else -> return c1.toHalfFormOrVirama() + c2 } 0x0926.toDevaInternal() -> /* Devanagari DA */ when (c2) { @@ -1807,31 +1831,17 @@ class TerrarumSansBitmap( 0x092E.toDevaInternal() -> return listOf(0xF0187) // D.M 0x092F.toDevaInternal() -> return listOf(0xF0188) // D.Y 0x0935.toDevaInternal() -> return listOf(0xF0189) // D.V - 0xF0322 -> return listOf(0xF0360) // D+G.R - 0xF0323 -> return listOf(0xF0361) // D+GH.R - 0xF0331 -> return listOf(0xF0362) // D+D.R - 0xF0332 -> return listOf(0xF0363) // D+DH.R - 0xF0333 -> return listOf(0xF0364) // D+N.R - 0xF0337 -> return listOf(0xF0365) // D+B.R - 0xF0338 -> return listOf(0xF0366) // D+BH.R - 0xF0339 -> return listOf(0xF0367) // D+M.R - 0xF033A -> return listOf(0xF0368) // D+Y.R - 0xF0340 -> return listOf(0xF0369) // D+V.R else -> return c1.toHalfFormOrVirama() + c2 } 0x0928.toDevaInternal() -> /* Devanagari NA */ when (c2) { 0x0924.toDevaInternal() -> return listOf(DEVANAGARI_LIG_N_T) // N.T 0x0928.toDevaInternal() -> return listOf(DEVANAGARI_LIG_N_N) // N.N - 0xF032F -> return listOf(0xF0354) // N.T.R else -> return c1.toHalfFormOrVirama() + c2 } 0x092A.toDevaInternal() -> /* Devanagari PA */ when (c2) { 0x091F.toDevaInternal() -> return listOf(0xF0190) // P.TT 0x0920.toDevaInternal() -> return listOf(0xF0191) // P.TTH 0x0922.toDevaInternal() -> return listOf(0xF0192) // P.DDH - 0xF032A -> return listOf(0xF0370) // P+TT.R - 0xF032B -> return listOf(0xF0371) // P+TTH.R - 0xF032D -> return listOf(0xF0372) // P+DDH.R else -> return c1.toHalfFormOrVirama() + c2 } 0x0936.toDevaInternal() -> /* Devanagari SHA */ when (c2) { @@ -1839,9 +1849,6 @@ class TerrarumSansBitmap( 0x0928.toDevaInternal() -> return listOf(DEVANAGARI_LIG_SH_N) // SH.N 0x0932.toDevaInternal() -> return listOf(DEVANAGARI_ALT_HALF_SHA, c2) // SH.L 0x0935.toDevaInternal() -> return listOf(DEVANAGARI_LIG_SH_V) // SH.V - 0xF0325 -> return listOf(0xF0358) // SH+C.R - 0xF033D -> return listOf(DEVANAGARI_ALT_HALF_SHA, c2)// SH+L.R - 0xF0340 -> return listOf(0xF035A) // SH+V.R else -> return c1.toHalfFormOrVirama() + c2 } 0x0937.toDevaInternal() -> /* Devanagari SSA */ when (c2) { @@ -1849,15 +1856,10 @@ class TerrarumSansBitmap( 0x0920.toDevaInternal() -> return listOf(0xF0194) // SS.TTH 0x0922.toDevaInternal() -> return listOf(0xF0195) // SS.DDH 0x092A.toDevaInternal() -> return listOf(DEVANAGARI_LIG_SS_P) // SS.P - 0xF032A -> return listOf(0xF0373) // SS+TT.R - 0xF032B -> return listOf(0xF0374) // SS+TTH.R - 0xF032D -> return listOf(0xF0375) // SS+DDH.R - 0xF0335 -> return listOf(0xF0357) // SS+P.R else -> return c1.toHalfFormOrVirama() + c2 } 0x0938.toDevaInternal() -> /* Devanagari SA */ when (c2) { 0x0935.toDevaInternal() -> return listOf(DEVANAGARI_LIG_S_V) // S.V - 0xF0340 -> return listOf(0xF0356) // S.V.R else -> return c1.toHalfFormOrVirama() + c2 } 0x0939.toDevaInternal() -> /* Devanagari HA */ when (c2) { @@ -2156,6 +2158,7 @@ class TerrarumSansBitmap( else throw IllegalArgumentException("No Internal form exists for ${this.charInfo()}") } + private fun isRaAppended(c: CodePoint) = c in (0xF0320..0xF04FF) /** * @param tone1 0..4 where 0 is extra-high diff --git a/testing.PNG b/testing.PNG index d5d2503..f56be56 100755 Binary files a/testing.PNG and b/testing.PNG differ diff --git a/testtext.txt b/testtext.txt index 5b8a4b9..2446420 100755 --- a/testtext.txt +++ b/testtext.txt @@ -1,4 +1,4 @@ -क क्क क्च क्त क्त्य क्त्र क्त्व क्थ क्न क्प क्प्र क्म क्य क्र क्ल क्व क्श क्ष क्ष्ण क्ष्म क्ष्म्य क्ष्य क्ष्व क्स +क क्क क्च क्त क्त्य क्त्र क्त्व क्थ क्न क्प क्प्र क्म क्य क्र क्ल क्व क्श क्ष क्ष्र क्ष्ण क्ष्म क्ष्म्य क्ष्य क्ष्व क्स ख ख्य ग ग्ग ग्ज ग्ज्य ग्ण ग्द ग्ध ग्ध्व ग्न ग्न्य ग्ब ग्भ ग्भ्य ग्म ग्य ग्र ग्र्य ग्ल ग्व घ घ्न घ्र घ्व @@ -18,7 +18,8 @@ न न्क न्क्र न्क्ल न्क्ष न्ख न्ग न्घ न्त न्त्य न्त्र न्त्र्य न्त्व न्त्स्य न्थ न्द न्द्य न्द्र न्द्व न्ध न्ध्य न्ध्र न्न न्न्य न्न्व न्प न्प्र न्फ न्ब न्ब्र न्भ न्भ्र न्म न्य न्र न्व न्व्य न्स न्स्थ न्स्म न्स्व न्ह प प्त प्त्व प्न प्म प्य प्र प्ल प्स प्स्य -ब ब्ज ब्द ब्ध ब्ध्व ब्य ब्र ब्व भ्ण भ्य भ्र भ्व +ब ब्ज ब्द ब्ध ब्ध्व ब्य ब्र ब्व +भ भ्ण भ्य भ्र भ्व म म्ण म्न म्प म्ब म्ब्य म्भ म्य म्र म्ल य य्य य्व र र्क र्क्ष्य र्ख र्ग र्ग्य र्ग्र र्घ र्घ्य र्ङ्ग र्च र्च्छ र्च्य र्छ र्ज र्ज्ञ र्ज्य र्ज्व र्ण र्ण्य र्त र्त्त र्त्म र्त्य र्त्र र्त्व र्त्स र्त्स्न्य र्थ र्थ्य र्द @@ -44,4 +45,9 @@ र्ग्यह अर्ग्यिह अर्त्स्न्यौह -अर्त्स्न्यिह \ No newline at end of file +अर्त्स्न्यिह कृकॄ + +ड्ग ड्भ ङ्ग ङ्घ ङ्म छ्व ट्ट ट्ठ ट्व ठ्ठ ठ्व ड्ड ड्ढ ड्व ढ्ढ ढ्व ष्ठ्र द्र्य +ड्ग्र ड्भ्र ङ्ग्र ङ्घ्र ङ्म्र छ्व्र ट्ट्र ट्ठ्र ट्व्र ठ्ठ्र ठ्व्र ड्ड्र ड्ढ्र ड्व्र ढ्ढ्र ढ्व्र + +श्क श्ख श्ग श्घ श्ङ श्च श्छ श्ज श्झ श्ञ श्ट श्ठ श्ड श्ढ श्ण श्त श्थ श्द श्ध श्न श्प श्फ श्ब श्भ श्म श्य श्र श्ल श्व श्श श्ष श्स श्ह श्ळ श्क्ष श्ज्ञ \ No newline at end of file diff --git a/work_files/devanagari_variable.psd b/work_files/devanagari_variable.psd index 951adcf..de5e252 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:0b93be8462eb4bc5002780f75854a9a32384b8c36f3116faf5e8fc5efd88f2a2 -size 1470719 +oid sha256:8754b12b86b0d81d384a00e3cad25f05f8847b7d1185b2186c6936998b67cba2 +size 1473493