summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/plugins/iconengines/svgiconengine/qsvgiconengine.cpp58
-rw-r--r--src/svg/qsvggenerator.cpp8
2 files changed, 41 insertions, 25 deletions
diff --git a/src/plugins/iconengines/svgiconengine/qsvgiconengine.cpp b/src/plugins/iconengines/svgiconengine/qsvgiconengine.cpp
index 713f2ad..53e9a57 100644
--- a/src/plugins/iconengines/svgiconengine/qsvgiconengine.cpp
+++ b/src/plugins/iconengines/svgiconengine/qsvgiconengine.cpp
@@ -45,6 +45,8 @@
#include "qsvgrenderer.h"
#include "qpixmapcache.h"
#include "qfileinfo.h"
+#include <qmimedatabase.h>
+#include <qmimetype.h>
#include <QAtomicInt>
#include "qdebug.h"
#include <private/qguiapplication_p.h>
@@ -67,7 +69,7 @@ public:
QString pmcKey(const QSize &size, QIcon::Mode mode, QIcon::State state)
{ return QLatin1String("$qt_svgicon_")
+ QString::number(serialNum, 16).append(QLatin1Char('_'))
- + QString::number((((((size.width()<<11)|size.height())<<11)|mode)<<4)|state, 16); }
+ + QString::number((((((qint64(size.width()) << 11) | size.height()) << 11) | mode) << 4) | state, 16); }
void stepSerialNum()
{ serialNum = lastSerialNum.fetchAndAddRelaxed(1); }
@@ -201,31 +203,49 @@ void QSvgIconEngine::addPixmap(const QPixmap &pixmap, QIcon::Mode mode,
d->addedPixmaps->insert(d->hashKey(mode, state), pixmap);
}
+enum FileType { OtherFile, SvgFile, CompressedSvgFile };
+
+static FileType fileType(const QFileInfo &fi)
+{
+ const QString &abs = fi.absoluteFilePath();
+ if (abs.endsWith(QLatin1String(".svg"), Qt::CaseInsensitive))
+ return SvgFile;
+ if (abs.endsWith(QLatin1String(".svgz"), Qt::CaseInsensitive)
+ || abs.endsWith(QLatin1String(".svg.gz"), Qt::CaseInsensitive)) {
+ return CompressedSvgFile;
+ }
+#ifndef QT_NO_MIMETYPE
+ const QString &mimeTypeName = QMimeDatabase().mimeTypeForFile(fi).name();
+ if (mimeTypeName == QLatin1String("image/svg+xml"))
+ return SvgFile;
+ if (mimeTypeName == QLatin1String("image/svg+xml-compressed"))
+ return CompressedSvgFile;
+#endif // !QT_NO_MIMETYPE
+ return OtherFile;
+}
void QSvgIconEngine::addFile(const QString &fileName, const QSize &,
QIcon::Mode mode, QIcon::State state)
{
if (!fileName.isEmpty()) {
- QString abs = fileName;
- if (fileName.at(0) != QLatin1Char(':'))
- abs = QFileInfo(fileName).absoluteFilePath();
- if (abs.endsWith(QLatin1String(".svg"), Qt::CaseInsensitive)
+ const QFileInfo fi(fileName);
+ const QString abs = fi.absoluteFilePath();
+ const FileType type = fileType(fi);
#ifndef QT_NO_COMPRESS
- || abs.endsWith(QLatin1String(".svgz"), Qt::CaseInsensitive)
- || abs.endsWith(QLatin1String(".svg.gz"), Qt::CaseInsensitive)
+ if (type == SvgFile || type == CompressedSvgFile) {
+#else
+ if (type == SvgFile) {
#endif
- )
- {
- QSvgRenderer renderer(abs);
- if (renderer.isValid()) {
- d->stepSerialNum();
- d->svgFiles.insert(d->hashKey(mode, state), abs);
- }
- } else {
- QPixmap pm(abs);
- if (!pm.isNull())
- addPixmap(pm, mode, state);
- }
+ QSvgRenderer renderer(abs);
+ if (renderer.isValid()) {
+ d->stepSerialNum();
+ d->svgFiles.insert(d->hashKey(mode, state), abs);
+ }
+ } else if (type == OtherFile) {
+ QPixmap pm(abs);
+ if (!pm.isNull())
+ addPixmap(pm, mode, state);
+ }
}
}
diff --git a/src/svg/qsvggenerator.cpp b/src/svg/qsvggenerator.cpp
index 0abd403..6bca27f 100644
--- a/src/svg/qsvggenerator.cpp
+++ b/src/svg/qsvggenerator.cpp
@@ -284,12 +284,8 @@ public:
}
}
- for (QGradientStop stop : qAsConst(stops)) {
- QString color =
- QString::fromLatin1("#%1%2%3")
- .arg(stop.second.red(), 2, 16, QLatin1Char('0'))
- .arg(stop.second.green(), 2, 16, QLatin1Char('0'))
- .arg(stop.second.blue(), 2, 16, QLatin1Char('0'));
+ for (const QGradientStop &stop : qAsConst(stops)) {
+ const QString color = stop.second.name(QColor::HexRgb);
str << QLatin1String(" <stop offset=\"")<< stop.first << QLatin1String("\" ")
<< QLatin1String("stop-color=\"") << color << QLatin1String("\" ")
<< QLatin1String("stop-opacity=\"") << stop.second.alphaF() <<QLatin1String("\" />\n");