Mike, this is the expected behaviour. You say you want to separate in two transforms, and that's ok, you can either use
CMYK -> [GraCol + Gracol] -> CMYK -> [Linearization] or CMYK -> [Gracol + Lab] -> Lab -> [Lab -> GraCol + Linearization] Both are valid, but you cannot use CMYK as middle space in the second way. Also you need Lab identities on both sides. I guess what you really want is an input/output transform first and after that a second transform with the linearization. To create a transform that with only one devicelink you can use cmsCreateTransform(tonalProfile, TYPE_CMYK_8, NULL, TYPE_CMYK_8, 0, 0) Hope this helps Marti Quoting Mike Marcoe <marcoe.m...@gmail.com>: > I have a CMYK->CMYK profile that I've chained with a device link profile to > apply tonal correction to the image. This works as expected. I now want to > separate this into 2 passes and I find that making 2 transforms does not > work. I get an Invalid PCS error from cmsCreateTransform. The PCS is invalid > because it is CMYK and cmsCreateTransform is expecting Lab or XYZ. > > Here is some code that shows the problem. > > int main (int argc, const char * argv[]) { > > LPGAMMATABLE transferFunctions[4]; > > // load a stock CMYK profile (this is distributed with Photoshop but > anyone should do) > cmsHPROFILE hInProfile = cmsOpenProfileFromFile("CoatedGRACoL2006.icc", > "r"); > > // build a linear gamma table (my app doesn't use linear but it doesn't > matter in this example) > const int numberOfEntries = 255; > transferFunctions[0] = cmsBuildGamma(numberOfEntries, 1.0); > transferFunctions[1] = cmsBuildGamma(numberOfEntries, 1.0); > transferFunctions[2] = cmsBuildGamma(numberOfEntries, 1.0); > transferFunctions[3] = cmsBuildGamma(numberOfEntries, 1.0); > > cmsHPROFILE tonalProfile = > cmsCreateLinearizationDeviceLink(icSigCmykData, transferFunctions); > > // build the chain of profile, first xform is CMYK->CMYK, second xform > // is CMYK->CMYK with the above transfer function > cmsHPROFILE profiles[3]; > > profiles[0] = hInProfile; > profiles[1] = hInProfile; > profiles[2] = tonalProfile; > > int intent = INTENT_ABSOLUTE_COLORIMETRIC; > int flags = cmsFLAGS_NOTPRECALC | cmsFLAGS_HIGHRESPRECALC | > cmsFLAGS_NOPRELINEARIZATION; > > // this succeeds > cmsHTRANSFORM chainedTrans = cmsCreateMultiprofileTransform(profiles, 3, > TYPE_CMYK_8, TYPE_CMYK_8, intent, flags); > > // but doing it twice fails. > // The second transform is not built because of an invalid PCS > // > > // passes > cmsHTRANSFORM trans1 = cmsCreateTransform(hInProfile, TYPE_CMYK_8, > hInProfile, TYPE_CMYK_8, intent, flags); > > // fails > cmsHTRANSFORM trans2 = cmsCreateTransform(hInProfile, TYPE_CMYK_8, > tonalProfile, TYPE_CMYK_8, intent, flags); > > } > > How can I separate these steps? Thank you. > ------------------------------------------------------------------------------ Start uncovering the many advantages of virtual appliances and start using them to simplify application deployment and accelerate your shift to cloud computing. http://p.sf.net/sfu/novell-sfdev2dev _______________________________________________ Lcms-user mailing list Lcms-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lcms-user