diff options
Diffstat (limited to 'src/gui/text/qtextengine.cpp')
-rw-r--r-- | src/gui/text/qtextengine.cpp | 37 |
1 files changed, 20 insertions, 17 deletions
diff --git a/src/gui/text/qtextengine.cpp b/src/gui/text/qtextengine.cpp index cd9b85df20b..419e6642d17 100644 --- a/src/gui/text/qtextengine.cpp +++ b/src/gui/text/qtextengine.cpp @@ -1368,6 +1368,9 @@ void QTextEngine::shapeText(int item) const si.glyph_data_offset = layoutData->used; const ushort *string = reinterpret_cast<const ushort *>(layoutData->string.constData()) + si.position; + const ushort *baseString = reinterpret_cast<const ushort *>(layoutData->string.constData()); + int baseStringStart = si.position; + int baseStringLength = layoutData->string.length(); const int itemLength = length(item); QString casedString; @@ -1393,6 +1396,9 @@ void QTextEngine::shapeText(int item) const } } string = reinterpret_cast<const ushort *>(casedString.constData()); + baseString = string; + baseStringStart = 0; + baseStringLength = casedString.length(); } if (Q_UNLIKELY(!ensureSpace(itemLength))) { @@ -1486,14 +1492,9 @@ void QTextEngine::shapeText(int item) const #if QT_CONFIG(harfbuzz) if (Q_LIKELY(shapingEnabled)) { - si.num_glyphs = shapeTextWithHarfbuzzNG(si, - string, - itemLength, - fontEngine, - itemBoundaries, - kerningEnabled, - letterSpacing != 0, - features); + si.num_glyphs = shapeTextWithHarfbuzzNG(si, baseString, baseStringStart, baseStringLength, + itemLength, fontEngine, itemBoundaries, + kerningEnabled, letterSpacing != 0, features); } else #endif { @@ -1603,13 +1604,10 @@ QT_BEGIN_INCLUDE_NAMESPACE QT_END_INCLUDE_NAMESPACE -int QTextEngine::shapeTextWithHarfbuzzNG(const QScriptItem &si, - const ushort *string, - int itemLength, - QFontEngine *fontEngine, - QSpan<uint> itemBoundaries, - bool kerningEnabled, - bool hasLetterSpacing, +int QTextEngine::shapeTextWithHarfbuzzNG(const QScriptItem &si, const ushort *string, + int stringBaseIndex, int stringLength, int itemLength, + QFontEngine *fontEngine, QSpan<uint> itemBoundaries, + bool kerningEnabled, bool hasLetterSpacing, const QHash<QFont::Tag, quint32> &fontFeatures) const { uint glyphs_shaped = 0; @@ -1642,7 +1640,12 @@ int QTextEngine::shapeTextWithHarfbuzzNG(const QScriptItem &si, // prepare buffer hb_buffer_clear_contents(buffer); - hb_buffer_add_utf16(buffer, reinterpret_cast<const uint16_t *>(string) + item_pos, item_length, 0, item_length); + + // Populate the buffer using the base string pointer and length, so HarfBuzz can grab an + // enclosing context for proper shaping at item boundaries in certain languages (e.g. + // Arabic). + hb_buffer_add_utf16(buffer, reinterpret_cast<const uint16_t *>(string), stringLength, + stringBaseIndex + item_pos, item_length); hb_buffer_set_segment_properties(buffer, &props); @@ -1746,7 +1749,7 @@ int QTextEngine::shapeTextWithHarfbuzzNG(const QScriptItem &si, last_glyph_pos = i + glyphs_shaped; last_cluster = cluster; - applyVisibilityRules(string[item_pos + str_pos], &g, i, actualFontEngine); + applyVisibilityRules(string[stringBaseIndex + item_pos + str_pos], &g, i, actualFontEngine); } } while (str_pos < item_length) |