## Re: [Lcms-user] Building a profile with a Rec 709 transfer curve

 Re: [Lcms-user] Building a profile with a Rec 709 transfer curve From: Marti Maria - 2013-01-07 17:57:06 ```Hi Richard, Back from holidays. I realize this message is quite old, so I apologize... Ok, There was a reason to limit the tone curve plug-in and disallow the file IO. It happens that the file format is defined by the ICC (and only by the ICC!), so any addition made by anyone else would turn the profile in not compliant, and I'm afraid many CCM will just discard it. So the plug-in feature allows you to create new tone curves and play with those tone curves in pipelines, evaluators, etc. but keeping in mind this is only for data handling and not to be saved as a profile. An example would be to create a special tone curve for a profiler to be used to compute LUT points, the points then are meant be saved as a CLUT in the final profile but the math curve is not. But anyway, I think there is a clean way to do what you wish, and this needs only a few math. It seems to me the issue comes because parametric 5 is in the form (a*x)^g and you need a*(x)^g But nothing prevents you to compute a new a' instead a'=a^(1/g) See below the parameters disposition params[0] = 0.45; /* y */ params[1] = pow(1.099, 1.0 / 0.45); /* a' */ params[2] = 0.0; /* b */ params[3] = 4.5; /* c */ params[4] = 0.018; /* d */ params[5] = -0.099; /* e */ params[6] = 0.0; /* f */ I've checked this against the "normal" Rec709, and it works at 16 bits precision. See the testing code below. Sorry again for the delay Regards Marti ----- static double Rec709(double L) { if (L <0.018) return 4.5*L; else { double a = 1.099* pow(L, 0.45); a = a - 0.099; return a; } } static cmsInt32Number CheckParametricRec709(void) { cmsFloat64Number params[7]; cmsToneCurve* t; int i; params[0] = 0.45; /* y */ params[1] = pow(1.099, 1.0 / 0.45); /* a */ params[2] = 0.0; /* b */ params[3] = 4.5; /* c */ params[4] = 0.018; /* d */ params[5] = -0.099; /* e */ params[6] = 0.0; /* f */ t = cmsBuildParametricToneCurve (NULL, 5, params); for (i=0; i < 256; i++) { cmsUInt16Number f1 = floor(255.0*cmsEvalToneCurveFloat(t, i / 255.0) + 0.5); cmsUInt16Number f2 = floor(255.0*Rec709((double) i / 255.0) + 0.5); if (f1 != f2) { return 0; } } return 1; } ```