summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/harfbuzz
diff options
context:
space:
mode:
authorJiang Jiang <jiang.jiang@nokia.com>2012-01-16 14:39:56 (GMT)
committerQt by Nokia <qt-info@nokia.com>2012-01-18 17:07:00 (GMT)
commit44f415aafaf7eec56b31468a58e0ca768bbc082d (patch)
tree2919064359cc4eee32bec40ab23d49bdc59a57d4 /src/3rdparty/harfbuzz
parentba7a19727c42047048f16f155ce10c51c90fa1bc (diff)
downloadQt-44f415aafaf7eec56b31468a58e0ca768bbc082d.zip
Qt-44f415aafaf7eec56b31468a58e0ca768bbc082d.tar.gz
Qt-44f415aafaf7eec56b31468a58e0ca768bbc082d.tar.bz2
Fix isolated Thai SARA AM handling
Since 5e07a3ac58f93bd5e09715d43b58c20950c2befa Thai text layout is handled by libthai to special case of the SARA AM. It didn't handle isolated SARA AM. This patch fixed it and added detailed explaination on the special case. The dotted circle should be shown rather than hidden. Added a test case to verify that with Waree. Change-Id: I4967715627cbe15f5a3e9ab3e3844420ab541aed Reviewed-by: Jiang Jiang <jiang.jiang@nokia.com>
Diffstat (limited to 'src/3rdparty/harfbuzz')
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-thai.c33
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 262cee6..deff61b 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;
}