I think I've nailed down the RAsup rendering

This commit is contained in:
minjaesong
2022-01-24 17:34:11 +09:00
parent 54d983013a
commit 23aac0c1c1
6 changed files with 54 additions and 14 deletions

Binary file not shown.

View File

@@ -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

View File

@@ -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<Pair<Int, CodePoint>>() // Stack of <Position, CodePoint>; 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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 24 KiB

View File

@@ -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
अंग्रेजी
अंग्रेजी
ख्य
மோநௌ « check the sanity of glyph reordering

Binary file not shown.