summaryrefslogtreecommitdiffstats
path: root/src/gui/text/qtextengine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/text/qtextengine.cpp')
-rw-r--r--src/gui/text/qtextengine.cpp37
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)