23 qreal targetDevicePixelRatio,
24 qreal *sourceDevicePixelRatio,
30 const QUrl url(baseFileName);
31 bool hasFileScheme =
false;
32 bool isResource =
false;
33 if (url.isLocalFile()) {
34 localFile = url.toLocalFile();
36 }
else if (baseFileName.startsWith(
"qrc:/"_L1)) {
38 localFile = baseFileName.sliced(3);
41 localFile = baseFileName;
42 isResource = baseFileName.startsWith(
":/"_L1);
44 *name = qt_findAtNxFile(localFile, targetDevicePixelRatio, sourceDevicePixelRatio);
47 return QUrl::fromLocalFile(*name);
49 return QUrl(
"qrc"_L1 + *name);
54static T
getAs(QTextDocument *doc,
const QTextImageFormat &format,
const qreal devicePixelRatio = 1.0)
56 qreal sourcePixelRatio = 1.0;
58 const QUrl url = findAtNxFileOrResource(format.name(), devicePixelRatio, &sourcePixelRatio, &name);
59 const QVariant data = doc->resource(QTextDocument::ImageResource, url);
62 if (data.userType() == QMetaType::QPixmap || data.userType() == QMetaType::QImage)
63 result = data.value<T>();
64 else if (data.metaType() == QMetaType::fromType<QByteArray>())
65 result.loadFromData(data.toByteArray());
67 if (result.isNull()) {
68 if (name.isEmpty() || !result.load(name))
69 return T(
":/qt-project.org/styles/commonstyle/images/file-16.png"_L1);
70 doc->addResource(QTextDocument::ImageResource, url, result);
73 if (sourcePixelRatio != 1.0)
74 result.setDevicePixelRatio(sourcePixelRatio);
79static QSize getSize(QTextDocument *doc,
const QTextImageFormat &format)
81 const bool hasWidth = format.hasProperty(QTextFormat::ImageWidth);
82 int width = qRound(format.width());
83 const bool hasHeight = format.hasProperty(QTextFormat::ImageHeight);
84 const int height = qRound(format.height());
86 const bool hasMaxWidth = format.hasProperty(QTextFormat::ImageMaxWidth);
87 const auto maxWidth = format.maximumWidth();
89 int effectiveMaxWidth =
std::numeric_limits<
int>::max();
91 if (maxWidth.type() == QTextLength::PercentageLength)
92 effectiveMaxWidth = (doc->pageSize().width() - 2 * doc->documentMargin()) * maxWidth.value(100) / 100;
94 effectiveMaxWidth = maxWidth.rawValue();
96 width = qMin(effectiveMaxWidth, width);
100 QSize size(width, height);
101 if (!hasWidth || !hasHeight) {
102 source = getAs<T>(doc, format);
103 QSizeF sourceSize = source.deviceIndependentSize();
105 if (sourceSize.width() > effectiveMaxWidth) {
107 sourceSize.setHeight(effectiveMaxWidth * (sourceSize.height() / qreal(sourceSize.width())));
108 sourceSize.setWidth(effectiveMaxWidth);
113 size.setWidth(sourceSize.width());
115 size.setWidth(qMin(effectiveMaxWidth, qRound(height * (sourceSize.width() / qreal(sourceSize.height())))));
119 size.setHeight(sourceSize.height());
121 size.setHeight(qRound(width * (sourceSize.height() / qreal(sourceSize.width()))));
126 QPaintDevice *pdev = doc->documentLayout()->paintDevice();
129 source = getAs<T>(doc, format);
130 if (!source.isNull())
131 scale = qreal(pdev->logicalDpiY()) / qreal(qt_defaultDpi());
142QSizeF QTextImageHandler::intrinsicSize(QTextDocument *doc,
int posInDocument,
const QTextFormat &format)
144 Q_UNUSED(posInDocument);
145 const QTextImageFormat imageFormat = format.toImageFormat();
147 if (QCoreApplication::instance()->thread() != QThread::currentThread())
148 return getSize<QImage>(doc, imageFormat);
149 return getSize<QPixmap>(doc, imageFormat);
159void QTextImageHandler::drawObject(QPainter *p,
const QRectF &rect, QTextDocument *doc,
int posInDocument,
const QTextFormat &format)
161 Q_UNUSED(posInDocument);
162 const QTextImageFormat imageFormat = format.toImageFormat();
164 if (QCoreApplication::instance()->thread() != QThread::currentThread()) {
165 const QImage image = getAs<QImage>(doc, imageFormat, p->device()->devicePixelRatio());
166 p->drawImage(rect, image, image.rect());
168 const QPixmap pixmap = getAs<QPixmap>(doc, imageFormat, p->device()->devicePixelRatio());
169 p->drawPixmap(rect, pixmap, pixmap.rect());
static QSize getSize(QTextDocument *doc, const QTextImageFormat &format)
static QUrl findAtNxFileOrResource(const QString &baseFileName, qreal targetDevicePixelRatio, qreal *sourceDevicePixelRatio, QString *name)
static T getAs(QTextDocument *doc, const QTextImageFormat &format, const qreal devicePixelRatio=1.0)