diff --git a/assets/devanagari_variable.tga b/assets/devanagari_variable.tga index 42f577a..6ec17b2 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:43d0c132455fcfb1713f81756625e029b8bac68ef869e547f2a99237a10fad39 +oid sha256:beed6606f9cca641ec56b5354f6fffc36f5621dcccedb1207d9234e8aa14bfdd size 1474578 diff --git a/src/net/torvald/terrarumsansbitmap/gdx/TerrarumSansBitmap.kt b/src/net/torvald/terrarumsansbitmap/gdx/TerrarumSansBitmap.kt index acdf589..d645f8f 100755 --- a/src/net/torvald/terrarumsansbitmap/gdx/TerrarumSansBitmap.kt +++ b/src/net/torvald/terrarumsansbitmap/gdx/TerrarumSansBitmap.kt @@ -30,6 +30,7 @@ import com.badlogic.gdx.graphics.Pixmap import com.badlogic.gdx.graphics.Texture import com.badlogic.gdx.graphics.g2d.* import com.badlogic.gdx.utils.GdxRuntimeException +import com.ibm.icu.impl.Normalizer2Impl.Hangul.isHangul import net.torvald.terrarumsansbitmap.DiacriticsAnchor import net.torvald.terrarumsansbitmap.GlyphProps import net.torvald.terrarumsansbitmap.gdx.TerrarumSansBitmap.Companion.charInfo @@ -1312,7 +1313,7 @@ class TerrarumSansBitmap( // reposition devanagari RA-initials into RAsup i = 0 -// dbgprn("seq3 = ${seq3.map { "${it.toCh()}${ZWNJ.toChar()}" }.joinToString(" ")}") + dbgprnLig("seq3 = ${seq3.map { "${it.toCh()}${ZWNJ.toChar()}" }.joinToString(" ")}") val yankedCharacters = Stack>() // Stack of ; codepoint use -1 if not applicable var yankedDevanagariRaStatus = intArrayOf(0,0) // 0: none, 1: consonants, 2: virama, 3: vowel for this syllable @@ -1340,44 +1341,54 @@ class TerrarumSansBitmap( val c = seq3[i] val cNext = seq3.getOrElse(i+1) { -1 } val cNext2 = seq3.getOrElse(i+2) { -1 } -// val cNext3 = seq3.getOrElse(i+3) { -1 } -// dbgprn(" र${yankedDevanagariRaStatus[1]} Chars: ${cPrev2.toCh()}${ZWNJ.toChar()} ${cPrev.toCh()}${ZWNJ.toChar()} [ ${c.toCh()}${ZWNJ.toChar()} ] ${cNext.toCh()}${ZWNJ.toChar()} ${cNext2.toCh()}${ZWNJ.toChar()}") + dbgprnLig(" र${yankedDevanagariRaStatus[1]} Chars: ${cPrev2.toCh()}${ZWNJ.toChar()} ${cPrev.toCh()}${ZWNJ.toChar()} [ ${c.toCh()}${ZWNJ.toChar()} ] ${cNext.toCh()}${ZWNJ.toChar()} ${cNext2.toCh()}${ZWNJ.toChar()}") // in Regex: RA vir VL* (C vir C (vir C)*)? VR* ᴿ [not V && not vir] + // TERMINATOR: right vowel | non-half consonant before any consonants if (yankedDevanagariRaStatus[1] == 0 && c == DEVANAGARI_RA && cNext == DEVANAGARI_VIRAMA) { -// dbgprn(" Yanking RA (0 -> 1)") + dbgprnLig(" Yanking RA (0 -> 1)") yankedCharacters.push(i to c) changeRaStatus(1) } else if (yankedDevanagariRaStatus[1] == 1 && yankedDevanagariRaStatus[0] == 0 && c == DEVANAGARI_VIRAMA) { -// dbgprn(" First Virama (1 -> 2)") + dbgprnLig(" First Virama (1 -> 2)") changeRaStatus(2) } else if (yankedDevanagariRaStatus[1] == 2 && devanagariConsonants.contains(c)) { -// dbgprn(" Consonants after Virama (2 -> 1)") + dbgprnLig(" Consonants after Virama (2 -> 1)") seq4.add(c) changeRaStatus(1) } - else if (yankedDevanagariRaStatus[1] == 3 && devanagariConsonants.contains(c)) { -// dbgprn(" Consonants after Left Vowel (3 -> 1)") + else if (yankedDevanagariRaStatus[1] in listOf(1,3) && devanariConsonantsHalfs.contains(c)) { + dbgprnLig(" Consonants Half Form (${yankedDevanagariRaStatus[1]} -> 3)") + seq4.add(c) + changeRaStatus(3) + } + else if (yankedDevanagariRaStatus[1] == 5 && devanagariConsonants.contains(c)) { + dbgprnLig(" Consonants after Left Vowel (5 -> 1)") seq4.add(c) changeRaStatus(1) } else if ((yankedDevanagariRaStatus[1] > 0) && devanagariRightVowels.contains(c)) { -// dbgprn(" Right Vowels (${yankedDevanagariRaStatus[1]} -> 4)") + dbgprnLig(" Right Vowels (${yankedDevanagariRaStatus[1]} -> 4)") seq4.add(c) changeRaStatus(4) } else if ((yankedDevanagariRaStatus[1] in 1..3) && devanagariVowels.contains(c)) { -// dbgprn(" Left Vowels (${yankedDevanagariRaStatus[1]} -> 3)") + dbgprnLig(" Left Vowels (${yankedDevanagariRaStatus[1]} -> 5)") seq4.add(c) - changeRaStatus(3) + changeRaStatus(5) + } + else if (yankedDevanagariRaStatus[1] > 0 && devanariConsonantsHalfs.contains(cPrev) && devanagariConsonants.contains(c)) { + dbgprnLig(" Consonant Tail after Halfs (${yankedDevanagariRaStatus[1]} -> 9)") + seq4.add(c) + changeRaStatus(9) } // -- termination or illegal state for Devanagari RA else if (yankedDevanagariRaStatus[1] > 0) { -// dbgprn(" Popping out RAsup") + dbgprnLig(" Popping out RAsup") yankedCharacters.pop() seq4.add(DEVANAGARI_RA_SUPER) resetRaStatus() @@ -1399,7 +1410,9 @@ class TerrarumSansBitmap( return seq4 } - private fun CodePoint.toCh() = if (this in 0xF0100..0xF02FF) this.puaToUni() else if (this < 65536) "${this.toChar()}" else this.toHex() + private fun dbgprnLig(i: Any) { if (false) println("[${this.javaClass.simpleName}] $i") } + + private fun CodePoint.toCh() = if (this >= 0xF0000) this.puaToUni() else if (this < 65536) "${this.toChar()}" else this.toHex() // nuke this function when the time that compiled bytecode exceeds 64 kb finally arrives private fun CodePoint.puaToUni() = when (this) { @@ -1411,6 +1424,9 @@ class TerrarumSansBitmap( 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()}" else -> this.toHex() } @@ -2056,24 +2072,6 @@ class TerrarumSansBitmap( private val TAMIL_SHRII = 0xF00EE private val TAMIL_I = 0xBBF - private val devanagariConsonants = ((0x0915..0x0939) + (0x0958..0x095F) + (0x0978..0x097F) + (0xF0140..0xF04FF)).toHashSet() - private val devanagariVowels = ((0x093A..0x093C) + (0x093E..0x094C) + (0x094E..0x094F)).toHashSet() - private val devanagariRightVowels = ((0x093A..0x093C) + (0x093E) + (0x0940..0x094C) + 0x094F).toHashSet() - - private val devanagariBaseConsonants = 0x0915..0x0939 - private val devanagariBaseConsonantsWithNukta = 0x0958..0x095F - private val devanagariBaseConsonantsExtended = 0x0978..0x097F - private val devanagariPresentationConsonants = 0xF0140..0xF022F - private val devanagariPresentationConsonantsHalf = 0xF0230..0xF031F - private val devanagariPresentationConsonantsWithRa = 0xF0320..0xF040F - private val devanagariPresentationConsonantsWithRaHalf = 0xF0410..0xF04FF - - - private val devanagariConsonantsNonLig = (devanagariBaseConsonants + - devanagariBaseConsonantsWithNukta + devanagariBaseConsonantsExtended + - devanagariPresentationConsonants + devanagariPresentationConsonantsWithRa).toHashSet() - - private val devanariConsonantsHalfs = ((0xF0105..0xF012F) + (0xF0137..0xF013F) + (0xF01C0..0xF01FF)).toHashSet() private val DEVANAGARI_VIRAMA = 0x94D private val DEVANAGARI_RA = 0x930.toDevaInternal() @@ -2117,9 +2115,28 @@ class TerrarumSansBitmap( private val MARWARI_LIG_DD_R = 0xF0118 + private val devanagariConsonants = ((0x0915..0x0939) + (0x0958..0x095F) + (0x0978..0x097F) + + (0xF0140..0xF04FF) + (0xF0106..0xF0109)).toHashSet() + private val devanagariVowels = ((0x093A..0x093C) + (0x093E..0x094C) + (0x094E..0x094F)).toHashSet() + private val devanagariRightVowels = ((0x093A..0x093C) + (0x093E) + (0x0940..0x094C) + 0x094F).toHashSet() + + private val devanagariBaseConsonants = 0x0915..0x0939 + private val devanagariBaseConsonantsWithNukta = 0x0958..0x095F + private val devanagariBaseConsonantsExtended = 0x0978..0x097F + private val devanagariPresentationConsonants = 0xF0140..0xF022F + private val devanagariPresentationConsonantsHalf = 0xF0230..0xF031F + private val devanagariPresentationConsonantsWithRa = 0xF0320..0xF040F + private val devanagariPresentationConsonantsWithRaHalf = 0xF0410..0xF04FF + + + private val devanagariConsonantsNonLig = (devanagariBaseConsonants + + devanagariBaseConsonantsWithNukta + devanagariBaseConsonantsExtended + + devanagariPresentationConsonants + devanagariPresentationConsonantsWithRa).toHashSet() + + private val devanariConsonantsHalfs = (devanagariPresentationConsonantsHalf + + devanagariPresentationConsonantsWithRaHalf + listOf(DEVANAGARI_HALF_RYA, DEVANAGARI_OPEN_HALF_YA)).toHashSet() + - private val DEVANAGARI_HALF_FORMS = 0xF0230 // starting point for Devanagari half forms - private val DEVANAGARI_LIG_X_R = 0xF0410 // starting point for Devanagari ligature CONSONANT+RA private fun Int.toDevaInternal(): Int { if (this in 0x0915..0x0939) return this - 0x0915 + 0xF0140 diff --git a/testing.PNG b/testing.PNG index 5644b0d..9b7bd9e 100755 Binary files a/testing.PNG and b/testing.PNG differ diff --git a/testtext.txt b/testtext.txt index 5523639..35cf481 100755 --- a/testtext.txt +++ b/testtext.txt @@ -28,4 +28,20 @@ श श्च श्च्य श्छ श्न श्प श्म श्य श्र श्ल श्व श्व्य ष ष्क ष्क्र ष्ट ष्ट्य ष्ट्र ष्ट्व ष्ठ ष्ठ्य ष्ण ष्ण्य ष्प ष्प्र ष्म ष्य ष्व स स्क स्त स्त्य स्त्र स्त्र्य स्त्व स्थ स्थ्य स्न स्प स्फ स्म स्म्य स्य स्र स्व स्स्व -ह ह्ण ह्न ह्म ह्य ह्र ह्ल ह्व \ No newline at end of file +ह ह्ण ह्न ह्म ह्य ह्र ह्ल ह्व + +विकिपीडिया सभी विषयों पर प्रामाणिक और उपयोग, परिवर्तन +व पुनर्वितरण के लिए स्वतन्त्र ज्ञानकोश बनाने का एक बहुभाषीय +प्रकल्प है। यह यथासम्भव निष्पक्ष दृष्टिकोण वाली सूचना प्रसारित +करने के लिए कृतसंकल्प है। सर्वप्रथम अंग्रेज़ी विकिपीडिया +जनवरी 2001 में आरम्भ किया गया था, और हिन्दी +विकिपीडिया का शुभारम्भ जुलाई 2003 में हुआ। सहायता पृष्ठ +पर जाएं और प्रयोगस्थल में प्रयोग करके देखें कि आप स्वयं +किसी लेख को कैसे परिवर्तित कर सकते हैं। + +र्ज्यह +परिवर्तन +र्ग्यह +अर्ग्यिह +अर्त्स्न्यौह +अर्त्स्न्यिह \ No newline at end of file diff --git a/work_files/devanagari_variable.psd b/work_files/devanagari_variable.psd index 9ebf68c..a57eff0 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:4d08974e99771ef7c6befec48ff7677d4f7841e925481fd04b995b466e686a90 -size 1433187 +oid sha256:8cadd82e1f6c1a9a7a3cc3d972648c57061e1a65efcc2872acf0ec933c346379 +size 1431809