From f114257be6ba774129ddfb27e3d962d8902b5cdf Mon Sep 17 00:00:00 2001 From: Ivailo Monev Date: Thu, 3 Mar 2022 04:18:14 +0200 Subject: [PATCH] new QImageReader::formatForMimeType() and QImageWriter::formatForMimeType() methods fixes pasting of images from clipboard for some image formats Signed-off-by: Ivailo Monev --- src/gui/image/qimagereader.cpp | 59 +++++++++++++++++++++++++++++++++++++----- src/gui/image/qimagereader.h | 1 + src/gui/image/qimagewriter.cpp | 40 +++++++++++++++++++++++++++- src/gui/image/qimagewriter.h | 1 + src/gui/kernel/qdnd.cpp | 2 +- 5 files changed, 94 insertions(+), 9 deletions(-) diff --git a/src/gui/image/qimagereader.cpp b/src/gui/image/qimagereader.cpp index 680908fd7..e9de09aa9 100644 --- a/src/gui/image/qimagereader.cpp +++ b/src/gui/image/qimagereader.cpp @@ -902,12 +902,12 @@ QList QImageReader::supportedImageFormats() #ifndef QT_NO_IMAGEFORMAT_KAT << "kat" #endif -#ifndef QT_NO_IMAGEFORMAT_PPM - << "ppm" << "pbm" -#endif #ifndef QT_NO_IMAGEFORMAT_XPM << "xpm" #endif +#ifndef QT_NO_IMAGEFORMAT_PPM + << "ppm" << "pbm" +#endif ; #ifndef QT_NO_LIBRARY @@ -926,9 +926,54 @@ QList QImageReader::supportedImageFormats() /*! \since 4.12 + Returns the format string for image MIME specified by \a mime. + + \sa supportedMimeTypes() +*/ +QByteArray QImageReader::formatForMimeType(const QByteArray &mime) +{ + if (mime == "image/png") { + return QByteArray("png"); + } +#ifndef QT_NO_IMAGEFORMAT_KAT + if (mime == "image/katie") { + return QByteArray("kat"); + } +#endif +#ifndef QT_NO_IMAGEFORMAT_XPM + if (mime == "image/x-xpixmap") { + return QByteArray("xpm"); + } +#endif +#ifndef QT_NO_IMAGEFORMAT_PPM + if (mime == "image/x-portable-pixmap") { + return QByteArray("ppm"); + } else if (mime == "image/x-portable-bitmap") { + return QByteArray("pbm"); + } +#endif + +#ifndef QT_NO_LIBRARY + QFactoryLoader *l = imageloader(); + foreach (const QString &key, l->keys()) { + QImageIOPlugin *plugin = qobject_cast(l->instance(key)); + if (plugin && plugin->capabilities(0, key.toLatin1()) & QImageIOPlugin::CanRead) { + if (plugin->mimeTypes().contains(mime)) { + return key.toLatin1(); + } + } + } +#endif // QT_NO_LIBRARY + + return QByteArray(); +} + +/*! + \since 4.12 + Returns the list of image MIME types supported by QImageReader. - \sa supportedImageFormats(), QImageWriter::supportedImageFormats(), + \sa supportedImageFormats(), QImageWriter::supportedImageFormats() */ QList QImageReader::supportedMimeTypes() { @@ -937,12 +982,12 @@ QList QImageReader::supportedMimeTypes() #ifndef QT_NO_IMAGEFORMAT_KAT << "image/katie" #endif -#ifndef QT_NO_IMAGEFORMAT_PPM - << "image/x-portable-pixmap" << "image/x-portable-bitmap" -#endif #ifndef QT_NO_IMAGEFORMAT_XPM << "image/x-xpixmap" #endif +#ifndef QT_NO_IMAGEFORMAT_PPM + << "image/x-portable-pixmap" << "image/x-portable-bitmap" +#endif ; #ifndef QT_NO_LIBRARY diff --git a/src/gui/image/qimagereader.h b/src/gui/image/qimagereader.h index 4c75366b7..d45802804 100644 --- a/src/gui/image/qimagereader.h +++ b/src/gui/image/qimagereader.h @@ -93,6 +93,7 @@ public: static QByteArray imageFormat(const QString &fileName); static QByteArray imageFormat(QIODevice *device); static QList supportedImageFormats(); + static QByteArray formatForMimeType(const QByteArray &mime); static QList supportedMimeTypes(); private: diff --git a/src/gui/image/qimagewriter.cpp b/src/gui/image/qimagewriter.cpp index f067c761e..563becc0a 100644 --- a/src/gui/image/qimagewriter.cpp +++ b/src/gui/image/qimagewriter.cpp @@ -554,9 +554,47 @@ QList QImageWriter::supportedImageFormats() /*! \since 4.12 + Returns the format string for image MIME specified by \a mime. + + \sa supportedMimeTypes() +*/ +QByteArray QImageWriter::formatForMimeType(const QByteArray &mime) +{ + if (mime == "image/png") { + return QByteArray("png"); + } +#ifndef QT_NO_IMAGEFORMAT_KAT + if (mime == "image/katie") { + return QByteArray("kat"); + } +#endif +#ifndef QT_NO_IMAGEFORMAT_PPM + if (mime == "image/x-portable-pixmap") { + return QByteArray("ppm"); + } +#endif + +#ifndef QT_NO_LIBRARY + QFactoryLoader *l = imageloader(); + foreach (const QString &key, l->keys()) { + QImageIOPlugin *plugin = qobject_cast(l->instance(key)); + if (plugin && plugin->capabilities(0, key.toLatin1()) & QImageIOPlugin::CanWrite) { + if (plugin->mimeTypes().contains(mime)) { + return key.toLatin1(); + } + } + } +#endif // QT_NO_LIBRARY + + return QByteArray(); +} + +/*! + \since 4.12 + Returns the list of image MIME types supported by QImageWriter. - \sa supportedImageFormats(), QImageReader::supportedImageFormats(), + \sa supportedImageFormats(), QImageReader::supportedImageFormats() */ QList QImageWriter::supportedMimeTypes() { diff --git a/src/gui/image/qimagewriter.h b/src/gui/image/qimagewriter.h index 1100fdb67..6fbfb8d30 100644 --- a/src/gui/image/qimagewriter.h +++ b/src/gui/image/qimagewriter.h @@ -75,6 +75,7 @@ public: static QByteArray defaultImageFormat(); static QList supportedImageFormats(); + static QByteArray formatForMimeType(const QByteArray &mime); static QList supportedMimeTypes(); private: diff --git a/src/gui/kernel/qdnd.cpp b/src/gui/kernel/qdnd.cpp index 06f592429..caa7c7a49 100644 --- a/src/gui/kernel/qdnd.cpp +++ b/src/gui/kernel/qdnd.cpp @@ -384,7 +384,7 @@ QByteArray QInternalMimeData::renderDataHelper(const QString &mimeType, const QM QImage image = qvariant_cast(data->imageData()); QBuffer buf(&ba); buf.open(QBuffer::WriteOnly); - image.save(&buf, mimeType.mid(mimeType.indexOf(QLatin1Char('/')) + 1).toLatin1().toUpper()); + image.save(&buf, QImageWriter::formatForMimeType(mimeType.toLatin1())); } } } -- 2.11.0