diff --git a/assets/devanagari_variable.tga b/assets/devanagari_variable.tga index 40e8729..ec84188 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:32c52fdafc5860e4ea876d0b2ed58da94398de94fd5271f9fe9509f9661cdf0f +oid sha256:e39e686cfdc068d08a3a245d110bf09920f4fd6c4c6a6e1b83c01c09621ca34b size 491538 diff --git a/src/net/torvald/terrarumsansbitmap/GlyphProps.kt b/src/net/torvald/terrarumsansbitmap/GlyphProps.kt index 11a0b24..cc91246 100755 --- a/src/net/torvald/terrarumsansbitmap/GlyphProps.kt +++ b/src/net/torvald/terrarumsansbitmap/GlyphProps.kt @@ -45,6 +45,7 @@ data class GlyphProps( const val STACK_DOWN = 1 const val STACK_BEFORE_N_AFTER = 2 const val STACK_UP_N_DOWN = 3 + const val STACK_DONT = 4 const val DIA_OVERLAY = 2 // const val DIA_JOINER = 2 diff --git a/src/net/torvald/terrarumsansbitmap/gdx/TerrarumSansBitmap.kt b/src/net/torvald/terrarumsansbitmap/gdx/TerrarumSansBitmap.kt index 46c12aa..d8200bf 100755 --- a/src/net/torvald/terrarumsansbitmap/gdx/TerrarumSansBitmap.kt +++ b/src/net/torvald/terrarumsansbitmap/gdx/TerrarumSansBitmap.kt @@ -713,7 +713,12 @@ class TerrarumSansBitmap( else writeOnTop = writeOnTop.ushr(28) and 15 } - val stackWhere = (0..1).fold(0) { acc, y -> acc or ((pixmap.getPixel(codeStartX, codeStartY + y + 18).and(255) != 0).toInt() shl y) } + val stackWhere0 = pixmap.getPixel(codeStartX, codeStartY + 18).tagify() + val stackWhere1 = pixmap.getPixel(codeStartX, codeStartY + 19).tagify() + + val stackWhere = if (stackWhere0 == 0x00FF00FF && stackWhere1 == 0x00FF00FF) + GlyphProps.STACK_DONT + else (0..1).fold(0) { acc, y -> acc or ((pixmap.getPixel(codeStartX, codeStartY + y + 18).and(255) != 0).toInt() shl y) } glyphProps[code] = GlyphProps(width, isLowHeight, nudgeX, nudgeY, diacriticsAnchors, alignWhere, writeOnTop, stackWhere, IntArray(15), hasKernData, isKernYtype, kerningMask, directiveOpcode, directiveArg1, directiveArg2) @@ -745,7 +750,7 @@ class TerrarumSansBitmap( // if (diacriticsAnchors.any { it.xUsed || it.yUsed }) dbgprn("${code.charInfo()} ${diacriticsAnchors.filter { it.xUsed || it.yUsed }.joinToString()}") // if (directiveOpcode != 0) dbgprn("Directive opcode ${directiveOpcode.toString(2)}: ${code.charInfo()}") // if (glyphProps[code]?.isPragma("replacewith") == true) dbgprn("Replacer: ${code.charInfo()} into ${glyphProps[code]!!.extInfo.map { it.toString(16) }.joinToString()}") - +// if (stackWhere == GlyphProps.STACK_DONT) dbgprn("Diacritics Don't stack: ${code.charInfo()}") } } @@ -1037,6 +1042,16 @@ class TerrarumSansBitmap( val seq2 = CodepointSequence() 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 + + fun changeRaStatus(n: Int) { + yankedDevanagariRaStatus[0] = yankedDevanagariRaStatus[1] + yankedDevanagariRaStatus[1] = n + } + fun resetRaStatus() { + yankedDevanagariRaStatus[0] = 0 + yankedDevanagariRaStatus[1] = 0 + } fun emptyOutYanked() { while (!yankedCharacters.empty()) { @@ -1170,7 +1185,7 @@ class TerrarumSansBitmap( // Unicode Devanagari Rendering Rule R6-R8 // (this must precede the ligaturing-machine coded on the 2nd pass, otherwise the rules below will cause undesirable effects) else if (devanagariConsonants.contains(c) && cNext == DEVANAGARI_VIRAMA && cNext2 == DEVANAGARI_RA) { - seq.addAll(toRaAppended(c)) + seq.addAll(ligateIndicConsonants(c, cNext2)) i += 2 } // Unicode Devanagari Rendering Rule R5 @@ -1179,18 +1194,38 @@ class TerrarumSansBitmap( i += 1 } // Unicode Devanagari Rendering Rule R2-R4 - else if (c == DEVANAGARI_RA && cNext == DEVANAGARI_VIRAMA && cNext2 != DEVANAGARI_RA) { - yankedCharacters.push(i to c) - i += 1 + // in Regex: RA (vir C)+ V* ᴿ [not V && not vir] + else if (yankedDevanagariRaStatus[1] == 1 && c == DEVANAGARI_VIRAMA) { + if (yankedDevanagariRaStatus[0] != 0) + seq.add(c) + changeRaStatus(2) + } + else if (yankedDevanagariRaStatus[1] == 2 && devanagariConsonants.contains(c)) { + seq.add(c) + changeRaStatus(1) + } + else if ((yankedDevanagariRaStatus[1] == 1 || yankedDevanagariRaStatus[1] == 3) && devanagariVerbs.contains(c)) { + seq.add(c) + changeRaStatus(3) + } +// else if (yankedDevanagariRaStatus == 3 && !devanagariVerbs.contains(c)) { + else if (yankedDevanagariRaStatus[1] > 0 && yankedCharacters.peek().second == DEVANAGARI_RA) { // termination or illegal state for Devanagari RA + yankedCharacters.pop() + seq.add(DEVANAGARI_RA_SUPER) + resetRaStatus() + i-- // scan this character again next time + } + else if (c == DEVANAGARI_RA && cNext == DEVANAGARI_VIRAMA && devanagariConsonants.contains(c)) { + yankedCharacters.push(i to c) + changeRaStatus(1) } - // Unicode Devanagari Rendering Rule R2-R4 else if (!isDevanagari(c) && !yankedCharacters.empty()) { emptyOutYanked() seq.add(c) + resetRaStatus() } // WIP // END of devanagari string replacer - // rearrange {letter, before-and-after diacritics} as {before-diacritics, letter, after-diacritics} else if (glyphProps[c]?.stackWhere == GlyphProps.STACK_BEFORE_N_AFTER) { val diacriticsProp = glyphProps[c]!! @@ -1710,6 +1745,7 @@ class TerrarumSansBitmap( private val TAMIL_SHRII = 0xF00EE private val devanagariConsonants = ((0x0915..0x0939) + (0x0958..0x095F) + (0x0978..0x097F) + (0xF0105..0xF01FF)).toIntArray() + private val devanagariVerbs = ((0x093A..0x093C) + (0x093E..0x094C) + (0x094E..0x094F)).toIntArray() private val devanagariBaseConsonants = 0x0915..0x0939 private val devanagariBaseConsonantsWithNukta = 0x0958..0x095F diff --git a/testing.PNG b/testing.PNG index 8a95573..c8826a7 100755 Binary files a/testing.PNG and b/testing.PNG differ diff --git a/testtext.txt b/testtext.txt index 38a115e..8ba8df9 100755 --- a/testtext.txt +++ b/testtext.txt @@ -1,8 +1,11 @@ - फ़ॊण्ज़ीणू क्की क्कि र्क र्त्सा र्र्ल ऱ्ड क्राप् ठ्री त्र् स्त्रक्ष्य ह्णह्नह्मह्यह्लह्वह्र णनमयलव ज़्लतान छात्त्र छात्र क्ष्र ज्ञ्र -ङ्यछ्यट्यठ्यड्यढ्यद्यश्यह्य ढा ऱुमिक्युब हुहू दुदू द्गद्घद्द ढ्ढढ्वद्व +क्यङ्यछ्यट्यठ्यड्यढ्यद्यश्यह्य ढा ऱुमिक्युब हुहू दुदू द्गद्घद्द ढ्ढढ्वद्व ग्र्क्र क्श्र त्रत्त्र क्ष्र्प ढ्य्ब न्न्ग तत्र अग्निः अस्ति। अष्टाध्यायी प्च प्छ +र्त्सार्पै « R.T.SAA R.PAI (RAsup must be above last 2 stems) +ऱ्त्साऱ्पै « RR.T.SAA RR.PAI (must use eyelash-RA) शर्करा « RAsup must be above KA -अंग्रेजी \ No newline at end of file +अंग्रेजी +ख्य +மோநௌ « check the sanity of glyph reordering \ No newline at end of file diff --git a/work_files/devanagari_variable.psd b/work_files/devanagari_variable.psd index a72496b..7088f8a 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:3bbcb79668e394dec3035860e7cdb90cb6e67c9842edd68575ad524b70874c39 -size 542046 +oid sha256:0e5ffee10b3f4546770ca6844d1d777a351a8477beb54a884c602cedbaa0d0d7 +size 543168