From 648610259528b6cc7ef14704af8b15bb835cce95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20Johan=20S=C3=B8rvig?= Date: Tue, 11 Aug 2020 22:40:47 +0200 Subject: QIconLoader: port to use new virtual functions Add override functions and move the implementation out of virtual_hook(). Task-number: QTBUG-85885 Change-Id: I35ed81a3483dd85d49474b78572d5302b0e5b608 Reviewed-by: Volker Hilsheimer --- src/gui/image/qiconloader.cpp | 79 +++++++++++++++++++------------------------ src/gui/image/qiconloader_p.h | 6 +++- 2 files changed, 40 insertions(+), 45 deletions(-) (limited to 'src/gui/image') diff --git a/src/gui/image/qiconloader.cpp b/src/gui/image/qiconloader.cpp index 9b91becf97..250e695574 100644 --- a/src/gui/image/qiconloader.cpp +++ b/src/gui/image/qiconloader.cpp @@ -834,55 +834,46 @@ QString QIconLoaderEngine::key() const return QLatin1String("QIconLoaderEngine"); } -void QIconLoaderEngine::virtual_hook(int id, void *data) +QString QIconLoaderEngine::iconName() { ensureLoaded(); + return m_info.iconName; +} - switch (id) { - case QIconEngine::AvailableSizesHook: - { - QIconEngine::AvailableSizesArgument &arg - = *reinterpret_cast(data); - const int N = m_info.entries.size(); - QList sizes; - sizes.reserve(N); - - // Gets all sizes from the DirectoryInfo entries - for (int i = 0; i < N; ++i) { - const QIconLoaderEngineEntry *entry = m_info.entries.at(i); - if (entry->dir.type == QIconDirInfo::Fallback) { - sizes.append(QIcon(entry->filename).availableSizes()); - } else { - int size = entry->dir.size; - sizes.append(QSize(size, size)); - } - } - arg.sizes.swap(sizes); // commit - } - break; - case QIconEngine::IconNameHook: - { - QString &name = *reinterpret_cast(data); - name = m_info.iconName; - } - break; - case QIconEngine::IsNullHook: - { - *reinterpret_cast(data) = m_info.entries.isEmpty(); - } - break; - case QIconEngine::ScaledPixmapHook: - { - QIconEngine::ScaledPixmapArgument &arg = *reinterpret_cast(data); - // QIcon::pixmap() multiplies size by the device pixel ratio. - const int integerScale = qCeil(arg.scale); - QIconLoaderEngineEntry *entry = entryForSize(m_info, arg.size / integerScale, integerScale); - arg.pixmap = entry ? entry->pixmap(arg.size, arg.mode, arg.state) : QPixmap(); +bool QIconLoaderEngine::isNull() +{ + ensureLoaded(); + return m_info.entries.isEmpty(); +} + +QPixmap QIconLoaderEngine::scaledPixmap(const QSize &size, QIcon::Mode mode, QIcon::State state, qreal scale) +{ + ensureLoaded(); + const int integerScale = qCeil(scale); + QIconLoaderEngineEntry *entry = entryForSize(m_info, size / integerScale, integerScale); + return entry ? entry->pixmap(size, mode, state) : QPixmap(); +} + +QList QIconLoaderEngine::availableSizes(QIcon::Mode mode, QIcon::State state) +{ + Q_UNUSED(mode); + Q_UNUSED(state); + ensureLoaded(); + const int N = m_info.entries.size(); + QList sizes; + sizes.reserve(N); + + // Gets all sizes from the DirectoryInfo entries + for (int i = 0; i < N; ++i) { + const QIconLoaderEngineEntry *entry = m_info.entries.at(i); + if (entry->dir.type == QIconDirInfo::Fallback) { + sizes.append(QIcon(entry->filename).availableSizes()); + } else { + int size = entry->dir.size; + sizes.append(QSize(size, size)); } - break; - default: - QIconEngine::virtual_hook(id, data); } + return sizes; } QT_END_NAMESPACE diff --git a/src/gui/image/qiconloader_p.h b/src/gui/image/qiconloader_p.h index dca22f725f..a17cea183e 100644 --- a/src/gui/image/qiconloader_p.h +++ b/src/gui/image/qiconloader_p.h @@ -132,13 +132,17 @@ public: bool read(QDataStream &in) override; bool write(QDataStream &out) const override; + QString iconName() override; + bool isNull() override; + QPixmap scaledPixmap(const QSize &size, QIcon::Mode mode, QIcon::State state, qreal scale) override; + QList availableSizes(QIcon::Mode mode, QIcon::State state) override; + Q_GUI_EXPORT static QIconLoaderEngineEntry *entryForSize(const QThemeIconInfo &info, const QSize &size, int scale = 1); private: QString key() const override; bool hasIcon() const; void ensureLoaded(); - void virtual_hook(int id, void *data) override; QIconLoaderEngine(const QIconLoaderEngine &other); QThemeIconInfo m_info; -- cgit v1.2.3