diff --git a/third_party/lcms/src/cmscgats.c b/third_party/lcms/src/cmscgats.c index a0c25c024..55f74ede8 100644 --- a/third_party/lcms/src/cmscgats.c +++ b/third_party/lcms/src/cmscgats.c @@ -38,7 +38,10 @@ #define DEFAULT_DBL_FORMAT "%.10g" // Double formatting #ifdef CMS_IS_WINDOWS_ -# include +//sunliang.liu modified 2010426 for wince error +# ifndef _WIN32_WCE +# include +# endif # define DIR_CHAR '\\' #else # define DIR_CHAR '/' diff --git a/third_party/lcms/src/cmsgamma.c b/third_party/lcms/src/cmsgamma.c index eb3dd881c..6e36cf462 100644 --- a/third_party/lcms/src/cmsgamma.c +++ b/third_party/lcms/src/cmsgamma.c @@ -749,14 +749,19 @@ void CMSEXPORT cmsFreeToneCurve(cmsToneCurve* Curve) { cmsContext ContextID; - if (Curve == NULL) return; + // added by Xiaochuan Liu + // Curve->InterpParams may be null + if (Curve == NULL || Curve->InterpParams == NULL) return; ContextID = Curve ->InterpParams->ContextID; _cmsFreeInterpParams(Curve ->InterpParams); + Curve ->InterpParams = NULL; - if (Curve -> Table16) + if (Curve -> Table16) { _cmsFree(ContextID, Curve ->Table16); + Curve ->Table16 = NULL; + } if (Curve ->Segments) { @@ -766,20 +771,30 @@ void CMSEXPORT cmsFreeToneCurve(cmsToneCurve* Curve) if (Curve ->Segments[i].SampledPoints) { _cmsFree(ContextID, Curve ->Segments[i].SampledPoints); + Curve ->Segments[i].SampledPoints = NULL; } - if (Curve ->SegInterp[i] != 0) + if (Curve ->SegInterp[i] != 0) { _cmsFreeInterpParams(Curve->SegInterp[i]); + Curve->SegInterp[i] = NULL; + } } _cmsFree(ContextID, Curve ->Segments); + Curve ->Segments = NULL; _cmsFree(ContextID, Curve ->SegInterp); + Curve ->SegInterp = NULL; } - if (Curve -> Evals) + if (Curve -> Evals) { _cmsFree(ContextID, Curve -> Evals); + Curve -> Evals = NULL; + } - if (Curve) _cmsFree(ContextID, Curve); + if (Curve) { + _cmsFree(ContextID, Curve); + Curve = NULL; + } } // Utility function, free 3 gamma tables @@ -799,7 +814,10 @@ void CMSEXPORT cmsFreeToneCurveTriple(cmsToneCurve* Curve[3]) // Duplicate a gamma table cmsToneCurve* CMSEXPORT cmsDupToneCurve(const cmsToneCurve* In) { - if (In == NULL || In ->Segments == NULL || In ->Table16 == NULL) return NULL; + // Xiaochuan Liu + // fix openpdf bug(mantis id:0055683, google id:360198) + // the function CurveSetElemTypeFree in cmslut.c also needs to check pointer + if (In == NULL || In ->InterpParams == NULL || In ->Segments == NULL || In ->Table16 == NULL) return NULL; return AllocateToneCurveStruct(In ->InterpParams ->ContextID, In ->nEntries, In ->nSegments, In ->Segments, In ->Table16); } diff --git a/third_party/lcms/src/cmsio0.c b/third_party/lcms/src/cmsio0.c index 1b026488d..cc5f89064 100644 --- a/third_party/lcms/src/cmsio0.c +++ b/third_party/lcms/src/cmsio0.c @@ -479,6 +479,14 @@ cmsIOHANDLER* CMSEXPORT cmsGetProfileIOhandler(cmsHPROFILE hProfile) return Icc->IOhandler; } +#ifdef _WIN32_WCE +time_t wceex_time(time_t *timer); +struct tm * wceex_gmtime(const time_t *timer); + +#define time wceex_time +#define gmtime wceex_gmtime +#endif + // Creates an empty structure holding all required parameters cmsHPROFILE CMSEXPORT cmsCreateProfilePlaceholder(cmsContext ContextID) { @@ -570,6 +578,14 @@ int _cmsSearchTag(_cmsICCPROFILE* Icc, cmsTagSignature sig, cmsBool lFollowLinks // Yes, follow link if (LinkedSig != (cmsTagSignature) 0) { + // fix bug mantis id#0055942 + // assume that TRCTag and ColorantTag can't be linked. + // Xiaochuan Liu 2014-04-23 + if ((sig == cmsSigRedTRCTag || sig == cmsSigGreenTRCTag || sig == cmsSigBlueTRCTag) && + (LinkedSig == cmsSigRedColorantTag || LinkedSig == cmsSigGreenColorantTag || LinkedSig == cmsSigBlueColorantTag)) + { + return n; + } sig = LinkedSig; } @@ -1363,6 +1379,12 @@ Error: return 0; } +#ifdef _WIN32_WCE +int wceex_unlink(const char *filename); +#ifndef remove +# define remove wceex_unlink +#endif +#endif // Low-level save to disk. cmsBool CMSEXPORT cmsSaveProfileToFile(cmsHPROFILE hProfile, const char* FileName) diff --git a/third_party/lcms/src/cmsio1.c b/third_party/lcms/src/cmsio1.c index 364741c9e..4b12ae18e 100644 --- a/third_party/lcms/src/cmsio1.c +++ b/third_party/lcms/src/cmsio1.c @@ -201,7 +201,11 @@ cmsPipeline* BuildGrayInputMatrixPipeline(cmsHPROFILE hProfile) return Lut; Error: - cmsFreeToneCurve(GrayTRC); + // memory pointed by GrayTRC is not a new malloc memory, so don't free it here, + // memory pointed by GrayTRC will be freed when hProfile is closed. + // test file :0047776_Pocket Medicine_ The Massachusetts General Hospital Handbook of Internal Medicine-2.pdf + // Xiaochuan Liu, 20140421 + //cmsFreeToneCurve(GrayTRC); cmsPipelineFree(Lut); return NULL; }