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. Pick-to: 6.9 Change-Id: Ifa6e15d37d15954df689253c32eaa779885c567b Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
This commit is contained in:
parent
66d42b62b6
commit
d884abaf8b
@ -470,9 +470,16 @@ const QFont *QPlatformTheme::font(Font type) const
|
|||||||
return nullptr;
|
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);
|
Q_UNUSED(size);
|
||||||
// TODO Should return QCommonStyle pixmaps?
|
// TODO Should return QCommonStyle pixmaps?
|
||||||
return QPixmap();
|
return QPixmap();
|
||||||
|
@ -390,9 +390,7 @@ QPixmap QCocoaTheme::standardPixmap(StandardPixmap sp, const QSizeF &size) const
|
|||||||
QT_IGNORE_DEPRECATIONS(GetIconRef(kOnSystemDisk, kSystemIconsCreator, iconType, &icon));
|
QT_IGNORE_DEPRECATIONS(GetIconRef(kOnSystemDisk, kSystemIconsCreator, iconType, &icon));
|
||||||
|
|
||||||
if (icon) {
|
if (icon) {
|
||||||
const auto dpr = qGuiApp->devicePixelRatio(); // Highest in the system
|
pixmap = qt_mac_convert_iconref(icon, size.width(), size.height());
|
||||||
pixmap = qt_mac_convert_iconref(icon, size.width() * dpr, size.height() * dpr);
|
|
||||||
pixmap.setDevicePixelRatio(dpr);
|
|
||||||
QT_IGNORE_DEPRECATIONS(ReleaseIconRef(icon));
|
QT_IGNORE_DEPRECATIONS(ReleaseIconRef(icon));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -803,12 +803,12 @@ void QWindowsTheme::refreshIconPixmapSizes()
|
|||||||
// Defined in qpixmap_win.cpp
|
// Defined in qpixmap_win.cpp
|
||||||
Q_GUI_EXPORT QPixmap qt_pixmapFromWinHICON(HICON icon);
|
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")) {
|
if (const HMODULE hmod = QSystemLibrary::load(L"shell32")) {
|
||||||
auto iconHandle =
|
auto iconHandle =
|
||||||
static_cast<HICON>(LoadImage(hmod, MAKEINTRESOURCE(resourceId),
|
static_cast<HICON>(LoadImage(hmod, MAKEINTRESOURCE(resourceId),
|
||||||
IMAGE_ICON, size.width(), size.height(), 0));
|
IMAGE_ICON, int(size.width()), int(size.height()), 0));
|
||||||
if (iconHandle) {
|
if (iconHandle) {
|
||||||
QPixmap iconpixmap = qt_pixmapFromWinHICON(iconHandle);
|
QPixmap iconpixmap = qt_pixmapFromWinHICON(iconHandle);
|
||||||
DestroyIcon(iconHandle);
|
DestroyIcon(iconHandle);
|
||||||
@ -818,7 +818,7 @@ static QPixmap loadIconFromShell32(int resourceId, QSize size)
|
|||||||
return QPixmap();
|
return QPixmap();
|
||||||
}
|
}
|
||||||
|
|
||||||
QPixmap QWindowsTheme::standardPixmap(StandardPixmap sp, const QSizeF &size) const
|
QPixmap QWindowsTheme::standardPixmap(StandardPixmap sp, const QSizeF &pixmapSize) const
|
||||||
{
|
{
|
||||||
int resourceId = -1;
|
int resourceId = -1;
|
||||||
SHSTOCKICONID stockId = SIID_INVALID;
|
SHSTOCKICONID stockId = SIID_INVALID;
|
||||||
@ -907,19 +907,16 @@ QPixmap QWindowsTheme::standardPixmap(StandardPixmap sp, const QSizeF &size) con
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto dpr = qGuiApp->devicePixelRatio(); // Highest in the system
|
|
||||||
|
|
||||||
if (stockId != SIID_INVALID) {
|
if (stockId != SIID_INVALID) {
|
||||||
SHSTOCKICONINFO iconInfo;
|
SHSTOCKICONINFO iconInfo;
|
||||||
memset(&iconInfo, 0, sizeof(iconInfo));
|
memset(&iconInfo, 0, sizeof(iconInfo));
|
||||||
iconInfo.cbSize = sizeof(iconInfo);
|
iconInfo.cbSize = sizeof(iconInfo);
|
||||||
stockFlags |= SHGSI_ICONLOCATION;
|
stockFlags |= SHGSI_ICONLOCATION;
|
||||||
if (SHGetStockIconInfo(stockId, stockFlags, &iconInfo) == S_OK) {
|
if (SHGetStockIconInfo(stockId, stockFlags, &iconInfo) == S_OK) {
|
||||||
const auto iconSize = size.width() * dpr;
|
const auto iconSize = pixmapSize.width();
|
||||||
HICON icon;
|
HICON icon;
|
||||||
if (SHDefExtractIcon(iconInfo.szPath, iconInfo.iIcon, 0, &icon, nullptr, iconSize) == S_OK) {
|
if (SHDefExtractIcon(iconInfo.szPath, iconInfo.iIcon, 0, &icon, nullptr, iconSize) == S_OK) {
|
||||||
QPixmap pixmap = qt_pixmapFromWinHICON(icon);
|
QPixmap pixmap = qt_pixmapFromWinHICON(icon);
|
||||||
pixmap.setDevicePixelRatio(dpr);
|
|
||||||
DestroyIcon(icon);
|
DestroyIcon(icon);
|
||||||
return pixmap;
|
return pixmap;
|
||||||
}
|
}
|
||||||
@ -927,15 +924,13 @@ QPixmap QWindowsTheme::standardPixmap(StandardPixmap sp, const QSizeF &size) con
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (resourceId != -1) {
|
if (resourceId != -1) {
|
||||||
const QSize pixmapSize(size.width() * dpr, size.height() * dpr);
|
|
||||||
QPixmap pixmap = loadIconFromShell32(resourceId, pixmapSize);
|
QPixmap pixmap = loadIconFromShell32(resourceId, pixmapSize);
|
||||||
if (!pixmap.isNull()) {
|
if (!pixmap.isNull()) {
|
||||||
if (sp == FileLinkIcon || sp == DirLinkIcon || sp == DirLinkOpenIcon) {
|
if (sp == FileLinkIcon || sp == DirLinkIcon || sp == DirLinkOpenIcon) {
|
||||||
QPainter painter(&pixmap);
|
QPainter painter(&pixmap);
|
||||||
QPixmap link = loadIconFromShell32(30, pixmapSize);
|
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;
|
return pixmap;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -948,7 +943,7 @@ QPixmap QWindowsTheme::standardPixmap(StandardPixmap sp, const QSizeF &size) con
|
|||||||
return pixmap;
|
return pixmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
return QPlatformTheme::standardPixmap(sp, size);
|
return QPlatformTheme::standardPixmap(sp, pixmapSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
enum { // Shell image list ids
|
enum { // Shell image list ids
|
||||||
|
@ -413,7 +413,8 @@ public:
|
|||||||
case Theme:
|
case Theme:
|
||||||
if (row >= themedIcons.size())
|
if (row >= themedIcons.size())
|
||||||
break;
|
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:
|
case Icon:
|
||||||
if (row < themedIcons.size())
|
if (row < themedIcons.size())
|
||||||
return QIcon::fromTheme(themedIcons.at(row));
|
return QIcon::fromTheme(themedIcons.at(row));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user