diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-09-21 15:01:20 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-09-22 14:22:13 +0200 |
commit | bb6fffd1ad3168edc9d67492cca585084d8ae6b4 (patch) | |
tree | 4fc0bd0165e667a2e4121f6d3c090154d8e15030 | |
parent | e924a83f3638c38c17be607c8ec0492a53baf90d (diff) |
Fix favicon engine under device pixel scaling
The QIcon::pixmap function does internal scaling messing up our
intermediate structures.
Change-Id: I727efd58a4cc948fa3e4b23539d97e8ca755d060
Reviewed-by: Peter Varga <pvarga@inf.u-szeged.hu>
-rw-r--r-- | src/core/favicon_manager.cpp | 23 | ||||
-rw-r--r-- | src/webengine/api/qquickwebenginefaviconprovider.cpp | 23 |
2 files changed, 42 insertions, 4 deletions
diff --git a/src/core/favicon_manager.cpp b/src/core/favicon_manager.cpp index 412aab90d..4496606f9 100644 --- a/src/core/favicon_manager.cpp +++ b/src/core/favicon_manager.cpp @@ -52,6 +52,11 @@ #include "third_party/skia/include/core/SkPixelRef.h" #include "ui/gfx/geometry/size.h" +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) +#include <qiconengine.h> +#include <private/qicon_p.h> +#endif + namespace QtWebEngineCore { static inline bool isResourceUrl(const QUrl &url) @@ -331,6 +336,20 @@ QUrl FaviconManager::candidateIconUrl(bool touchIconsEnabled) const return iconUrl; } +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) +static QPixmap getUnscaledPixmap(QIcon icon, const QSize &size) +{ + QPixmap pixmap = icon.data_ptr()->engine->pixmap(size, QIcon::Normal, QIcon::Off); + pixmap.setDevicePixelRatio(1.0); + return pixmap; +} +#else +static QPixmap getUnscaledPixmap(const QIcon &icon, const QSize &size) +{ + return icon.pixmap(size, 1.0); +} +#endif + void FaviconManager::generateCandidateIcon(bool touchIconsEnabled) { Q_ASSERT(m_candidateCount); @@ -349,7 +368,7 @@ void FaviconManager::generateCandidateIcon(bool touchIconsEnabled) if (!it->multiSize) { if (!m_candidateIcon.availableSizes().contains(it->size)) - m_candidateIcon.addPixmap(icon.pixmap(it->size)); + m_candidateIcon.addPixmap(getUnscaledPixmap(icon, it->size)); continue; } @@ -357,7 +376,7 @@ void FaviconManager::generateCandidateIcon(bool touchIconsEnabled) const auto sizes = icon.availableSizes(); for (const QSize &size : sizes) { if (!m_candidateIcon.availableSizes().contains(size)) - m_candidateIcon.addPixmap(icon.pixmap(size)); + m_candidateIcon.addPixmap(getUnscaledPixmap(icon, size)); } } } diff --git a/src/webengine/api/qquickwebenginefaviconprovider.cpp b/src/webengine/api/qquickwebenginefaviconprovider.cpp index 3255f22be..f817e4016 100644 --- a/src/webengine/api/qquickwebenginefaviconprovider.cpp +++ b/src/webengine/api/qquickwebenginefaviconprovider.cpp @@ -47,6 +47,11 @@ #include <QtGui/QIcon> #include <QtGui/QPixmap> +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) +#include <QtGui/qiconengine.h> +#include <QtGui/private/qicon_p.h> +#endif + QT_BEGIN_NAMESPACE using QtWebEngineCore::FaviconInfo; @@ -113,6 +118,20 @@ void QQuickWebEngineFaviconProvider::detach(QQuickWebEngineView *view) delete iconUrls; } +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) +static QPixmap getUnscaledPixmap(QIcon icon, const QSize &size) +{ + QPixmap pixmap = icon.data_ptr()->engine->pixmap(size, QIcon::Normal, QIcon::Off); + pixmap.setDevicePixelRatio(1.0); + return pixmap; +} +#else +static QPixmap getUnscaledPixmap(const QIcon &icon, const QSize &size) +{ + return icon.pixmap(size, 1.0); +} +#endif + QPixmap QQuickWebEngineFaviconProvider::requestPixmap(const QString &id, QSize *size, const QSize &requestedSize) { Q_UNUSED(size); @@ -138,11 +157,11 @@ QPixmap QQuickWebEngineFaviconProvider::requestPixmap(const QString &id, QSize * if (size) *size = bestSize; - return icon.pixmap(bestSize).copy(); + return getUnscaledPixmap(icon, bestSize).copy(); } const QSize &fitSize = findFitSize(icon.availableSizes(), requestedSize, bestSize); - const QPixmap &iconPixmap = icon.pixmap(fitSize); + const QPixmap &iconPixmap = getUnscaledPixmap(icon, fitSize); if (size) *size = iconPixmap.size(); |