< prev index next >
src/java.desktop/share/native/liblcms/cmsopt.c
Print this page
@@ -28,11 +28,11 @@
// file:
//
//---------------------------------------------------------------------------------
//
// 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"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
@@ -315,23 +315,23 @@
return AnyOpt;
}
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];
cmsUNUSED_PARAMETER(p);
}
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];
cmsUInt16Number StageDEF[cmsMAXCHANNELS];
cmsUInt32Number i;
@@ -433,11 +433,11 @@
#define PRELINEARIZATION_POINTS 4096
// 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];
cmsUInt32Number i;
@@ -671,11 +671,11 @@
_cmsStageCLutData* DataCLUT;
cmsToneCurve** DataSetIn;
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));
OutputColorSpace = _cmsICCcolorSpace((int) T_COLORSPACE(*OutputFormat));
@@ -935,23 +935,23 @@
// 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;
r = (cmsUInt8Number) (Input[0] >> 8);
g = (cmsUInt8Number) (Input[1] >> 8);
@@ -1068,11 +1068,11 @@
cmsStage* mpe;
cmsToneCurve** OptimizedPrelinCurves;
_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
if (T_COLORSPACE(*InputFormat) != PT_RGB) return FALSE;
if (T_PLANAR(*InputFormat)) return FALSE;
@@ -1111,10 +1111,11 @@
// degenerated, it is likely the transform is squeezing and clipping
// the output from previous CLUT. We cannot optimize this case
{
cmsStage* last = cmsPipelineGetPtrToLastStage(OriginalLut);
+ if (last == NULL) goto Error;
if (cmsStageType(last) == cmsSigCurveSetElemType) {
_cmsStageToneCurvesData* Data = (_cmsStageToneCurvesData*)cmsStageData(last);
for (i = 0; i < Data->nCurves; i++) {
if (IsDegenerated(Data->TheCurves[i]))
@@ -1219,27 +1220,21 @@
if (_cmsFormatterIs8bit(*InputFormat)) {
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);
}
else
{
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);
}
@@ -1363,13 +1358,13 @@
return c16;
}
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;
cmsUInt32Number i;
@@ -1380,13 +1375,13 @@
}
}
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;
for (i=0; i < Data ->nCurves; i++) {
@@ -1394,13 +1389,13 @@
}
}
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;
for (i=0; i < Lut ->InputChannels; i++) {
@@ -1421,11 +1416,11 @@
cmsPipeline* Dest = NULL;
cmsStage* mpe;
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?
for (mpe = cmsPipelineGetPtrToFirstStage(Src);
mpe != NULL;
@@ -1471,28 +1466,27 @@
GammaTables = NULL;
}
// 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;
*dwFlags |= cmsFLAGS_NOCACHE;
_cmsPipelineSetOptimizationParameters(Dest, FastEvaluateCurves8, c16, CurvesFree, CurvesDup);
}
else {
-
- _cmsStageToneCurvesData* Data = (_cmsStageToneCurvesData*) cmsStageData(ObtainedCurves);
Curves16Data* c16 = CurvesAlloc(Dest ->ContextID, Data ->nCurves, 65536, Data ->TheCurves);
if (c16 == NULL) goto Error;
*dwFlags |= cmsFLAGS_NOCACHE;
_cmsPipelineSetOptimizationParameters(Dest, FastEvaluateCurves16, c16, CurvesFree, CurvesDup);
@@ -1555,13 +1549,13 @@
// A fast matrix-shaper evaluator for 8 bits. This is a bit ticky since I'm using 1.14 signed fixed point
// 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;
cmsUInt32Number ri, gi, bi;
@@ -1797,12 +1791,12 @@
}
else {
_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
SetMatShaper(Dest, mpeC1 ->TheCurves, &res, (cmsVEC3*) Offset, mpeC2->TheCurves, OutputFormat);
}
< prev index next >