summaryrefslogtreecommitdiffstats
path: root/src/widgets/styles/qstylesheetstyle.cpp
diff options
context:
space:
mode:
authorMorten Johan Sørvig <morten.sorvig@digia.com>2014-03-13 09:10:47 +0100
committerUlf Hermann <ulf.hermann@qt.io>2018-10-04 07:01:05 +0000
commitd7e274a44621a4c1bb1ede66c00ee1d1e3f7bd13 (patch)
treeeb5d6d64eaad5bf400477e360a49f5cafef9f6b3 /src/widgets/styles/qstylesheetstyle.cpp
parent0cae5a4c4b3c508463580ba740df95e92d2fc9c0 (diff)
StyleSheetStyle: Load @Nx images
Perform a @Nx image file lookup when loading pixmaps. Make drawBackgroundImage() handle high-dpi pixmaps, here the layout calculations needs to be in device- independent pixels Fixes: QTBUG-36825 Change-Id: I61e6f53c59f61f3bd88c34a036349e51e8c8ad92 Reviewed-by: Ulf Hermann <ulf.hermann@qt.io> Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
Diffstat (limited to 'src/widgets/styles/qstylesheetstyle.cpp')
-rw-r--r--src/widgets/styles/qstylesheetstyle.cpp47
1 files changed, 38 insertions, 9 deletions
diff --git a/src/widgets/styles/qstylesheetstyle.cpp b/src/widgets/styles/qstylesheetstyle.cpp
index c2ffcc82b1..58478c7595 100644
--- a/src/widgets/styles/qstylesheetstyle.cpp
+++ b/src/widgets/styles/qstylesheetstyle.cpp
@@ -115,6 +115,8 @@
#include <QtWidgets/qtoolbar.h>
#endif
+#include <QtGui/qscreen.h>
+
QT_BEGIN_NAMESPACE
using namespace QCss;
@@ -952,8 +954,10 @@ QRenderRule::QRenderRule(const QVector<Declaration> &declarations, const QObject
Attachment attachment = Attachment_Scroll;
origin = Origin_Padding;
Origin clip = Origin_Border;
- if (v.extractBackground(&brush, &uri, &repeat, &alignment, &origin, &attachment, &clip))
- bg = new QStyleSheetBackgroundData(brush, QPixmap(uri), repeat, alignment, origin, attachment, clip);
+ if (v.extractBackground(&brush, &uri, &repeat, &alignment, &origin, &attachment, &clip)) {
+ bg = new QStyleSheetBackgroundData(brush, QStyleSheetStyle::loadPixmap(uri, object),
+ repeat, alignment, origin, attachment, clip);
+ }
QBrush sfg, fg;
QBrush sbg, abg;
@@ -992,7 +996,7 @@ QRenderRule::QRenderRule(const QVector<Declaration> &declarations, const QObject
bd->bi = new QStyleSheetBorderImageData;
QStyleSheetBorderImageData *bi = bd->bi;
- bi->pixmap = QPixmap(uri);
+ bi->pixmap = QStyleSheetStyle::loadPixmap(uri, object);
for (int i = 0; i < 4; i++)
bi->cuts[i] = cuts[i];
bi->horizStretch = horizStretch;
@@ -1215,30 +1219,33 @@ void QRenderRule::drawBackgroundImage(QPainter *p, const QRect &rect, QPoint off
if (background()->attachment == Attachment_Fixed)
off = QPoint(0, 0);
+ QSize bgpSize = bgp.size() / bgp.devicePixelRatio();
+ int bgpHeight = bgpSize.height();
+ int bgpWidth = bgpSize.width();
QRect r = originRect(rect, background()->origin);
- QRect aligned = QStyle::alignedRect(Qt::LeftToRight, background()->position, bgp.size(), r);
+ QRect aligned = QStyle::alignedRect(Qt::LeftToRight, background()->position, bgpSize, r);
QRect inter = aligned.translated(-off).intersected(r);
switch (background()->repeat) {
case Repeat_Y:
p->drawTiledPixmap(inter.x(), r.y(), inter.width(), r.height(), bgp,
inter.x() - aligned.x() + off.x(),
- bgp.height() - int(aligned.y() - r.y()) % bgp.height() + off.y());
+ bgpHeight - int(aligned.y() - r.y()) % bgpHeight + off.y());
break;
case Repeat_X:
p->drawTiledPixmap(r.x(), inter.y(), r.width(), inter.height(), bgp,
- bgp.width() - int(aligned.x() - r.x())%bgp.width() + off.x(),
+ bgpWidth - int(aligned.x() - r.x())%bgpWidth + off.x(),
inter.y() - aligned.y() + off.y());
break;
case Repeat_XY:
p->drawTiledPixmap(r, bgp,
- QPoint(bgp.width() - int(aligned.x() - r.x())% bgp.width() + off.x(),
- bgp.height() - int(aligned.y() - r.y())%bgp.height() + off.y()));
+ QPoint(bgpWidth - int(aligned.x() - r.x())% bgpWidth + off.x(),
+ bgpHeight - int(aligned.y() - r.y())%bgpHeight + off.y()));
break;
case Repeat_None:
default:
p->drawPixmap(inter.x(), inter.y(), bgp, inter.x() - aligned.x() + off.x(),
- inter.y() - aligned.y() + off.y(), inter.width(), inter.height());
+ inter.y() - aligned.y() + off.y(), bgp.width() , bgp.height());
break;
}
@@ -6107,6 +6114,28 @@ bool QStyleSheetStyle::isNaturalChild(const QObject *obj)
return false;
}
+QPixmap QStyleSheetStyle::loadPixmap(const QString &fileName, const QObject *context)
+{
+ qreal ratio = -1.0;
+ if (const QWidget *widget = qobject_cast<const QWidget *>(context)) {
+ if (QScreen *screen = QApplication::screenAt(widget->mapToGlobal(QPoint(0, 0))))
+ ratio = screen->devicePixelRatio();
+ }
+
+ if (ratio < 0) {
+ if (const QApplication *app = qApp)
+ ratio = app->devicePixelRatio();
+ else
+ ratio = 1.0;
+ }
+
+ qreal sourceDevicePixelRatio = 1.0;
+ QString resolvedFileName = qt_findAtNxFile(fileName, ratio, &sourceDevicePixelRatio);
+ QPixmap pixmap(resolvedFileName);
+ pixmap.setDevicePixelRatio(sourceDevicePixelRatio);
+ return pixmap;
+}
+
QT_END_NAMESPACE
#include "moc_qstylesheetstyle_p.cpp"