diff options
Diffstat (limited to 'src/3rdparty/harfbuzz')
-rw-r--r-- | src/3rdparty/harfbuzz/src/harfbuzz-thai.c | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-thai.c b/src/3rdparty/harfbuzz/src/harfbuzz-thai.c index 262cee6a8e..deff61be7e 100644 --- a/src/3rdparty/harfbuzz/src/harfbuzz-thai.c +++ b/src/3rdparty/harfbuzz/src/harfbuzz-thai.c @@ -258,20 +258,39 @@ static HB_Bool HB_ThaiConvertStringToGlyphIndices (HB_ShaperItem *item) /* Add glyphs to glyphs string and setting some attributes */ for (int lgi = 0; lgi < lgn; lgi++) { if ( rglyphs[lgi] == 0xdd/*TH_BLANK_BASE_GLYPH*/ ) { - //if ( !item->fixedPitch ) { - glyphString[slen++] = C_DOTTED_CIRCLE; - item->attributes[slen-1].dontPrint = true; // FIXME this will hide all dotted circle - //} + glyphString[slen++] = C_DOTTED_CIRCLE; } else { glyphString[slen++] = (HB_UChar16) thai_get_glyph_index (font_type, rglyphs[lgi]); } } + /* Special case to handle U+0E33 (SARA AM, āļģ): SARA AM is normally written at the end of a + * word with a base character and an optional top character before it. For example, U+0E0B + * (base), U+0E49 (top), U+0E33 (SARA AM). The sequence should be converted to 4 glyphs: + * base, hilo (the little circle in the top left part of SARA AM, NIKHAHIT), top, then the + * right part of SARA AM (SARA AA). + * + * The painting process finds out the starting glyph and ending glyph of a character + * sequence by checking the logClusters array. In this case, logClusters array should + * ideally be [ 0, 1, 3 ] so that glyphsStart = 0 and glyphsEnd = 3 (slen - 1) to paint out + * all the glyphs generated. + * + * A special case in this special case is when we have no base character. When an isolated + * SARA AM is processed (cell_length = 1), libthai will produce 3 glyphs: dotted circle + * (indicates that the base is empty), NIKHAHIT then SARA AA. If logClusters[0] = 1, it will + * paint from the second glyph in the glyphs array. So in this case logClusters[0] should + * point to the first glyph it produces, aka. the dotted circle. */ if (haveSaraAm) { - logClusters[i + cell_length - 1] = slen - 1; // Set logClusters before NIKAHIT - if (tis_cell.top != 0) - logClusters[i + cell_length - 2] = slen - 2; // Set logClusters before NIKAHIT when tis_cell has top + logClusters[i + cell_length - 1] = cell_length == 1 ? slen - 3 : slen - 1; + if (tis_cell.top != 0) { + if (cell_length > 1) { + /* set the logClusters[top character] to slen - 2 as it points to the second to + * lastglyph (slen - 2) */ + logClusters[i + cell_length - 2] = slen - 2; + } + } + /* check for overflow */ if (logClusters[i + cell_length - 1] > slen) logClusters[i + cell_length - 1] = 0; } |