QByteArray LcmsColorProfileContainer::createFromChromacities(const KoRGBChromaticities& _chromacities, qreal gamma, QString _profileName) { cmsCIExyYTRIPLE primaries; cmsCIExyY whitePoint; lcmsToPigmentViceVersaStructureCopy(primaries.Red, _chromacities.primaries.Red); lcmsToPigmentViceVersaStructureCopy(primaries.Green, _chromacities.primaries.Green); lcmsToPigmentViceVersaStructureCopy(primaries.Blue, _chromacities.primaries.Blue); lcmsToPigmentViceVersaStructureCopy(whitePoint, _chromacities.whitePoint); cmsToneCurve* gammaTable = cmsBuildGamma(0, gamma); const int numTransferFunctions = 3; cmsToneCurve* transferFunctions[numTransferFunctions]; for (int i = 0; i < numTransferFunctions; ++i) { transferFunctions[i] = gammaTable; } cmsHPROFILE profile = cmsCreateRGBProfile(&whitePoint, &primaries, transferFunctions); QString name = _profileName; if (name.isEmpty()) { name = QString("lcms virtual RGB profile - R(%1, %2) G(%3, %4) B(%5, %6) W(%7, %8) gamma %9") .arg(primaries.Red.x) .arg(primaries.Red.y) .arg(primaries.Green.x) .arg(primaries.Green.y) .arg(primaries.Blue.x) .arg(primaries.Blue.y) .arg(whitePoint.x) .arg(whitePoint.y) .arg(gamma); } // icSigProfileDescriptionTag is the compulsory tag and is the profile name // displayed by other applications. cmsWriteTag(profile, cmsSigProfileDescriptionTag, name.toLatin1().data()); cmsWriteTag(profile, cmsSigDeviceModelDescTag, name.toLatin1().data()); // Clear the default manufacturer's tag that is set to "(lcms internal)" QByteArray ba(""); cmsWriteTag(profile, cmsSigDeviceMfgDescTag, ba.data()); cmsFreeToneCurve(gammaTable); QByteArray profileArray = lcmsProfileToByteArray(profile); cmsCloseProfile(profile); return profileArray; }
static KoCIExyY RGB2xyY(cmsHPROFILE RGBProfile, qreal red, qreal green, qreal blue) { cmsHPROFILE XYZProfile = cmsCreateXYZProfile(); const cmsUInt32Number inputFormat = TYPE_RGB_DBL; const cmsUInt32Number outputFormat = TYPE_XYZ_DBL; const cmsUInt32Number transformFlags = cmsFLAGS_LOWRESPRECALC; cmsHTRANSFORM transform = cmsCreateTransform(RGBProfile, inputFormat, XYZProfile, outputFormat, INTENT_ABSOLUTE_COLORIMETRIC, transformFlags); struct XYZPixel { qreal X; qreal Y; qreal Z; }; struct RGBPixel { qreal red; qreal green; qreal blue; }; XYZPixel xyzPixel; RGBPixel rgbPixel; rgbPixel.red = red; rgbPixel.green = green; rgbPixel.blue = blue; const unsigned int numPixelsToTransform = 1; cmsDoTransform(transform, &rgbPixel, &xyzPixel, numPixelsToTransform); cmsCIEXYZ xyzPixelXYZ; xyzPixelXYZ.X = xyzPixel.X; xyzPixelXYZ.Y = xyzPixel.Y; xyzPixelXYZ.Z = xyzPixel.Z; cmsCIExyY xyzPixelxyY; cmsXYZ2xyY(&xyzPixelxyY, &xyzPixelXYZ); cmsDeleteTransform(transform); cmsCloseProfile(XYZProfile); KoCIExyY res; lcmsToPigmentViceVersaStructureCopy(res, xyzPixelxyY); return res; }