170 qWarning() <<
"Profile has a size of 4096, which is suspicious and indicates a possible misuse of QIODevice::read(int), check your code.";
178 cmsGetProfileInfo(
d->
profile, cmsInfoDescription, cmsNoLanguage, cmsNoCountry, buffer,
_BUFFER_SIZE_);
179 d->
name = QString::fromWCharArray(buffer);
185 cmsGetProfileInfo(
d->
profile, cmsInfoManufacturer, cmsNoLanguage, cmsNoCountry, buffer,
_BUFFER_SIZE_);
189 d->
copyright = QString::fromWCharArray(buffer);
191 cmsProfileClassSignature profile_class;
192 profile_class = cmsGetDeviceClass(
d->
profile);
193 d->
valid = ( profile_class != cmsSigNamedColorClass
194 && profile_class != cmsSigLinkClass);
198 cmsCIEXYZ baseMediaWhitePoint;
199 cmsCIEXYZ *mediaWhitePointPtr;
206 if (cmsIsTag(
d->
profile, cmsSigMediaWhitePointTag)
207 && (mediaWhitePointPtr = (cmsCIEXYZ *)cmsReadTag(
d->
profile, cmsSigMediaWhitePointTag))) {
212 whiteComp[0] = std::fabs(baseMediaWhitePoint.X - cmsD50_XYZ()->X) < 0.00001;
213 whiteComp[1] = std::fabs(baseMediaWhitePoint.Y - cmsD50_XYZ()->Y) < 0.00001;
214 whiteComp[2] = std::fabs(baseMediaWhitePoint.Z - cmsD50_XYZ()->Z) < 0.00001;
215 whiteIsD50 = std::all_of(std::begin(whiteComp), std::end(whiteComp), [](
bool b) {
return b;});
219 if (cmsIsTag(
d->
profile, cmsSigChromaticAdaptationTag)
220 && (CAM1 = (cmsCIEXYZ *)cmsReadTag(
d->
profile, cmsSigChromaticAdaptationTag))
226 QGenericMatrix<1, 3, double> whitePointMatrix(d3dummy);
227 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);
231 QTransform invertedDummy = invertDummy.inverted();
233 double d9dummy [9] = {invertedDummy.m11(), invertedDummy.m12(), invertedDummy.m13(),
234 invertedDummy.m21(), invertedDummy.m22(), invertedDummy.m23(),
235 invertedDummy.m31(), invertedDummy.m32(), invertedDummy.m33()
237 QGenericMatrix<3, 3, double> chromaticAdaptionMatrix(d9dummy);
239 QGenericMatrix<1, 3, double> result = chromaticAdaptionMatrix * whitePointMatrix;
249 cmsCIEXYZ *tempColorantsRed, *tempColorantsGreen, *tempColorantsBlue;
252 if (cmsIsTag(
d->
profile, cmsSigRedColorantTag) && cmsIsTag(
d->
profile, cmsSigRedColorantTag) && cmsIsTag(
d->
profile, cmsSigRedColorantTag)
253 && (tempColorantsRed = (cmsCIEXYZ *)cmsReadTag(
d->
profile, cmsSigRedColorantTag))
254 && (tempColorantsGreen = (cmsCIEXYZ *)cmsReadTag(
d->
profile, cmsSigGreenColorantTag))
255 && (tempColorantsBlue = (cmsCIEXYZ *)cmsReadTag(
d->
profile, cmsSigBlueColorantTag))) {
256 cmsCIEXYZTRIPLE tempColorants;
257 tempColorants.Red = *tempColorantsRed;
258 tempColorants.Green = *tempColorantsGreen;
259 tempColorants.Blue = *tempColorantsBlue;
271 if (cmsIsTag(
d->
profile, cmsSigRedTRCTag) && cmsIsTag(
d->
profile, cmsSigBlueTRCTag) && cmsIsTag(
d->
profile, cmsSigGreenTRCTag)) {
273 d->
redTRC = ((cmsToneCurve *)cmsReadTag (
d->
profile, cmsSigRedTRCTag));
286 && cmsIsToneCurveLinear(
d->
redTRC)
288 && cmsIsToneCurveLinear(
d->
blueTRC);
291 }
else if (cmsIsTag(
d->
profile, cmsSigGrayTRCTag)) {
306 if (cmsIsTag(
d->
profile, cmsSigcicpTag)) {
322 if (cmsIsTag(
d->
profile, cmsSigMetaTag)) {
323 dbgPigment <<
"icc profile has dictionary entries";
325 cmsHANDLE dictionary = (cmsHANDLE) cmsReadTag(
d->
profile, cmsSigMetaTag);
326 const cmsDICTentry *entry = cmsDictGetEntryList(dictionary);
328 QString
name = QString::fromWCharArray(entry->Name, -1);
329 QString
value = QString::fromWCharArray(entry->Value, -1);
330 if (
name.toLower() ==
"crwl") {
337 dbgPigment << entry->DisplayName << entry->DisplayValue;
338 entry = cmsDictNextEntry(entry);
720 cmsToneCurve *mainCurve;
723 cmsFloat64Number srgb_parameters[5] =
724 { 2.4, 1.0 / 1.055, 0.055 / 1.055, 1.0 / 12.92, 0.04045 };
725 cmsFloat64Number rec709_parameters[5] =
726 { 1.0 / 0.45, 1.0 / 1.099, 0.099 / 1.099, 1.0 / 4.5, 0.081 };
729 cmsFloat64Number rec202012bit_parameters[5] =
730 { 1.0 / 0.45, 1.0 / 1.0993, 0.0993 / 1.0993, 1.0 / 4.5, 0.0812 };
732 cmsFloat64Number SMPTE_240M_parameters[5] =
733 { 1.0 / 0.45, 1.0 / 1.1115, 0.1115 / 1.1115, 1.0 / 4.0, 0.0913 };
735 cmsFloat64Number prophoto_parameters[5] =
736 { 1.8, 1.0, 0, 1.0 / 16, (16.0/512) };
738 cmsFloat64Number log_100[5] = {1.0, 10, 2.0, -2.0, 0.0};
739 cmsFloat64Number log_100_sqrt[5] = {1.0, 10, 2.5, -2.5, 0.0};
741 cmsFloat64Number labl_parameters[5] = {3.0, 0.862076, 0.137924, 0.110703, 0.080002};
748 qWarning() <<
"Neither IEC 61966 2-4 nor Bt. 1361 are supported, returning a rec 709 curve.";
753 mainCurve = cmsBuildParametricToneCurve(NULL, 4, rec709_parameters);
756 mainCurve = cmsBuildParametricToneCurve(NULL, 4, rec202012bit_parameters);
759 mainCurve = cmsBuildGamma(NULL, 2.2);
762 mainCurve = cmsBuildGamma(NULL, 2.8);
765 mainCurve = cmsBuildParametricToneCurve(NULL, 4, SMPTE_240M_parameters);
768 mainCurve = cmsBuildParametricToneCurve(NULL, 4, srgb_parameters);
771 mainCurve = cmsBuildParametricToneCurve(NULL, 8, log_100);
774 mainCurve = cmsBuildParametricToneCurve(NULL, 8, log_100_sqrt);
778 mainCurve = cmsBuildGamma(NULL, 563.0 / 256.0);
781 mainCurve = cmsBuildParametricToneCurve(NULL, 4, prophoto_parameters);
784 mainCurve = cmsBuildGamma(NULL, 1.8);
787 mainCurve = cmsBuildGamma(NULL, 2.4);
790 mainCurve = cmsBuildParametricToneCurve(NULL, 4, labl_parameters);
799 qWarning() <<
"Cannot generate an icc profile with this transfer function, will generate a linear profile";
803 mainCurve = cmsBuildGamma(NULL, 1.0);