diff options
author | Marti Maria <marti.maria@littlecms.com> | 2022-06-30 20:16:29 +0200 |
---|---|---|
committer | Marti Maria <marti.maria@littlecms.com> | 2022-06-30 20:16:29 +0200 |
commit | c05f3f0c8ddab4bd0685cf82a41c30305fa3f662 (patch) | |
tree | eec6316a3a7e8f68913ce5cd42938b19e0b24338 | |
parent | c3726d290e246b8ee48de8be51edf4df31281788 (diff) | |
download | lcms2-c05f3f0c8ddab4bd0685cf82a41c30305fa3f662.tar.gz |
support for spec 4.4
With this commit lcms2 now supports ICC spec 4.4
-rw-r--r-- | include/lcms2.h | 14 | ||||
-rw-r--r-- | src/cmsgamma.c | 4 | ||||
-rw-r--r-- | src/cmstypes.c | 125 | ||||
-rw-r--r-- | testbed/testcms2.c | 37 |
4 files changed, 145 insertions, 35 deletions
diff --git a/include/lcms2.h b/include/lcms2.h index 8e4dd39..dca4f64 100644 --- a/include/lcms2.h +++ b/include/lcms2.h @@ -23,7 +23,7 @@ // //--------------------------------------------------------------------------------- // -// Version 2.14 alpha +// Version 2.14 alpha2 // #ifndef _lcms2_H @@ -290,6 +290,7 @@ typedef int cmsBool; // Base ICC type definitions typedef enum { cmsSigChromaticityType = 0x6368726D, // 'chrm' + cmsSigcicpType = 0x63696370, // 'cicp' cmsSigColorantOrderType = 0x636C726F, // 'clro' cmsSigColorantTableType = 0x636C7274, // 'clrt' cmsSigCrdInfoType = 0x63726469, // 'crdi' @@ -401,6 +402,7 @@ typedef enum { cmsSigViewingConditionsTag = 0x76696577, // 'view' cmsSigVcgtTag = 0x76636774, // 'vcgt' cmsSigMetaTag = 0x6D657461, // 'meta' + cmsSigcicpTag = 0x63696370, // 'cicp' cmsSigArgyllArtsTag = 0x61727473 // 'arts' } cmsTagSignature; @@ -1038,6 +1040,16 @@ typedef struct { } cmsICCViewingConditions; +typedef struct { + cmsUInt8Number ColourPrimaries; // Recommendation ITU-T H.273 + cmsUInt8Number TransferCharacteristics; // (ISO/IEC 23091-2) + cmsUInt8Number MatrixCoefficients; + cmsUInt8Number VideoFullRangeFlag; + +} cmsVideoSignalType; + + + // Get LittleCMS version (for shared objects) ----------------------------------------------------------------------------- CMSAPI int CMSEXPORT cmsGetEncodedCMMversion(void); diff --git a/src/cmsgamma.c b/src/cmsgamma.c index 1c4a223..dd97dd4 100644 --- a/src/cmsgamma.c +++ b/src/cmsgamma.c @@ -427,8 +427,8 @@ cmsFloat64Number DefaultEvalParametricFn(cmsInt32Number Type, const cmsFloat64Nu // IEC 61966-3 - // Y = (aX + b)^Gamma | X <= -b/a - // Y = c | else + // Y = (aX + b)^Gamma + c | X <= -b/a + // Y = c | else case 3: { if (fabs(Params[1]) < MATRIX_DET_TOLERANCE) diff --git a/src/cmstypes.c b/src/cmstypes.c index 9af487d..1c9a156 100644 --- a/src/cmstypes.c +++ b/src/cmstypes.c @@ -1425,9 +1425,9 @@ void *Type_Measurement_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* { cmsICCMeasurementConditions mc; - + memset(&mc, 0, sizeof(mc)); - + if (!_cmsReadUInt32Number(io, &mc.Observer)) return NULL; if (!_cmsReadXYZNumber(io, &mc.Backing)) return NULL; if (!_cmsReadUInt32Number(io, &mc.Geometry)) return NULL; @@ -1951,13 +1951,13 @@ cmsBool Type_LUT8_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, if (MatMPE != NULL) { - for (i = 0; i < 9; i++) - { - if (!_cmsWrite15Fixed16Number(io, MatMPE->Double[i])) return FALSE; - } + for (i = 0; i < 9; i++) + { + if (!_cmsWrite15Fixed16Number(io, MatMPE->Double[i])) return FALSE; + } } else { - + if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; @@ -2234,17 +2234,17 @@ cmsBool Type_LUT16_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) OutputChannels)) return FALSE; if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) clutPoints)) return FALSE; if (!_cmsWriteUInt8Number(io, 0)) return FALSE; // Padding - + if (MatMPE != NULL) { - for (i = 0; i < 9; i++) - { - if (!_cmsWrite15Fixed16Number(io, MatMPE->Double[i])) return FALSE; - } + for (i = 0; i < 9; i++) + { + if (!_cmsWrite15Fixed16Number(io, MatMPE->Double[i])) return FALSE; + } } else { - + if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; @@ -2586,31 +2586,31 @@ Error: static cmsBool WriteMatrix(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsStage* mpe) { - cmsUInt32Number i, n; + cmsUInt32Number i, n; _cmsStageMatrixData* m = (_cmsStageMatrixData*) mpe -> Data; - n = mpe->InputChannels * mpe->OutputChannels; + n = mpe->InputChannels * mpe->OutputChannels; - // Write the Matrix - for (i = 0; i < n; i++) - { - if (!_cmsWrite15Fixed16Number(io, m->Double[i])) return FALSE; - } + // Write the Matrix + for (i = 0; i < n; i++) + { + if (!_cmsWrite15Fixed16Number(io, m->Double[i])) return FALSE; + } - if (m->Offset != NULL) { + if (m->Offset != NULL) { - for (i = 0; i < mpe->OutputChannels; i++) - { - if (!_cmsWrite15Fixed16Number(io, m->Offset[i])) return FALSE; - } - } - else { - for (i = 0; i < mpe->OutputChannels; i++) - { - if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; - } - } + for (i = 0; i < mpe->OutputChannels; i++) + { + if (!_cmsWrite15Fixed16Number(io, m->Offset[i])) return FALSE; + } + } + else { + for (i = 0; i < mpe->OutputChannels; i++) + { + if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; + } + } return TRUE; @@ -5383,6 +5383,64 @@ void Type_Dictionary_Free(struct _cms_typehandler_struct* self, void* Ptr) cmsUNUSED_PARAMETER(self); } +// cicp VideoSignalType + +static +void* Type_VideoSignal_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsVideoSignalType* cicp = NULL; + + if (SizeOfTag != 8) return NULL; + + if (!_cmsReadUInt32Number(io, NULL)) return NULL; + + cicp = (cmsVideoSignalType*)_cmsCalloc(self->ContextID, 1, sizeof(cmsVideoSignalType)); + if (cicp == NULL) return NULL; + + if (!_cmsReadUInt8Number(io, &cicp->ColourPrimaries)) goto Error; + if (!_cmsReadUInt8Number(io, &cicp->TransferCharacteristics)) goto Error; + if (!_cmsReadUInt8Number(io, &cicp->MatrixCoefficients)) goto Error; + if (!_cmsReadUInt8Number(io, &cicp->VideoFullRangeFlag)) goto Error; + + // Success + *nItems = 1; + return cicp; + +Error: + if (cicp != NULL) _cmsFree(self->ContextID, cicp); + return NULL; +} + +static +cmsBool Type_VideoSignal_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsVideoSignalType* cicp = (cmsVideoSignalType*)Ptr; + + if (!_cmsWriteUInt32Number(io, 0)) return FALSE; + if (!_cmsWriteUInt8Number(io, cicp->ColourPrimaries)) return FALSE; + if (!_cmsWriteUInt8Number(io, cicp->TransferCharacteristics)) return FALSE; + if (!_cmsWriteUInt8Number(io, cicp->MatrixCoefficients)) return FALSE; + if (!_cmsWriteUInt8Number(io, cicp->VideoFullRangeFlag)) return FALSE; + + return TRUE; + + cmsUNUSED_PARAMETER(self); + cmsUNUSED_PARAMETER(nItems); +} + +void* Type_VideoSignal_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n) +{ + return _cmsDupMem(self->ContextID, Ptr, sizeof(cmsVideoSignalType)); + + cmsUNUSED_PARAMETER(n); +} + + +static +void Type_VideoSignal_Free(struct _cms_typehandler_struct* self, void* Ptr) +{ + _cmsFree(self->ContextID, Ptr); +} // ******************************************************************************** // Type support main routines @@ -5422,6 +5480,7 @@ static const _cmsTagTypeLinkedList SupportedTagTypes[] = { {TYPE_HANDLER(cmsMonacoBrokenCurveType, Curve), (_cmsTagTypeLinkedList*) &SupportedTagTypes[28] }, {TYPE_HANDLER(cmsSigProfileSequenceIdType, ProfileSequenceId), (_cmsTagTypeLinkedList*) &SupportedTagTypes[29] }, {TYPE_HANDLER(cmsSigDictType, Dictionary), (_cmsTagTypeLinkedList*) &SupportedTagTypes[30] }, +{TYPE_HANDLER(cmsSigcicpType, VideoSignal), (_cmsTagTypeLinkedList*) &SupportedTagTypes[31] }, {TYPE_HANDLER(cmsSigVcgtType, vcgt), NULL } }; @@ -5616,6 +5675,8 @@ static _cmsTagLinkedList SupportedTags[] = { { cmsSigProfileSequenceIdTag, { 1, 1, { cmsSigProfileSequenceIdType}, NULL }, &SupportedTags[62]}, { cmsSigProfileDescriptionMLTag,{ 1, 1, { cmsSigMultiLocalizedUnicodeType}, NULL}, &SupportedTags[63]}, + { cmsSigcicpTag, { 1, 1, { cmsSigcicpType}, NULL }, &SupportedTags[64]}, + { cmsSigArgyllArtsTag, { 9, 1, { cmsSigS15Fixed16ArrayType}, NULL}, NULL} }; diff --git a/testbed/testcms2.c b/testbed/testcms2.c index 717b1c9..9129589 100644 --- a/testbed/testcms2.c +++ b/testbed/testcms2.c @@ -5312,6 +5312,40 @@ cmsInt32Number CheckRAWtags(cmsInt32Number Pass, cmsHPROFILE hProfile) } + +static +cmsInt32Number Check_cicp(cmsInt32Number Pass, cmsHPROFILE hProfile) +{ + cmsVideoSignalType* v; + cmsVideoSignalType s; + + switch (Pass) { + + case 1: + s.ColourPrimaries = 1; + s.TransferCharacteristics = 13; + s.MatrixCoefficients = 0; + s.VideoFullRangeFlag = 1; + + if (!cmsWriteTag(hProfile, cmsSigcicpTag, &s)) return 0; + return 1; + + case 2: + v = (cmsVideoSignalType*)cmsReadTag(hProfile, cmsSigcicpTag); + if (v == NULL) return 0; + + if (v->ColourPrimaries != 1) return 0; + if (v->TransferCharacteristics != 13) return 0; + if (v->MatrixCoefficients != 0) return 0; + if (v->VideoFullRangeFlag != 1) return 0; + return 1; + + default: + return 0; + } + +} + // This is a very big test that checks every single tag static cmsInt32Number CheckProfileCreation(void) @@ -5457,6 +5491,9 @@ cmsInt32Number CheckProfileCreation(void) // if (!CheckDictionary16(Pass, h)) goto Error; if (!CheckDictionary24(Pass, h)) goto Error; + SubTest("cicp Video Signal Type"); + if (!Check_cicp(Pass, h)) goto Error; + if (Pass == 1) { cmsSaveProfileToFile(h, "alltags.icc"); cmsCloseProfile(h); |