From 37217c57fa5595e7cdfd7e19f34de22848dfc370 Mon Sep 17 00:00:00 2001 From: Alexander Volkov Date: Thu, 25 Jan 2018 15:18:07 +0300 Subject: Introduce QImage{Reader,Writer}::imageFormatsForMimeType() It can be used if, for example, you get an image MIME type from the user, and you want to find the appropriate format for loading or saving this image. Task-number: QTBUG-49714 Change-Id: Iae5a7e9d658d6c3d1cd750a8bbc279f1812f99df Reviewed-by: Eirik Aavitsland --- src/gui/image/qimagereader.cpp | 17 ++++++++++++++ src/gui/image/qimagereader.h | 1 + src/gui/image/qimagereaderwriterhelpers.cpp | 36 +++++++++++++++++++++++++++-- src/gui/image/qimagereaderwriterhelpers_p.h | 1 + src/gui/image/qimagewriter.cpp | 17 ++++++++++++++ src/gui/image/qimagewriter.h | 1 + 6 files changed, 71 insertions(+), 2 deletions(-) diff --git a/src/gui/image/qimagereader.cpp b/src/gui/image/qimagereader.cpp index a2686bd238..e77c6f019c 100644 --- a/src/gui/image/qimagereader.cpp +++ b/src/gui/image/qimagereader.cpp @@ -1552,4 +1552,21 @@ QList QImageReader::supportedMimeTypes() return QImageReaderWriterHelpers::supportedMimeTypes(QImageReaderWriterHelpers::CanRead); } +/*! + \since 5.12 + + Returns the list of image formats corresponding to \mimeType. + + Note that the QGuiApplication instance must be created before this function is + called. + + \sa supportedImageFormats(), supportedMimeTypes() +*/ + +QList QImageReader::imageFormatsForMimeType(const QByteArray &mimeType) +{ + return QImageReaderWriterHelpers::imageFormatsForMimeType(mimeType, + QImageReaderWriterHelpers::CanRead); +} + QT_END_NAMESPACE diff --git a/src/gui/image/qimagereader.h b/src/gui/image/qimagereader.h index 9d6c1e0b1e..4e9a08b6e6 100644 --- a/src/gui/image/qimagereader.h +++ b/src/gui/image/qimagereader.h @@ -144,6 +144,7 @@ public: static QByteArray imageFormat(QIODevice *device); static QList supportedImageFormats(); static QList supportedMimeTypes(); + static QList imageFormatsForMimeType(const QByteArray &mimeType); private: Q_DISABLE_COPY(QImageReader) diff --git a/src/gui/image/qimagereaderwriterhelpers.cpp b/src/gui/image/qimagereaderwriterhelpers.cpp index 6481f0e603..a5b7fb6449 100644 --- a/src/gui/image/qimagereaderwriterhelpers.cpp +++ b/src/gui/image/qimagereaderwriterhelpers.cpp @@ -78,7 +78,8 @@ static void appendImagePluginFormats(QFactoryLoader *loader, static void appendImagePluginMimeTypes(QFactoryLoader *loader, QImageIOPlugin::Capability cap, - QList *result) + QList *result, + QList *resultKeys = nullptr) { QList metaDataList = loader->metaData(); @@ -90,8 +91,12 @@ static void appendImagePluginMimeTypes(QFactoryLoader *loader, QImageIOPlugin *plugin = qobject_cast(loader->instance(i)); const int keyCount = keys.size(); for (int k = 0; k < keyCount; ++k) { - if (plugin && (plugin->capabilities(0, keys.at(k).toString().toLatin1()) & cap) != 0) + const QByteArray key = keys.at(k).toString().toLatin1(); + if (plugin && (plugin->capabilities(0, key) & cap) != 0) { result->append(mimeTypes.at(k).toString().toLatin1()); + if (resultKeys) + resultKeys->append(key); + } } } } @@ -143,6 +148,33 @@ QList supportedMimeTypes(Capability cap) return mimeTypes; } +QList imageFormatsForMimeType(const QByteArray &mimeType, Capability cap) +{ + QList formats; + if (mimeType.startsWith("image/")) { + const QByteArray type = mimeType.mid(sizeof("image/") - 1); + for (const auto &fmt : _qt_BuiltInFormats) { + if (fmt.mimeType == type && !formats.contains(fmt.extension)) + formats << fmt.extension; + } + } + +#ifndef QT_NO_IMAGEFORMATPLUGIN + QList mimeTypes; + QList keys; + appendImagePluginMimeTypes(loader(), pluginCapability(cap), &mimeTypes, &keys); + for (int i = 0; i < mimeTypes.size(); ++i) { + if (mimeTypes.at(i) == mimeType) { + const auto &key = keys.at(i); + if (!formats.contains(key)) + formats << key; + } + } +#endif // QT_NO_IMAGEFORMATPLUGIN + + return formats; +} + } // QImageReaderWriterHelpers QT_END_NAMESPACE diff --git a/src/gui/image/qimagereaderwriterhelpers_p.h b/src/gui/image/qimagereaderwriterhelpers_p.h index 358ae9be89..6fe418a8ab 100644 --- a/src/gui/image/qimagereaderwriterhelpers_p.h +++ b/src/gui/image/qimagereaderwriterhelpers_p.h @@ -130,6 +130,7 @@ enum Capability { }; QList supportedImageFormats(Capability cap); QList supportedMimeTypes(Capability cap); +QList imageFormatsForMimeType(const QByteArray &mimeType, Capability cap); } diff --git a/src/gui/image/qimagewriter.cpp b/src/gui/image/qimagewriter.cpp index fd036da604..30ec224158 100644 --- a/src/gui/image/qimagewriter.cpp +++ b/src/gui/image/qimagewriter.cpp @@ -863,4 +863,21 @@ QList QImageWriter::supportedMimeTypes() return QImageReaderWriterHelpers::supportedMimeTypes(QImageReaderWriterHelpers::CanWrite); } +/*! + \since 5.12 + + Returns the list of image formats corresponding to \mimeType. + + Note that the QGuiApplication instance must be created before this function is + called. + + \sa supportedImageFormats(), supportedMimeTypes() +*/ + +QList QImageWriter::imageFormatsForMimeType(const QByteArray &mimeType) +{ + return QImageReaderWriterHelpers::imageFormatsForMimeType(mimeType, + QImageReaderWriterHelpers::CanWrite); +} + QT_END_NAMESPACE diff --git a/src/gui/image/qimagewriter.h b/src/gui/image/qimagewriter.h index fd1fdd07e8..29c06ccdd2 100644 --- a/src/gui/image/qimagewriter.h +++ b/src/gui/image/qimagewriter.h @@ -116,6 +116,7 @@ public: static QList supportedImageFormats(); static QList supportedMimeTypes(); + static QList imageFormatsForMimeType(const QByteArray &mimeType); private: Q_DISABLE_COPY(QImageWriter) -- cgit v1.2.3