summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/plugins/iconengines/svgiconengine/qsvgiconengine.cpp95
-rw-r--r--src/plugins/imageformats/svg/qsvgiohandler.cpp7
-rw-r--r--src/svg/qsvggenerator.cpp2
-rw-r--r--src/svg/qsvghandler.cpp2
4 files changed, 78 insertions, 28 deletions
diff --git a/src/plugins/iconengines/svgiconengine/qsvgiconengine.cpp b/src/plugins/iconengines/svgiconengine/qsvgiconengine.cpp
index 0c54e0e..e23dd9a 100644
--- a/src/plugins/iconengines/svgiconengine/qsvgiconengine.cpp
+++ b/src/plugins/iconengines/svgiconengine/qsvgiconengine.cpp
@@ -74,7 +74,8 @@ public:
void stepSerialNum()
{ serialNum = lastSerialNum.fetchAndAddRelaxed(1); }
- void loadDataForModeAndState(QSvgRenderer *renderer, QIcon::Mode mode, QIcon::State state);
+ bool tryLoad(QSvgRenderer *renderer, QIcon::Mode mode, QIcon::State state);
+ QIcon::Mode loadDataForModeAndState(QSvgRenderer *renderer, QIcon::Mode mode, QIcon::State state);
QHash<int, QString> svgFiles;
QHash<int, QByteArray> *svgBuffers;
@@ -121,31 +122,73 @@ QSize QSvgIconEngine::actualSize(const QSize &size, QIcon::Mode mode,
return pm.size();
}
-void QSvgIconEnginePrivate::loadDataForModeAndState(QSvgRenderer *renderer, QIcon::Mode mode, QIcon::State state)
+static QByteArray maybeUncompress(const QByteArray &ba)
{
- QByteArray buf;
- const QIcon::State oppositeState = state == QIcon::Off ? QIcon::On : QIcon::Off;
- if (svgBuffers) {
- buf = svgBuffers->value(hashKey(mode, state));
- if (buf.isEmpty())
- buf = svgBuffers->value(hashKey(QIcon::Normal, state));
- if (buf.isEmpty())
- buf = svgBuffers->value(hashKey(QIcon::Normal, oppositeState));
- }
- if (!buf.isEmpty()) {
#ifndef QT_NO_COMPRESS
- buf = qUncompress(buf);
+ return qUncompress(ba);
+#else
+ return ba;
#endif
- renderer->load(buf);
+}
+
+bool QSvgIconEnginePrivate::tryLoad(QSvgRenderer *renderer, QIcon::Mode mode, QIcon::State state)
+{
+ if (svgBuffers) {
+ QByteArray buf = svgBuffers->value(hashKey(mode, state));
+ if (!buf.isEmpty()) {
+ buf = maybeUncompress(buf);
+ renderer->load(buf);
+ return true;
+ }
+ }
+ QString svgFile = svgFiles.value(hashKey(mode, state));
+ if (!svgFile.isEmpty()) {
+ renderer->load(svgFile);
+ return true;
+ }
+ return false;
+}
+
+QIcon::Mode QSvgIconEnginePrivate::loadDataForModeAndState(QSvgRenderer *renderer, QIcon::Mode mode, QIcon::State state)
+{
+ if (tryLoad(renderer, mode, state))
+ return mode;
+
+ const QIcon::State oppositeState = (state == QIcon::On) ? QIcon::Off : QIcon::On;
+ if (mode == QIcon::Disabled || mode == QIcon::Selected) {
+ const QIcon::Mode oppositeMode = (mode == QIcon::Disabled) ? QIcon::Selected : QIcon::Disabled;
+ if (tryLoad(renderer, QIcon::Normal, state))
+ return QIcon::Normal;
+ if (tryLoad(renderer, QIcon::Active, state))
+ return QIcon::Active;
+ if (tryLoad(renderer, mode, oppositeState))
+ return mode;
+ if (tryLoad(renderer, QIcon::Normal, oppositeState))
+ return QIcon::Normal;
+ if (tryLoad(renderer, QIcon::Active, oppositeState))
+ return QIcon::Active;
+ if (tryLoad(renderer, oppositeMode, state))
+ return oppositeMode;
+ if (tryLoad(renderer, oppositeMode, oppositeState))
+ return oppositeMode;
} else {
- QString svgFile = svgFiles.value(hashKey(mode, state));
- if (svgFile.isEmpty())
- svgFile = svgFiles.value(hashKey(QIcon::Normal, state));
- if (svgFile.isEmpty())
- svgFile = svgFiles.value(hashKey(QIcon::Normal, oppositeState));
- if (!svgFile.isEmpty())
- renderer->load(svgFile);
+ const QIcon::Mode oppositeMode = (mode == QIcon::Normal) ? QIcon::Active : QIcon::Normal;
+ if (tryLoad(renderer, oppositeMode, state))
+ return oppositeMode;
+ if (tryLoad(renderer, mode, oppositeState))
+ return mode;
+ if (tryLoad(renderer, oppositeMode, oppositeState))
+ return oppositeMode;
+ if (tryLoad(renderer, QIcon::Disabled, state))
+ return QIcon::Disabled;
+ if (tryLoad(renderer, QIcon::Selected, state))
+ return QIcon::Selected;
+ if (tryLoad(renderer, QIcon::Disabled, oppositeState))
+ return QIcon::Disabled;
+ if (tryLoad(renderer, QIcon::Selected, oppositeState))
+ return QIcon::Selected;
}
+ return QIcon::Normal;
}
QPixmap QSvgIconEngine::pixmap(const QSize &size, QIcon::Mode mode,
@@ -164,7 +207,7 @@ QPixmap QSvgIconEngine::pixmap(const QSize &size, QIcon::Mode mode,
}
QSvgRenderer renderer;
- d->loadDataForModeAndState(&renderer, mode, state);
+ const QIcon::Mode loadmode = d->loadDataForModeAndState(&renderer, mode, state);
if (!renderer.isValid())
return pm;
@@ -182,9 +225,11 @@ QPixmap QSvgIconEngine::pixmap(const QSize &size, QIcon::Mode mode,
p.end();
pm = QPixmap::fromImage(img);
if (qobject_cast<QGuiApplication *>(QCoreApplication::instance())) {
- const QPixmap generated = QGuiApplicationPrivate::instance()->applyQIconStyleHelper(mode, pm);
- if (!generated.isNull())
- pm = generated;
+ if (loadmode != mode && mode != QIcon::Normal) {
+ const QPixmap generated = QGuiApplicationPrivate::instance()->applyQIconStyleHelper(mode, pm);
+ if (!generated.isNull())
+ pm = generated;
+ }
}
if (!pm.isNull())
diff --git a/src/plugins/imageformats/svg/qsvgiohandler.cpp b/src/plugins/imageformats/svg/qsvgiohandler.cpp
index 457c79e..a999d47 100644
--- a/src/plugins/imageformats/svg/qsvgiohandler.cpp
+++ b/src/plugins/imageformats/svg/qsvgiohandler.cpp
@@ -176,8 +176,13 @@ bool QSvgIOHandler::read(QImage *image)
t.translate(tr1.x(), tr1.y());
bounds = t.mapRect(bounds);
}
- if (image->size() != finalSize || !image->reinterpretAsFormat(QImage::Format_ARGB32_Premultiplied))
+ if (image->size() != finalSize || !image->reinterpretAsFormat(QImage::Format_ARGB32_Premultiplied)) {
*image = QImage(finalSize, QImage::Format_ARGB32_Premultiplied);
+ if (!finalSize.isEmpty() && image->isNull()) {
+ qWarning("QSvgIOHandler: QImage allocation failed (size %i x %i)", finalSize.width(), finalSize.height());
+ return false;
+ }
+ }
if (!finalSize.isEmpty()) {
image->fill(d->backColor.rgba());
QPainter p(image);
diff --git a/src/svg/qsvggenerator.cpp b/src/svg/qsvggenerator.cpp
index 424cc76..07f8d74 100644
--- a/src/svg/qsvggenerator.cpp
+++ b/src/svg/qsvggenerator.cpp
@@ -334,7 +334,7 @@ public:
void saveGradientUnits(QTextStream &str, const QGradient *gradient)
{
str << QLatin1String("gradientUnits=\"");
- if (gradient && gradient->coordinateMode() == QGradient::ObjectBoundingMode)
+ if (gradient && (gradient->coordinateMode() == QGradient::ObjectBoundingMode || gradient->coordinateMode() == QGradient::ObjectMode))
str << QLatin1String("objectBoundingBox");
else
str << QLatin1String("userSpaceOnUse");
diff --git a/src/svg/qsvghandler.cpp b/src/svg/qsvghandler.cpp
index fe07d0e..10cb779 100644
--- a/src/svg/qsvghandler.cpp
+++ b/src/svg/qsvghandler.cpp
@@ -2865,7 +2865,7 @@ static void parseBaseGradient(QSvgNode *node,
}
if (units.isEmpty() || units == QLatin1String("objectBoundingBox")) {
- grad->setCoordinateMode(QGradient::ObjectBoundingMode);
+ grad->setCoordinateMode(QGradient::ObjectMode);
}
}