diff options
Diffstat (limited to 'src/3rdparty/harfbuzz/src')
-rw-r--r-- | src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp | 28 | ||||
-rw-r--r-- | src/3rdparty/harfbuzz/src/harfbuzz-thai.c | 15 |
2 files changed, 38 insertions, 5 deletions
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp b/src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp index 0734442fe0..af0ee52e9a 100644 --- a/src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp +++ b/src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp @@ -265,6 +265,34 @@ static inline void positionCluster(HB_ShaperItem *item, int gfrom, int glast) //qreal offsetBase = (size - 4) / 4 + qMin<qreal>(size, 4) + 1; // qDebug("offset = %f", offsetBase); + // To fix some Thai character heights check for two above glyphs + if (nmarks == 2 && (attributes[gfrom+1].combiningClass == HB_Combining_AboveRight || + attributes[gfrom+1].combiningClass == HB_Combining_AboveLeft || + attributes[gfrom+1].combiningClass == HB_Combining_Above)) + if (attributes[gfrom+2].combiningClass == 23 || + attributes[gfrom+2].combiningClass == 24 || + attributes[gfrom+2].combiningClass == 25 || + attributes[gfrom+2].combiningClass == 27 || + attributes[gfrom+2].combiningClass == 28 || + attributes[gfrom+2].combiningClass == 30 || + attributes[gfrom+2].combiningClass == 31 || + attributes[gfrom+2].combiningClass == 33 || + attributes[gfrom+2].combiningClass == 34 || + attributes[gfrom+2].combiningClass == 35 || + attributes[gfrom+2].combiningClass == 36 || + attributes[gfrom+2].combiningClass == 107 || + attributes[gfrom+2].combiningClass == 122) { + // Two above glyphs, check total height + int markTotalHeight = baseMetrics.height; + HB_GlyphMetrics markMetrics; + item->font->klass->getGlyphMetrics(item->font, glyphs[gfrom+1], &markMetrics); + markTotalHeight += markMetrics.height; + item->font->klass->getGlyphMetrics(item->font, glyphs[gfrom+2], &markMetrics); + markTotalHeight += markMetrics.height; + if ((markTotalHeight + 2 * offsetBase) > (size * 10)) + offsetBase = ((size * 10) - markTotalHeight) / 2; // Use offset that just fits + } + bool rightToLeft = item->item.bidiLevel % 2; int i; diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-thai.c b/src/3rdparty/harfbuzz/src/harfbuzz-thai.c index deff61be7e..bf6c35b19c 100644 --- a/src/3rdparty/harfbuzz/src/harfbuzz-thai.c +++ b/src/3rdparty/harfbuzz/src/harfbuzz-thai.c @@ -74,10 +74,10 @@ static void to_tis620(const HB_UChar16 *string, hb_uint32 len, const char *cstr) for (i = 0; i < len; ++i) { if (string[i] <= 0xa0) result[i] = (unsigned char)string[i]; - if (string[i] >= 0xe01 && string[i] <= 0xe5b) + else if (string[i] >= 0xe01 && string[i] <= 0xe5b) result[i] = (unsigned char)(string[i] - 0xe00 + 0xa0); else - result[i] = '?'; + result[i] = (unsigned char)~0; // Same encoding as libthai uses for invalid chars } result[len] = 0; @@ -259,8 +259,13 @@ static HB_Bool HB_ThaiConvertStringToGlyphIndices (HB_ShaperItem *item) for (int lgi = 0; lgi < lgn; lgi++) { if ( rglyphs[lgi] == 0xdd/*TH_BLANK_BASE_GLYPH*/ ) { glyphString[slen++] = C_DOTTED_CIRCLE; - } - else { + } else if (cstr[i] == (signed char)~0) { + // The only glyphs that should be passed to this function that cannot be mapped to + // tis620 are the ones of type Inherited class. Pass these glyphs untouched. + glyphString[slen++] = string[i]; + if (string[i] == 0x200D || string[i] == 0x200C) + item->attributes[slen-1].dontPrint = true; // Hide ZWJ and ZWNJ characters + } else { glyphString[slen++] = (HB_UChar16) thai_get_glyph_index (font_type, rglyphs[lgi]); } } @@ -353,7 +358,7 @@ HB_Bool HB_ThaiShape (HB_ShaperItem *shaper_item) const int availableGlyphs = shaper_item->num_glyphs; if ( HB_SelectScript (shaper_item, thai_features) ) { HB_OpenTypeShape (shaper_item, /*properties*/0); - return HB_OpenTypePosition (shaper_item, availableGlyphs, /*doLogClusters*/false); + return HB_OpenTypePosition (shaper_item, availableGlyphs, /*doLogClusters*/true); } #endif |