Font icon engines: reverse implementation to avoid pixmaps

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 <qt_ci_bot@qt-project.org>
Reviewed-by: Doris Verria <doris.verria@qt.io>
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
(cherry picked from commit 1752405f44eb6d5cbd8f8147b78263461092e676)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Volker Hilsheimer 2024-03-22 17:02:49 +01:00 committed by Qt Cherry-pick Bot
parent 51c0378798
commit 1d9ff052fa
2 changed files with 53 additions and 49 deletions

View File

@ -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

View File

@ -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