From 78051d03caa64b990ebf6180441d3f9ca873e5f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Fri, 13 Dec 2024 16:54:02 +0100 Subject: [PATCH] Document that QPlatformTheme::standardPixmap should always be a 1x pixmap This reverts 59bbfb17db563d7e62b9f3158dab3cc6e7e68acd and c853054910552f5fef04797222dde0d29a0c340d, as that approach was causing issues for QCommonStyle::iconFromWindowsTheme, for example in situations where the system has a 1x and 2.5x screen, and the user requests a 16x16 pixmap or icon via QStyle::standardPixmap or QStyle::standardIcon. In that situation our smallest pixmap is 40x40, and we need to downscale, causing blurred results on a 1x screen. Change-Id: Ifa6e15d37d15954df689253c32eaa779885c567b Reviewed-by: Volker Hilsheimer (cherry picked from commit d884abaf8bdc1be74ee52306948c0be1986d738d) Reviewed-by: Qt Cherry-pick Bot --- src/gui/kernel/qplatformtheme.cpp | 11 +++++++++-- src/plugins/platforms/cocoa/qcocoatheme.mm | 4 +--- tests/manual/iconbrowser/main.cpp | 3 ++- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/gui/kernel/qplatformtheme.cpp b/src/gui/kernel/qplatformtheme.cpp index c38ca70eb60..aa530c5f08c 100644 --- a/src/gui/kernel/qplatformtheme.cpp +++ b/src/gui/kernel/qplatformtheme.cpp @@ -470,9 +470,16 @@ const QFont *QPlatformTheme::font(Font type) const return nullptr; } -QPixmap QPlatformTheme::standardPixmap(StandardPixmap sp, const QSizeF &size) const +/*! + \brief Return a pixmap for \a standardPixmap, at the given \a size. + + The implementation should not take system DPR into account, and + always return a pixmap with a DPR of 1. It's up to the consumer + to account for DPR and request a pixmap of the right size. +*/ +QPixmap QPlatformTheme::standardPixmap(StandardPixmap standardPixmap, const QSizeF &size) const { - Q_UNUSED(sp); + Q_UNUSED(standardPixmap); Q_UNUSED(size); // TODO Should return QCommonStyle pixmaps? return QPixmap(); diff --git a/src/plugins/platforms/cocoa/qcocoatheme.mm b/src/plugins/platforms/cocoa/qcocoatheme.mm index 022ef8f072f..6d15e8e5d2c 100644 --- a/src/plugins/platforms/cocoa/qcocoatheme.mm +++ b/src/plugins/platforms/cocoa/qcocoatheme.mm @@ -390,9 +390,7 @@ QPixmap QCocoaTheme::standardPixmap(StandardPixmap sp, const QSizeF &size) const QT_IGNORE_DEPRECATIONS(GetIconRef(kOnSystemDisk, kSystemIconsCreator, iconType, &icon)); if (icon) { - const auto dpr = qGuiApp->devicePixelRatio(); // Highest in the system - pixmap = qt_mac_convert_iconref(icon, size.width() * dpr, size.height() * dpr); - pixmap.setDevicePixelRatio(dpr); + pixmap = qt_mac_convert_iconref(icon, size.width(), size.height()); QT_IGNORE_DEPRECATIONS(ReleaseIconRef(icon)); } diff --git a/tests/manual/iconbrowser/main.cpp b/tests/manual/iconbrowser/main.cpp index c22dcbf7113..11968d86eb7 100644 --- a/tests/manual/iconbrowser/main.cpp +++ b/tests/manual/iconbrowser/main.cpp @@ -413,7 +413,8 @@ public: case Theme: if (row >= themedIcons.size()) break; - return QIcon(QApplicationPrivate::platformTheme()->standardPixmap(QPlatformTheme::StandardPixmap(row), {64, 64})); + return QIcon(QApplicationPrivate::platformTheme()->standardPixmap( + QPlatformTheme::StandardPixmap(row), QSize(64, 64) * qGuiApp->devicePixelRatio())); case Icon: if (row < themedIcons.size()) return QIcon::fromTheme(themedIcons.at(row));