diff options
Diffstat (limited to 'src/gui/image/qicon.cpp')
-rw-r--r-- | src/gui/image/qicon.cpp | 47 |
1 files changed, 27 insertions, 20 deletions
diff --git a/src/gui/image/qicon.cpp b/src/gui/image/qicon.cpp index 62ec8e93b2..db118edf04 100644 --- a/src/gui/image/qicon.cpp +++ b/src/gui/image/qicon.cpp @@ -47,6 +47,8 @@ #include "private/qiconloader_p.h" #include "qpainter.h" #include "qfileinfo.h" +#include <qmimedatabase.h> +#include <qmimetype.h> #include "qpixmapcache.h" #include "qvariant.h" #include "qcache.h" @@ -839,8 +841,11 @@ QPixmap QIcon::pixmap(QWindow *window, const QSize &size, Mode mode, State state qreal devicePixelRatio = qt_effective_device_pixel_ratio(window); // Handle the simple normal-dpi case: - if (!(devicePixelRatio > 1.0)) - return d->engine->pixmap(size, mode, state); + if (!(devicePixelRatio > 1.0)) { + QPixmap pixmap = d->engine->pixmap(size, mode, state); + pixmap.setDevicePixelRatio(1.0); + return pixmap; + } // Try get a pixmap that is big enough to be displayed at device pixel resolution. QPixmap pixmap = d->engine->pixmap(size * devicePixelRatio, mode, state); @@ -976,6 +981,18 @@ void QIcon::addPixmap(const QPixmap &pixmap, Mode mode, State state) d->engine->addPixmap(pixmap, mode, state); } +static QIconEngine *iconEngineFromSuffix(const QString &fileName, const QString &suffix) +{ + if (!suffix.isEmpty()) { + const int index = loader()->indexOf(suffix); + if (index != -1) { + if (QIconEnginePlugin *factory = qobject_cast<QIconEnginePlugin*>(loader()->instance(index))) { + return factory->create(fileName); + } + } + } + return nullptr; +} /*! Adds an image from the file with the given \a fileName to the icon, as a specialization for \a size, \a mode and \a state. The @@ -1013,25 +1030,15 @@ void QIcon::addFile(const QString &fileName, const QSize &size, Mode mode, State return; detach(); if (!d) { + QFileInfo info(fileName); - QString suffix = info.suffix(); - if (!suffix.isEmpty()) { - // first try version 2 engines.. - const int index = loader()->indexOf(suffix); - if (index != -1) { - if (QIconEnginePlugin *factory = qobject_cast<QIconEnginePlugin*>(loader()->instance(index))) { - if (QIconEngine *engine = factory->create(fileName)) { - d = new QIconPrivate; - d->engine = engine; - } - } - } - } - // ...then fall back to the default engine - if (!d) { - d = new QIconPrivate; - d->engine = new QPixmapIconEngine; - } + QIconEngine *engine = iconEngineFromSuffix(fileName, info.suffix()); +#ifndef QT_NO_MIMETYPE + if (!engine) + engine = iconEngineFromSuffix(fileName, QMimeDatabase().mimeTypeForFile(info).preferredSuffix()); +#endif // !QT_NO_MIMETYPE + d = new QIconPrivate; + d->engine = engine ? engine : new QPixmapIconEngine; } d->engine->addFile(fileName, size, mode, state); |