OSDN Git Service

new QImageReader::formatForMimeType() and QImageWriter::formatForMimeType() methods
authorIvailo Monev <xakepa10@gmail.com>
Thu, 3 Mar 2022 02:18:14 +0000 (04:18 +0200)
committerIvailo Monev <xakepa10@gmail.com>
Thu, 3 Mar 2022 02:18:14 +0000 (04:18 +0200)
fixes pasting of images from clipboard for some image formats

Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
src/gui/image/qimagereader.cpp
src/gui/image/qimagereader.h
src/gui/image/qimagewriter.cpp
src/gui/image/qimagewriter.h
src/gui/kernel/qdnd.cpp

index 680908f..e9de09a 100644 (file)
@@ -902,12 +902,12 @@ QList<QByteArray> 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<QByteArray> 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<QImageIOPlugin *>(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<QByteArray> QImageReader::supportedMimeTypes()
 {
@@ -937,12 +982,12 @@ QList<QByteArray> 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
index 4c75366..d458028 100644 (file)
@@ -93,6 +93,7 @@ public:
     static QByteArray imageFormat(const QString &fileName);
     static QByteArray imageFormat(QIODevice *device);
     static QList<QByteArray> supportedImageFormats();
+    static QByteArray formatForMimeType(const QByteArray &mime);
     static QList<QByteArray> supportedMimeTypes();
 
 private:
index f067c76..563becc 100644 (file)
@@ -554,9 +554,47 @@ QList<QByteArray> 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<QImageIOPlugin *>(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<QByteArray> QImageWriter::supportedMimeTypes()
 {
index 1100fdb..6fbfb8d 100644 (file)
@@ -75,6 +75,7 @@ public:
 
     static QByteArray defaultImageFormat();
     static QList<QByteArray> supportedImageFormats();
+    static QByteArray formatForMimeType(const QByteArray &mime);
     static QList<QByteArray> supportedMimeTypes();
 
 private:
index 06f5924..caa7c7a 100644 (file)
@@ -384,7 +384,7 @@ QByteArray QInternalMimeData::renderDataHelper(const QString &mimeType, const QM
                 QImage image = qvariant_cast<QImage>(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()));
             }
         }
     }