devanagari: using new internal mapping

This commit is contained in:
minjaesong
2022-02-13 01:22:00 +09:00
parent 4614ffab92
commit 1705b2752e
8 changed files with 251 additions and 231 deletions

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 210 KiB

After

Width:  |  Height:  |  Size: 131 B

View File

@@ -126,4 +126,7 @@ data class GlyphProps(
fun forEachExtInfo(action: (Int) -> Unit) = extInfo.slice(0 until requiredExtInfoCount()).forEach(action) fun forEachExtInfo(action: (Int) -> Unit) = extInfo.slice(0 until requiredExtInfoCount()).forEach(action)
fun forEachExtInfoIndexed(action: (Int, Int) -> Unit) = extInfo.slice(0 until requiredExtInfoCount()).forEachIndexed(action) fun forEachExtInfoIndexed(action: (Int, Int) -> Unit) = extInfo.slice(0 until requiredExtInfoCount()).forEachIndexed(action)
val isIllegal: Boolean
get() = directiveOpcode == 255
} }

View File

@@ -1006,25 +1006,38 @@ class TerrarumSansBitmap(
// basically an Unicode NFD with some additional flavours // basically an Unicode NFD with some additional flavours
private fun CodepointSequence.normalise(): CodepointSequence { private fun CodepointSequence.normalise(): CodepointSequence {
val seq0 = CodepointSequence()
val seq = CodepointSequence() val seq = CodepointSequence()
val seq2 = CodepointSequence() val seq2 = CodepointSequence()
val seq3 = CodepointSequence() val seq3 = CodepointSequence()
val seq4 = CodepointSequence() val seq4 = CodepointSequence()
var i = 0 var i = 0
this.utf16to32().let { dis ->
// dbgprn("Charsequence: ${dis.map { "${it.toChar()}${ZWNJ.toChar()}" }.joinToString(" ")}") seq0.add(0)
this.utf16to32().forEach { c ->
// turn Unicode Devanagari consonants into the internal one
if (c in 0x0915..0x0939 || c in 0x0958..0x095F)
seq0.add(c.toDevaInternal())
else
seq0.add(c)
}
seq0.add(0)
while (i < dis.size) {
val cPrev2 = dis.getOrElse(i-2) { -1 } dbgprn("Charsequence: ${seq0.map { "${it.toChar()}${ZWNJ.toChar()}" }.joinToString(" ")}")
val cPrev = dis.getOrElse(i-1) { -1 }
val c = dis[i] i = 0
val cNext = dis.getOrElse(i+1) { -1 } while (i < seq0.lastIndex) {
val cNext2 = dis.getOrElse(i+2) { -1 } // val cPrev2 = seq0.getOrElse(i-2) { -1 }
val cNext3 = dis.getOrElse(i+3) { -1 } val cPrev = seq0.getOrElse(i-1) { -1 }
val c = seq0[i]
val cNext = seq0.getOrElse(i+1) { -1 }
val cNext2 = seq0.getOrElse(i+2) { -1 }
val cNext3 = seq0.getOrElse(i+3) { -1 }
// can't use regular sliding window as the 'i' value is changed way too often // can't use regular sliding window as the 'i' value is changed way too often
// LET THE NORMALISATION BEGIN // // LET THE NORMALISATION BEGIN //
// disassemble Hangul Syllables into Initial-Peak-Final encoding // disassemble Hangul Syllables into Initial-Peak-Final encoding
@@ -1107,10 +1120,10 @@ class TerrarumSansBitmap(
else if (c == 0xBB8 && cNext == TAMIL_I) { else if (c == 0xBB8 && cNext == TAMIL_I) {
seq.add(0xF00F5); i++ seq.add(0xF00F5); i++
} }
else if (c == 0xB95 && cNext == 0xBCD && dis.getOrElse(i+2){-1} == 0xBB7) { else if (c == 0xB95 && cNext == 0xBCD && cNext2 == 0xBB7) {
seq.add(TAMIL_KSSA); i += 2 seq.add(TAMIL_KSSA); i += 2
} }
else if (c == 0xBB6 && cNext == 0xBCD && dis.getOrElse(i+2){-1} == 0xBB0 && dis.getOrElse(i+3){-1} == 0xBC0) { else if (c == 0xBB6 && cNext == 0xBCD && cNext2 == 0xBB0 && cNext3 == 0xBC0) {
seq.add(TAMIL_SHRII); i += 3 seq.add(TAMIL_SHRII); i += 3
} }
else if (c == 0xB9F && cNext == 0xBBF) { else if (c == 0xB9F && cNext == 0xBBF) {
@@ -1193,8 +1206,6 @@ class TerrarumSansBitmap(
i++ i++
} }
}
// BEGIN of Devanagari String Replacer 2 (lookbehind type) // BEGIN of Devanagari String Replacer 2 (lookbehind type)
i = 0 i = 0
@@ -1659,6 +1670,177 @@ class TerrarumSansBitmap(
else 0 else 0
} }
private fun CodePoint.toHalfFormOrNull(): CodePoint? {
if (this in devanagariBaseConsonantsExtended) return null
if (this < 0xF0000) throw IllegalArgumentException("Normalise consonants to internal encoding first!")
if (this == DEVANAGARI_RYA) return DEVANAGARI_HALF_RYA
if (this == MARWARI_LIG_DD_Y) return MARWARI_HALFLIG_DD_Y
if (this == DEVANAGARI_OPEN_YA) return DEVANAGARI_OPEN_HALF_YA
(this + 240).let {
if (glyphProps[it]?.isIllegal != false)
return null
else
return it
}
}
// TODO use proper version of Virama for respective scripts
private fun CodePoint.toHalfFormOrVirama(): List<CodePoint> = this.toHalfFormOrNull().let {
// println("[TerrarumSansBitmap] toHalfForm ${this.charInfo()} = ${it?.charInfo()}")
if (it == null) listOf(this, DEVANAGARI_VIRAMA) else listOf(it)
}
// TODO use proper version of Virama for respective scripts
private fun toRaAppended(c: CodePoint): List<CodePoint> {
if (c == MARWARI_DD) return listOf(MARWARI_LIG_DD_R)
(c + 480).let {
if (glyphProps[it]?.isIllegal != false)
return listOf(c, DEVANAGARI_VIRAMA, DEVANAGARI_RA)
else
return listOf(it)
}
}
private fun ligateIndicConsonants(c1: CodePoint, c2: CodePoint): List<CodePoint> {
// println("[TerrarumSansBitmap] Indic ligation ${c1.charInfo()} - ${c2.charInfo()}")
if (c1 != DEVANAGARI_RA && c2 == DEVANAGARI_RA) return toRaAppended(c1) // Devanagari @.RA
when (c1) {
0x0915.toDevaInternal() -> /* Devanagari KA */ when (c2) {
0x0924.toDevaInternal() -> return listOf(DEVANAGARI_LIG_K_T) // K.T
0x0937.toDevaInternal() -> return listOf(DEVANAGARI_LIG_K_SS) // K.SS
0xF0337 -> return listOf(0xF0351) // K.SS.R
DEVANAGARI_YA -> return c1.toHalfFormOrVirama() + DEVANAGARI_OPEN_YA // K.Y
else -> return c1.toHalfFormOrVirama() + c2
}
0x0918.toDevaInternal() -> /* Devanagari GHA */ when (c2) {
0x091F.toDevaInternal() -> return listOf(0xF018D) // GH.TT
0x0920.toDevaInternal() -> return listOf(0xF018E) // GH.TTH
0x0922.toDevaInternal() -> return listOf(0xF018F) // GH.DDH
0xF032A -> return listOf(0xF036D) // GH.TTR
0xF032B -> return listOf(0xF036E) // GH.TTHR
0xF032D -> return listOf(0xF036F) // GH.DDHR
else -> return c1.toHalfFormOrVirama() + c2
}
0x0919.toDevaInternal() -> /* Devanagari NGA */ when (c2) {
0x0917.toDevaInternal() -> return listOf(0xF01A2) // NG.G
DEVANAGARI_VA -> return listOf(0xF01A3) // NG.V
0x092E.toDevaInternal() -> return listOf(0xF01A4) // NG.M
DEVANAGARI_YA -> return c1.toHalfFormOrVirama() + DEVANAGARI_OPEN_YA // NG.Y
else -> return c1.toHalfFormOrVirama() + c2
}
0x091B.toDevaInternal() -> /* Devanagari CHA */ when (c2) {
DEVANAGARI_VA -> return listOf(0xF01A5) // CH.V
DEVANAGARI_YA -> return c1.toHalfFormOrVirama() + DEVANAGARI_OPEN_YA // CH.Y
else -> return c1.toHalfFormOrVirama() + c2
}
0x091C.toDevaInternal() -> /* Devanagari JA */ when (c2) {
0x091E.toDevaInternal() -> return listOf(DEVANAGARI_LIG_J_NY) // J.NY
DEVANAGARI_YA -> return c1.toHalfFormOrVirama() + DEVANAGARI_OPEN_YA // J.Y
0xF0329 -> return listOf(0xF0352) // J.NY.R
else -> return c1.toHalfFormOrVirama() + c2
}
0x091F.toDevaInternal() -> /* Devanagari TTA */ when (c2) {
0x091F.toDevaInternal() -> return listOf(0xF01A6) // TT.TT
0x0920.toDevaInternal() -> return listOf(0xF01A7) // TT.TTH
DEVANAGARI_VA -> return listOf(0xF01A8) // TT.V
DEVANAGARI_YA -> return c1.toHalfFormOrVirama() + DEVANAGARI_OPEN_YA // TT.Y
else -> return c1.toHalfFormOrVirama() + c2
}
0x0920.toDevaInternal() -> /* Devanagari TTHA */ when (c2) {
0x0920.toDevaInternal() -> return listOf(0xF01A9) // TTH.TTH
DEVANAGARI_VA -> return listOf(0xF01AA) // TTH.V
DEVANAGARI_YA -> return c1.toHalfFormOrVirama() + DEVANAGARI_OPEN_YA // TTH.Y
else -> return c1.toHalfFormOrVirama() + c2
}
0x0921.toDevaInternal() -> /* Devanagari DDA */ when (c2) {
0x0921.toDevaInternal() -> return listOf(0xF01AB) // DD.DD
0x0922.toDevaInternal() -> return listOf(0xF01AC) // DD.DDH
DEVANAGARI_VA -> return listOf(0xF01AD) // DD.V
DEVANAGARI_YA -> return c1.toHalfFormOrVirama() + DEVANAGARI_OPEN_YA // DD.Y
else -> return c1.toHalfFormOrVirama() + c2
}
0x0922.toDevaInternal() -> /* Devanagari DDHA */ when (c2) {
0x0922.toDevaInternal() -> return listOf(0xF01AE) // DDH.DDH
DEVANAGARI_VA -> return listOf(0xF01AF) // DDH.V
DEVANAGARI_YA -> return c1.toHalfFormOrVirama() + DEVANAGARI_OPEN_YA // DDH.Y
else -> return c1.toHalfFormOrVirama() + c2
}
0x0924.toDevaInternal() -> /* Devanagari TA */ when (c2) {
0x0924.toDevaInternal() -> return listOf(DEVANAGARI_LIG_T_T) // T.T
0xF032F -> return listOf(0xF0353) // T.T.R
else -> return c1.toHalfFormOrVirama() + c2
}
0x0926.toDevaInternal() -> /* Devanagari DA */ when (c2) {
0x0917.toDevaInternal() -> return listOf(0xF0180) // D.G
0x0918.toDevaInternal() -> return listOf(0xF0181) // D.GH
0x0926.toDevaInternal() -> return listOf(0xF0182) // D.D
0x0927.toDevaInternal() -> return listOf(0xF0183) // D.DH
0x0928.toDevaInternal() -> return listOf(0xF0184) // D.N
0x092C.toDevaInternal() -> return listOf(0xF0185) // D.B
0x092D.toDevaInternal() -> return listOf(0xF0186) // D.BH
0x092E.toDevaInternal() -> return listOf(0xF0187) // D.M
0x092F.toDevaInternal() -> return listOf(0xF0188) // D.Y
0x0935.toDevaInternal() -> return listOf(0xF0189) // D.V
else -> return c1.toHalfFormOrVirama() + c2
}
0x0928.toDevaInternal() -> /* Devanagari NA */ when (c2) {
0x0924.toDevaInternal() -> return listOf(DEVANAGARI_LIG_N_T) // N.T
0x0928.toDevaInternal() -> return listOf(DEVANAGARI_LIG_N_N) // N.N
0xF032F -> return listOf(0xF0354) // N.T.R
else -> return c1.toHalfFormOrVirama() + c2
}
0x092A.toDevaInternal() -> /* Devanagari PA */ when (c2) {
0x091F.toDevaInternal() -> return listOf(0xF0190) // P.TT
0x0920.toDevaInternal() -> return listOf(0xF0191) // P.TTH
0x0922.toDevaInternal() -> return listOf(0xF0192) // P.DDH
0xF032A -> return listOf(0xF0370) // P.TTR
0xF032B -> return listOf(0xF0371) // P.TTHR
0xF032D -> return listOf(0xF0372) // P.DDHR
else -> return c1.toHalfFormOrVirama() + c2
}
0x0937.toDevaInternal() -> /* Devanagari SSA */ when (c2) {
0x091F.toDevaInternal() -> return listOf(0xF0193) // SS.TT
0x0920.toDevaInternal() -> return listOf(0xF0194) // SS.TTH
0x0922.toDevaInternal() -> return listOf(0xF0195) // SS.DDH
0xF032A -> return listOf(0xF0373) // SS.TTR
0xF032B -> return listOf(0xF0374) // SS.TTHR
0xF032D -> return listOf(0xF0375) // SS.DDHR
else -> return c1.toHalfFormOrVirama() + c2
}
0x0939.toDevaInternal() -> /* Devanagari HA */ when (c2) {
0x0923.toDevaInternal() -> return listOf(0xF0196) // H.NN
0x0928.toDevaInternal() -> return listOf(0xF0197) // H.N
0x092E.toDevaInternal() -> return listOf(0xF0198) // H.M
0x092F.toDevaInternal() -> return listOf(0xF0199) // H.Y
0x0932.toDevaInternal() -> return listOf(0xF019A) // H.L
0x0935.toDevaInternal() -> return listOf(0xF019B) // H.V
else -> return c1.toHalfFormOrVirama() + c2
}
0x0978 -> /* Marwari DDA */ when (c2) {
0x0978 -> return listOf(MARWARI_LIG_DD_DD) // DD.DD
0x0922.toDevaInternal() -> return listOf(MARWARI_LIG_DD_DDH) // DD.DDH
DEVANAGARI_YA -> return listOf(MARWARI_LIG_DD_Y) // DD.Y
else -> return c1.toHalfFormOrVirama() + c2
}
in 0xF0180..0xF0189 -> /* Devanagari D.@A */ when (c2) {
DEVANAGARI_YA -> return c1.toHalfFormOrVirama() + DEVANAGARI_OPEN_YA
else -> return c1.toHalfFormOrVirama() + c2
}
else -> return c1.toHalfFormOrVirama() + c2 // TODO use proper version of Virama for respective scripts
}
}
companion object { companion object {
private fun Boolean.toSign() = if (this) 1 else -1 private fun Boolean.toSign() = if (this) 1 else -1
@@ -1783,7 +1965,7 @@ class TerrarumSansBitmap(
"cyrilic_serbian_variable.tga", "cyrilic_serbian_variable.tga",
"tsalagi_variable.tga", "tsalagi_variable.tga",
"phonetic_extensions_variable.tga", "phonetic_extensions_variable.tga",
"devanagari_variable.tga", "devanagari_alt_encoding_variable.tga",
"kartuli_allcaps_variable.tga", "kartuli_allcaps_variable.tga",
"diacritical_marks_variable.tga", "diacritical_marks_variable.tga",
"greek_polytonic_xyswap_variable.tga", "greek_polytonic_xyswap_variable.tga",
@@ -1820,7 +2002,7 @@ class TerrarumSansBitmap(
0xF0060..0xF00BF, // SHEET_SERBIAN_VARW; assign them to PUA 0xF0060..0xF00BF, // SHEET_SERBIAN_VARW; assign them to PUA
0x13A0..0x13F5, // SHEET_TSALAGI_VARW 0x13A0..0x13F5, // SHEET_TSALAGI_VARW
0x1D00..0x1DBF, // SHEET_PHONETIC_EXT_VARW 0x1D00..0x1DBF, // SHEET_PHONETIC_EXT_VARW
(0x900..0x97F) + (0xF0100..0xF01FF), // SHEET_DEVANAGARI_VARW (0x900..0x97F) + (0xF0100..0xF04FF), // SHEET_DEVANAGARI_VARW
0x1C90..0x1CBF, // SHEET_KARTULI_CAPS_VARW 0x1C90..0x1CBF, // SHEET_KARTULI_CAPS_VARW
0x300..0x36F, // SHEET_DIACRITICAL_MARKS_VARW 0x300..0x36F, // SHEET_DIACRITICAL_MARKS_VARW
0x1F00..0x1FFF, // SHEET_GREEK_POLY_VARW 0x1F00..0x1FFF, // SHEET_GREEK_POLY_VARW
@@ -1851,231 +2033,74 @@ class TerrarumSansBitmap(
private val TAMIL_SHRII = 0xF00EE private val TAMIL_SHRII = 0xF00EE
private val TAMIL_I = 0xBBF private val TAMIL_I = 0xBBF
private val devanagariConsonants = ((0x0915..0x0939) + (0x0958..0x095F) + (0x0978..0x097F) + (0xF0105..0xF01FF)).toHashSet() private val devanagariConsonants = ((0x0915..0x0939) + (0x0958..0x095F) + (0x0978..0x097F) + (0xF0140..0xF04FF)).toHashSet()
private val devanagariVowels = ((0x093A..0x093C) + (0x093E..0x094C) + (0x094E..0x094F)).toHashSet() private val devanagariVowels = ((0x093A..0x093C) + (0x093E..0x094C) + (0x094E..0x094F)).toHashSet()
private val devanagariRightVowels = ((0x093A..0x093C) + (0x093E) + (0x0940..0x094C) + 0x094F).toHashSet() private val devanagariRightVowels = ((0x093A..0x093C) + (0x093E) + (0x0940..0x094C) + 0x094F).toHashSet()
private val devanagariBaseConsonants = 0x0915..0x0939 private val devanagariBaseConsonants = 0x0915..0x0939
private val devanagariBaseConsonantsWithNukta = 0x0958..0x095F private val devanagariBaseConsonantsWithNukta = 0x0958..0x095F
private val devanagariBaseConsonantsExtended = 0x0978..0x097F private val devanagariBaseConsonantsExtended = 0x0978..0x097F
private val devanagariPresentationConsonants = 0xF0140..0xF01FF private val devanagariPresentationConsonants = 0xF0140..0xF022F
private val devanagariPresentationConsonantsWithRa = 0xF0145..0xF017F private val devanagariPresentationConsonantsHalf = 0xF0230..0xF031F
private val devanagariPresentationIrregularConsonants = 0xF0180..0xF01BF private val devanagariPresentationConsonantsWithRa = 0xF0320..0xF040F
private val devanagariPresentationConsonantsWithRaHalf = 0xF0410..0xF04FF
private val devanagariConsonantsNonLig = (devanagariBaseConsonants + private val devanagariConsonantsNonLig = (devanagariBaseConsonants +
devanagariBaseConsonantsWithNukta + devanagariBaseConsonantsExtended + devanagariBaseConsonantsWithNukta + devanagariBaseConsonantsExtended +
devanagariPresentationConsonantsWithRa + devanagariPresentationIrregularConsonants).toHashSet() devanagariPresentationConsonants + devanagariPresentationConsonantsWithRa).toHashSet()
private val devanariConsonantsHalfs = ((0xF0105..0xF012F) + (0xF0137..0xF013F) + (0xF01C0..0xF01FF)).toHashSet() private val devanariConsonantsHalfs = ((0xF0105..0xF012F) + (0xF0137..0xF013F) + (0xF01C0..0xF01FF)).toHashSet()
private val DEVANAGARI_VIRAMA = 0x94D private val DEVANAGARI_VIRAMA = 0x94D
private val DEVANAGARI_RA = 0x930 private val DEVANAGARI_RA = 0x930.toDevaInternal()
private val DEVANAGARI_YA = 0x92F private val DEVANAGARI_YA = 0x92F.toDevaInternal()
private val DEVANAGARI_RRA = 0x931 private val DEVANAGARI_RRA = 0x931.toDevaInternal()
private val DEVANAGARI_VA = 0x0935 private val DEVANAGARI_VA = 0x0935.toDevaInternal()
private val DEVANAGARI_HA = 0x939 private val DEVANAGARI_HA = 0x939.toDevaInternal()
private val DEVANAGARI_U = 0x941 private val DEVANAGARI_U = 0x941
private val DEVANAGARI_UU = 0x942 private val DEVANAGARI_UU = 0x942
private val DEVANAGARI_RYA = 0xF0140 private val DEVANAGARI_RYA = 0xF0106
private val DEVANAGARI_HALF_RYA = 0xF0141 private val DEVANAGARI_HALF_RYA = 0xF0107
private val DEVANAGARI_SYLL_RU = 0xF0100 private val DEVANAGARI_SYLL_RU = 0xF0100
private val DEVANAGARI_SYLL_RUU = 0xF0101 private val DEVANAGARI_SYLL_RUU = 0xF0101
private val DEVANAGARI_SYLL_RRU = 0xF0102 private val DEVANAGARI_SYLL_RRU = 0xF0102
private val DEVANAGARI_SYLL_RRUU = 0xF0103 private val DEVANAGARI_SYLL_RRUU = 0xF0103
private val DEVANAGARI_SYLL_HU = 0xF0130 private val DEVANAGARI_SYLL_HU = 0xF0104
private val DEVANAGARI_SYLL_HUU = 0xF0131 private val DEVANAGARI_SYLL_HUU = 0xF0105
private val DEVANAGARI_OPEN_YA = 0xF0136 private val DEVANAGARI_OPEN_YA = 0xF0108
private val DEVANAGARI_OPEN_HALF_YA = 0xF0137 private val DEVANAGARI_OPEN_HALF_YA = 0xF0109
private val DEVANAGARI_RA_SUPER = 0xF0104 private val DEVANAGARI_RA_SUPER = 0xF010B
private val DEVANAGARI_EYELASH_RA = 0xF012A private val DEVANAGARI_EYELASH_RA = 0xF010C
private val DEVANAGARI_LIG_K_SS = 0xF0181 private val MARWARI_DD = 0x978
private val DEVANAGARI_LIG_J_NY = 0xF0184
private val DEVANAGARI_LIG_T_T = 0xF018B
private val DEVANAGARI_LIG_N_T = 0xF01B0
private val MARWARI_LIG_DD_DD = 0xF01AB
private val MARWARI_LIG_DD_DDH = 0xF01AC
private val MARWARI_LIG_DD_Y = 0xF01AD
private val DEVANAGARI_LIG_T_R = 0xF0154 private val DEVANAGARI_LIG_K_T = 0xF0170
private val MARWARI_LIG_DD_R = 0xF016A private val DEVANAGARI_LIG_K_SS = 0xF0171
private val DEVANAGARI_LIG_J_NY = 0xF0172
private val DEVANAGARI_LIG_T_T = 0xF0173
private val DEVANAGARI_LIG_N_T = 0xF0174
private val DEVANAGARI_LIG_N_N = 0xF0175
private val DEVANAGARI_LIG_K_SS_R = 0xF016B private val MARWARI_LIG_DD_DD = 0xF018A
private val DEVANAGARI_LIG_J_NY_R = 0xF016C private val MARWARI_LIG_DD_DDH = 0xF018B
private val DEVANAGARI_LIG_T_T_R = 0xF016D private val MARWARI_LIG_DD_Y = 0xF016E
private val DEVANAGARI_LIG_N_T_R = 0xF016E private val MARWARI_HALFLIG_DD_Y = 0xF016F
private val MARWARI_LIG_DD_R = 0xF0118
private val DEVANAGARI_HALFLIG_K_SS = 0xF012B
private val DEVANAGARI_HALFLIG_J_NY = 0xF012C
private val DEVANAGARI_HALFLIG_T_T = 0xF012D
private val DEVANAGARI_HALFLIG_N_T = 0xF01C4
private val MARWARI_HALFLIG_DD_Y = 0xF01AE
private val DEVANAGARI_HALF_FORMS = 0xF0100 // starting point for Devanagari half forms
private val DEVANAGARI_LIG_X_R = 0xF0140 // starting point for Devanagari ligature CONSONANT+RA
private fun CodePoint.toHalfFormOrNull(): CodePoint? { private val DEVANAGARI_HALF_FORMS = 0xF0230 // starting point for Devanagari half forms
if (this == DEVANAGARI_RYA) return DEVANAGARI_HALF_RYA private val DEVANAGARI_LIG_X_R = 0xF0410 // starting point for Devanagari ligature CONSONANT+RA
if (this in 0xF018C..0xF018F) return this + 0x34
if (this == DEVANAGARI_LIG_K_SS) return DEVANAGARI_HALFLIG_K_SS private fun Int.toDevaInternal(): Int {
if (this == DEVANAGARI_LIG_J_NY) return DEVANAGARI_HALFLIG_J_NY if (this in 0x0915..0x0939) return this - 0x0915 + 0xF0140
if (this == DEVANAGARI_LIG_T_T) return DEVANAGARI_HALFLIG_T_T else if (this in 0x0958..0x095F) return this - 0x0958 + 0xF0165
if (this == DEVANAGARI_LIG_N_T) return DEVANAGARI_HALFLIG_N_T else throw IllegalArgumentException("No Internal form exists for ${this.charInfo()}")
if (this == DEVANAGARI_OPEN_YA) return DEVANAGARI_OPEN_HALF_YA
if (this == MARWARI_LIG_DD_Y) return MARWARI_HALFLIG_DD_Y
if (this in devanagariBaseConsonants) return (this - 0x0910 + DEVANAGARI_HALF_FORMS)
if (this in devanagariBaseConsonantsWithNukta) return (this - 0x0920 + DEVANAGARI_HALF_FORMS)
if (this in devanagariPresentationConsonantsWithRa) return this + 0x80
return null
} }
// TODO use proper version of Virama for respective scripts
private fun CodePoint.toHalfFormOrVirama(): List<CodePoint> = this.toHalfFormOrNull().let {
// println("[TerrarumSansBitmap] toHalfForm ${this.charInfo()} = ${it?.charInfo()}")
if (it == null) listOf(this, DEVANAGARI_VIRAMA) else listOf(it)
}
// TODO use proper version of Virama for respective scripts
private fun toRaAppended(c: CodePoint): List<CodePoint> {
if (c in devanagariBaseConsonants) return listOf(c - 0x0910 + DEVANAGARI_LIG_X_R)
else if (c == DEVANAGARI_LIG_K_SS) return listOf(DEVANAGARI_LIG_K_SS_R)
else if (c == DEVANAGARI_LIG_J_NY) return listOf(DEVANAGARI_LIG_J_NY_R)
else if (c == DEVANAGARI_LIG_T_T) return listOf(DEVANAGARI_LIG_T_T_R)
else if (c == 0x0978) return listOf(MARWARI_LIG_DD_R)
else return listOf(c, DEVANAGARI_VIRAMA, DEVANAGARI_RA)
}
private fun ligateIndicConsonants(c1: CodePoint, c2: CodePoint): List<CodePoint> {
// println("[TerrarumSansBitmap] Indic ligation ${c1.charInfo()} - ${c2.charInfo()}")
if (c1 != DEVANAGARI_RA && c2 == DEVANAGARI_RA) return toRaAppended(c1) // Devanagari @.RA
when (c1) {
0x0915 -> /* Devanagari KA */ when (c2) {
0x0924 -> return listOf(0xF0180) // K.T
0x0937 -> return listOf(DEVANAGARI_LIG_K_SS) // K.SS
0xF0167 -> return listOf(DEVANAGARI_LIG_K_SS_R) // K.SS.R
DEVANAGARI_YA -> return c1.toHalfFormOrVirama() + DEVANAGARI_OPEN_YA // K.Y
else -> return c1.toHalfFormOrVirama() + c2
}
0x0918 -> /* Devanagari GHA */ when (c2) {
0x091F -> return listOf(0xF01A2) // GH.TT
0x0920 -> return listOf(0xF01A3) // GH.TTH
0x0922 -> return listOf(0xF01A4) // GH.DDH
0xF014F -> return listOf(0xF0172) // GH.TTR
0xF0150 -> return listOf(0xF0173) // GH.TTHR
0xF0152 -> return listOf(0xF0174) // GH.DDHR
else -> return c1.toHalfFormOrVirama() + c2
}
0x0919 -> /* Devanagari NGA */ when (c2) {
0x0917 -> return listOf(0xF0182) // NG.G
0x092E -> return listOf(0xF0183) // NG.M
DEVANAGARI_VA -> return listOf(0xF019C) // NG.V
DEVANAGARI_YA -> return c1.toHalfFormOrVirama() + DEVANAGARI_OPEN_YA // NG.Y
else -> return c1.toHalfFormOrVirama() + c2
}
0x091B -> /* Devanagari CHA */ when (c2) {
DEVANAGARI_VA -> return listOf(0xF019D) // CH.V
DEVANAGARI_YA -> return c1.toHalfFormOrVirama() + DEVANAGARI_OPEN_YA // CH.Y
else -> return c1.toHalfFormOrVirama() + c2
}
0x091C -> /* Devanagari JA */ when (c2) {
0x091E -> return listOf(DEVANAGARI_LIG_J_NY) // J.NY
DEVANAGARI_YA -> return c1.toHalfFormOrVirama() + DEVANAGARI_OPEN_YA // J.Y
0xF014E -> return listOf(DEVANAGARI_LIG_J_NY_R) // J.NY.R
else -> return c1.toHalfFormOrVirama() + c2
}
0x091F -> /* Devanagari TTA */ when (c2) {
0x091F -> return listOf(0xF0185) // TT.TT
0x0920 -> return listOf(0xF0186) // TT.TTH
DEVANAGARI_VA -> return listOf(0xF019E) // TT.V
DEVANAGARI_YA -> return c1.toHalfFormOrVirama() + DEVANAGARI_OPEN_YA // TT.Y
else -> return c1.toHalfFormOrVirama() + c2
}
0x0920 -> /* Devanagari TTHA */ when (c2) {
0x0920 -> return listOf(0xF0187) // TTH.TTH
DEVANAGARI_VA -> return listOf(0xF019F) // TTH.V
DEVANAGARI_YA -> return c1.toHalfFormOrVirama() + DEVANAGARI_OPEN_YA // TTH.Y
else -> return c1.toHalfFormOrVirama() + c2
}
0x0921 -> /* Devanagari DDA */ when (c2) {
0x0921 -> return listOf(0xF0188) // DD.DD
0x0922 -> return listOf(0xF0189) // DD.DDH
DEVANAGARI_VA -> return listOf(0xF01A0) // DD.V
DEVANAGARI_YA -> return c1.toHalfFormOrVirama() + DEVANAGARI_OPEN_YA // DD.Y
else -> return c1.toHalfFormOrVirama() + c2
}
0x0922 -> /* Devanagari DDHA */ when (c2) {
0x0922 -> return listOf(0xF018A) // DDH.DDH
DEVANAGARI_VA -> return listOf(0xF01A1) // DDH.V
DEVANAGARI_YA -> return c1.toHalfFormOrVirama() + DEVANAGARI_OPEN_YA // DDH.Y
else -> return c1.toHalfFormOrVirama() + c2
}
0x0924 -> /* Devanagari TA */ when (c2) {
0x0924 -> return listOf(DEVANAGARI_LIG_T_T) // T.T
DEVANAGARI_LIG_T_R -> return listOf(DEVANAGARI_LIG_T_T_R) // T.T.R
else -> return c1.toHalfFormOrVirama() + c2
}
0x0926 -> /* Devanagari DA */ when (c2) {
0x0917 -> return listOf(0xF019A) // D.G
0x0918 -> return listOf(0xF019B) // D.GH
0x0926 -> return listOf(0xF018C) // D.D
0x0927 -> return listOf(0xF018D) // D.DH
0x092C -> return listOf(0xF018E) // D.B
0x092D -> return listOf(0xF018F) // D.BH
0x092E -> return listOf(0xF0190) // D.M
0x092F -> return listOf(0xF0191) // D.Y
0x0935 -> return listOf(0xF0192) // D.V
else -> return c1.toHalfFormOrVirama() + c2
}
0x0928 -> /* Devanagari NA */ when (c2) {
0x0924 -> return listOf(DEVANAGARI_LIG_N_T) // N.T
0x0928 -> return listOf(0xF0193) // N.N
DEVANAGARI_LIG_T_R -> return listOf(DEVANAGARI_LIG_N_T_R) // N.T.R
else -> return c1.toHalfFormOrVirama() + c2
}
0x092A -> /* Devanagari PA */ when (c2) {
0x091F -> return listOf(0xF01A5) // P.TT
0x0920 -> return listOf(0xF01A6) // P.TTH
0x0922 -> return listOf(0xF01A7) // P.DDH
0xF014F -> return listOf(0xF0175) // P.TTR
0xF0150 -> return listOf(0xF0176) // P.TTHR
0xF0152 -> return listOf(0xF0177) // P.DDHR
else -> return c1.toHalfFormOrVirama() + c2
}
0x0937 -> /* Devanagari SSA */ when (c2) {
0x091F -> return listOf(0xF01A8) // SS.TT
0x0920 -> return listOf(0xF01A9) // SS.TTH
0x0922 -> return listOf(0xF01AA) // SS.DDH
0xF014F -> return listOf(0xF0178) // SS.TTR
0xF0150 -> return listOf(0xF0179) // SS.TTHR
0xF0152 -> return listOf(0xF017A) // SS.DDHR
else -> return c1.toHalfFormOrVirama() + c2
}
0x0939 -> /* Devanagari HA */ when (c2) {
0x0923 -> return listOf(0xF0194) // H.NN
0x0928 -> return listOf(0xF0195) // H.N
0x092E -> return listOf(0xF0196) // H.M
0x092F -> return listOf(0xF0197) // H.Y
0x0932 -> return listOf(0xF0198) // H.L
0x0935 -> return listOf(0xF0199) // H.V
else -> return c1.toHalfFormOrVirama() + c2
}
0x0978 -> /* Marwari DDA */ when (c2) {
0x0978 -> return listOf(MARWARI_LIG_DD_DD) // DD.DD
0x0922 -> return listOf(MARWARI_LIG_DD_DDH) // DD.DDH
DEVANAGARI_YA -> return listOf(MARWARI_LIG_DD_Y) // DD.Y
else -> return c1.toHalfFormOrVirama() + c2
}
in 0xF018C..0xF018F -> /* Devanagari D.@A */ when (c2) {
DEVANAGARI_YA -> return c1.toHalfFormOrVirama() + DEVANAGARI_OPEN_YA
else -> return c1.toHalfFormOrVirama() + c2
}
else -> return c1.toHalfFormOrVirama() + c2 // TODO use proper version of Virama for respective scripts
}
}
/** /**
* @param tone1 0..4 where 0 is extra-high * @param tone1 0..4 where 0 is extra-high

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -1,22 +1,11 @@
हिन्दी विकिपीडिया
विकिपीडिया सभी विषयों पर प्रामाणिक और उपयोग, परिवर्तन विकिपीडिया सभी विषयों पर प्रामाणिक और उपयोग, परिवर्तन
व पुनर्वितरण के लिए स्वतन्त्र ज्ञानकोश बनाने का एक बहुभाषीय व पुनर्वितरण के लिए स्वतन्त्र ज्ञानकोश बनाने का एक बहुभाषीय
प्रकल्प है। यह यथासम्भव निष्पक्ष दृष्टिकोण वाली सूचना प्रकल्प है। यह यथासम्भव निष्पक्ष दृष्टिकोण वाली सूचना प्रसारित
प्रसारित करने के लिए कृतसंकल्प है। सर्वप्रथम अंग्रेज़ी करने के लिए कृतसंकल्प है। सर्वप्रथम अंग्रेज़ी विकिपीडिया
विकिपीडिया जनवरी 2001 में आरम्भ किया गया था, और जनवरी 2001 में आरम्भ किया गया था, और हिन्दी
हिन्दी विकिपीडिया का शुभारम्भ जुलाई 2003 में हुआ। विकिपीडिया का शुभारम्भ जुलाई 2003 में हुआ। सहायता पृष्ठ
सहायता पृष्ठ पर जाएं और प्रयोगस्थल में प्रयोग करके देखें कि पर जाएं और प्रयोगस्थल में प्रयोग करके देखें कि आप स्वयं
आप स्वयं किसी लेख को कैसे परिवर्तित कर सकते हैं। किसी लेख को कैसे परिवर्तित कर सकते हैं।
सभी << open BHA (not a ligature) पुनर्वितरण < RAsup on व
स्वतन्त्र << N.T.RA ligature परिवर्तित < RAsup on त
सर्वप्रथम << RAsup must be above VA
भारतीय अक्षर जटिल हैं क्ष्फ क्षफ अऺ कृकॄ
ऄअआऑऒओऔ ॲॳॴॵॶॷ
˩˥˦˧˨˩˥˧˦˨˨˩˧˩˦˥˦˩˧˩˨˩
˩
எழுத்து வடிவங்களுக்கு வார்த்தைகள் மற்றும் வாக்கியங்கள் போலவே தொனி, ஒலி பண்பு, தன்மை உண்டு

Binary file not shown.

Binary file not shown.