diff options
-rw-r--r-- | src/gui/text/qabstracttextdocumentlayout_p.h | 11 | ||||
-rw-r--r-- | src/gui/text/qtextengine.cpp | 13 | ||||
-rw-r--r-- | src/widgets/widgets/qwidgetlinecontrol.cpp | 3 | ||||
-rw-r--r-- | tests/auto/gui/text/qglyphrun/tst_qglyphrun.cpp | 16 | ||||
-rw-r--r-- | tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp | 24 | ||||
-rw-r--r-- | tests/auto/shared/resources/test.ttf | bin | 2128 -> 2196 bytes |
6 files changed, 55 insertions, 12 deletions
diff --git a/src/gui/text/qabstracttextdocumentlayout_p.h b/src/gui/text/qabstracttextdocumentlayout_p.h index 34eccd89af..f10c1d9bd2 100644 --- a/src/gui/text/qabstracttextdocumentlayout_p.h +++ b/src/gui/text/qabstracttextdocumentlayout_p.h @@ -18,6 +18,7 @@ #include <QtGui/private/qtguiglobal_p.h> #include "private/qobject_p.h" #include "qtextdocument_p.h" +#include "qabstracttextdocumentlayout.h" #include "QtCore/qhash.h" QT_BEGIN_NAMESPACE @@ -46,6 +47,16 @@ public: docPrivate = QTextDocumentPrivate::get(doc); } + static QAbstractTextDocumentLayoutPrivate *get(QAbstractTextDocumentLayout *layout) + { + return layout->d_func(); + } + + bool hasHandlers() const + { + return !handlers.isEmpty(); + } + inline int _q_dynamicPageCountSlot() const { return q_func()->pageCount(); } inline QSizeF _q_dynamicDocumentSizeSlot() const diff --git a/src/gui/text/qtextengine.cpp b/src/gui/text/qtextengine.cpp index c174eefa70..eded3e3f33 100644 --- a/src/gui/text/qtextengine.cpp +++ b/src/gui/text/qtextengine.cpp @@ -7,6 +7,7 @@ #include "qtextformat_p.h" #include "qtextengine_p.h" #include "qabstracttextdocumentlayout.h" +#include "qabstracttextdocumentlayout_p.h" #include "qtextlayout.h" #include "qtextboundaryfinder.h" #include <QtCore/private/qunicodetables_p.h> @@ -1933,7 +1934,17 @@ void QTextEngine::itemize() const while (uc < e) { switch (*uc) { case QChar::ObjectReplacementCharacter: - analysis->flags = QScriptAnalysis::Object; + { + const QTextDocumentPrivate *doc_p = QTextDocumentPrivate::get(block); + if (doc_p != nullptr + && doc_p->layout() != nullptr + && QAbstractTextDocumentLayoutPrivate::get(doc_p->layout()) != nullptr + && QAbstractTextDocumentLayoutPrivate::get(doc_p->layout())->hasHandlers()) { + analysis->flags = QScriptAnalysis::Object; + } else { + analysis->flags = QScriptAnalysis::None; + } + } break; case QChar::LineSeparator: analysis->flags = QScriptAnalysis::LineOrParagraphSeparator; diff --git a/src/widgets/widgets/qwidgetlinecontrol.cpp b/src/widgets/widgets/qwidgetlinecontrol.cpp index 30465b95fa..ed7bc035ec 100644 --- a/src/widgets/widgets/qwidgetlinecontrol.cpp +++ b/src/widgets/widgets/qwidgetlinecontrol.cpp @@ -85,8 +85,7 @@ void QWidgetLineControl::updateDisplayText(bool forceUpdate) for (int i = 0; i < (int)str.size(); ++i) { if ((uc[i].unicode() < 0x20 && uc[i].unicode() != 0x09) || uc[i] == QChar::LineSeparator - || uc[i] == QChar::ParagraphSeparator - || uc[i] == QChar::ObjectReplacementCharacter) + || uc[i] == QChar::ParagraphSeparator) uc[i] = QChar(0x0020); } diff --git a/tests/auto/gui/text/qglyphrun/tst_qglyphrun.cpp b/tests/auto/gui/text/qglyphrun/tst_qglyphrun.cpp index efd590a730..9660d829b8 100644 --- a/tests/auto/gui/text/qglyphrun/tst_qglyphrun.cpp +++ b/tests/auto/gui/text/qglyphrun/tst_qglyphrun.cpp @@ -42,6 +42,7 @@ private slots: void stringIndexes(); void retrievalFlags_data(); void retrievalFlags(); + void objectReplacementCharacter(); private: int m_testFontId; @@ -954,6 +955,21 @@ void tst_QGlyphRun::retrievalFlags() QCOMPARE(firstGlyphRun.positions().isEmpty(), !expectedGlyphPositions); } +void tst_QGlyphRun::objectReplacementCharacter() +{ + QTextLayout layout; + layout.setFont(m_testFont); + layout.setText(QStringLiteral("\uFFFC")); + layout.beginLayout(); + layout.createLine(); + layout.endLayout(); + + QList<QGlyphRun> glyphRuns = layout.glyphRuns(); + QCOMPARE(glyphRuns.size(), 1); + QCOMPARE(glyphRuns.first().glyphIndexes().size(), 1); + QCOMPARE(glyphRuns.first().glyphIndexes().first(), 5); +} + #endif // QT_NO_RAWFONT QTEST_MAIN(tst_QGlyphRun) diff --git a/tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp b/tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp index 3958e2a01c..9e6daf81b1 100644 --- a/tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp +++ b/tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp @@ -512,18 +512,24 @@ void tst_QTextLayout::noWrap() void tst_QTextLayout::cursorToXForInlineObjects() { - QChar ch(QChar::ObjectReplacementCharacter); - QString text(ch); - QTextLayout layout(text, testFont); - layout.beginLayout(); + QString text = QStringLiteral("<html><body><img src=\"\" width=\"32\" height=\"32\" /></body></html>"); - QTextEngine *engine = layout.engine(); - const int item = engine->findItem(0); - engine->layoutData->items[item].width = 32; + QTextDocument document; + document.setHtml(text); + QCOMPARE(document.blockCount(), 1); - QTextLine line = layout.createLine(); - line.setLineWidth(0x10000); + // Trigger layout + { + QImage img(1, 1, QImage::Format_ARGB32_Premultiplied); + QPainter p(&img); + document.drawContents(&p); + } + + QTextLayout *layout = document.firstBlock().layout(); + QVERIFY(layout != nullptr); + QCOMPARE(layout->lineCount(), 1); + QTextLine line = layout->lineAt(0); QCOMPARE(line.cursorToX(0), qreal(0)); QCOMPARE(line.cursorToX(1), qreal(32)); } diff --git a/tests/auto/shared/resources/test.ttf b/tests/auto/shared/resources/test.ttf Binary files differindex b2bb6cd036..8b56c046d4 100644 --- a/tests/auto/shared/resources/test.ttf +++ b/tests/auto/shared/resources/test.ttf |