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:
parent
51c0378798
commit
1d9ff052fa
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user