mirror of
https://github.com/curioustorvald/Terrarum-sans-bitmap.git
synced 2026-06-06 05:58:30 +09:00
I think I've nailed down the RAsup rendering
This commit is contained in:
BIN
assets/devanagari_variable.tga
LFS
BIN
assets/devanagari_variable.tga
LFS
Binary file not shown.
@@ -45,6 +45,7 @@ data class GlyphProps(
|
|||||||
const val STACK_DOWN = 1
|
const val STACK_DOWN = 1
|
||||||
const val STACK_BEFORE_N_AFTER = 2
|
const val STACK_BEFORE_N_AFTER = 2
|
||||||
const val STACK_UP_N_DOWN = 3
|
const val STACK_UP_N_DOWN = 3
|
||||||
|
const val STACK_DONT = 4
|
||||||
|
|
||||||
const val DIA_OVERLAY = 2
|
const val DIA_OVERLAY = 2
|
||||||
// const val DIA_JOINER = 2
|
// const val DIA_JOINER = 2
|
||||||
|
|||||||
@@ -713,7 +713,12 @@ class TerrarumSansBitmap(
|
|||||||
else writeOnTop = writeOnTop.ushr(28) and 15
|
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)
|
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 (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 (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 (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 seq2 = CodepointSequence()
|
||||||
|
|
||||||
val yankedCharacters = Stack<Pair<Int, CodePoint>>() // Stack of <Position, CodePoint>; codepoint use -1 if not applicable
|
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() {
|
fun emptyOutYanked() {
|
||||||
while (!yankedCharacters.empty()) {
|
while (!yankedCharacters.empty()) {
|
||||||
@@ -1170,7 +1185,7 @@ class TerrarumSansBitmap(
|
|||||||
// Unicode Devanagari Rendering Rule R6-R8
|
// 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)
|
// (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) {
|
else if (devanagariConsonants.contains(c) && cNext == DEVANAGARI_VIRAMA && cNext2 == DEVANAGARI_RA) {
|
||||||
seq.addAll(toRaAppended(c))
|
seq.addAll(ligateIndicConsonants(c, cNext2))
|
||||||
i += 2
|
i += 2
|
||||||
}
|
}
|
||||||
// Unicode Devanagari Rendering Rule R5
|
// Unicode Devanagari Rendering Rule R5
|
||||||
@@ -1179,18 +1194,38 @@ class TerrarumSansBitmap(
|
|||||||
i += 1
|
i += 1
|
||||||
}
|
}
|
||||||
// Unicode Devanagari Rendering Rule R2-R4
|
// Unicode Devanagari Rendering Rule R2-R4
|
||||||
else if (c == DEVANAGARI_RA && cNext == DEVANAGARI_VIRAMA && cNext2 != DEVANAGARI_RA) {
|
// in Regex: RA (vir C)+ V* ᴿ [not V && not vir]
|
||||||
yankedCharacters.push(i to c)
|
else if (yankedDevanagariRaStatus[1] == 1 && c == DEVANAGARI_VIRAMA) {
|
||||||
i += 1
|
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()) {
|
else if (!isDevanagari(c) && !yankedCharacters.empty()) {
|
||||||
emptyOutYanked()
|
emptyOutYanked()
|
||||||
seq.add(c)
|
seq.add(c)
|
||||||
|
resetRaStatus()
|
||||||
}
|
}
|
||||||
// WIP
|
// WIP
|
||||||
// END of devanagari string replacer
|
// END of devanagari string replacer
|
||||||
|
|
||||||
// rearrange {letter, before-and-after diacritics} as {before-diacritics, letter, after-diacritics}
|
// rearrange {letter, before-and-after diacritics} as {before-diacritics, letter, after-diacritics}
|
||||||
else if (glyphProps[c]?.stackWhere == GlyphProps.STACK_BEFORE_N_AFTER) {
|
else if (glyphProps[c]?.stackWhere == GlyphProps.STACK_BEFORE_N_AFTER) {
|
||||||
val diacriticsProp = glyphProps[c]!!
|
val diacriticsProp = glyphProps[c]!!
|
||||||
@@ -1710,6 +1745,7 @@ class TerrarumSansBitmap(
|
|||||||
private val TAMIL_SHRII = 0xF00EE
|
private val TAMIL_SHRII = 0xF00EE
|
||||||
|
|
||||||
private val devanagariConsonants = ((0x0915..0x0939) + (0x0958..0x095F) + (0x0978..0x097F) + (0xF0105..0xF01FF)).toIntArray()
|
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 devanagariBaseConsonants = 0x0915..0x0939
|
||||||
private val devanagariBaseConsonantsWithNukta = 0x0958..0x095F
|
private val devanagariBaseConsonantsWithNukta = 0x0958..0x095F
|
||||||
|
|||||||
BIN
testing.PNG
BIN
testing.PNG
Binary file not shown.
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 24 KiB |
@@ -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
|
शर्करा « RAsup must be above KA
|
||||||
अंग्रेजी
|
अंग्रेजी
|
||||||
|
ख्य
|
||||||
|
மோநௌ « check the sanity of glyph reordering
|
||||||
Binary file not shown.
Reference in New Issue
Block a user