163 qWarning() <<
"Profile has a size of 4096, which is suspicious and indicates a possible misuse of QIODevice::read(int), check your code.";
171 cmsGetProfileInfo(
d->
profile, cmsInfoDescription, cmsNoLanguage, cmsNoCountry, buffer,
_BUFFER_SIZE_);
172 d->
name = QString::fromWCharArray(buffer);
178 cmsGetProfileInfo(
d->
profile, cmsInfoManufacturer, cmsNoLanguage, cmsNoCountry, buffer,
_BUFFER_SIZE_);
182 d->
copyright = QString::fromWCharArray(buffer);
184 cmsProfileClassSignature profile_class;
185 profile_class = cmsGetDeviceClass(
d->
profile);
186 d->
valid = ( profile_class != cmsSigNamedColorClass
187 && profile_class != cmsSigLinkClass);
191 cmsCIEXYZ baseMediaWhitePoint;
192 cmsCIEXYZ *mediaWhitePointPtr;
199 if (cmsIsTag(
d->
profile, cmsSigMediaWhitePointTag)
200 && (mediaWhitePointPtr = (cmsCIEXYZ *)cmsReadTag(
d->
profile, cmsSigMediaWhitePointTag))) {
205 whiteComp[0] = std::fabs(baseMediaWhitePoint.X - cmsD50_XYZ()->X) < 0.00001;
206 whiteComp[1] = std::fabs(baseMediaWhitePoint.Y - cmsD50_XYZ()->Y) < 0.00001;
207 whiteComp[2] = std::fabs(baseMediaWhitePoint.Z - cmsD50_XYZ()->Z) < 0.00001;
208 whiteIsD50 = std::all_of(std::begin(whiteComp), std::end(whiteComp), [](
bool b) {
return b;});
212 if (cmsIsTag(
d->
profile, cmsSigChromaticAdaptationTag)
213 && (CAM1 = (cmsCIEXYZ *)cmsReadTag(
d->
profile, cmsSigChromaticAdaptationTag))
219 QGenericMatrix<1, 3, double> whitePointMatrix(d3dummy);
220 QTransform invertDummy(CAM1[0].X, CAM1[0].Y, CAM1[0].Z, CAM1[1].X, CAM1[1].Y, CAM1[1].Z, CAM1[2].X, CAM1[2].Y, CAM1[2].Z);
224 QTransform invertedDummy = invertDummy.inverted();
226 double d9dummy [9] = {invertedDummy.m11(), invertedDummy.m12(), invertedDummy.m13(),
227 invertedDummy.m21(), invertedDummy.m22(), invertedDummy.m23(),
228 invertedDummy.m31(), invertedDummy.m32(), invertedDummy.m33()
230 QGenericMatrix<3, 3, double> chromaticAdaptionMatrix(d9dummy);
232 QGenericMatrix<1, 3, double> result = chromaticAdaptionMatrix * whitePointMatrix;
242 cmsCIEXYZ *tempColorantsRed, *tempColorantsGreen, *tempColorantsBlue;
245 if (cmsIsTag(
d->
profile, cmsSigRedColorantTag) && cmsIsTag(
d->
profile, cmsSigRedColorantTag) && cmsIsTag(
d->
profile, cmsSigRedColorantTag)
246 && (tempColorantsRed = (cmsCIEXYZ *)cmsReadTag(
d->
profile, cmsSigRedColorantTag))
247 && (tempColorantsGreen = (cmsCIEXYZ *)cmsReadTag(
d->
profile, cmsSigGreenColorantTag))
248 && (tempColorantsBlue = (cmsCIEXYZ *)cmsReadTag(
d->
profile, cmsSigBlueColorantTag))) {
249 cmsCIEXYZTRIPLE tempColorants;
250 tempColorants.Red = *tempColorantsRed;
251 tempColorants.Green = *tempColorantsGreen;
252 tempColorants.Blue = *tempColorantsBlue;
264 if (cmsIsTag(
d->
profile, cmsSigRedTRCTag) && cmsIsTag(
d->
profile, cmsSigBlueTRCTag) && cmsIsTag(
d->
profile, cmsSigGreenTRCTag)) {
266 d->
redTRC = ((cmsToneCurve *)cmsReadTag (
d->
profile, cmsSigRedTRCTag));
279 && cmsIsToneCurveLinear(
d->
redTRC)
281 && cmsIsToneCurveLinear(
d->
blueTRC);
284 }
else if (cmsIsTag(
d->
profile, cmsSigGrayTRCTag)) {
302 LCMS_USED_AS_OUTPUT);
662 cmsToneCurve *mainCurve;
665 cmsFloat64Number srgb_parameters[5] =
666 { 2.4, 1.0 / 1.055, 0.055 / 1.055, 1.0 / 12.92, 0.04045 };
667 cmsFloat64Number rec709_parameters[5] =
668 { 1.0 / 0.45, 1.0 / 1.099, 0.099 / 1.099, 1.0 / 4.5, 0.081 };
671 cmsFloat64Number rec202012bit_parameters[5] =
672 { 1.0 / 0.45, 1.0 / 1.0993, 0.0993 / 1.0993, 1.0 / 4.5, 0.0812 };
674 cmsFloat64Number SMPTE_240M_parameters[5] =
675 { 1.0 / 0.45, 1.0 / 1.1115, 0.1115 / 1.1115, 1.0 / 4.0, 0.0913 };
677 cmsFloat64Number prophoto_parameters[5] =
678 { 1.8, 1.0, 0, 1.0 / 16, (16.0/512) };
680 cmsFloat64Number log_100[5] = {1.0, 10, 2.0, -2.0, 0.0};
681 cmsFloat64Number log_100_sqrt[5] = {1.0, 10, 2.5, -2.5, 0.0};
683 cmsFloat64Number labl_parameters[5] = {3.0, 0.862076, 0.137924, 0.110703, 0.080002};
690 qWarning() <<
"Neither IEC 61966 2-4 nor Bt. 1361 are supported, returning a rec 709 curve.";
695 mainCurve = cmsBuildParametricToneCurve(NULL, 4, rec709_parameters);
698 mainCurve = cmsBuildParametricToneCurve(NULL, 4, rec202012bit_parameters);
701 mainCurve = cmsBuildGamma(NULL, 2.2);
704 mainCurve = cmsBuildGamma(NULL, 2.8);
707 mainCurve = cmsBuildParametricToneCurve(NULL, 4, SMPTE_240M_parameters);
710 mainCurve = cmsBuildParametricToneCurve(NULL, 4, srgb_parameters);
713 mainCurve = cmsBuildParametricToneCurve(NULL, 8, log_100);
716 mainCurve = cmsBuildParametricToneCurve(NULL, 8, log_100_sqrt);
720 mainCurve = cmsBuildGamma(NULL, 563.0 / 256.0);
723 mainCurve = cmsBuildParametricToneCurve(NULL, 4, prophoto_parameters);
726 mainCurve = cmsBuildGamma(NULL, 1.8);
729 mainCurve = cmsBuildGamma(NULL, 2.4);
732 mainCurve = cmsBuildParametricToneCurve(NULL, 4, labl_parameters);
740 qWarning() <<
"Cannot generate an icc profile with this transfer function, will generate a linear profile";
744 mainCurve = cmsBuildGamma(NULL, 1.0);