summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/lcms2.h14
-rw-r--r--src/cmsgamma.c4
-rw-r--r--src/cmstypes.c125
-rw-r--r--testbed/testcms2.c37
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);