diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5ef4401..dd8c3a5 100755 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -116,7 +116,7 @@ Currently supported opcodes: *00000000: No-operation; does not use the Compiler Directive system. -*10000xxx: Replace a character with xxx subchars (yes, number 0 can be used). +*10000111: Replace a character with maximum 7 subchars. Replacement characters are encoded vertically from X-zero, bit by bit (colour of the pixel doesn't matter) with LSB sitting on Y-zero. diff --git a/PUA_allocation_chart.xlsx b/PUA_allocation_chart.xlsx index 9ac13c9..821abca 100755 Binary files a/PUA_allocation_chart.xlsx and b/PUA_allocation_chart.xlsx differ diff --git a/assets/devanagari_variable.tga b/assets/devanagari_variable.tga index a7aca0c..b881ab1 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:b8202e14617760d02855ce3ec9a4702206e994508dfc9f4df83409099841124d +oid sha256:f545641ea029fa3f3c66aced67674fc3ff569834239ccdc62dc784c9c570c480 size 491538 diff --git a/assets/internal_variable.tga b/assets/internal_variable.tga index 41eb7a9..997b919 100644 --- a/assets/internal_variable.tga +++ b/assets/internal_variable.tga @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ad3b0ddd391eae7ea32afef5f016cf93858f0d2c222f598c8dc70b98288dbfad +oid sha256:acd10775e2d8c2494c9896519c7172a7856cd36a4976e9779a8bcd088e5517a2 size 327698 diff --git a/demo.PNG b/demo.PNG index 2c3f333..2b44df4 100644 Binary files a/demo.PNG and b/demo.PNG differ diff --git a/src/net/torvald/terrarumsansbitmap/gdx/TerrarumSansBitmap.kt b/src/net/torvald/terrarumsansbitmap/gdx/TerrarumSansBitmap.kt index 1c5f310..7cfe43c 100755 --- a/src/net/torvald/terrarumsansbitmap/gdx/TerrarumSansBitmap.kt +++ b/src/net/torvald/terrarumsansbitmap/gdx/TerrarumSansBitmap.kt @@ -879,6 +879,7 @@ class TerrarumSansBitmap( else -> posXbuffer[nonDiacriticCounter] + itsProp.width + alignmentOffset + interchar + kerning + extraWidth } + posYbuffer[charIndex] = -thisProp.nudgeY nonDiacriticCounter = charIndex @@ -927,11 +928,11 @@ class TerrarumSansBitmap( // if (thisProp.alignWhere == GlyphProps.ALIGN_CENTRE) { when (thisProp.stackWhere) { GlyphProps.STACK_DOWN -> { - posYbuffer[charIndex] = H_DIACRITICS * stackDownwardCounter * flipY.toSign() + posYbuffer[charIndex] = (H_DIACRITICS * stackDownwardCounter + -thisProp.nudgeY) * flipY.toSign() stackDownwardCounter++ } GlyphProps.STACK_UP -> { - posYbuffer[charIndex] = -H_DIACRITICS * stackUpwardCounter * flipY.toSign() + posYbuffer[charIndex] = (-H_DIACRITICS * stackUpwardCounter + -thisProp.nudgeY) * flipY.toSign() // shift down on lowercase if applicable if (getSheetType(thisChar) in autoShiftDownOnLowercase && lastNonDiacriticChar.isLowHeight()) { @@ -949,11 +950,11 @@ class TerrarumSansBitmap( // dbgprn("lastNonDiacriticChar: ${lastNonDiacriticChar.charInfo()}; stack counter: $stackUpwardCounter") } GlyphProps.STACK_UP_N_DOWN -> { - posYbuffer[charIndex] = H_DIACRITICS * stackDownwardCounter * flipY.toSign() + posYbuffer[charIndex] = (H_DIACRITICS * stackDownwardCounter + -thisProp.nudgeY) * flipY.toSign() stackDownwardCounter++ - posYbuffer[charIndex] = -H_DIACRITICS * stackUpwardCounter * flipY.toSign() + posYbuffer[charIndex] = (-H_DIACRITICS * stackUpwardCounter + -thisProp.nudgeY) * flipY.toSign() // shift down on lowercase if applicable if (getSheetType(thisChar) in autoShiftDownOnLowercase && lastNonDiacriticChar.isLowHeight()) { @@ -1066,6 +1067,9 @@ class TerrarumSansBitmap( var i = 0 this.utf16to32().let { dis -> + +// dbgprn("Charsequence: ${dis.map { "${it.toChar()}${ZWNJ.toChar()}" }.joinToString(" ")}") + while (i < dis.size) { val cPrev2 = dis.getOrElse(i-2) { -1 } val cPrev = dis.getOrElse(i-1) { -1 } @@ -1076,6 +1080,7 @@ class TerrarumSansBitmap( // can't use regular sliding window as the 'i' value is changed way too often // LET THE NORMALISATION BEGIN // +// dbgprn("Ra: ${yankedDevanagariRaStatus[1]}; Chars: ${cPrev2.toChar()}${ZWNJ.toChar()} ${cPrev.toChar()}${ZWNJ.toChar()} [ ${c.toChar()}${ZWNJ.toChar()} ] ${cNext.toChar()}${ZWNJ.toChar()} ${cNext2.toChar()}${ZWNJ.toChar()}") // disassemble Hangul Syllables into Initial-Peak-Final encoding if (c in 0xAC00..0xD7A3) { @@ -1191,6 +1196,43 @@ class TerrarumSansBitmap( else if (c == DEVANAGARI_HA && cNext == DEVANAGARI_UU) { seq.add(DEVANAGARI_SYLL_HUU); i += 1 } + // Unicode Devanagari Rendering Rule R2-R4 + // in Regex: RA (vir C)+ V* ᴿ [not V && not vir] + else if (yankedDevanagariRaStatus[1] == 0 && c == DEVANAGARI_RA && cNext == DEVANAGARI_VIRAMA) { +// dbgprn(" Yanking RA (0 -> 1)") + + yankedCharacters.push(i to c) + changeRaStatus(1) + } + else if (yankedDevanagariRaStatus[1] == 1 && c == DEVANAGARI_VIRAMA) { +// dbgprn(" Virama (1 -> 2)") + + if (yankedDevanagariRaStatus[0] != 0) + seq.add(c) + changeRaStatus(2) + } + else if (yankedDevanagariRaStatus[1] == 2 && devanagariConsonants.contains(c)) { +// dbgprn(" Consonants after Virama (2 -> 1)") + + seq.add(c) + changeRaStatus(1) + } + else if ((yankedDevanagariRaStatus[1] == 1 || yankedDevanagariRaStatus[1] == 3) && devanagariVowels.contains(c)) { +// dbgprn(" Vowels (${yankedDevanagariRaStatus[1]} -> 3)") + + seq.add(c) + changeRaStatus(3) + } + // -- termination or illegal state for Devanagari RA + else if (yankedDevanagariRaStatus[1] > 0) { +// dbgprn(" Popping out RAsup") + + yankedCharacters.pop() + seq.add(DEVANAGARI_RA_SUPER) +// dbgprn(" -> Seq: ${seq[seq.lastIndex - 2].toHex()} ${seq[seq.lastIndex - 1].toHex()} [ ${seq[seq.lastIndex].toHex()} ]") + resetRaStatus() + i-- // scan this character again next time + } // 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) { @@ -1202,32 +1244,6 @@ class TerrarumSansBitmap( seq.add(DEVANAGARI_EYELASH_RA) i += 1 } - // Unicode Devanagari Rendering Rule R2-R4 - // 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) && devanagariVowels.contains(c)) { - seq.add(c) - changeRaStatus(3) - } -// else if (yankedDevanagariRaStatus == 3 && !devanagariVowels.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) - } else if (!isDevanagari(c) && !yankedCharacters.empty()) { emptyOutYanked() seq.add(c) @@ -1247,6 +1263,8 @@ class TerrarumSansBitmap( // U+007F is DEL originally, but dis font stores bitmap of Replacement Character (U+FFFD) // to dis position. dis line will replace U+FFFD into U+007F. else { +// dbgprn(" nop") + seq.add(c) } diff --git a/testing.PNG b/testing.PNG index ceedcf4..2db9829 100755 Binary files a/testing.PNG and b/testing.PNG differ diff --git a/testtext.txt b/testtext.txt index a676c45..79fd4d5 100755 --- a/testtext.txt +++ b/testtext.txt @@ -12,7 +12,9 @@ सभी << open BHA (not a ligature) स्वतन्त्र << N.T.RA ligature -सर्वप्रथम << RAsup must be above VA, not P.RA +सर्वप्रथम << RAsup must be above VA -भारतीय अक्षर जटिल हैं क्ष्फ क्षफ अऺ -ऄअआऑऒओऔ ॲॳॴॵॶॷ \ 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 5151473..5caa513 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:690ddcdadd281ca7fbe6fa55c6141aa55e5af429086a18a827c189969ce3320f -size 552640 +oid sha256:0b3a2060b1fd9870e2b77063322ba0b717c6de0d56a247906bd2c9fcc10967e4 +size 552970 diff --git a/work_files/internal_variable.psd b/work_files/internal_variable.psd index 4dcabab..1f08476 100644 --- a/work_files/internal_variable.psd +++ b/work_files/internal_variable.psd @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c5e96729787105995b6319af0bff0239a1b9dbf3cd7e9d85de9062d55bbac467 -size 285654 +oid sha256:6991dc79b54ae9a023d0b458a836e5c23fcae50748f9b71208b5793d9398c384 +size 284790 diff --git a/work_files/ipa_ext_variable.psd b/work_files/ipa_ext_variable.psd index cd0db25..dd10958 100644 --- a/work_files/ipa_ext_variable.psd +++ b/work_files/ipa_ext_variable.psd @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8c0e41fe4e68560498509f9e29a467457408b63fd7c28bc9067cc97402c819b9 -size 271693 +oid sha256:902dc067d33a4c10017018ef4ea52d8257c053ee932d3a7c963e8f694d65fbd1 +size 270148