OSDN Git Service

implement QImageIOHandler::CompressionLevel for png handler
authorIvailo Monev <xakepa10@gmail.com>
Sun, 27 Feb 2022 19:51:49 +0000 (21:51 +0200)
committerIvailo Monev <xakepa10@gmail.com>
Sun, 27 Feb 2022 19:51:49 +0000 (21:51 +0200)
Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
src/gui/image/qpnghandler.cpp
src/gui/image/qpnghandler_p.h

index a51af3b..908b952 100644 (file)
@@ -21,6 +21,7 @@
 
 #include "qpnghandler_p.h"
 #include "qiodevice.h"
+#include "qvariant.h"
 #include "qimage.h"
 #include "qimage_p.h"
 #include "qdrawhelper_p.h"
@@ -82,6 +83,7 @@ static void qt_png_flush(png_structp /* png_ptr */)
 #endif
 
 QPngHandler::QPngHandler()
+    : m_compression(1)
 {
 }
 
@@ -238,6 +240,7 @@ bool QPngHandler::write(const QImage &image)
     sig_bit.blue = 8;
     sig_bit.alpha = copy.hasAlphaChannel() ? 8 : 0;
     png_set_sBIT(png_ptr, info_ptr, &sig_bit);
+    png_set_compression_level(png_ptr, m_compression);
 
 #if Q_BYTE_ORDER == Q_BIG_ENDIAN
     // Swap ARGB to RGBA (normal PNG format) before saving on
@@ -277,6 +280,24 @@ bool QPngHandler::write(const QImage &image)
     return true;
 }
 
+bool QPngHandler::supportsOption(QImageIOHandler::ImageOption option) const
+{
+    return (option == QImageIOHandler::CompressionLevel);
+}
+
+void QPngHandler::setOption(QImageIOHandler::ImageOption option, const QVariant &value)
+{
+    if (option == QImageIOHandler::CompressionLevel) {
+        const int newlevel = value.toInt();
+        if (Q_UNLIKELY(newlevel < 0 || newlevel > 9)) {
+            qWarning("QPngHandler::setOption() invalid compression level value");
+            m_compression = 1;
+        } else {
+            m_compression = newlevel;
+        }
+    }
+}
+
 QByteArray QPngHandler::name() const
 {
     return "png";
index 88527f8..da5654b 100644 (file)
@@ -47,9 +47,15 @@ public:
     bool read(QImage *image) final;
     bool write(const QImage &image) final;
 
+    bool supportsOption(QImageIOHandler::ImageOption option) const final;
+    void setOption(QImageIOHandler::ImageOption option, const QVariant &value) final;
+
     QByteArray name() const final;
 
     static bool canRead(QIODevice *device);
+
+private:
+    int m_compression;
 };
 
 QT_END_NAMESPACE