diff options
Diffstat (limited to 'src/gui/text/qtextengine.cpp')
-rw-r--r-- | src/gui/text/qtextengine.cpp | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/src/gui/text/qtextengine.cpp b/src/gui/text/qtextengine.cpp index 29a633f350..6b98c14205 100644 --- a/src/gui/text/qtextengine.cpp +++ b/src/gui/text/qtextengine.cpp @@ -1120,6 +1120,15 @@ QT_BEGIN_INCLUDE_NAMESPACE QT_END_INCLUDE_NAMESPACE +#if defined(Q_OS_OSX) && !defined(QT_NO_FREETYPE) +static const char *s_shapersForOsxFreeType[] = +{ + "ot", + "fallback", + Q_NULLPTR +}; +#endif + int QTextEngine::shapeTextWithHarfbuzzNG(const QScriptItem &si, const ushort *string, int itemLength, QFontEngine *fontEngine, const QVector<uint> &itemBoundaries, bool kerningEnabled) const { uint glyphs_shaped = 0; @@ -1172,7 +1181,15 @@ int QTextEngine::shapeTextWithHarfbuzzNG(const QScriptItem &si, const ushort *st }; const int num_features = 1; - bool shapedOk = hb_shape_full(hb_font, buffer, features, num_features, 0); + const char *const *shaper_list = Q_NULLPTR; +#if defined(Q_OS_OSX) && !defined(QT_NO_FREETYPE) + // What's behind QFontEngine::FaceData::user_data isn't compatible between CoreText and + // FreeType font engines - specifically functions in hb-coretext.cc would run into undefined + // behavior with data from the FreeType engine. The OpenType shaper works with that engine. + if (actualFontEngine->type() == QFontEngine::Freetype) + shaper_list = s_shapersForOsxFreeType; +#endif + bool shapedOk = hb_shape_full(hb_font, buffer, features, num_features, shaper_list); if (Q_UNLIKELY(!shapedOk)) { hb_buffer_destroy(buffer); return 0; @@ -2571,7 +2588,7 @@ void QTextEngine::setPreeditArea(int position, const QString &preeditText) clearLineData(); } -void QTextEngine::setFormats(const QList<QTextLayout::FormatRange> &formats) +void QTextEngine::setFormats(const QVector<QTextLayout::FormatRange> &formats) { if (formats.isEmpty()) { if (!specialData) @@ -2863,6 +2880,7 @@ QFixed QTextEngine::calculateTabWidth(int item, QFixed x) const if (!tabArray.isEmpty()) { if (isRightToLeft()) { // rebase the tabArray positions. QList<QTextOption::Tab> newTabs; + newTabs.reserve(tabArray.count()); QList<QTextOption::Tab>::Iterator iter = tabArray.begin(); while(iter != tabArray.end()) { QTextOption::Tab tab = *iter; @@ -2946,17 +2964,17 @@ QFixed QTextEngine::calculateTabWidth(int item, QFixed x) const namespace { class FormatRangeComparatorByStart { - const QList<QTextLayout::FormatRange> &list; + const QVector<QTextLayout::FormatRange> &list; public: - FormatRangeComparatorByStart(const QList<QTextLayout::FormatRange> &list) : list(list) { } + FormatRangeComparatorByStart(const QVector<QTextLayout::FormatRange> &list) : list(list) { } bool operator()(int a, int b) { return list.at(a).start < list.at(b).start; } }; class FormatRangeComparatorByEnd { - const QList<QTextLayout::FormatRange> &list; + const QVector<QTextLayout::FormatRange> &list; public: - FormatRangeComparatorByEnd(const QList<QTextLayout::FormatRange> &list) : list(list) { } + FormatRangeComparatorByEnd(const QVector<QTextLayout::FormatRange> &list) : list(list) { } bool operator()(int a, int b) { return list.at(a).start + list.at(a).length < list.at(b).start + list.at(b).length; } |