diff options
author | Marti Maria <info@littlecms.com> | 2010-06-02 16:46:18 +0200 |
---|---|---|
committer | Marti Maria <info@littlecms.com> | 2010-06-02 16:46:18 +0200 |
commit | 7f7f41003b20651193b04c743a7d1612d657d18a (patch) | |
tree | 4077be6d58ef435cbdece95037d9aa146a932399 | |
parent | 6d987ca7970b1d8187153477390aee9c7ef42e69 (diff) | |
download | lcms2-7f7f41003b20651193b04c743a7d1612d657d18a.tar.gz |
Fixed mluc handling on platforms where sizeof(wchar_t) != 2
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | src/cmslut.c | 5 | ||||
-rw-r--r-- | src/cmstypes.c | 148 |
3 files changed, 94 insertions, 64 deletions
@@ -1,6 +1,7 @@ -Major version bump -------------------- +2.0 Major version bump +----------------------- Fixed a bug on V2 CHAD construction, affects absolute colorimetric intent Fixed a bug that prevented linkicc to work Fixed a bug on transicc that made profiles with output colorants info to malfunction +Fixed a bug on Lab + Alpha float formatters, added such predefined formatters as well diff --git a/src/cmslut.c b/src/cmslut.c index 473d7cf..289b0a3 100644 --- a/src/cmslut.c +++ b/src/cmslut.c @@ -1171,9 +1171,8 @@ cmsPipeline* CMSEXPORT cmsPipelineAlloc(cmsContext ContextID, cmsUInt32Number In NewLUT ->EvalFloatFn = _LUTevalFloat; NewLUT ->DupDataFn = NULL; NewLUT ->FreeDataFn = NULL; - NewLUT ->Data = NewLUT; - - NewLUT ->ContextID = ContextID; + NewLUT ->Data = NewLUT; + NewLUT ->ContextID = ContextID; BlessLUT(NewLUT); diff --git a/src/cmstypes.c b/src/cmstypes.c index 78a5287..6ef1f26 100644 --- a/src/cmstypes.c +++ b/src/cmstypes.c @@ -134,6 +134,28 @@ cmsBool _cmsWriteWCharArray(cmsIOHANDLER* io, cmsUInt32Number n, const wchar_t* return TRUE; } +static +cmsBool _cmsReadWCharArray(cmsIOHANDLER* io, cmsUInt32Number n, wchar_t* Array) +{ + cmsUInt32Number i; + cmsUInt16Number tmp; + + _cmsAssert(io != NULL); + + for (i=0; i < n; i++) { + + if (Array != NULL) { + + if (!_cmsReadUInt16Number(io, &tmp)) return FALSE; + Array[i] = (wchar_t) tmp; + } + else { + if (!_cmsReadUInt16Number(io, NULL)) return FALSE; + } + + } + return TRUE; +} // To deal with position tables typedef cmsBool (* PositionTableEntryFn)(struct _cms_typehandler_struct* self, @@ -982,7 +1004,7 @@ cmsBool Type_Text_Description_Write(struct _cms_typehandler_struct* self, cmsIO if (!_cmsWriteUInt32Number(io, len_aligned+1)) goto Error; - // Note that in some compilers sizeof(cmsUInt16Number) != sizeof(wchar_t) + // Note that in some compilers sizeof(cmsUInt16Number) != sizeof(wchar_t) if (!_cmsWriteWCharArray(io, len, Wide)) goto Error; if (!_cmsWriteUInt16Array(io, len_filler_alignment+1, (cmsUInt16Number*) Filler)) goto Error; @@ -1365,13 +1387,11 @@ void Type_Measurement_Free(struct _cms_typehandler_struct* self, void* Ptr) // ******************************************************************************** // Type cmsSigMultiLocalizedUnicodeType // ******************************************************************************** - // // Do NOT trust SizeOfTag as there is an issue on the definition of profileSequenceDescTag. See the TechNote from // Max Derhak and Rohit Patil about this: basically the size of the string table should be guessed and cannot be // taken from the size of tag if this tag is embedded as part of bigger structures (profileSequenceDescTag, for instance) // -// FIXME: this doesn't work if sizeof(wchat_t) != 2 !!! static void *Type_MLU_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) @@ -1381,7 +1401,7 @@ void *Type_MLU_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsU cmsUInt32Number SizeOfHeader; cmsUInt32Number Len, Offset; cmsUInt32Number i; - cmsUInt16Number* Block; + wchar_t* Block; cmsUInt32Number BeginOfThisString, EndOfThisString, LargestPosition; *nItems = 0; @@ -1408,13 +1428,18 @@ void *Type_MLU_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsU if (!_cmsReadUInt16Number(io, &mlu ->Entries[i].Country)) goto Error; // Now deal with Len and offset. - if (!_cmsReadUInt32Number(io, &Len)) goto Error; - mlu ->Entries[i].Len = Len; - + if (!_cmsReadUInt32Number(io, &Len)) goto Error; if (!_cmsReadUInt32Number(io, &Offset)) goto Error; + // Check for overflow + if (Offset < (SizeOfHeader + 8)) goto Error; + + // True begin of the string BeginOfThisString = Offset - SizeOfHeader - 8; - mlu ->Entries[i].StrW = BeginOfThisString; + + // Ajust to wchar_t elements + mlu ->Entries[i].Len = (Len * sizeof(wchar_t)) / sizeof(cmsUInt16Number); + mlu ->Entries[i].StrW = (BeginOfThisString * sizeof(wchar_t)) / sizeof(cmsUInt16Number); // To guess maximum size, add offset + len EndOfThisString = BeginOfThisString + Len; @@ -1423,15 +1448,16 @@ void *Type_MLU_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsU } // Now read the remaining of tag and fill all strings. Substract the directory - SizeOfTag = LargestPosition; + SizeOfTag = (LargestPosition * sizeof(wchar_t)) / sizeof(cmsUInt16Number); - Block = (cmsUInt16Number*) _cmsMalloc(self ->ContextID, SizeOfTag); + Block = (wchar_t*) _cmsMalloc(self ->ContextID, SizeOfTag); if (Block == NULL) goto Error; - NumOfWchar = SizeOfTag / sizeof(cmsUInt16Number); + NumOfWchar = SizeOfTag / sizeof(wchar_t); + + if (!_cmsReadWCharArray(io, NumOfWchar, Block)) goto Error; - if (!_cmsReadUInt16Array(io, NumOfWchar, Block)) goto Error; - mlu ->MemPool = Block; + mlu ->MemPool = Block; mlu ->PoolSize = SizeOfTag; mlu ->PoolUsed = SizeOfTag; @@ -1447,7 +1473,8 @@ static cmsBool Type_MLU_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsMLU* mlu =(cmsMLU*) Ptr; - cmsUInt32Number HeaderSize, Offset; + cmsUInt32Number HeaderSize; + cmsUInt32Number Len, Offset; int i; if (!_cmsWriteUInt32Number(io, mlu ->UsedEntries)) return FALSE; @@ -1456,17 +1483,20 @@ cmsBool Type_MLU_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, HeaderSize = 12 * mlu ->UsedEntries + sizeof(_cmsTagBase); for (i=0; i < mlu ->UsedEntries; i++) { + + Len = mlu ->Entries[i].Len; + Offset = mlu ->Entries[i].StrW; + Len = (Len * sizeof(cmsUInt16Number)) / sizeof(wchar_t); + Offset = (Offset * sizeof(cmsUInt16Number)) / sizeof(wchar_t) + HeaderSize + 8; + if (!_cmsWriteUInt16Number(io, mlu ->Entries[i].Language)) return FALSE; if (!_cmsWriteUInt16Number(io, mlu ->Entries[i].Country)) return FALSE; - if (!_cmsWriteUInt32Number(io, mlu ->Entries[i].Len)) return FALSE; - - Offset = mlu ->Entries[i].StrW + HeaderSize + 8; - + if (!_cmsWriteUInt32Number(io, Len)) return FALSE; if (!_cmsWriteUInt32Number(io, Offset)) return FALSE; } - if (!_cmsWriteUInt16Array(io, mlu ->PoolUsed / sizeof(cmsUInt16Number), (cmsUInt16Number*) mlu ->MemPool)) return FALSE; + if (!_cmsWriteWCharArray(io, mlu ->PoolUsed / sizeof(wchar_t), (wchar_t*) mlu ->MemPool)) return FALSE; return TRUE; @@ -4535,71 +4565,71 @@ Error: static cmsBool Type_vcgt_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { - cmsToneCurve** Curves = (cmsToneCurve**) Ptr; - cmsUInt32Number i, j; + cmsToneCurve** Curves = (cmsToneCurve**) Ptr; + cmsUInt32Number i, j; - if (cmsGetToneCurveParametricType(Curves[0]) == 5 && - cmsGetToneCurveParametricType(Curves[1]) == 5 && - cmsGetToneCurveParametricType(Curves[2]) == 5) { + if (cmsGetToneCurveParametricType(Curves[0]) == 5 && + cmsGetToneCurveParametricType(Curves[1]) == 5 && + cmsGetToneCurveParametricType(Curves[2]) == 5) { - if (!_cmsWriteUInt32Number(io, cmsVideoCardGammaFormulaType)) return FALSE; + if (!_cmsWriteUInt32Number(io, cmsVideoCardGammaFormulaType)) return FALSE; - // Save parameters - for (i=0; i < 3; i++) { + // Save parameters + for (i=0; i < 3; i++) { - _cmsVCGTGAMMA v; + _cmsVCGTGAMMA v; - v.Gamma = Curves[i] ->Segments[0].Params[0]; - v.Min = Curves[i] ->Segments[0].Params[5]; - v.Max = pow(Curves[i] ->Segments[0].Params[1], v.Gamma) + v.Min; + v.Gamma = Curves[i] ->Segments[0].Params[0]; + v.Min = Curves[i] ->Segments[0].Params[5]; + v.Max = pow(Curves[i] ->Segments[0].Params[1], v.Gamma) + v.Min; - if (!_cmsWrite15Fixed16Number(io, v.Gamma)) return FALSE; - if (!_cmsWrite15Fixed16Number(io, v.Min)) return FALSE; - if (!_cmsWrite15Fixed16Number(io, v.Max)) return FALSE; - } - } + if (!_cmsWrite15Fixed16Number(io, v.Gamma)) return FALSE; + if (!_cmsWrite15Fixed16Number(io, v.Min)) return FALSE; + if (!_cmsWrite15Fixed16Number(io, v.Max)) return FALSE; + } + } - else { + else { - // Always store as a table of 256 words - if (!_cmsWriteUInt32Number(io, cmsVideoCardGammaTableType)) return FALSE; - if (!_cmsWriteUInt16Number(io, 3)) return FALSE; - if (!_cmsWriteUInt16Number(io, 256)) return FALSE; - if (!_cmsWriteUInt16Number(io, 2)) return FALSE; + // Always store as a table of 256 words + if (!_cmsWriteUInt32Number(io, cmsVideoCardGammaTableType)) return FALSE; + if (!_cmsWriteUInt16Number(io, 3)) return FALSE; + if (!_cmsWriteUInt16Number(io, 256)) return FALSE; + if (!_cmsWriteUInt16Number(io, 2)) return FALSE; - for (i=0; i < 3; i++) { - for (j=0; j < 256; j++) { + for (i=0; i < 3; i++) { + for (j=0; j < 256; j++) { - cmsFloat32Number v = cmsEvalToneCurveFloat(Curves[i], (cmsFloat32Number) (j / 255.0)); - cmsUInt16Number n = _cmsQuickSaturateWord(v * 65535.0); + cmsFloat32Number v = cmsEvalToneCurveFloat(Curves[i], (cmsFloat32Number) (j / 255.0)); + cmsUInt16Number n = _cmsQuickSaturateWord(v * 65535.0); - if (!_cmsWriteUInt16Number(io, n)) return FALSE; - } - } - } + if (!_cmsWriteUInt16Number(io, n)) return FALSE; + } + } + } - return TRUE; + return TRUE; - cmsUNUSED_PARAMETER(self); - cmsUNUSED_PARAMETER(nItems); + cmsUNUSED_PARAMETER(self); + cmsUNUSED_PARAMETER(nItems); } static void* Type_vcgt_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { - cmsToneCurve** OldCurves = (cmsToneCurve**) Ptr; - cmsToneCurve** NewCurves; + cmsToneCurve** OldCurves = (cmsToneCurve**) Ptr; + cmsToneCurve** NewCurves; - NewCurves = ( cmsToneCurve**) _cmsCalloc(self ->ContextID, 3, sizeof(cmsToneCurve*)); + NewCurves = ( cmsToneCurve**) _cmsCalloc(self ->ContextID, 3, sizeof(cmsToneCurve*)); if (NewCurves == NULL) return NULL; - NewCurves[0] = cmsDupToneCurve(OldCurves[0]); + NewCurves[0] = cmsDupToneCurve(OldCurves[0]); NewCurves[1] = cmsDupToneCurve(OldCurves[1]); - NewCurves[2] = cmsDupToneCurve(OldCurves[2]); + NewCurves[2] = cmsDupToneCurve(OldCurves[2]); return (void*) NewCurves; - cmsUNUSED_PARAMETER(n); + cmsUNUSED_PARAMETER(n); } |