From 27b560373d2919d68ccea79f5a0b928f4a14c9cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20L=C3=B6hning?= Date: Wed, 12 Jan 2022 23:19:16 +0100 Subject: [PATCH] QImageReader: Check for existing handler in initHandler Some calling code did this beforehand, other didn't. Now, the function itself checks for an existing handler before doing anything else. Change-Id: I8fc43fb8788c9dfe825b15ffa2fa69ee43915cd6 Reviewed-by: Qt CI Bot Reviewed-by: Eirik Aavitsland --- src/gui/image/qimagereader.cpp | 9 ++++--- .../image/qimagereader/tst_qimagereader.cpp | 26 +++++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/gui/image/qimagereader.cpp b/src/gui/image/qimagereader.cpp index dbfcb4ee8c..940f87af9a 100644 --- a/src/gui/image/qimagereader.cpp +++ b/src/gui/image/qimagereader.cpp @@ -529,6 +529,9 @@ QImageReaderPrivate::~QImageReaderPrivate() */ bool QImageReaderPrivate::initHandler() { + if (handler) + return true; + // check some preconditions if (!device || (!deleteDevice && !device->isOpen() && !device->open(QIODevice::ReadOnly))) { imageReaderError = QImageReader::DeviceError; @@ -575,7 +578,7 @@ bool QImageReaderPrivate::initHandler() } // assign a handler - if (!handler && (handler = createReadHandlerHelper(device, format, autoDetectImageFormat, ignoresFormatAndExtension)) == nullptr) { + if ((handler = createReadHandlerHelper(device, format, autoDetectImageFormat, ignoresFormatAndExtension)) == nullptr) { imageReaderError = QImageReader::UnsupportedFormatError; errorString = QImageReader::tr("Unsupported image format"); return false; @@ -588,7 +591,7 @@ bool QImageReaderPrivate::initHandler() */ void QImageReaderPrivate::getText() { - if (text.isEmpty() && (handler || initHandler()) && handler->supportsOption(QImageIOHandler::Description)) + if (text.isEmpty() && initHandler() && handler->supportsOption(QImageIOHandler::Description)) text = qt_getImageTextFromDescription(handler->option(QImageIOHandler::Description).toString()); } @@ -1223,7 +1226,7 @@ bool QImageReader::read(QImage *image) return false; } - if (!d->handler && !d->initHandler()) + if (!d->initHandler()) return false; // set the handler specific options. diff --git a/tests/auto/gui/image/qimagereader/tst_qimagereader.cpp b/tests/auto/gui/image/qimagereader/tst_qimagereader.cpp index 3191f9f06b..bf281f8d61 100644 --- a/tests/auto/gui/image/qimagereader/tst_qimagereader.cpp +++ b/tests/auto/gui/image/qimagereader/tst_qimagereader.cpp @@ -94,6 +94,8 @@ private slots: void setScaledClipRect_data(); void setScaledClipRect(); + void setFormat(); + void imageFormat_data(); void imageFormat(); @@ -513,6 +515,30 @@ void tst_QImageReader::setScaledClipRect() QCOMPARE(originalImage.copy(newRect), image); } +void tst_QImageReader::setFormat() +{ + QByteArray ppmImage = "P1 2 2\n1 0\n0 1"; + QBuffer buf(&ppmImage); + QImageReader reader(&buf); + + // read image in autodetected format + QCOMPARE(reader.size(), QSize(2,2)); + buf.close(); + + // try reading with non-matching format, must not succeed + reader.setDecideFormatFromContent(false); + reader.setFormat("bmp"); + reader.setDevice(&buf); + QCOMPARE(reader.size(), QSize()); + buf.close(); + + // read with manually set matching format + reader.setFormat("ppm"); + reader.setDevice(&buf); + QCOMPARE(reader.size(), QSize(2,2)); + buf.close(); +} + void tst_QImageReader::imageFormat_data() { QTest::addColumn("fileName");