diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2019-07-19 11:46:07 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2019-07-23 23:37:45 +0200 |
commit | 83de6d0ce5baceb7739b89254cba4acc6fdab47d (patch) | |
tree | 5789985d4b73287bece43cfccead448fdf8dfece /src | |
parent | 733ca2230c283cdfaae424eac481ddc33593f44f (diff) |
Add support for saving colorspace to PNGs
Also fixes interaction with QImageReader gamma correction
Change-Id: I108f253697f7ff60be6940bca17faa9f9ceb577b
Reviewed-by: Eirik Aavitsland <eirik.aavitsland@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/gui/image/qpnghandler.cpp | 24 |
1 files changed, 22 insertions, 2 deletions
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); } |