From: Ivailo Monev Date: Sun, 27 Feb 2022 19:51:49 +0000 (+0200) Subject: implement QImageIOHandler::CompressionLevel for png handler X-Git-Tag: 4.12.0~837 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=73ed98b9443b365c024ee9ab81b3edea3c1f661b;p=kde%2FKatie.git implement QImageIOHandler::CompressionLevel for png handler Signed-off-by: Ivailo Monev --- diff --git a/src/gui/image/qpnghandler.cpp b/src/gui/image/qpnghandler.cpp index a51af3b35..908b952e1 100644 --- a/src/gui/image/qpnghandler.cpp +++ b/src/gui/image/qpnghandler.cpp @@ -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"; diff --git a/src/gui/image/qpnghandler_p.h b/src/gui/image/qpnghandler_p.h index 88527f893..da5654b2e 100644 --- a/src/gui/image/qpnghandler_p.h +++ b/src/gui/image/qpnghandler_p.h @@ -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