From 83de6d0ce5baceb7739b89254cba4acc6fdab47d Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Fri, 19 Jul 2019 11:46:07 +0200 Subject: Add support for saving colorspace to PNGs Also fixes interaction with QImageReader gamma correction Change-Id: I108f253697f7ff60be6940bca17faa9f9ceb577b Reviewed-by: Eirik Aavitsland --- src/gui/image/qpnghandler.cpp | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) (limited to 'src/gui') diff --git a/src/gui/image/qpnghandler.cpp b/src/gui/image/qpnghandler.cpp index 4b72888414..023696a401 100644 --- a/src/gui/image/qpnghandler.cpp +++ b/src/gui/image/qpnghandler.cpp @@ -611,6 +611,9 @@ bool QPngHandlerPrivate::readPngHeader() if (!colorSpace.isValid()) { qWarning() << "QPngHandler: Failed to parse ICC profile"; } else { + QColorSpacePrivate *csD = QColorSpacePrivate::getWritable(colorSpace); + if (csD->description.isEmpty()) + csD->description = QString::fromLatin1((const char *)name); colorSpaceState = Icc; } } @@ -680,7 +683,7 @@ bool QPngHandlerPrivate::readPngImage(QImage *outImage) png_set_gamma(png_ptr, 1.0f / gamma, fileGamma); QColorSpacePrivate *csPrivate = QColorSpacePrivate::getWritable(colorSpace); csPrivate->transferFunction = QColorSpace::TransferFunction::Gamma; - csPrivate->gamma = gamma; + csPrivate->gamma = 1.0f / gamma; csPrivate->setTransferFunction(); colorSpaceState = GammaChrm; } @@ -977,7 +980,24 @@ bool QPNGImageWriter::writeImage(const QImage& image, volatile int compression_i bpc, // per channel color_type, 0, 0, 0); // sets #channels - if (gamma != 0.0) { + if (image.colorSpace().isValid()) { + QColorSpace cs = image.colorSpace(); + // Support the old gamma making it override transferfunction. + if (gamma != 0.0 && !qFuzzyCompare(cs.gamma(), 1.0f / gamma)) { + QColorSpacePrivate *csPrivate = QColorSpacePrivate::getWritable(cs); + csPrivate->transferFunction = QColorSpace::TransferFunction::Gamma; + csPrivate->gamma = 1.0f / gamma; + csPrivate->setTransferFunction(); + csPrivate->iccProfile.clear(); + csPrivate->description.clear(); + } + QByteArray iccProfileName = QColorSpacePrivate::get(cs)->description.toLatin1(); + if (iccProfileName.isEmpty()) + iccProfileName = QByteArrayLiteral("Custom"); + QByteArray iccProfile = cs.iccProfile(); + png_set_iCCP(png_ptr, info_ptr, (png_const_charp)iccProfileName.constData(), + PNG_COMPRESSION_TYPE_BASE, (png_const_bytep)iccProfile.constData(), iccProfile.length()); + } else if (gamma != 0.0) { png_set_gAMA(png_ptr, info_ptr, 1.0/gamma); } -- cgit v1.2.3