diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/iconengines/svgiconengine/qsvgiconengine.cpp | 95 | ||||
-rw-r--r-- | src/plugins/imageformats/svg/qsvgiohandler.cpp | 7 | ||||
-rw-r--r-- | src/svg/qsvggenerator.cpp | 2 | ||||
-rw-r--r-- | src/svg/qsvghandler.cpp | 2 |
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); } } |