diff --git a/lib/src/utils/PrimitiveUtils.cpp b/lib/src/utils/PrimitiveUtils.cpp index f1ac98e..d7e7eba 100644 --- a/lib/src/utils/PrimitiveUtils.cpp +++ b/lib/src/utils/PrimitiveUtils.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -1365,7 +1366,20 @@ QPixmap getPixmap( #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) return icon.pixmap(getWindow(widget), iconSize, iconMode, iconState); #else - return icon.pixmap(iconSize, widget ? widget->devicePixelRatio() : qApp->devicePixelRatio(), iconMode, iconState); + const auto devicePixelRatio = widget ? widget->devicePixelRatio() : qApp->devicePixelRatio(); + if (devicePixelRatio <= 1.0) { + return icon.pixmap(iconSize, devicePixelRatio, iconMode, iconState); + } + + // Qt icon pixmap cache is broken when devicePixelRatio > 1.0. + auto pixmap = icon.pixmap(iconSize * devicePixelRatio, 1.0, iconMode, iconState); // The 1.0 pixmap gives a stable cache key. + auto cacheKey = QString("qlementine_icon_pixmap_%1_%2").arg(pixmap.cacheKey()).arg(devicePixelRatio); + if (QPixmapCache::find(cacheKey, &pixmap)) { + return pixmap; + } + pixmap.setDevicePixelRatio(devicePixelRatio); // This changes the internal cache key. + QPixmapCache::insert(cacheKey, pixmap); + return pixmap; #endif } diff --git a/lib/src/widgets/IconWidget.cpp b/lib/src/widgets/IconWidget.cpp index da90af7..be037ee 100644 --- a/lib/src/widgets/IconWidget.cpp +++ b/lib/src/widgets/IconWidget.cpp @@ -75,7 +75,7 @@ void IconWidget::paintEvent(QPaintEvent*) { return; const auto& color = palette().color(isEnabled() ? QPalette::Normal : QPalette::Disabled, QPalette::Text); - const auto& colorizedPixmap = autoIconColor != AutoIconColor::None ? colorizePixmap(pixmap, color) : pixmap; + const auto& colorizedPixmap = autoIconColor != AutoIconColor::None ? getColorizedPixmap(pixmap, color) : pixmap; QPainter p(this); p.setRenderHint(QPainter::Antialiasing, true); diff --git a/lib/src/widgets/LineEdit.cpp b/lib/src/widgets/LineEdit.cpp index 204b39d..4bafca8 100644 --- a/lib/src/widgets/LineEdit.cpp +++ b/lib/src/widgets/LineEdit.cpp @@ -75,7 +75,7 @@ QPixmap LineEdit::getPixmap() const { const auto pixmap = qlementine::getPixmap(_icon, iconSize, MouseState::Normal, CheckState::NotChecked, this); const auto colorGroup = isEnabled() ? QPalette::ColorGroup::Normal : QPalette::ColorGroup::Disabled; const auto& color = palette().color(colorGroup, QPalette::ColorRole::Text); - const auto colorizedPixmap = qlementine::colorizePixmap(pixmap, color); + const auto colorizedPixmap = qlementine::getColorizedPixmap(pixmap, color); return colorizedPixmap; } else { const auto mouse = isEnabled() ? MouseState::Normal : MouseState::Disabled; diff --git a/lib/src/widgets/Switch.cpp b/lib/src/widgets/Switch.cpp index 5815dab..4987dfa 100644 --- a/lib/src/widgets/Switch.cpp +++ b/lib/src/widgets/Switch.cpp @@ -87,8 +87,8 @@ void Switch::paintEvent(QPaintEvent*) { // Draw icon. const auto extent = iconSize.height(); if (hasIcon && availableW >= extent) { - const auto pixmap = icon().pixmap(extent, QIcon::Mode::Normal, QIcon::State::On); - const auto coloredPixmap = colorizePixmap(pixmap, textColor); + const auto pixmap = qlementine::getPixmap(icon(), {extent, extent}, MouseState::Normal, CheckState::Checked, this); + const auto coloredPixmap = getColorizedPixmap(pixmap, textColor); const auto iconX = availableX; const auto iconY = contentRect.y() + (contentRect.height() - extent) / 2; const auto iconRect = QRect{ iconX, iconY, extent, extent };