diff options
author | Marti Maria <info@littlecms.com> | 2013-06-14 15:20:53 +0200 |
---|---|---|
committer | Marti Maria <info@littlecms.com> | 2013-06-14 15:20:53 +0200 |
commit | e5ce12948f89f45f8a7cff157423669ec2ec8279 (patch) | |
tree | 16d40f6d9c17eb2266d331c0d40009fd9a6c7569 /src | |
parent | 1b5e2fdae7f8094c0e625733438e2e92d10a0b3b (diff) | |
download | lcms2-e5ce12948f89f45f8a7cff157423669ec2ec8279.tar.gz |
Added white point on transform2devicelink
Diffstat (limited to 'src')
-rw-r--r-- | src/cmscgats.c | 2 | ||||
-rw-r--r-- | src/cmsintrp.c | 1 | ||||
-rw-r--r-- | src/cmsnamed.c | 3 | ||||
-rw-r--r-- | src/cmspcs.c | 4 | ||||
-rw-r--r-- | src/cmsvirt.c | 15 | ||||
-rw-r--r-- | src/cmsxform.c | 20 | ||||
-rw-r--r-- | src/lcms2_internal.h | 4 |
7 files changed, 42 insertions, 7 deletions
diff --git a/src/cmscgats.c b/src/cmscgats.c index 76d4df3..53730e9 100644 --- a/src/cmscgats.c +++ b/src/cmscgats.c @@ -2766,7 +2766,7 @@ void CMSEXPORT cmsIT8DefineDblFormat(cmsHANDLE hIT8, const char* Formatter) if (Formatter == NULL) strcpy(it8->DoubleFormatter, DEFAULT_DBL_FORMAT); else - strcpy(it8->DoubleFormatter, Formatter); + strncpy(it8->DoubleFormatter, Formatter, sizeof(it8->DoubleFormatter)); it8 ->DoubleFormatter[sizeof(it8 ->DoubleFormatter)-1] = 0; } diff --git a/src/cmsintrp.c b/src/cmsintrp.c index 3e81805..ea33cc6 100644 --- a/src/cmsintrp.c +++ b/src/cmsintrp.c @@ -54,7 +54,6 @@ cmsBool _cmsRegisterInterpPlugin(cmsPluginBase* Data) // Set the interpolation method - cmsBool _cmsSetInterpolationRoutine(cmsInterpParams* p) { // Invoke factory, possibly in the Plug-in diff --git a/src/cmsnamed.c b/src/cmsnamed.c index f374367..a916e17 100644 --- a/src/cmsnamed.c +++ b/src/cmsnamed.c @@ -887,7 +887,6 @@ cmsHANDLE CMSEXPORT cmsDictDup(cmsHANDLE hDict) { _cmsDICT* old_dict = (_cmsDICT*) hDict; cmsHANDLE hNew; - _cmsDICT* new_dict; cmsDICTentry *entry; _cmsAssert(old_dict != NULL); @@ -895,8 +894,6 @@ cmsHANDLE CMSEXPORT cmsDictDup(cmsHANDLE hDict) hNew = cmsDictAlloc(old_dict ->ContextID); if (hNew == NULL) return NULL; - new_dict = (_cmsDICT*) hNew; - // Walk the list freeing all nodes entry = old_dict ->head; while (entry != NULL) { diff --git a/src/cmspcs.c b/src/cmspcs.c index d20e6e6..102cd7d 100644 --- a/src/cmspcs.c +++ b/src/cmspcs.c @@ -869,9 +869,11 @@ cmsUInt32Number CMSEXPORT cmsChannelsOf(cmsColorSpaceSignature ColorSpace) { switch (ColorSpace) { + case cmsSigMCH1Data: case cmsSig1colorData: case cmsSigGrayData: return 1; + case cmsSigMCH2Data: case cmsSig2colorData: return 2; case cmsSigXYZData: @@ -883,10 +885,12 @@ cmsUInt32Number CMSEXPORT cmsChannelsOf(cmsColorSpaceSignature ColorSpace) case cmsSigHsvData: case cmsSigHlsData: case cmsSigCmyData: + case cmsSigMCH3Data: case cmsSig3colorData: return 3; case cmsSigLuvKData: case cmsSigCmykData: + case cmsSigMCH4Data: case cmsSig4colorData: return 4; case cmsSigMCH5Data: diff --git a/src/cmsvirt.c b/src/cmsvirt.c index 87184f9..953377a 100644 --- a/src/cmsvirt.c +++ b/src/cmsvirt.c @@ -1053,6 +1053,7 @@ cmsHPROFILE CMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, cmsFloat cmsContext ContextID = cmsGetTransformContextID(hTransform); const cmsAllowedLUT* AllowedLUT; cmsTagSignature DestinationTag; + cmsProfileClassSignature deviceClass; _cmsAssert(hTransform != NULL); @@ -1104,8 +1105,9 @@ cmsHPROFILE CMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, cmsFloat FrmIn = COLORSPACE_SH(ColorSpaceBitsIn) | CHANNELS_SH(ChansIn)|BYTES_SH(2); FrmOut = COLORSPACE_SH(ColorSpaceBitsOut) | CHANNELS_SH(ChansOut)|BYTES_SH(2); + deviceClass = cmsGetDeviceClass(hProfile); - if (cmsGetDeviceClass(hProfile) == cmsSigOutputClass) + if (deviceClass == cmsSigOutputClass) DestinationTag = cmsSigBToA0Tag; else DestinationTag = cmsSigAToB0Tag; @@ -1166,10 +1168,19 @@ cmsHPROFILE CMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, cmsFloat if (!cmsWriteTag(hProfile, cmsSigColorantTableOutTag, xform->OutputColorant)) goto Error; } - if (xform ->Sequence != NULL) { + if ((deviceClass == cmsSigLinkClass) && (xform ->Sequence != NULL)) { if (!_cmsWriteProfileSequence(hProfile, xform ->Sequence)) goto Error; } + // Set the white point + if (deviceClass == cmsSigInputClass) { + if (!cmsWriteTag(hProfile, cmsSigMediaWhitePointTag, &xform ->EntryWhitePoint)) goto Error; + } + else { + if (!cmsWriteTag(hProfile, cmsSigMediaWhitePointTag, &xform ->ExitWhitePoint)) goto Error; + } + + // Per 7.2.15 in spec 4.3 cmsSetHeaderRenderingIntent(hProfile, xform ->RenderingIntent); diff --git a/src/cmsxform.c b/src/cmsxform.c index 02a9f3c..37a21b3 100644 --- a/src/cmsxform.c +++ b/src/cmsxform.c @@ -622,6 +622,22 @@ cmsBool IsProperColorSpace(cmsColorSpaceSignature Check, cmsUInt32Number dwForm // ---------------------------------------------------------------------------------------------------------------- +static +void SetWhitePoint(cmsCIEXYZ* wtPt, const cmsCIEXYZ* src) +{ + if (src == NULL) { + wtPt ->X = cmsD50X; + wtPt ->Y = cmsD50Y; + wtPt ->Z = cmsD50Z; + } + else { + wtPt ->X = src->X; + wtPt ->Y = src->Y; + wtPt ->Z = src->Z; + } + +} + // New to lcms 2.0 -- have all parameters available. cmsHTRANSFORM CMSEXPORT cmsCreateExtendedTransform(cmsContext ContextID, cmsUInt32Number nProfiles, cmsHPROFILE hProfiles[], @@ -698,6 +714,10 @@ cmsHTRANSFORM CMSEXPORT cmsCreateExtendedTransform(cmsContext ContextID, xform ->ExitColorSpace = ExitColorSpace; xform ->RenderingIntent = Intents[nProfiles-1]; + // Take white points + SetWhitePoint(&xform->EntryWhitePoint, (cmsCIEXYZ*) cmsReadTag(hProfiles[0], cmsSigMediaWhitePointTag)); + SetWhitePoint(&xform->ExitWhitePoint, (cmsCIEXYZ*) cmsReadTag(hProfiles[nProfiles-1], cmsSigMediaWhitePointTag)); + // Create a gamut check LUT if requested if (hGamutProfile != NULL && (dwFlags & cmsFLAGS_GAMUTCHECK)) diff --git a/src/lcms2_internal.h b/src/lcms2_internal.h index 31ee61c..d6300df 100644 --- a/src/lcms2_internal.h +++ b/src/lcms2_internal.h @@ -558,6 +558,10 @@ typedef struct _cmstransform_struct { cmsColorSpaceSignature EntryColorSpace; cmsColorSpaceSignature ExitColorSpace; + // White points (informative only) + cmsCIEXYZ EntryWhitePoint; + cmsCIEXYZ ExitWhitePoint; + // Profiles used to create the transform cmsSEQ* Sequence; |