diff options
| author | Carl Schwan <carl@carlschwan.eu> | 2024-04-10 16:30:42 +0200 |
|---|---|---|
| committer | Shawn Rutledge <shawn.rutledge@qt.io> | 2024-05-07 12:28:59 -0700 |
| commit | ab2f4ef8fad82fd07dac8768b8dcb94b11b271b6 (patch) | |
| tree | b24d4c9f6e65150566b195a545794386b30114cc /src/gui/text/qtextimagehandler.cpp | |
| parent | fb2ea1e52a03f87e041a61b936183175df37b5bf (diff) | |
QTextDocument: Add support for responsive images
Add support for the max-width css attribute in image. This allows images
to be responsive: it adapts their size to the size of the QTextDocument
so that they never grow bigger than the QTextDocument pageSize.
This is implemented for the image handler used in QTextEdit and other
QtWidget text related classes.
[ChangeLog][QtGui][CSS] The max-width style can now be applied to
<img/> to set the maximum width in pixels or percentage.
Task-number: QTBUG-12283
Change-Id: Ic94e16279a1240ab4a509823de59dc0bfc920bb9
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
Diffstat (limited to 'src/gui/text/qtextimagehandler.cpp')
| -rw-r--r-- | src/gui/text/qtextimagehandler.cpp | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/src/gui/text/qtextimagehandler.cpp b/src/gui/text/qtextimagehandler.cpp index 5c56c30711e..920e6c689cb 100644 --- a/src/gui/text/qtextimagehandler.cpp +++ b/src/gui/text/qtextimagehandler.cpp @@ -12,6 +12,7 @@ #include <private/qtextengine_p.h> #include <qpalette.h> #include <qthread.h> +#include <limits> QT_BEGIN_NAMESPACE @@ -72,21 +73,40 @@ template<typename T> static QSize getSize(QTextDocument *doc, const QTextImageFormat &format) { const bool hasWidth = format.hasProperty(QTextFormat::ImageWidth); - const int width = qRound(format.width()); + int width = qRound(format.width()); const bool hasHeight = format.hasProperty(QTextFormat::ImageHeight); const int height = qRound(format.height()); + const bool hasMaxWidth = format.hasProperty(QTextFormat::ImageMaxWidth); + const auto maxWidth = format.maximumWidth(); + + int effectiveMaxWidth = std::numeric_limits<int>::max(); + if (hasMaxWidth) { + if (maxWidth.type() == QTextLength::PercentageLength) + effectiveMaxWidth = (doc->pageSize().width() - 2 * doc->documentMargin()) * maxWidth.value(100) / 100; + else + effectiveMaxWidth = maxWidth.rawValue(); + + width = qMin(effectiveMaxWidth, width); + } + T source; QSize size(width, height); if (!hasWidth || !hasHeight) { source = getAs<T>(doc, format); - const QSizeF sourceSize = source.deviceIndependentSize(); + QSizeF sourceSize = source.deviceIndependentSize(); + + if (sourceSize.width() > effectiveMaxWidth) { + // image is bigger than effectiveMaxWidth, scale it down + sourceSize.setHeight(effectiveMaxWidth * (sourceSize.height() / qreal(sourceSize.width()))); + sourceSize.setWidth(effectiveMaxWidth); + } if (!hasWidth) { if (!hasHeight) size.setWidth(sourceSize.width()); else - size.setWidth(qRound(height * (sourceSize.width() / qreal(sourceSize.height())))); + size.setWidth(qMin(effectiveMaxWidth, qRound(height * (sourceSize.width() / qreal(sourceSize.height()))))); } if (!hasHeight) { if (!hasWidth) |
