diff -pruN lcms2-2.9.orig/ChangeLog lcms2-2.9/ChangeLog --- lcms2-2.9.orig/ChangeLog 2017-11-01 02:36:47.000000000 +1100 +++ lcms2-2.9/ChangeLog 2017-11-13 04:15:10.000000000 +1100 @@ -5,6 +5,9 @@ Several fixes related with security, and therefore not detailed here. C++ compiles now without warnings Added OSX and clang in travis +Added a travis-ci test matrix for many compilers and OS. Thanks to Thomas Weber (debian) for this great improvement. +testbed can now work with dynamic versions of library +Fixed wrong planar formatters regarding linestride interpretation ----------------------- 2.8 Featured release diff -pruN lcms2-2.9.orig/src/cmshalf.c lcms2-2.9/src/cmshalf.c --- lcms2-2.9.orig/src/cmshalf.c 2017-11-01 02:36:47.000000000 +1100 +++ lcms2-2.9/src/cmshalf.c 2017-11-13 04:15:10.000000000 +1100 @@ -503,7 +503,7 @@ static cmsUInt8Number Shift[512] = { 0x18, 0x18, 0x18, 0x18, 0x0d }; -cmsFloat32Number _cmsHalf2Float(cmsUInt16Number h) +cmsFloat32Number CMSEXPORT _cmsHalf2Float(cmsUInt16Number h) { union { cmsFloat32Number flt; @@ -516,7 +516,7 @@ cmsFloat32Number _cmsHalf2Float(cmsUInt1 return out.flt; } -cmsUInt16Number _cmsFloat2Half(cmsFloat32Number flt) +cmsUInt16Number CMSEXPORT _cmsFloat2Half(cmsFloat32Number flt) { union { cmsFloat32Number flt; diff -pruN lcms2-2.9.orig/src/cmsintrp.c lcms2-2.9/src/cmsintrp.c --- lcms2-2.9.orig/src/cmsintrp.c 2017-11-01 02:36:47.000000000 +1100 +++ lcms2-2.9/src/cmsintrp.c 2017-11-13 04:15:10.000000000 +1100 @@ -158,8 +158,8 @@ cmsInterpParams* _cmsComputeInterpParams // This one is a wrapper on the anterior, but assuming all directions have same number of nodes -cmsInterpParams* _cmsComputeInterpParams(cmsContext ContextID, cmsUInt32Number nSamples, - cmsUInt32Number InputChan, cmsUInt32Number OutputChan, const void* Table, cmsUInt32Number dwFlags) +cmsInterpParams* CMSEXPORT _cmsComputeInterpParams(cmsContext ContextID, cmsUInt32Number nSamples, + cmsUInt32Number InputChan, cmsUInt32Number OutputChan, const void* Table, cmsUInt32Number dwFlags) { int i; cmsUInt32Number Samples[MAX_INPUT_DIMENSIONS]; @@ -174,7 +174,7 @@ cmsInterpParams* _cmsComputeInterpParams // Free all associated memory -void _cmsFreeInterpParams(cmsInterpParams* p) +void CMSEXPORT _cmsFreeInterpParams(cmsInterpParams* p) { if (p != NULL) _cmsFree(p ->ContextID, p); } diff -pruN lcms2-2.9.orig/src/cmsio1.c lcms2-2.9/src/cmsio1.c --- lcms2-2.9.orig/src/cmsio1.c 2017-11-01 02:36:47.000000000 +1100 +++ lcms2-2.9/src/cmsio1.c 2017-11-13 04:15:10.000000000 +1100 @@ -307,7 +307,7 @@ Error: // Read and create a BRAND NEW MPE LUT from a given profile. All stuff dependent of version, etc // is adjusted here in order to create a LUT that takes care of all those details. // We add intent = 0xffffffff as a way to read matrix shaper always, no matter of other LUT -cmsPipeline* _cmsReadInputLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent) +cmsPipeline* CMSEXPORT _cmsReadInputLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent) { cmsTagTypeSignature OriginalType; cmsTagSignature tag16; @@ -582,7 +582,7 @@ Error: } // Create an output MPE LUT from agiven profile. Version mismatches are handled here -cmsPipeline* _cmsReadOutputLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent) +cmsPipeline* CMSEXPORT _cmsReadOutputLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent) { cmsTagTypeSignature OriginalType; cmsTagSignature tag16; @@ -705,7 +705,7 @@ Error: // This one includes abstract profiles as well. Matrix-shaper cannot be obtained on that device class. The // tag name here may default to AToB0 -cmsPipeline* _cmsReadDevicelinkLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent) +cmsPipeline* CMSEXPORT _cmsReadDevicelinkLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent) { cmsPipeline* Lut; cmsTagTypeSignature OriginalType; diff -pruN lcms2-2.9.orig/src/cmslut.c lcms2-2.9/src/cmslut.c --- lcms2-2.9.orig/src/cmslut.c 2017-11-01 02:36:47.000000000 +1100 +++ lcms2-2.9/src/cmslut.c 2017-11-13 04:15:10.000000000 +1100 @@ -292,7 +292,7 @@ cmsStage* CMSEXPORT cmsStageAllocToneCur // Create a bunch of identity curves -cmsStage* _cmsStageAllocIdentityCurves(cmsContext ContextID, cmsUInt32Number nChannels) +cmsStage* CMSEXPORT _cmsStageAllocIdentityCurves(cmsContext ContextID, cmsUInt32Number nChannels) { cmsStage* mpe = cmsStageAllocToneCurves(ContextID, nChannels, NULL); @@ -712,7 +712,7 @@ int IdentitySampler(register const cmsUI } // Creates an MPE that just copies input to output -cmsStage* _cmsStageAllocIdentityCLut(cmsContext ContextID, cmsUInt32Number nChan) +cmsStage* CMSEXPORT _cmsStageAllocIdentityCLut(cmsContext ContextID, cmsUInt32Number nChan) { cmsUInt32Number Dimensions[MAX_INPUT_DIMENSIONS]; cmsStage* mpe ; @@ -736,7 +736,7 @@ cmsStage* _cmsStageAllocIdentityCLut(cms // Quantize a value 0 <= i < MaxSamples to 0..0xffff -cmsUInt16Number _cmsQuantizeVal(cmsFloat64Number i, cmsUInt32Number MaxSamples) +cmsUInt16Number CMSEXPORT _cmsQuantizeVal(cmsFloat64Number i, cmsUInt32Number MaxSamples) { cmsFloat64Number x; @@ -969,7 +969,7 @@ void EvaluateLab2XYZ(const cmsFloat32Num // No dup or free routines needed, as the structure has no pointers in it. -cmsStage* _cmsStageAllocLab2XYZ(cmsContext ContextID) +cmsStage* CMSEXPORT _cmsStageAllocLab2XYZ(cmsContext ContextID) { return _cmsStageAllocPlaceholder(ContextID, cmsSigLab2XYZElemType, 3, 3, EvaluateLab2XYZ, NULL, NULL, NULL); } @@ -1020,7 +1020,7 @@ cmsStage* _cmsStageAllocLabV2ToV4curves( // ******************************************************************************** // Matrix-based conversion, which is more accurate, but slower and cannot properly be saved in devicelink profiles -cmsStage* _cmsStageAllocLabV2ToV4(cmsContext ContextID) +cmsStage* CMSEXPORT _cmsStageAllocLabV2ToV4(cmsContext ContextID) { static const cmsFloat64Number V2ToV4[] = { 65535.0/65280.0, 0, 0, 0, 65535.0/65280.0, 0, @@ -1036,7 +1036,7 @@ cmsStage* _cmsStageAllocLabV2ToV4(cmsCon // Reverse direction -cmsStage* _cmsStageAllocLabV4ToV2(cmsContext ContextID) +cmsStage* CMSEXPORT _cmsStageAllocLabV4ToV2(cmsContext ContextID) { static const cmsFloat64Number V4ToV2[] = { 65280.0/65535.0, 0, 0, 0, 65280.0/65535.0, 0, @@ -1179,7 +1179,7 @@ void EvaluateXYZ2Lab(const cmsFloat32Num cmsUNUSED_PARAMETER(mpe); } -cmsStage* _cmsStageAllocXYZ2Lab(cmsContext ContextID) +cmsStage* CMSEXPORT _cmsStageAllocXYZ2Lab(cmsContext ContextID) { return _cmsStageAllocPlaceholder(ContextID, cmsSigXYZ2LabElemType, 3, 3, EvaluateXYZ2Lab, NULL, NULL, NULL); diff -pruN lcms2-2.9.orig/src/cmsnamed.c lcms2-2.9/src/cmsnamed.c --- lcms2-2.9.orig/src/cmsnamed.c 2017-11-01 02:36:47.000000000 +1100 +++ lcms2-2.9/src/cmsnamed.c 2017-11-13 04:15:10.000000000 +1100 @@ -730,7 +730,7 @@ void EvalNamedColor(const cmsFloat32Numb // Named color lookup element -cmsStage* _cmsStageAllocNamedColor(cmsNAMEDCOLORLIST* NamedColorList, cmsBool UsePCS) +cmsStage* CMSEXPORT _cmsStageAllocNamedColor(cmsNAMEDCOLORLIST* NamedColorList, cmsBool UsePCS) { return _cmsStageAllocPlaceholder(NamedColorList ->ContextID, cmsSigNamedColorElemType, diff -pruN lcms2-2.9.orig/src/cmspack.c lcms2-2.9/src/cmspack.c --- lcms2-2.9.orig/src/cmspack.c 2017-11-01 02:36:47.000000000 +1100 +++ lcms2-2.9/src/cmspack.c 2017-11-13 04:15:10.000000000 +1100 @@ -531,7 +531,7 @@ cmsUInt8Number* UnrollPlanarWords(regist cmsUInt8Number* Init = accum; if (DoSwap) { - accum += T_EXTRA(info -> InputFormat) * Stride * sizeof(cmsUInt16Number); + accum += T_EXTRA(info -> InputFormat) * Stride; } for (i=0; i < nChan; i++) { @@ -544,7 +544,7 @@ cmsUInt8Number* UnrollPlanarWords(regist wIn[index] = Reverse ? REVERSE_FLAVOR_16(v) : v; - accum += Stride * sizeof(cmsUInt16Number); + accum += Stride; } return (Init + sizeof(cmsUInt16Number)); @@ -772,13 +772,18 @@ cmsUInt8Number* UnrollLabDoubleTo16(regi { if (T_PLANAR(info -> InputFormat)) { - cmsFloat64Number* Pt = (cmsFloat64Number*) accum; - cmsCIELab Lab; - - Lab.L = Pt[0]; - Lab.a = Pt[Stride]; - Lab.b = Pt[Stride*2]; + cmsUInt8Number* pos_L; + cmsUInt8Number* pos_a; + cmsUInt8Number* pos_b; + + pos_L = accum; + pos_a = accum + Stride; + pos_b = accum + Stride * 2; + + Lab.L = *(cmsFloat64Number*) pos_L; + Lab.a = *(cmsFloat64Number*) pos_a; + Lab.b = *(cmsFloat64Number*) pos_b; cmsFloat2LabEncoded(wIn, &Lab); return accum + sizeof(cmsFloat64Number); @@ -803,12 +808,17 @@ cmsUInt8Number* UnrollLabFloatTo16(regis if (T_PLANAR(info -> InputFormat)) { - cmsFloat32Number* Pt = (cmsFloat32Number*) accum; - - - Lab.L = Pt[0]; - Lab.a = Pt[Stride]; - Lab.b = Pt[Stride*2]; + cmsUInt8Number* pos_L; + cmsUInt8Number* pos_a; + cmsUInt8Number* pos_b; + + pos_L = accum; + pos_a = accum + Stride; + pos_b = accum + Stride * 2; + + Lab.L = *(cmsFloat32Number*)pos_L; + Lab.a = *(cmsFloat32Number*)pos_a; + Lab.b = *(cmsFloat32Number*)pos_b; cmsFloat2LabEncoded(wIn, &Lab); return accum + sizeof(cmsFloat32Number); @@ -834,12 +844,19 @@ cmsUInt8Number* UnrollXYZDoubleTo16(regi { if (T_PLANAR(info -> InputFormat)) { - cmsFloat64Number* Pt = (cmsFloat64Number*) accum; cmsCIEXYZ XYZ; + cmsUInt8Number* pos_X; + cmsUInt8Number* pos_Y; + cmsUInt8Number* pos_Z; + + pos_X = accum; + pos_Y = accum + Stride; + pos_Z = accum + Stride * 2; + + XYZ.X = *(cmsFloat64Number*)pos_X; + XYZ.Y = *(cmsFloat64Number*)pos_Y; + XYZ.Z = *(cmsFloat64Number*)pos_Z; - XYZ.X = Pt[0]; - XYZ.Y = Pt[Stride]; - XYZ.Z = Pt[Stride*2]; cmsFloat2XYZEncoded(wIn, &XYZ); return accum + sizeof(cmsFloat64Number); @@ -863,12 +880,19 @@ cmsUInt8Number* UnrollXYZFloatTo16(regis { if (T_PLANAR(info -> InputFormat)) { - cmsFloat32Number* Pt = (cmsFloat32Number*) accum; cmsCIEXYZ XYZ; + cmsUInt8Number* pos_X; + cmsUInt8Number* pos_Y; + cmsUInt8Number* pos_Z; + + pos_X = accum; + pos_Y = accum + Stride; + pos_Z = accum + Stride * 2; + + XYZ.X = *(cmsFloat32Number*)pos_X; + XYZ.Y = *(cmsFloat32Number*)pos_Y; + XYZ.Z = *(cmsFloat32Number*)pos_Z; - XYZ.X = Pt[0]; - XYZ.Y = Pt[Stride]; - XYZ.Z = Pt[Stride*2]; cmsFloat2XYZEncoded(wIn, &XYZ); return accum + sizeof(cmsFloat32Number); @@ -913,6 +937,20 @@ cmsINLINE cmsBool IsInkSpace(cmsUInt32Nu } } +// Return the size in bytes of a given formatter +static +cmsUInt32Number PixelSize(cmsUInt32Number Format) +{ + cmsUInt32Number fmt_bytes = T_BYTES(Format); + + // For double, the T_BYTES field is zero + if (fmt_bytes == 0) + return sizeof(cmsUInt64Number); + + // Otherwise, it is already correct for all formats + return fmt_bytes; +} + // Inks does come in percentage, remaining cases are between 0..1.0, again to 16 bits static cmsUInt8Number* UnrollDoubleTo16(register _cmsTRANSFORM* info, @@ -934,6 +972,8 @@ cmsUInt8Number* UnrollDoubleTo16(registe cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 655.35 : 65535.0; + Stride /= PixelSize(info->InputFormat); + if (ExtraFirst) start = Extra; @@ -989,6 +1029,7 @@ cmsUInt8Number* UnrollFloatTo16(register cmsUInt32Number i, start = 0; cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 655.35 : 65535.0; + Stride /= PixelSize(info->InputFormat); if (ExtraFirst) start = Extra; @@ -1065,6 +1106,7 @@ cmsUInt8Number* UnrollFloatsToFloat(_cms cmsUInt32Number i, start = 0; cmsFloat32Number maximum = IsInkSpace(info ->InputFormat) ? 100.0F : 1.0F; + Stride /= PixelSize(info->InputFormat); if (ExtraFirst) start = Extra; @@ -1117,6 +1159,7 @@ cmsUInt8Number* UnrollDoublesToFloat(_cm cmsUInt32Number i, start = 0; cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 100.0 : 1.0; + Stride /= PixelSize(info->InputFormat); if (ExtraFirst) start = Extra; @@ -1162,7 +1205,9 @@ cmsUInt8Number* UnrollLabDoubleToFloat(_ if (T_PLANAR(info -> InputFormat)) { - wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1 + Stride /= PixelSize(info->InputFormat); + + wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1 wIn[1] = (cmsFloat32Number) ((Pt[Stride] + 128) / 255.0); // form -128..+127 to 0..1 wIn[2] = (cmsFloat32Number) ((Pt[Stride*2] + 128) / 255.0); @@ -1190,6 +1235,8 @@ cmsUInt8Number* UnrollLabFloatToFloat(_c if (T_PLANAR(info -> InputFormat)) { + Stride /= PixelSize(info->InputFormat); + wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1 wIn[1] = (cmsFloat32Number) ((Pt[Stride] + 128) / 255.0); // form -128..+127 to 0..1 wIn[2] = (cmsFloat32Number) ((Pt[Stride*2] + 128) / 255.0); @@ -1220,6 +1267,8 @@ cmsUInt8Number* UnrollXYZDoubleToFloat(_ if (T_PLANAR(info -> InputFormat)) { + Stride /= PixelSize(info->InputFormat); + wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ); wIn[1] = (cmsFloat32Number) (Pt[Stride] / MAX_ENCODEABLE_XYZ); wIn[2] = (cmsFloat32Number) (Pt[Stride*2] / MAX_ENCODEABLE_XYZ); @@ -1247,6 +1296,8 @@ cmsUInt8Number* UnrollXYZFloatToFloat(_c if (T_PLANAR(info -> InputFormat)) { + Stride /= PixelSize(info->InputFormat); + wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ); wIn[1] = (cmsFloat32Number) (Pt[Stride] / MAX_ENCODEABLE_XYZ); wIn[2] = (cmsFloat32Number) (Pt[Stride*2] / MAX_ENCODEABLE_XYZ); @@ -1429,7 +1480,7 @@ cmsUInt8Number* PackPlanarWords(register cmsUInt16Number v; if (DoSwap) { - output += T_EXTRA(info -> OutputFormat) * Stride * sizeof(cmsUInt16Number); + output += T_EXTRA(info -> OutputFormat) * Stride; } for (i=0; i < nChan; i++) { @@ -1445,7 +1496,7 @@ cmsUInt8Number* PackPlanarWords(register v = REVERSE_FLAVOR_16(v); *(cmsUInt16Number*) output = v; - output += (Stride * sizeof(cmsUInt16Number)); + output += Stride; } return (Init + sizeof(cmsUInt16Number)); @@ -2297,6 +2348,8 @@ cmsUInt8Number* PackLabFloatFrom16(regis cmsFloat32Number* Out = (cmsFloat32Number*) output; + Stride /= PixelSize(info->OutputFormat); + Out[0] = (cmsFloat32Number)Lab.L; Out[Stride] = (cmsFloat32Number)Lab.a; Out[Stride*2] = (cmsFloat32Number)Lab.b; @@ -2325,6 +2378,8 @@ cmsUInt8Number* PackXYZDoubleFrom16(regi cmsFloat64Number* Out = (cmsFloat64Number*) output; cmsXYZEncoded2Float(&XYZ, wOut); + Stride /= PixelSize(Info->OutputFormat); + Out[0] = XYZ.X; Out[Stride] = XYZ.Y; Out[Stride*2] = XYZ.Z; @@ -2352,6 +2407,8 @@ cmsUInt8Number* PackXYZFloatFrom16(regis cmsFloat32Number* Out = (cmsFloat32Number*) output; cmsXYZEncoded2Float(&XYZ, wOut); + Stride /= PixelSize(Info->OutputFormat); + Out[0] = (cmsFloat32Number) XYZ.X; Out[Stride] = (cmsFloat32Number) XYZ.Y; Out[Stride*2] = (cmsFloat32Number) XYZ.Z; @@ -2391,6 +2448,8 @@ cmsUInt8Number* PackDoubleFrom16(registe cmsFloat64Number* swap1 = (cmsFloat64Number*) output; cmsUInt32Number i, start = 0; + Stride /= PixelSize(info->OutputFormat); + if (ExtraFirst) start = Extra; @@ -2442,6 +2501,8 @@ cmsUInt8Number* PackFloatFrom16(register cmsFloat32Number* swap1 = (cmsFloat32Number*)output; cmsUInt32Number i, start = 0; + Stride /= PixelSize(info->OutputFormat); + if (ExtraFirst) start = Extra; @@ -2495,6 +2556,8 @@ cmsUInt8Number* PackFloatsFromFloat(_cms cmsFloat64Number v = 0; cmsUInt32Number i, start = 0; + Stride /= PixelSize(info->OutputFormat); + if (ExtraFirst) start = Extra; @@ -2544,6 +2607,8 @@ cmsUInt8Number* PackDoublesFromFloat(_cm cmsFloat64Number* swap1 = (cmsFloat64Number*)output; cmsUInt32Number i, start = 0; + Stride /= PixelSize(info->OutputFormat); + if (ExtraFirst) start = Extra; @@ -2590,6 +2655,8 @@ cmsUInt8Number* PackLabFloatFromFloat(_c if (T_PLANAR(Info -> OutputFormat)) { + Stride /= PixelSize(Info->OutputFormat); + Out[0] = (cmsFloat32Number) (wOut[0] * 100.0); Out[Stride] = (cmsFloat32Number) (wOut[1] * 255.0 - 128.0); Out[Stride*2] = (cmsFloat32Number) (wOut[2] * 255.0 - 128.0); @@ -2618,6 +2685,8 @@ cmsUInt8Number* PackLabDoubleFromFloat(_ if (T_PLANAR(Info -> OutputFormat)) { + Stride /= PixelSize(Info->OutputFormat); + Out[0] = (cmsFloat64Number) (wOut[0] * 100.0); Out[Stride] = (cmsFloat64Number) (wOut[1] * 255.0 - 128.0); Out[Stride*2] = (cmsFloat64Number) (wOut[2] * 255.0 - 128.0); @@ -2647,6 +2716,8 @@ cmsUInt8Number* PackXYZFloatFromFloat(_c if (T_PLANAR(Info -> OutputFormat)) { + Stride /= PixelSize(Info->OutputFormat); + Out[0] = (cmsFloat32Number) (wOut[0] * MAX_ENCODEABLE_XYZ); Out[Stride] = (cmsFloat32Number) (wOut[1] * MAX_ENCODEABLE_XYZ); Out[Stride*2] = (cmsFloat32Number) (wOut[2] * MAX_ENCODEABLE_XYZ); @@ -2675,6 +2746,8 @@ cmsUInt8Number* PackXYZDoubleFromFloat(_ if (T_PLANAR(Info -> OutputFormat)) { + Stride /= PixelSize(Info->OutputFormat); + Out[0] = (cmsFloat64Number) (wOut[0] * MAX_ENCODEABLE_XYZ); Out[Stride] = (cmsFloat64Number) (wOut[1] * MAX_ENCODEABLE_XYZ); Out[Stride*2] = (cmsFloat64Number) (wOut[2] * MAX_ENCODEABLE_XYZ); @@ -2718,6 +2791,8 @@ cmsUInt8Number* UnrollHalfTo16(register cmsFloat32Number maximum = IsInkSpace(info ->InputFormat) ? 655.35F : 65535.0F; + Stride /= PixelSize(info->OutputFormat); + if (ExtraFirst) start = Extra; @@ -2769,6 +2844,7 @@ cmsUInt8Number* UnrollHalfToFloat(_cmsTR cmsUInt32Number i, start = 0; cmsFloat32Number maximum = IsInkSpace(info ->InputFormat) ? 100.0F : 1.0F; + Stride /= PixelSize(info->OutputFormat); if (ExtraFirst) start = Extra; @@ -2820,6 +2896,8 @@ cmsUInt8Number* PackHalfFrom16(register cmsUInt16Number* swap1 = (cmsUInt16Number*)output; cmsUInt32Number i, start = 0; + Stride /= PixelSize(info->OutputFormat); + if (ExtraFirst) start = Extra; @@ -2871,6 +2949,8 @@ cmsUInt8Number* PackHalfFromFloat(_cmsTR cmsFloat32Number v = 0; cmsUInt32Number i, start = 0; + Stride /= PixelSize(info->OutputFormat); + if (ExtraFirst) start = Extra; @@ -3288,10 +3368,10 @@ cmsBool _cmsRegisterFormattersPlugin(cm return TRUE; } -cmsFormatter _cmsGetFormatter(cmsContext ContextID, - cmsUInt32Number Type, // Specific type, i.e. TYPE_RGB_8 - cmsFormatterDirection Dir, - cmsUInt32Number dwFlags) +cmsFormatter CMSEXPORT _cmsGetFormatter(cmsContext ContextID, + cmsUInt32Number Type, // Specific type, i.e. TYPE_RGB_8 + cmsFormatterDirection Dir, + cmsUInt32Number dwFlags) { _cmsFormattersPluginChunkType* ctx = ( _cmsFormattersPluginChunkType*) _cmsContextGetClientChunk(ContextID, FormattersPlugin); cmsFormattersFactoryList* f; diff -pruN lcms2-2.9.orig/src/lcms2_internal.h lcms2-2.9/src/lcms2_internal.h --- lcms2-2.9.orig/src/lcms2_internal.h 2017-11-01 02:36:47.000000000 +1100 +++ lcms2-2.9/src/lcms2_internal.h 2017-11-13 04:15:10.000000000 +1100 @@ -180,13 +180,14 @@ cmsINLINE cmsUInt16Number _cmsQuickSatur return _cmsQuickFloorWord(d); } +// Test bed entry points--------------------------------------------------------------- +#define CMSCHECKPOINT CMSAPI // Pthread support -------------------------------------------------------------------- #ifndef CMS_NO_PTHREADS // This is the threading support. Unfortunately, it has to be platform-dependent because // windows does not support pthreads. - #ifdef CMS_IS_WINDOWS_ #define WIN32_LEAN_AND_MEAN 1 @@ -823,10 +824,10 @@ void _cmsTagSignature2St // Interpolation --------------------------------------------------------------------------------------------------------- -cmsInterpParams* _cmsComputeInterpParams(cmsContext ContextID, cmsUInt32Number nSamples, cmsUInt32Number InputChan, cmsUInt32Number OutputChan, const void* Table, cmsUInt32Number dwFlags); -cmsInterpParams* _cmsComputeInterpParamsEx(cmsContext ContextID, const cmsUInt32Number nSamples[], cmsUInt32Number InputChan, cmsUInt32Number OutputChan, const void* Table, cmsUInt32Number dwFlags); -void _cmsFreeInterpParams(cmsInterpParams* p); -cmsBool _cmsSetInterpolationRoutine(cmsContext ContextID, cmsInterpParams* p); +CMSCHECKPOINT cmsInterpParams* CMSEXPORT _cmsComputeInterpParams(cmsContext ContextID, cmsUInt32Number nSamples, cmsUInt32Number InputChan, cmsUInt32Number OutputChan, const void* Table, cmsUInt32Number dwFlags); +cmsInterpParams* _cmsComputeInterpParamsEx(cmsContext ContextID, const cmsUInt32Number nSamples[], cmsUInt32Number InputChan, cmsUInt32Number OutputChan, const void* Table, cmsUInt32Number dwFlags); +CMSCHECKPOINT void CMSEXPORT _cmsFreeInterpParams(cmsInterpParams* p); +cmsBool _cmsSetInterpolationRoutine(cmsContext ContextID, cmsInterpParams* p); // Curves ---------------------------------------------------------------------------------------------------------------- @@ -876,20 +877,20 @@ struct _cmsStage_struct { // Special Stages (cannot be saved) -cmsStage* _cmsStageAllocLab2XYZ(cmsContext ContextID); -cmsStage* _cmsStageAllocXYZ2Lab(cmsContext ContextID); -cmsStage* _cmsStageAllocLabPrelin(cmsContext ContextID); -cmsStage* _cmsStageAllocLabV2ToV4(cmsContext ContextID); -cmsStage* _cmsStageAllocLabV2ToV4curves(cmsContext ContextID); -cmsStage* _cmsStageAllocLabV4ToV2(cmsContext ContextID); -cmsStage* _cmsStageAllocNamedColor(cmsNAMEDCOLORLIST* NamedColorList, cmsBool UsePCS); -cmsStage* _cmsStageAllocIdentityCurves(cmsContext ContextID, cmsUInt32Number nChannels); -cmsStage* _cmsStageAllocIdentityCLut(cmsContext ContextID, cmsUInt32Number nChan); -cmsStage* _cmsStageNormalizeFromLabFloat(cmsContext ContextID); -cmsStage* _cmsStageNormalizeFromXyzFloat(cmsContext ContextID); -cmsStage* _cmsStageNormalizeToLabFloat(cmsContext ContextID); -cmsStage* _cmsStageNormalizeToXyzFloat(cmsContext ContextID); -cmsStage* _cmsStageClipNegatives(cmsContext ContextID, cmsUInt32Number nChannels); +CMSCHECKPOINT cmsStage* CMSEXPORT _cmsStageAllocLab2XYZ(cmsContext ContextID); +CMSCHECKPOINT cmsStage* CMSEXPORT _cmsStageAllocXYZ2Lab(cmsContext ContextID); +cmsStage* _cmsStageAllocLabPrelin(cmsContext ContextID); +CMSCHECKPOINT cmsStage* CMSEXPORT _cmsStageAllocLabV2ToV4(cmsContext ContextID); +cmsStage* _cmsStageAllocLabV2ToV4curves(cmsContext ContextID); +CMSCHECKPOINT cmsStage* CMSEXPORT _cmsStageAllocLabV4ToV2(cmsContext ContextID); +CMSCHECKPOINT cmsStage* CMSEXPORT _cmsStageAllocNamedColor(cmsNAMEDCOLORLIST* NamedColorList, cmsBool UsePCS); +CMSCHECKPOINT cmsStage* CMSEXPORT _cmsStageAllocIdentityCurves(cmsContext ContextID, cmsUInt32Number nChannels); +CMSCHECKPOINT cmsStage* CMSEXPORT _cmsStageAllocIdentityCLut(cmsContext ContextID, cmsUInt32Number nChan); +cmsStage* _cmsStageNormalizeFromLabFloat(cmsContext ContextID); +cmsStage* _cmsStageNormalizeFromXyzFloat(cmsContext ContextID); +cmsStage* _cmsStageNormalizeToLabFloat(cmsContext ContextID); +cmsStage* _cmsStageNormalizeToXyzFloat(cmsContext ContextID); +cmsStage* _cmsStageClipNegatives(cmsContext ContextID, cmsUInt32Number nChannels); // For curve set only @@ -924,9 +925,9 @@ struct _cmsPipeline_struct { // Read tags using low-level function, provide necessary glue code to adapt versions, etc. All those return a brand new copy // of the LUTS, since ownership of original is up to the profile. The user should free allocated resources. -cmsPipeline* _cmsReadInputLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent); -cmsPipeline* _cmsReadOutputLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent); -cmsPipeline* _cmsReadDevicelinkLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent); +CMSCHECKPOINT cmsPipeline* CMSEXPORT _cmsReadInputLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent); +CMSCHECKPOINT cmsPipeline* CMSEXPORT _cmsReadOutputLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent); +CMSCHECKPOINT cmsPipeline* CMSEXPORT _cmsReadDevicelinkLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent); // Special values cmsBool _cmsReadMediaWhitePoint(cmsCIEXYZ* Dest, cmsHPROFILE hProfile); @@ -951,7 +952,8 @@ cmsSEQ* _cmsCompileProfileSequence(cmsCo // LUT optimization ------------------------------------------------------------------------------------------------ -cmsUInt16Number _cmsQuantizeVal(cmsFloat64Number i, cmsUInt32Number MaxSamples); +CMSCHECKPOINT cmsUInt16Number CMSEXPORT _cmsQuantizeVal(cmsFloat64Number i, cmsUInt32Number MaxSamples); + cmsUInt32Number _cmsReasonableGridpointsByColorspace(cmsColorSpaceSignature Colorspace, cmsUInt32Number dwFlags); cmsBool _cmsEndPointsBySpace(cmsColorSpaceSignature Space, @@ -985,17 +987,17 @@ cmsPipeline* _cmsCreateGamutCheckPip cmsBool _cmsFormatterIsFloat(cmsUInt32Number Type); cmsBool _cmsFormatterIs8bit(cmsUInt32Number Type); -cmsFormatter _cmsGetFormatter(cmsContext ContextID, - cmsUInt32Number Type, // Specific type, i.e. TYPE_RGB_8 - cmsFormatterDirection Dir, - cmsUInt32Number dwFlags); +CMSCHECKPOINT cmsFormatter CMSEXPORT _cmsGetFormatter(cmsContext ContextID, + cmsUInt32Number Type, // Specific type, i.e. TYPE_RGB_8 + cmsFormatterDirection Dir, + cmsUInt32Number dwFlags); #ifndef CMS_NO_HALF_SUPPORT // Half float -cmsFloat32Number _cmsHalf2Float(cmsUInt16Number h); -cmsUInt16Number _cmsFloat2Half(cmsFloat32Number flt); +CMSCHECKPOINT cmsFloat32Number CMSEXPORT _cmsHalf2Float(cmsUInt16Number h); +CMSCHECKPOINT cmsUInt16Number CMSEXPORT _cmsFloat2Half(cmsFloat32Number flt); #endif diff -pruN lcms2-2.9.orig/testbed/testcms2.c lcms2-2.9/testbed/testcms2.c --- lcms2-2.9.orig/testbed/testcms2.c 2017-11-01 02:36:47.000000000 +1100 +++ lcms2-2.9/testbed/testcms2.c 2017-11-13 04:15:10.000000000 +1100 @@ -3813,9 +3813,9 @@ void CheckSingleFormatter16(cmsContext i Values[i] <<= 8; } - b.Fmt16(&info, Values, Buffer, 1); + b.Fmt16(&info, Values, Buffer, 2); memset(Values, 0, sizeof(Values)); - f.Fmt16(&info, Values, Buffer, 1); + f.Fmt16(&info, Values, Buffer, 2); for (i=0; i < nChannels; i++) { if (bytes == 1)