--- old/src/java.desktop/share/native/liblcms/cmsopt.c 2020-08-27 15:57:45.086103069 -0700 +++ new/src/java.desktop/share/native/liblcms/cmsopt.c 2020-08-27 15:57:44.798103073 -0700 @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2017 Marti Maria Saguer +// Copyright (c) 1998-2020 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -317,9 +317,9 @@ } static -void Eval16nop1D(register const cmsUInt16Number Input[], - register cmsUInt16Number Output[], - register const struct _cms_interp_struc* p) +void Eval16nop1D(CMSREGISTER const cmsUInt16Number Input[], + CMSREGISTER cmsUInt16Number Output[], + CMSREGISTER const struct _cms_interp_struc* p) { Output[0] = Input[0]; @@ -327,9 +327,9 @@ } static -void PrelinEval16(register const cmsUInt16Number Input[], - register cmsUInt16Number Output[], - register const void* D) +void PrelinEval16(CMSREGISTER const cmsUInt16Number Input[], + CMSREGISTER cmsUInt16Number Output[], + CMSREGISTER const void* D) { Prelin16Data* p16 = (Prelin16Data*) D; cmsUInt16Number StageABC[MAX_INPUT_DIMENSIONS]; @@ -435,7 +435,7 @@ // Sampler implemented by another LUT. This is a clean way to precalculate the devicelink 3D CLUT for // almost any transform. We use floating point precision and then convert from floating point to 16 bits. static -cmsInt32Number XFormSampler16(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo) +cmsInt32Number XFormSampler16(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], CMSREGISTER void* Cargo) { cmsPipeline* Lut = (cmsPipeline*) Cargo; cmsFloat32Number InFloat[cmsMAXCHANNELS], OutFloat[cmsMAXCHANNELS]; @@ -552,10 +552,10 @@ return FALSE; } - for (i = 0; i < (int) nChannelsOut; i++) - Grid->Tab.T[index + i] = Value[i]; + for (i = 0; i < (int) nChannelsOut; i++) + Grid->Tab.T[index + i] = Value[i]; - return TRUE; + return TRUE; } // Auxiliary, to see if two values are equal or very different @@ -673,7 +673,7 @@ cmsToneCurve** DataSetOut; Prelin16Data* p16; - // This is a loosy optimization! does not apply in floating-point cases + // This is a lossy optimization! does not apply in floating-point cases if (_cmsFormatterIsFloat(*InputFormat) || _cmsFormatterIsFloat(*OutputFormat)) return FALSE; ColorSpace = _cmsICCcolorSpace((int) T_COLORSPACE(*InputFormat)); @@ -937,19 +937,19 @@ // A optimized interpolation for 8-bit input. #define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan]) -static -void PrelinEval8(register const cmsUInt16Number Input[], - register cmsUInt16Number Output[], - register const void* D) +static CMS_NO_SANITIZE +void PrelinEval8(CMSREGISTER const cmsUInt16Number Input[], + CMSREGISTER cmsUInt16Number Output[], + CMSREGISTER const void* D) { cmsUInt8Number r, g, b; cmsS15Fixed16Number rx, ry, rz; cmsS15Fixed16Number c0, c1, c2, c3, Rest; int OutChan; - register cmsS15Fixed16Number X0, X1, Y0, Y1, Z0, Z1; + CMSREGISTER cmsS15Fixed16Number X0, X1, Y0, Y1, Z0, Z1; Prelin8Data* p8 = (Prelin8Data*) D; - register const cmsInterpParams* p = p8 ->p; + CMSREGISTER const cmsInterpParams* p = p8 ->p; int TotalOut = (int) p -> nOutputs; const cmsUInt16Number* LutTable = (const cmsUInt16Number*) p->Table; @@ -1020,8 +1020,8 @@ c1 = c2 = c3 = 0; } - Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; - Output[OutChan] = (cmsUInt16Number) (c0 + ((Rest + (Rest >> 16)) >> 16)); + Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; + Output[OutChan] = (cmsUInt16Number) (c0 + ((Rest + (Rest >> 16)) >> 16)); } } @@ -1070,7 +1070,7 @@ _cmsStageCLutData* OptimizedPrelinCLUT; - // This is a loosy optimization! does not apply in floating-point cases + // This is a lossy optimization! does not apply in floating-point cases if (_cmsFormatterIsFloat(*InputFormat) || _cmsFormatterIsFloat(*OutputFormat)) return FALSE; // Only on chunky RGB @@ -1113,6 +1113,7 @@ { cmsStage* last = cmsPipelineGetPtrToLastStage(OriginalLut); + if (last == NULL) goto Error; if (cmsStageType(last) == cmsSigCurveSetElemType) { _cmsStageToneCurvesData* Data = (_cmsStageToneCurvesData*)cmsStageData(last); @@ -1221,10 +1222,7 @@ Prelin8Data* p8 = PrelinOpt8alloc(OptimizedLUT ->ContextID, OptimizedPrelinCLUT ->Params, OptimizedPrelinCurves); - if (p8 == NULL) { - cmsPipelineFree(OptimizedLUT); - return FALSE; - } + if (p8 == NULL) return FALSE; _cmsPipelineSetOptimizationParameters(OptimizedLUT, PrelinEval8, (void*) p8, Prelin8free, Prelin8dup); @@ -1234,10 +1232,7 @@ Prelin16Data* p16 = PrelinOpt16alloc(OptimizedLUT ->ContextID, OptimizedPrelinCLUT ->Params, 3, OptimizedPrelinCurves, 3, NULL); - if (p16 == NULL) { - cmsPipelineFree(OptimizedLUT); - return FALSE; - } + if (p16 == NULL) return FALSE; _cmsPipelineSetOptimizationParameters(OptimizedLUT, PrelinEval16, (void*) p16, PrelinOpt16free, Prelin16dup); @@ -1365,9 +1360,9 @@ } static -void FastEvaluateCurves8(register const cmsUInt16Number In[], - register cmsUInt16Number Out[], - register const void* D) +void FastEvaluateCurves8(CMSREGISTER const cmsUInt16Number In[], + CMSREGISTER cmsUInt16Number Out[], + CMSREGISTER const void* D) { Curves16Data* Data = (Curves16Data*) D; int x; @@ -1382,9 +1377,9 @@ static -void FastEvaluateCurves16(register const cmsUInt16Number In[], - register cmsUInt16Number Out[], - register const void* D) +void FastEvaluateCurves16(CMSREGISTER const cmsUInt16Number In[], + CMSREGISTER cmsUInt16Number Out[], + CMSREGISTER const void* D) { Curves16Data* Data = (Curves16Data*) D; cmsUInt32Number i; @@ -1396,9 +1391,9 @@ static -void FastIdentity16(register const cmsUInt16Number In[], - register cmsUInt16Number Out[], - register const void* D) +void FastIdentity16(CMSREGISTER const cmsUInt16Number In[], + CMSREGISTER cmsUInt16Number Out[], + CMSREGISTER const void* D) { cmsPipeline* Lut = (cmsPipeline*) D; cmsUInt32Number i; @@ -1423,7 +1418,7 @@ cmsStage* ObtainedCurves = NULL; - // This is a loosy optimization! does not apply in floating-point cases + // This is a lossy optimization! does not apply in floating-point cases if (_cmsFormatterIsFloat(*InputFormat) || _cmsFormatterIsFloat(*OutputFormat)) return FALSE; // Only curves in this LUT? @@ -1473,14 +1468,15 @@ // Maybe the curves are linear at the end if (!AllCurvesAreLinear(ObtainedCurves)) { + _cmsStageToneCurvesData* Data; if (!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, ObtainedCurves)) goto Error; + Data = (_cmsStageToneCurvesData*) cmsStageData(ObtainedCurves); + ObtainedCurves = NULL; // If the curves are to be applied in 8 bits, we can save memory if (_cmsFormatterIs8bit(*InputFormat)) { - - _cmsStageToneCurvesData* Data = (_cmsStageToneCurvesData*) ObtainedCurves ->Data; Curves16Data* c16 = CurvesAlloc(Dest ->ContextID, Data ->nCurves, 256, Data ->TheCurves); if (c16 == NULL) goto Error; @@ -1489,8 +1485,6 @@ } else { - - _cmsStageToneCurvesData* Data = (_cmsStageToneCurvesData*) cmsStageData(ObtainedCurves); Curves16Data* c16 = CurvesAlloc(Dest ->ContextID, Data ->nCurves, 65536, Data ->TheCurves); if (c16 == NULL) goto Error; @@ -1557,9 +1551,9 @@ // to accomplish some performance. Actually it takes 256x3 16 bits tables and 16385 x 3 tables of 8 bits, // in total about 50K, and the performance boost is huge! static -void MatShaperEval16(register const cmsUInt16Number In[], - register cmsUInt16Number Out[], - register const void* D) +void MatShaperEval16(CMSREGISTER const cmsUInt16Number In[], + CMSREGISTER cmsUInt16Number Out[], + CMSREGISTER const void* D) { MatShaper8Data* p = (MatShaper8Data*) D; cmsS1Fixed14Number l1, l2, l3, r, g, b; @@ -1799,8 +1793,8 @@ _cmsStageToneCurvesData* mpeC1 = (_cmsStageToneCurvesData*) cmsStageData(Curve1); _cmsStageToneCurvesData* mpeC2 = (_cmsStageToneCurvesData*) cmsStageData(Curve2); - // In this particular optimization, caché does not help as it takes more time to deal with - // the caché that with the pixel handling + // In this particular optimization, cache does not help as it takes more time to deal with + // the cache that with the pixel handling *dwFlags |= cmsFLAGS_NOCACHE; // Setup the optimizarion routines