From b63185824ea213c2d19472fee302f007151dd5ca Mon Sep 17 00:00:00 2001 From: Roman Pasechnik Date: Sat, 11 Apr 2015 12:49:56 +0200 Subject: Fix QQuickTextDocumentWithImageResources image loading QQuickTextDocumentWithImageResources always tries to load images itself and not using QTextDocument internal resources. What it should do: 1) Check if QTextDocument already has image resource and use it. 2) If not, try to load resource manually. Change-Id: Ifc4d919fc4a08b4efae50e06a42f1af7cee67af3 Task-number: QTBUG-32525 Reviewed-by: Eskil Abrahamsen Blomfeldt --- src/quick/items/qquicktext.cpp | 38 ++++++++++------------ src/quick/items/qquicktext_p_p.h | 2 +- .../qquicktextdocument/tst_qquicktextdocument.cpp | 16 +++++++++ 3 files changed, 34 insertions(+), 22 deletions(-) diff --git a/src/quick/items/qquicktext.cpp b/src/quick/items/qquicktext.cpp index 205571f2e7..f848d0baee 100644 --- a/src/quick/items/qquicktext.cpp +++ b/src/quick/items/qquicktext.cpp @@ -120,14 +120,15 @@ QQuickTextDocumentWithImageResources::~QQuickTextDocumentWithImageResources() QVariant QQuickTextDocumentWithImageResources::loadResource(int type, const QUrl &name) { - QQmlContext *context = qmlContext(parent()); - - if (type == QTextDocument::ImageResource) { - QQuickPixmap *p = loadPixmap(context, name); - return p->image(); + QVariant resource = QTextDocument::loadResource(type, name); + if (resource.isNull() && type == QTextDocument::ImageResource) { + QQmlContext *context = qmlContext(parent()); + QUrl url = baseUrl().resolved(name); + QQuickPixmap *p = loadPixmap(context, url); + resource = p->image(); } - return QTextDocument::loadResource(type, name); + return resource; } void QQuickTextDocumentWithImageResources::requestFinished() @@ -152,30 +153,28 @@ QSizeF QQuickTextDocumentWithImageResources::intrinsicSize( QSizeF size(width, height); if (!hasWidth || !hasHeight) { - QQmlContext *context = qmlContext(parent()); - QUrl url = baseUrl().resolved(QUrl(imageFormat.name())); - - QQuickPixmap *p = loadPixmap(context, url); - if (!p->isReady()) { + QVariant res = resource(QTextDocument::ImageResource, QUrl(imageFormat.name())); + QImage image = res.value(); + if (image.isNull()) { if (!hasWidth) size.setWidth(16); if (!hasHeight) size.setHeight(16); return size; } - QSize implicitSize = p->implicitSize(); + QSize imgSize = image.size(); if (!hasWidth) { if (!hasHeight) - size.setWidth(implicitSize.width()); + size.setWidth(imgSize.width()); else - size.setWidth(qRound(height * (implicitSize.width() / (qreal) implicitSize.height()))); + size.setWidth(qRound(height * (imgSize.width() / (qreal) imgSize.height()))); } if (!hasHeight) { if (!hasWidth) - size.setHeight(implicitSize.height()); + size.setHeight(imgSize.height()); else - size.setHeight(qRound(width * (implicitSize.height() / (qreal) implicitSize.width()))); + size.setHeight(qRound(width * (imgSize.height() / (qreal) imgSize.width()))); } } return size; @@ -190,11 +189,8 @@ void QQuickTextDocumentWithImageResources::drawObject( QImage QQuickTextDocumentWithImageResources::image(const QTextImageFormat &format) { - QQmlContext *context = qmlContext(parent()); - QUrl url = baseUrl().resolved(QUrl(format.name())); - - QQuickPixmap *p = loadPixmap(context, url); - return p->image(); + QVariant res = resource(QTextDocument::ImageResource, QUrl(format.name())); + return res.value(); } void QQuickTextDocumentWithImageResources::reset() diff --git a/src/quick/items/qquicktext_p_p.h b/src/quick/items/qquicktext_p_p.h index cd14008728..28435bc8c5 100644 --- a/src/quick/items/qquicktext_p_p.h +++ b/src/quick/items/qquicktext_p_p.h @@ -179,7 +179,7 @@ public: }; class QQuickPixmap; -class QQuickTextDocumentWithImageResources : public QTextDocument, public QTextObjectInterface +class Q_AUTOTEST_EXPORT QQuickTextDocumentWithImageResources : public QTextDocument, public QTextObjectInterface { Q_OBJECT Q_INTERFACES(QTextObjectInterface) diff --git a/tests/auto/quick/qquicktextdocument/tst_qquicktextdocument.cpp b/tests/auto/quick/qquicktextdocument/tst_qquicktextdocument.cpp index 27a02377bd..302959dd7f 100644 --- a/tests/auto/quick/qquicktextdocument/tst_qquicktextdocument.cpp +++ b/tests/auto/quick/qquicktextdocument/tst_qquicktextdocument.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -47,6 +48,7 @@ class tst_qquicktextdocument : public QQmlDataTest Q_OBJECT private slots: void textDocumentWriter(); + void textDocumentWithImage(); }; QString text = QStringLiteral("foo bar"); @@ -74,6 +76,20 @@ void tst_qquicktextdocument::textDocumentWriter() delete o; } +void tst_qquicktextdocument::textDocumentWithImage() +{ + QQuickTextDocumentWithImageResources document(0); + QImage image(1, 1, QImage::Format_Mono); + image.fill(1); + + QString name = "image"; + document.addResource(QTextDocument::ImageResource, name, image); + QTextImageFormat format; + format.setName(name); + QCOMPARE(image, document.image(format)); + QCOMPARE(image, document.resource(QTextDocument::ImageResource, name).value()); +} + QTEST_MAIN(tst_qquicktextdocument) #include "tst_qquicktextdocument.moc" -- cgit v1.2.3