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 qt_mac_convert_iconref(const IconRef icon, int width, int height) 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/src/plugins/platforms/windows/qwindowstheme.cpp b/src/plugins/platforms/windows/qwindowstheme.cpp index 92b8478ee52..1379018793b 100644 --- a/src/plugins/platforms/windows/qwindowstheme.cpp +++ b/src/plugins/platforms/windows/qwindowstheme.cpp @@ -803,12 +803,12 @@ void QWindowsTheme::refreshIconPixmapSizes() // Defined in qpixmap_win.cpp Q_GUI_EXPORT QPixmap qt_pixmapFromWinHICON(HICON icon); -static QPixmap loadIconFromShell32(int resourceId, QSize size) +static QPixmap loadIconFromShell32(int resourceId, QSizeF size) { if (const HMODULE hmod = QSystemLibrary::load(L"shell32")) { auto iconHandle = static_cast(LoadImage(hmod, MAKEINTRESOURCE(resourceId), - IMAGE_ICON, size.width(), size.height(), 0)); + IMAGE_ICON, int(size.width()), int(size.height()), 0)); if (iconHandle) { QPixmap iconpixmap = qt_pixmapFromWinHICON(iconHandle); DestroyIcon(iconHandle); @@ -818,7 +818,7 @@ static QPixmap loadIconFromShell32(int resourceId, QSize size) return QPixmap(); } -QPixmap QWindowsTheme::standardPixmap(StandardPixmap sp, const QSizeF &size) const +QPixmap QWindowsTheme::standardPixmap(StandardPixmap sp, const QSizeF &pixmapSize) const { int resourceId = -1; SHSTOCKICONID stockId = SIID_INVALID; @@ -907,19 +907,16 @@ QPixmap QWindowsTheme::standardPixmap(StandardPixmap sp, const QSizeF &size) con break; } - const auto dpr = qGuiApp->devicePixelRatio(); // Highest in the system - if (stockId != SIID_INVALID) { SHSTOCKICONINFO iconInfo; memset(&iconInfo, 0, sizeof(iconInfo)); iconInfo.cbSize = sizeof(iconInfo); stockFlags |= SHGSI_ICONLOCATION; if (SHGetStockIconInfo(stockId, stockFlags, &iconInfo) == S_OK) { - const auto iconSize = size.width() * dpr; + const auto iconSize = pixmapSize.width(); HICON icon; if (SHDefExtractIcon(iconInfo.szPath, iconInfo.iIcon, 0, &icon, nullptr, iconSize) == S_OK) { QPixmap pixmap = qt_pixmapFromWinHICON(icon); - pixmap.setDevicePixelRatio(dpr); DestroyIcon(icon); return pixmap; } @@ -927,15 +924,13 @@ QPixmap QWindowsTheme::standardPixmap(StandardPixmap sp, const QSizeF &size) con } if (resourceId != -1) { - const QSize pixmapSize(size.width() * dpr, size.height() * dpr); QPixmap pixmap = loadIconFromShell32(resourceId, pixmapSize); if (!pixmap.isNull()) { if (sp == FileLinkIcon || sp == DirLinkIcon || sp == DirLinkOpenIcon) { QPainter painter(&pixmap); QPixmap link = loadIconFromShell32(30, pixmapSize); - painter.drawPixmap(0, 0, pixmapSize.width(), pixmapSize.height(), link); + painter.drawPixmap(0, 0, int(pixmapSize.width()), int(pixmapSize.height()), link); } - pixmap.setDevicePixelRatio(dpr); return pixmap; } } @@ -948,7 +943,7 @@ QPixmap QWindowsTheme::standardPixmap(StandardPixmap sp, const QSizeF &size) con return pixmap; } - return QPlatformTheme::standardPixmap(sp, size); + return QPlatformTheme::standardPixmap(sp, pixmapSize); } enum { // Shell image list ids 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 @@ class IconModel : public QAbstractItemModel 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));