165 qWarning() <<
"Profile has a size of 4096, which is suspicious and indicates a possible misuse of QIODevice::read(int), check your code.";
173 cmsGetProfileInfo(
d->
profile, cmsInfoDescription, cmsNoLanguage, cmsNoCountry, buffer,
_BUFFER_SIZE_);
174 d->
name = QString::fromWCharArray(buffer);
180 cmsGetProfileInfo(
d->
profile, cmsInfoManufacturer, cmsNoLanguage, cmsNoCountry, buffer,
_BUFFER_SIZE_);
184 d->
copyright = QString::fromWCharArray(buffer);
186 cmsProfileClassSignature profile_class;
187 profile_class = cmsGetDeviceClass(
d->
profile);
188 d->
valid = ( profile_class != cmsSigNamedColorClass
189 && profile_class != cmsSigLinkClass);
193 cmsCIEXYZ baseMediaWhitePoint;
194 cmsCIEXYZ *mediaWhitePointPtr;
201 if (cmsIsTag(
d->
profile, cmsSigMediaWhitePointTag)
202 && (mediaWhitePointPtr = (cmsCIEXYZ *)cmsReadTag(
d->
profile, cmsSigMediaWhitePointTag))) {
207 whiteComp[0] = std::fabs(baseMediaWhitePoint.X - cmsD50_XYZ()->X) < 0.00001;
208 whiteComp[1] = std::fabs(baseMediaWhitePoint.Y - cmsD50_XYZ()->Y) < 0.00001;
209 whiteComp[2] = std::fabs(baseMediaWhitePoint.Z - cmsD50_XYZ()->Z) < 0.00001;
210 whiteIsD50 = std::all_of(std::begin(whiteComp), std::end(whiteComp), [](
bool b) {
return b;});
214 if (cmsIsTag(
d->
profile, cmsSigChromaticAdaptationTag)
215 && (CAM1 = (cmsCIEXYZ *)cmsReadTag(
d->
profile, cmsSigChromaticAdaptationTag))
221 QGenericMatrix<1, 3, double> whitePointMatrix(d3dummy);
222 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);
226 QTransform invertedDummy = invertDummy.inverted();
228 double d9dummy [9] = {invertedDummy.m11(), invertedDummy.m12(), invertedDummy.m13(),
229 invertedDummy.m21(), invertedDummy.m22(), invertedDummy.m23(),
230 invertedDummy.m31(), invertedDummy.m32(), invertedDummy.m33()
232 QGenericMatrix<3, 3, double> chromaticAdaptionMatrix(d9dummy);
234 QGenericMatrix<1, 3, double> result = chromaticAdaptionMatrix * whitePointMatrix;
244 cmsCIEXYZ *tempColorantsRed, *tempColorantsGreen, *tempColorantsBlue;
247 if (cmsIsTag(
d->
profile, cmsSigRedColorantTag) && cmsIsTag(
d->
profile, cmsSigRedColorantTag) && cmsIsTag(
d->
profile, cmsSigRedColorantTag)
248 && (tempColorantsRed = (cmsCIEXYZ *)cmsReadTag(
d->
profile, cmsSigRedColorantTag))
249 && (tempColorantsGreen = (cmsCIEXYZ *)cmsReadTag(
d->
profile, cmsSigGreenColorantTag))
250 && (tempColorantsBlue = (cmsCIEXYZ *)cmsReadTag(
d->
profile, cmsSigBlueColorantTag))) {
251 cmsCIEXYZTRIPLE tempColorants;
252 tempColorants.Red = *tempColorantsRed;
253 tempColorants.Green = *tempColorantsGreen;
254 tempColorants.Blue = *tempColorantsBlue;
266 if (cmsIsTag(
d->
profile, cmsSigRedTRCTag) && cmsIsTag(
d->
profile, cmsSigBlueTRCTag) && cmsIsTag(
d->
profile, cmsSigGreenTRCTag)) {
268 d->
redTRC = ((cmsToneCurve *)cmsReadTag (
d->
profile, cmsSigRedTRCTag));
281 && cmsIsToneCurveLinear(
d->
redTRC)
283 && cmsIsToneCurveLinear(
d->
blueTRC);
286 }
else if (cmsIsTag(
d->
profile, cmsSigGrayTRCTag)) {
671 cmsToneCurve *mainCurve;
674 cmsFloat64Number srgb_parameters[5] =
675 { 2.4, 1.0 / 1.055, 0.055 / 1.055, 1.0 / 12.92, 0.04045 };
676 cmsFloat64Number rec709_parameters[5] =
677 { 1.0 / 0.45, 1.0 / 1.099, 0.099 / 1.099, 1.0 / 4.5, 0.081 };
680 cmsFloat64Number rec202012bit_parameters[5] =
681 { 1.0 / 0.45, 1.0 / 1.0993, 0.0993 / 1.0993, 1.0 / 4.5, 0.0812 };
683 cmsFloat64Number SMPTE_240M_parameters[5] =
684 { 1.0 / 0.45, 1.0 / 1.1115, 0.1115 / 1.1115, 1.0 / 4.0, 0.0913 };
686 cmsFloat64Number prophoto_parameters[5] =
687 { 1.8, 1.0, 0, 1.0 / 16, (16.0/512) };
689 cmsFloat64Number log_100[5] = {1.0, 10, 2.0, -2.0, 0.0};
690 cmsFloat64Number log_100_sqrt[5] = {1.0, 10, 2.5, -2.5, 0.0};
692 cmsFloat64Number labl_parameters[5] = {3.0, 0.862076, 0.137924, 0.110703, 0.080002};
699 qWarning() <<
"Neither IEC 61966 2-4 nor Bt. 1361 are supported, returning a rec 709 curve.";
704 mainCurve = cmsBuildParametricToneCurve(NULL, 4, rec709_parameters);
707 mainCurve = cmsBuildParametricToneCurve(NULL, 4, rec202012bit_parameters);
710 mainCurve = cmsBuildGamma(NULL, 2.2);
713 mainCurve = cmsBuildGamma(NULL, 2.8);
716 mainCurve = cmsBuildParametricToneCurve(NULL, 4, SMPTE_240M_parameters);
719 mainCurve = cmsBuildParametricToneCurve(NULL, 4, srgb_parameters);
722 mainCurve = cmsBuildParametricToneCurve(NULL, 8, log_100);
725 mainCurve = cmsBuildParametricToneCurve(NULL, 8, log_100_sqrt);
729 mainCurve = cmsBuildGamma(NULL, 563.0 / 256.0);
732 mainCurve = cmsBuildParametricToneCurve(NULL, 4, prophoto_parameters);
735 mainCurve = cmsBuildGamma(NULL, 1.8);
738 mainCurve = cmsBuildGamma(NULL, 2.4);
741 mainCurve = cmsBuildParametricToneCurve(NULL, 4, labl_parameters);
749 qWarning() <<
"Cannot generate an icc profile with this transfer function, will generate a linear profile";
753 mainCurve = cmsBuildGamma(NULL, 1.0);