168 qWarning() <<
"Profile has a size of 4096, which is suspicious and indicates a possible misuse of QIODevice::read(int), check your code.";
176 cmsGetProfileInfo(
d->
profile, cmsInfoDescription, cmsNoLanguage, cmsNoCountry, buffer,
_BUFFER_SIZE_);
177 d->
name = QString::fromWCharArray(buffer);
183 cmsGetProfileInfo(
d->
profile, cmsInfoManufacturer, cmsNoLanguage, cmsNoCountry, buffer,
_BUFFER_SIZE_);
187 d->
copyright = QString::fromWCharArray(buffer);
189 cmsProfileClassSignature profile_class;
190 profile_class = cmsGetDeviceClass(
d->
profile);
191 d->
valid = ( profile_class != cmsSigNamedColorClass
192 && profile_class != cmsSigLinkClass);
196 cmsCIEXYZ baseMediaWhitePoint;
197 cmsCIEXYZ *mediaWhitePointPtr;
204 if (cmsIsTag(
d->
profile, cmsSigMediaWhitePointTag)
205 && (mediaWhitePointPtr = (cmsCIEXYZ *)cmsReadTag(
d->
profile, cmsSigMediaWhitePointTag))) {
210 whiteComp[0] = std::fabs(baseMediaWhitePoint.X - cmsD50_XYZ()->X) < 0.00001;
211 whiteComp[1] = std::fabs(baseMediaWhitePoint.Y - cmsD50_XYZ()->Y) < 0.00001;
212 whiteComp[2] = std::fabs(baseMediaWhitePoint.Z - cmsD50_XYZ()->Z) < 0.00001;
213 whiteIsD50 = std::all_of(std::begin(whiteComp), std::end(whiteComp), [](
bool b) {
return b;});
217 if (cmsIsTag(
d->
profile, cmsSigChromaticAdaptationTag)
218 && (CAM1 = (cmsCIEXYZ *)cmsReadTag(
d->
profile, cmsSigChromaticAdaptationTag))
224 QGenericMatrix<1, 3, double> whitePointMatrix(d3dummy);
225 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);
229 QTransform invertedDummy = invertDummy.inverted();
231 double d9dummy [9] = {invertedDummy.m11(), invertedDummy.m12(), invertedDummy.m13(),
232 invertedDummy.m21(), invertedDummy.m22(), invertedDummy.m23(),
233 invertedDummy.m31(), invertedDummy.m32(), invertedDummy.m33()
235 QGenericMatrix<3, 3, double> chromaticAdaptionMatrix(d9dummy);
237 QGenericMatrix<1, 3, double> result = chromaticAdaptionMatrix * whitePointMatrix;
247 cmsCIEXYZ *tempColorantsRed, *tempColorantsGreen, *tempColorantsBlue;
250 if (cmsIsTag(
d->
profile, cmsSigRedColorantTag) && cmsIsTag(
d->
profile, cmsSigRedColorantTag) && cmsIsTag(
d->
profile, cmsSigRedColorantTag)
251 && (tempColorantsRed = (cmsCIEXYZ *)cmsReadTag(
d->
profile, cmsSigRedColorantTag))
252 && (tempColorantsGreen = (cmsCIEXYZ *)cmsReadTag(
d->
profile, cmsSigGreenColorantTag))
253 && (tempColorantsBlue = (cmsCIEXYZ *)cmsReadTag(
d->
profile, cmsSigBlueColorantTag))) {
254 cmsCIEXYZTRIPLE tempColorants;
255 tempColorants.Red = *tempColorantsRed;
256 tempColorants.Green = *tempColorantsGreen;
257 tempColorants.Blue = *tempColorantsBlue;
269 if (cmsIsTag(
d->
profile, cmsSigRedTRCTag) && cmsIsTag(
d->
profile, cmsSigBlueTRCTag) && cmsIsTag(
d->
profile, cmsSigGreenTRCTag)) {
271 d->
redTRC = ((cmsToneCurve *)cmsReadTag (
d->
profile, cmsSigRedTRCTag));
284 && cmsIsToneCurveLinear(
d->
redTRC)
286 && cmsIsToneCurveLinear(
d->
blueTRC);
289 }
else if (cmsIsTag(
d->
profile, cmsSigGrayTRCTag)) {
304 if (cmsIsTag(
d->
profile, cmsSigcicpTag)) {
320 if (cmsIsTag(
d->
profile, cmsSigMetaTag)) {
321 dbgPigment <<
"icc profile has dictionary entries";
323 cmsHANDLE dictionary = (cmsHANDLE) cmsReadTag(
d->
profile, cmsSigMetaTag);
324 const cmsDICTentry *entry = cmsDictGetEntryList(dictionary);
326 dbgPigment << QString::fromWCharArray(entry->Name, -1) << QString::fromWCharArray(entry->Value, -1);;
327 dbgPigment << entry->DisplayName << entry->DisplayValue;
328 entry = cmsDictNextEntry(entry);
705 cmsToneCurve *mainCurve;
708 cmsFloat64Number srgb_parameters[5] =
709 { 2.4, 1.0 / 1.055, 0.055 / 1.055, 1.0 / 12.92, 0.04045 };
710 cmsFloat64Number rec709_parameters[5] =
711 { 1.0 / 0.45, 1.0 / 1.099, 0.099 / 1.099, 1.0 / 4.5, 0.081 };
714 cmsFloat64Number rec202012bit_parameters[5] =
715 { 1.0 / 0.45, 1.0 / 1.0993, 0.0993 / 1.0993, 1.0 / 4.5, 0.0812 };
717 cmsFloat64Number SMPTE_240M_parameters[5] =
718 { 1.0 / 0.45, 1.0 / 1.1115, 0.1115 / 1.1115, 1.0 / 4.0, 0.0913 };
720 cmsFloat64Number prophoto_parameters[5] =
721 { 1.8, 1.0, 0, 1.0 / 16, (16.0/512) };
723 cmsFloat64Number log_100[5] = {1.0, 10, 2.0, -2.0, 0.0};
724 cmsFloat64Number log_100_sqrt[5] = {1.0, 10, 2.5, -2.5, 0.0};
726 cmsFloat64Number labl_parameters[5] = {3.0, 0.862076, 0.137924, 0.110703, 0.080002};
733 qWarning() <<
"Neither IEC 61966 2-4 nor Bt. 1361 are supported, returning a rec 709 curve.";
738 mainCurve = cmsBuildParametricToneCurve(NULL, 4, rec709_parameters);
741 mainCurve = cmsBuildParametricToneCurve(NULL, 4, rec202012bit_parameters);
744 mainCurve = cmsBuildGamma(NULL, 2.2);
747 mainCurve = cmsBuildGamma(NULL, 2.8);
750 mainCurve = cmsBuildParametricToneCurve(NULL, 4, SMPTE_240M_parameters);
753 mainCurve = cmsBuildParametricToneCurve(NULL, 4, srgb_parameters);
756 mainCurve = cmsBuildParametricToneCurve(NULL, 8, log_100);
759 mainCurve = cmsBuildParametricToneCurve(NULL, 8, log_100_sqrt);
763 mainCurve = cmsBuildGamma(NULL, 563.0 / 256.0);
766 mainCurve = cmsBuildParametricToneCurve(NULL, 4, prophoto_parameters);
769 mainCurve = cmsBuildGamma(NULL, 1.8);
772 mainCurve = cmsBuildGamma(NULL, 2.4);
775 mainCurve = cmsBuildParametricToneCurve(NULL, 4, labl_parameters);
784 qWarning() <<
"Cannot generate an icc profile with this transfer function, will generate a linear profile";
788 mainCurve = cmsBuildGamma(NULL, 1.0);