diff options
author | Tarja Sundqvist <tarja.sundqvist@qt.io> | 2022-04-07 15:22:22 +0300 |
---|---|---|
committer | Tarja Sundqvist <tarja.sundqvist@qt.io> | 2022-04-07 15:22:22 +0300 |
commit | 945a9f19f9a018ffb6b9bb8396186df448e519d7 (patch) | |
tree | 6f474184d4b52d52e558a8b5c0531389bbedd2ec | |
parent | b4dfef869ab1ff25c8b511d52371d8b7a18d6902 (diff) | |
parent | 9a669aad89843252541acf636b34f14799c554f1 (diff) |
Merge remote-tracking branch 'origin/tqtc/lts-5.15.4' into tqtc/lts-5.15-opensourcev5.15.4-lts-lgpl
Change-Id: Iada998d00c8fbf9fd35ff7bdd6f87c3e8260aad6
-rw-r--r-- | .qmake.conf | 2 | ||||
-rw-r--r-- | src/plugins/imageformats/svg/qsvgiohandler.cpp | 37 | ||||
-rw-r--r-- | src/svg/qsvghandler.cpp | 5 | ||||
-rw-r--r-- | tests/auto/qsvgplugin/simple_Utf16BE.svg | bin | 0 -> 228 bytes | |||
-rw-r--r-- | tests/auto/qsvgplugin/simple_Utf16LE.svg | bin | 0 -> 228 bytes | |||
-rw-r--r-- | tests/auto/qsvgplugin/simple_Utf32BE.svg | bin | 0 -> 456 bytes | |||
-rw-r--r-- | tests/auto/qsvgplugin/simple_Utf32LE.svg | bin | 0 -> 456 bytes | |||
-rw-r--r-- | tests/auto/qsvgplugin/simple_Utf8.svg | 3 | ||||
-rw-r--r-- | tests/auto/qsvgplugin/tst_qsvgplugin.cpp | 32 |
9 files changed, 62 insertions, 17 deletions
diff --git a/.qmake.conf b/.qmake.conf index bbf484f..769c11f 100644 --- a/.qmake.conf +++ b/.qmake.conf @@ -3,4 +3,4 @@ load(qt_build_config) CONFIG += warning_clean DEFINES += QT_NO_FOREACH -MODULE_VERSION = 5.15.3 +MODULE_VERSION = 5.15.4 diff --git a/src/plugins/imageformats/svg/qsvgiohandler.cpp b/src/plugins/imageformats/svg/qsvgiohandler.cpp index bd39b2a..4136aaf 100644 --- a/src/plugins/imageformats/svg/qsvgiohandler.cpp +++ b/src/plugins/imageformats/svg/qsvgiohandler.cpp @@ -118,6 +118,24 @@ QSvgIOHandler::~QSvgIOHandler() delete d; } +static bool isPossiblySvg(QIODevice *device, bool *isCompressed = nullptr) +{ + constexpr int bufSize = 64; + char buf[bufSize]; + const qint64 readLen = device->peek(buf, bufSize); + if (readLen < 8) + return false; +# ifndef QT_NO_COMPRESS + if (quint8(buf[0]) == 0x1f && quint8(buf[1]) == 0x8b) { + if (isCompressed) + *isCompressed = true; + return true; + } +# endif + QTextStream str(QByteArray::fromRawData(buf, readLen)); + QByteArray ba = str.read(16).trimmed().toLatin1(); + return ba.startsWith("<?xml") || ba.startsWith("<svg") || ba.startsWith("<!--") || ba.startsWith("<!DOCTYPE svg"); +} bool QSvgIOHandler::canRead() const { @@ -126,15 +144,9 @@ bool QSvgIOHandler::canRead() const if (d->loaded && !d->readDone) return true; // Will happen if we have been asked for the size - QByteArray buf = device()->peek(16); -#ifndef QT_NO_COMPRESS - if (buf.startsWith("\x1f\x8b")) { - setFormat("svgz"); - return true; - } else -#endif - if (buf.contains("<?xml") || buf.contains("<svg") || buf.contains("<!--") || buf.contains("<!DOCTYPE svg")) { - setFormat("svg"); + bool isCompressed = false; + if (isPossiblySvg(device(), &isCompressed)) { + setFormat(isCompressed ? "svgz" : "svg"); return true; } return false; @@ -260,12 +272,7 @@ bool QSvgIOHandler::supportsOption(ImageOption option) const bool QSvgIOHandler::canRead(QIODevice *device) { - QByteArray buf = device->peek(16); - return -#ifndef QT_NO_COMPRESS - buf.startsWith("\x1f\x8b") || -#endif - buf.contains("<?xml") || buf.contains("<svg") || buf.contains("<!--") || buf.contains("<!DOCTYPE svg"); + return isPossiblySvg(device); } QT_END_NAMESPACE diff --git a/src/svg/qsvghandler.cpp b/src/svg/qsvghandler.cpp index b3d9aaf..9dac05c 100644 --- a/src/svg/qsvghandler.cpp +++ b/src/svg/qsvghandler.cpp @@ -673,7 +673,8 @@ static qreal toDouble(const QChar *&str) val = -val; } else { val = QByteArray::fromRawData(temp, pos).toDouble(); - if (qFpClassify(val) != FP_NORMAL) + // Do not tolerate values too wild to be represented normally by floats + if (qFpClassify(float(val)) != FP_NORMAL) val = 0; } return val; @@ -3046,6 +3047,8 @@ static QSvgStyleProperty *createRadialGradientNode(QSvgNode *node, ncy = toDouble(cy); if (!r.isEmpty()) nr = toDouble(r); + if (nr < 0.5) + nr = 0.5; qreal nfx = ncx; if (!fx.isEmpty()) diff --git a/tests/auto/qsvgplugin/simple_Utf16BE.svg b/tests/auto/qsvgplugin/simple_Utf16BE.svg Binary files differnew file mode 100644 index 0000000..c3312cb --- /dev/null +++ b/tests/auto/qsvgplugin/simple_Utf16BE.svg diff --git a/tests/auto/qsvgplugin/simple_Utf16LE.svg b/tests/auto/qsvgplugin/simple_Utf16LE.svg Binary files differnew file mode 100644 index 0000000..cdbeda9 --- /dev/null +++ b/tests/auto/qsvgplugin/simple_Utf16LE.svg diff --git a/tests/auto/qsvgplugin/simple_Utf32BE.svg b/tests/auto/qsvgplugin/simple_Utf32BE.svg Binary files differnew file mode 100644 index 0000000..0d5d02c --- /dev/null +++ b/tests/auto/qsvgplugin/simple_Utf32BE.svg diff --git a/tests/auto/qsvgplugin/simple_Utf32LE.svg b/tests/auto/qsvgplugin/simple_Utf32LE.svg Binary files differnew file mode 100644 index 0000000..58a7159 --- /dev/null +++ b/tests/auto/qsvgplugin/simple_Utf32LE.svg diff --git a/tests/auto/qsvgplugin/simple_Utf8.svg b/tests/auto/qsvgplugin/simple_Utf8.svg new file mode 100644 index 0000000..2052c48 --- /dev/null +++ b/tests/auto/qsvgplugin/simple_Utf8.svg @@ -0,0 +1,3 @@ +<svg version="1.0" xmlns="http://www.w3.org/2000/svg"> + <circle cx="50" cy="50" r="25" fill="#00ff00" /> +</svg> diff --git a/tests/auto/qsvgplugin/tst_qsvgplugin.cpp b/tests/auto/qsvgplugin/tst_qsvgplugin.cpp index e1f84f3..73bbe8b 100644 --- a/tests/auto/qsvgplugin/tst_qsvgplugin.cpp +++ b/tests/auto/qsvgplugin/tst_qsvgplugin.cpp @@ -61,6 +61,8 @@ private slots: void checkSize_data(); void checkSize(); void checkImageInclude(); + void encodings_data(); + void encodings(); }; @@ -145,6 +147,36 @@ void tst_QSvgPlugin::checkImageInclude() logMessages.clear(); } +void tst_QSvgPlugin::encodings_data() +{ + QTest::addColumn<QString>("filename"); + + QTest::newRow("utf-8") << QFINDTESTDATA("simple_Utf8.svg"); + QTest::newRow("utf-16LE") << QFINDTESTDATA("simple_Utf16LE.svg"); + QTest::newRow("utf-16BE") << QFINDTESTDATA("simple_Utf16BE.svg"); + QTest::newRow("utf-32LE") << QFINDTESTDATA("simple_Utf32LE.svg"); + QTest::newRow("utf-32BE") << QFINDTESTDATA("simple_Utf32BE.svg"); +} + +void tst_QSvgPlugin::encodings() +{ + QFETCH(QString, filename); + + { + QFile file(filename); + file.open(QIODevice::ReadOnly); + QVERIFY(QSvgIOHandler::canRead(&file)); + } + + QFile file(filename); + file.open(QIODevice::ReadOnly); + QSvgIOHandler plugin; + plugin.setDevice(&file); + QVERIFY(plugin.canRead()); + QImage img; + QVERIFY(plugin.read(&img)); + QCOMPARE(img.size(), QSize(50, 50)); +} QTEST_MAIN(tst_QSvgPlugin) #include "tst_qsvgplugin.moc" |