diff options
Diffstat (limited to 'src/gui/text')
-rw-r--r-- | src/gui/text/qtextengine.cpp | 32 | ||||
-rw-r--r-- | src/gui/text/qtextengine_p.h | 9 |
2 files changed, 26 insertions, 15 deletions
diff --git a/src/gui/text/qtextengine.cpp b/src/gui/text/qtextengine.cpp index 6abdbdaa2a..448907b4fe 100644 --- a/src/gui/text/qtextengine.cpp +++ b/src/gui/text/qtextengine.cpp @@ -2198,11 +2198,11 @@ int QTextEngine::formatIndex(const QScriptItem *si) const QTextCharFormat QTextEngine::format(const QScriptItem *si) const { QTextCharFormat format; - const QTextFormatCollection *formats = 0; - if (block.docHandle()) { - formats = this->formats(); + const QTextFormatCollection *formats = this->formats(); + + if (formats) format = formats->charFormat(formatIndex(si)); - } + if (specialData && specialData->resolvedFormatIndices.isEmpty()) { int end = si->position + length(si); for (int i = 0; i < specialData->addFormats.size(); ++i) { @@ -2289,11 +2289,15 @@ bool QTextEngine::atSpace(int position) const void QTextEngine::indexAdditionalFormats() { - if (!block.docHandle()) - return; - specialData->addFormatIndices.resize(specialData->addFormats.count()); - QTextFormatCollection * const formats = this->formats(); + + QTextFormatCollection *formats = this->formats(); + + if (!formats) { + Q_ASSERT(!block.docHandle()); + specialData->formats.reset(new QTextFormatCollection); + formats = specialData->formats.data(); + } for (int i = 0; i < specialData->addFormats.count(); ++i) { specialData->addFormatIndices[i] = formats->indexForFormat(specialData->addFormats.at(i).format); @@ -2708,11 +2712,10 @@ public: void QTextEngine::resolveAdditionalFormats() const { if (!specialData || specialData->addFormats.isEmpty() - || !block.docHandle() || !specialData->resolvedFormatIndices.isEmpty()) return; - QTextFormatCollection *collection = this->formats(); + QTextFormatCollection *collection = formats(); specialData->resolvedFormatIndices.clear(); QVector<int> indices(layoutData->items.count()); @@ -2748,16 +2751,17 @@ void QTextEngine::resolveAdditionalFormats() const ++endIt; } QTextCharFormat format; - const QTextFormatCollection *formats = 0; if (block.docHandle()) { - formats = this->formats(); - format = formats->charFormat(formatIndex(si)); + // when we have a docHandle, formatIndex might still return a valid index based + // on the preeditPosition. for all other cases, we cleared the resolved format indices + format = collection->charFormat(formatIndex(si)); } + foreach (int cur, currentFormats) { const QTextLayout::FormatRange &r = specialData->addFormats.at(cur); Q_ASSERT (r.start <= si->position && r.start + r.length >= end); if (!specialData->addFormatIndices.isEmpty()) { - format.merge(formats->format(specialData->addFormatIndices.at(cur))); + format.merge(collection->format(specialData->addFormatIndices.at(cur))); } else { format.merge(r.format); } diff --git a/src/gui/text/qtextengine_p.h b/src/gui/text/qtextengine_p.h index d8ab222475..c2362e6dc5 100644 --- a/src/gui/text/qtextengine_p.h +++ b/src/gui/text/qtextengine_p.h @@ -541,7 +541,12 @@ public: #ifdef QT_BUILD_COMPAT_LIB return 0; // Compat should never reference this symbol #else - return block.docHandle()->formatCollection(); + if (block.docHandle()) + return block.docHandle()->formatCollection(); + else if (specialData) + return specialData->formats.data(); + + return 0; #endif } QTextCharFormat format(const QScriptItem *si) const; @@ -619,6 +624,8 @@ public: QList<QTextLayout::FormatRange> addFormats; QVector<int> addFormatIndices; QVector<int> resolvedFormatIndices; + // only used when no docHandle is available + QScopedPointer<QTextFormatCollection> formats; }; SpecialData *specialData; |