summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2019-07-19 11:46:07 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2019-07-23 23:37:45 +0200
commit83de6d0ce5baceb7739b89254cba4acc6fdab47d (patch)
tree5789985d4b73287bece43cfccead448fdf8dfece /src
parent733ca2230c283cdfaae424eac481ddc33593f44f (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.cpp24
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);
}