diff options
author | hjk <hjk@qt.io> | 2022-08-03 13:49:07 +0200 |
---|---|---|
committer | hjk <hjk@qt.io> | 2022-08-04 12:50:28 +0000 |
commit | d3ea90ec208d6e9d450ff3054fa2438c141e0eb0 (patch) | |
tree | 9532e6e319bfe7f4818981a34bb49da8d232cac8 | |
parent | 371d9ffe0fc7c2f68fc4b0c040d9989d44da1df3 (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.cpp | 32 | ||||
-rw-r--r-- | src/libs/utils/icon.h | 2 |
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 |