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) {
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);
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());
++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);
}
#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;
QList<QTextLayout::FormatRange> addFormats;
QVector<int> addFormatIndices;
QVector<int> resolvedFormatIndices;
+ // only used when no docHandle is available
+ QScopedPointer<QTextFormatCollection> formats;
};
SpecialData *specialData;
#include <qtest.h>
Q_DECLARE_METATYPE(QTextDocument*)
+Q_DECLARE_METATYPE(QList<QTextLayout::FormatRange>)
class tst_QText: public QObject
{
void layout_data();
void layout();
+ void formattedLayout_data();
void formattedLayout();
void paintLayoutToPixmap();
void paintLayoutToPixmap_painterFill();
}
}*/
-void tst_QText::formattedLayout()
+void tst_QText::formattedLayout_data()
{
- //set up formatting
- QList<QTextLayout::FormatRange> ranges;
+ QTest::addColumn<QString>("text");
+ QTest::addColumn<QList<QTextLayout::FormatRange> >("ranges");
+
+ QTextCharFormat format;
+ format.setForeground(QColor("steelblue"));
+
{
- QTextCharFormat format;
- format.setForeground(QColor("steelblue"));
+ QList<QTextLayout::FormatRange> ranges;
QTextLayout::FormatRange formatRange;
formatRange.format = format;
formatRange.start = 0;
formatRange.length = 50;
-
ranges.append(formatRange);
+
+ QTest::newRow("short-single") << m_shortLorem << ranges;
+ }
+ {
+ QList<QTextLayout::FormatRange> ranges;
+
+ QString text = m_lorem.repeated(100);
+ const int width = 1;
+ for (int i = 0; i < text.size(); i += width) {
+ QTextLayout::FormatRange formatRange;
+ formatRange.format.setForeground(QBrush(QColor(i % 255, 255, 255)));
+ formatRange.start = i;
+ formatRange.length = width;
+ ranges.append(formatRange);
+ }
+
+ QTest::newRow("long-many") << m_shortLorem << ranges;
}
+}
- QTextLayout layout(m_shortLorem);
+void tst_QText::formattedLayout()
+{
+ QFETCH(QString, text);
+ QFETCH(QList<QTextLayout::FormatRange>, ranges);
+
+ QTextLayout layout(text);
layout.setAdditionalFormats(ranges);
setupTextLayout(&layout);
QBENCHMARK {
- QTextLayout layout(m_shortLorem);
+ QTextLayout layout(text);
layout.setAdditionalFormats(ranges);
setupTextLayout(&layout);
}