aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhjk <hjk@qt.io>2022-08-03 13:49:07 +0200
committerhjk <hjk@qt.io>2022-08-04 12:50:28 +0000
commitd3ea90ec208d6e9d450ff3054fa2438c141e0eb0 (patch)
tree9532e6e319bfe7f4818981a34bb49da8d232cac8
parent371d9ffe0fc7c2f68fc4b0c040d9989d44da1df3 (diff)
Utils: Cache the last QIcon created from a Utils::Icon
This rarely changes, but was re-computed/re-painted for each text mark etc. Change-Id: I9f4b0f2f2a88f0a267ecdd0faa983677eb634751 Reviewed-by: David Schulz <david.schulz@qt.io>
-rw-r--r--src/libs/utils/icon.cpp32
-rw-r--r--src/libs/utils/icon.h2
2 files changed, 20 insertions, 14 deletions
diff --git a/src/libs/utils/icon.cpp b/src/libs/utils/icon.cpp
index bdf8601dcc2..a4ae9b81ed2 100644
--- a/src/libs/utils/icon.cpp
+++ b/src/libs/utils/icon.cpp
@@ -169,23 +169,27 @@ Icon::Icon(const FilePath &imageFileName)
QIcon Icon::icon() const
{
- if (m_iconSourceList.isEmpty()) {
+ if (m_iconSourceList.isEmpty())
return QIcon();
- } else if (m_style == None) {
+
+ if (m_style == None)
return QIcon(m_iconSourceList.constFirst().first.toString());
- } else {
- QIcon result;
- const int maxDpr = qRound(qApp->devicePixelRatio());
- for (int dpr = 1; dpr <= maxDpr; dpr++) {
- const MasksAndColors masks = masksAndColors(m_iconSourceList, dpr);
- const QPixmap combinedMask = Utils::combinedMask(masks, m_style);
- result.addPixmap(masksToIcon(masks, combinedMask, m_style));
-
- const QColor disabledColor = creatorTheme()->color(Theme::IconsDisabledColor);
- result.addPixmap(maskToColorAndAlpha(combinedMask, disabledColor), QIcon::Disabled);
- }
- return result;
+
+ const int maxDpr = qRound(qApp->devicePixelRatio());
+ if (maxDpr == m_lastDevicePixelRatio)
+ return m_lastIcon;
+
+ m_lastDevicePixelRatio = maxDpr;
+ m_lastIcon = QIcon();
+ for (int dpr = 1; dpr <= maxDpr; dpr++) {
+ const MasksAndColors masks = masksAndColors(m_iconSourceList, dpr);
+ const QPixmap combinedMask = Utils::combinedMask(masks, m_style);
+ m_lastIcon.addPixmap(masksToIcon(masks, combinedMask, m_style));
+
+ const QColor disabledColor = creatorTheme()->color(Theme::IconsDisabledColor);
+ m_lastIcon.addPixmap(maskToColorAndAlpha(combinedMask, disabledColor), QIcon::Disabled);
}
+ return m_lastIcon;
}
QPixmap Icon::pixmap(QIcon::Mode iconMode) const
diff --git a/src/libs/utils/icon.h b/src/libs/utils/icon.h
index d2352be5055..286644eb84a 100644
--- a/src/libs/utils/icon.h
+++ b/src/libs/utils/icon.h
@@ -88,6 +88,8 @@ public:
private:
QVector<IconMaskAndColor> m_iconSourceList;
IconStyleOptions m_style = None;
+ mutable int m_lastDevicePixelRatio = -1;
+ mutable QIcon m_lastIcon;
};
} // namespace Utils