diff options
Diffstat (limited to 'src/gui/text/qtextengine.cpp')
-rw-r--r-- | src/gui/text/qtextengine.cpp | 50 |
1 files changed, 34 insertions, 16 deletions
diff --git a/src/gui/text/qtextengine.cpp b/src/gui/text/qtextengine.cpp index 076b6bbde4..10a61d3c84 100644 --- a/src/gui/text/qtextengine.cpp +++ b/src/gui/text/qtextengine.cpp @@ -881,16 +881,22 @@ static inline void qt_getJustificationOpportunities(const ushort *string, int le int spaceAs; switch (si.analysis.script) { + case QChar::Script_Arabic: + case QChar::Script_Syriac: case QChar::Script_Nko: case QChar::Script_Mandaic: case QChar::Script_Mongolian: case QChar::Script_PhagsPa: + case QChar::Script_Manichaean: + case QChar::Script_PsalterPahlavi: // same as default but inter character justification takes precedence spaceAs = Justification_Arabic_Space; break; + case QChar::Script_Tibetan: case QChar::Script_Hiragana: case QChar::Script_Katakana: + case QChar::Script_Bopomofo: case QChar::Script_Han: // same as default but inter character justification is the only option spaceAs = Justification_Character; @@ -1201,20 +1207,7 @@ int QTextEngine::shapeTextWithHarfbuzzNG(const QScriptItem &si, const ushort *st uint cluster = infos->cluster; if (Q_LIKELY(last_cluster != cluster)) { - if (Q_UNLIKELY(g.glyphs[i] == 0)) { - // hide characters that should normally be invisible - switch (string[item_pos + str_pos]) { - case QChar::LineFeed: - case 0x000c: // FormFeed - case QChar::CarriageReturn: - case QChar::LineSeparator: - case QChar::ParagraphSeparator: - g.attributes[i].dontPrint = true; - break; - default: - break; - } - } + g.attributes[i].clusterStart = true; // fix up clusters so that the cluster indices will be monotonic // and thus we never return out-of-order indices @@ -1222,7 +1215,32 @@ int QTextEngine::shapeTextWithHarfbuzzNG(const QScriptItem &si, const ushort *st log_clusters[str_pos++] = last_glyph_pos; last_glyph_pos = i + glyphs_shaped; last_cluster = cluster; - g.attributes[i].clusterStart = true; + + // hide characters that should normally be invisible + switch (string[item_pos + str_pos]) { + case QChar::LineFeed: + case 0x000c: // FormFeed + case QChar::CarriageReturn: + case QChar::LineSeparator: + case QChar::ParagraphSeparator: + g.attributes[i].dontPrint = true; + break; + case QChar::SoftHyphen: + if (!actualFontEngine->symbol) { + // U+00AD [SOFT HYPHEN] is a default ignorable codepoint, + // so we replace its glyph and metrics with ones for + // U+002D [HYPHEN-MINUS] and make it visible if it appears at line-break + g.glyphs[i] = actualFontEngine->glyphIndex('-'); + if (Q_LIKELY(g.glyphs[i] != 0)) { + QGlyphLayout tmp = g.mid(i, 1); + actualFontEngine->recalcAdvances(&tmp, 0); + } + g.attributes[i].dontPrint = true; + } + break; + default: + break; + } } } while (str_pos < item_length) @@ -1618,10 +1636,10 @@ void QTextEngine::itemize() const for (int i = 0; i < length; ++i) { switch (analysis[i].script) { case QChar::Script_Latin: - case QChar::Script_Han: case QChar::Script_Hiragana: case QChar::Script_Katakana: case QChar::Script_Bopomofo: + case QChar::Script_Han: analysis[i].script = QChar::Script_Common; break; default: |