From 1d9ff052fa6b4f2ae2b65bef2ce296e2529d9b0b Mon Sep 17 00:00:00 2001 From: Volker Hilsheimer Date: Fri, 22 Mar 2024 17:02:49 +0100 Subject: [PATCH] Font icon engines: reverse implementation to avoid pixmaps MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Draw the glyph directly in the paint() override, and use that from the scaledPixmap implementation. This avoids a pixmap creation just for drawing an icon with an existing painter. Change-Id: Iece0083a3a9f3625d843bc6e9d836baf9b5d84f8 Reviewed-by: Qt CI Bot Reviewed-by: Doris Verria Reviewed-by: Tor Arne Vestbø (cherry picked from commit 1752405f44eb6d5cbd8f8147b78263461092e676) Reviewed-by: Qt Cherry-pick Bot --- .../android/qandroidplatformiconengine.cpp | 52 ++++++++++--------- .../platforms/windows/qwindowsiconengine.cpp | 50 +++++++++--------- 2 files changed, 53 insertions(+), 49 deletions(-) diff --git a/src/plugins/platforms/android/qandroidplatformiconengine.cpp b/src/plugins/platforms/android/qandroidplatformiconengine.cpp index 70223922711..faa63dcca13 100644 --- a/src/plugins/platforms/android/qandroidplatformiconengine.cpp +++ b/src/plugins/platforms/android/qandroidplatformiconengine.cpp @@ -572,32 +572,11 @@ QPixmap QAndroidPlatformIconEngine::scaledPixmap(const QSize &size, QIcon::Mode const quint64 cacheKey = calculateCacheKey(mode, state); if (cacheKey != m_cacheKey || m_pixmap.size() != size || m_pixmap.devicePixelRatio() != scale) { m_pixmap = QPixmap(size * scale); - m_pixmap.fill(QColor(0, 0, 0, 0)); + m_pixmap.fill(Qt::transparent); m_pixmap.setDevicePixelRatio(scale); QPainter painter(&m_pixmap); - QFont renderFont(m_iconFont); - renderFont.setPixelSize(size.height()); - painter.setFont(renderFont); - - QPalette palette; - switch (mode) { - case QIcon::Active: - painter.setPen(palette.color(QPalette::Active, QPalette::Accent)); - break; - case QIcon::Normal: - painter.setPen(palette.color(QPalette::Active, QPalette::Text)); - break; - case QIcon::Disabled: - painter.setPen(palette.color(QPalette::Disabled, QPalette::Accent)); - break; - case QIcon::Selected: - painter.setPen(palette.color(QPalette::Active, QPalette::Accent)); - break; - } - - const QRect rect({0, 0}, size); - painter.drawText(rect, Qt::AlignCenter, m_glyphs); + paint(&painter, QRect(QPoint(), size), mode, state); m_cacheKey = cacheKey; } @@ -607,8 +586,31 @@ QPixmap QAndroidPlatformIconEngine::scaledPixmap(const QSize &size, QIcon::Mode void QAndroidPlatformIconEngine::paint(QPainter *painter, const QRect &rect, QIcon::Mode mode, QIcon::State state) { - const qreal scale = painter->device()->devicePixelRatio(); - painter->drawPixmap(rect, scaledPixmap(rect.size(), mode, state, scale)); + Q_UNUSED(state); + + painter->save(); + QFont renderFont(m_iconFont); + renderFont.setPixelSize(rect.height()); + painter->setFont(renderFont); + + QPalette palette; + switch (mode) { + case QIcon::Active: + painter->setPen(palette.color(QPalette::Active, QPalette::Text)); + break; + case QIcon::Normal: + painter->setPen(palette.color(QPalette::Active, QPalette::Text)); + break; + case QIcon::Disabled: + painter->setPen(palette.color(QPalette::Disabled, QPalette::Text)); + break; + case QIcon::Selected: + painter->setPen(palette.color(QPalette::Active, QPalette::HighlightedText)); + break; + } + + painter->drawText(rect, Qt::AlignCenter, m_glyphs); + painter->restore(); } QT_END_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowsiconengine.cpp b/src/plugins/platforms/windows/qwindowsiconengine.cpp index 42777df5b5d..4c32f1327f6 100644 --- a/src/plugins/platforms/windows/qwindowsiconengine.cpp +++ b/src/plugins/platforms/windows/qwindowsiconengine.cpp @@ -354,28 +354,7 @@ QPixmap QWindowsIconEngine::scaledPixmap(const QSize &size, QIcon::Mode mode, QI m_pixmap.setDevicePixelRatio(scale); QPainter painter(&m_pixmap); - QFont renderFont(m_iconFont); - renderFont.setPixelSize(size.height()); - painter.setFont(renderFont); - - QPalette palette; - switch (mode) { - case QIcon::Active: - painter.setPen(palette.color(QPalette::Active, QPalette::Text)); - break; - case QIcon::Normal: - painter.setPen(palette.color(QPalette::Active, QPalette::Text)); - break; - case QIcon::Disabled: - painter.setPen(palette.color(QPalette::Disabled, QPalette::Text)); - break; - case QIcon::Selected: - painter.setPen(palette.color(QPalette::Active, QPalette::HighlightedText)); - break; - } - - const QRect rect({0, 0}, size); - painter.drawText(rect, Qt::AlignCenter, m_glyphs); + paint(&painter, QRect(QPoint(), size), mode, state); m_cacheKey = cacheKey; } @@ -385,8 +364,31 @@ QPixmap QWindowsIconEngine::scaledPixmap(const QSize &size, QIcon::Mode mode, QI void QWindowsIconEngine::paint(QPainter *painter, const QRect &rect, QIcon::Mode mode, QIcon::State state) { - const qreal scale = painter->device()->devicePixelRatio(); - painter->drawPixmap(rect, scaledPixmap(rect.size(), mode, state, scale)); + Q_UNUSED(state); + + painter->save(); + QFont renderFont(m_iconFont); + renderFont.setPixelSize(rect.height()); + painter->setFont(renderFont); + + QPalette palette; + switch (mode) { + case QIcon::Active: + painter->setPen(palette.color(QPalette::Active, QPalette::Text)); + break; + case QIcon::Normal: + painter->setPen(palette.color(QPalette::Active, QPalette::Text)); + break; + case QIcon::Disabled: + painter->setPen(palette.color(QPalette::Disabled, QPalette::Text)); + break; + case QIcon::Selected: + painter->setPen(palette.color(QPalette::Active, QPalette::HighlightedText)); + break; + } + + painter->drawText(rect, Qt::AlignCenter, m_glyphs); + painter->restore(); } QT_END_NAMESPACE