< prev index next >

src/java.desktop/share/native/liblcms/cmsintrp.c

Print this page

        

*** 28,38 **** // file: // //--------------------------------------------------------------------------------- // // Little Color Management System ! // Copyright (c) 1998-2017 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, --- 28,38 ---- // file: // //--------------------------------------------------------------------------------- // // Little Color Management System ! // 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,
*** 208,254 **** if (p != NULL) _cmsFree(p ->ContextID, p); } // Inline fixed point interpolation ! cmsINLINE cmsUInt16Number LinearInterp(cmsS15Fixed16Number a, cmsS15Fixed16Number l, cmsS15Fixed16Number h) { cmsUInt32Number dif = (cmsUInt32Number) (h - l) * a + 0x8000; dif = (dif >> 16) + l; return (cmsUInt16Number) (dif); } // Linear interpolation (Fixed-point optimized) static ! void LinLerp1D(register const cmsUInt16Number Value[], ! register cmsUInt16Number Output[], ! register const cmsInterpParams* p) { cmsUInt16Number y1, y0; int cell0, rest; int val3; const cmsUInt16Number* LutTable = (cmsUInt16Number*) p ->Table; // if last value... if (Value[0] == 0xffff) { Output[0] = LutTable[p -> Domain[0]]; - return; } ! ! val3 = p -> Domain[0] * Value[0]; val3 = _cmsToFixedDomain(val3); // To fixed 15.16 cell0 = FIXED_TO_INT(val3); // Cell is 16 MSB bits rest = FIXED_REST_TO_INT(val3); // Rest is 16 LSB bits y0 = LutTable[cell0]; ! y1 = LutTable[cell0+1]; ! Output[0] = LinearInterp(rest, y0, y1); } // To prevent out of bounds indexing cmsINLINE cmsFloat32Number fclamp(cmsFloat32Number v) { --- 208,254 ---- if (p != NULL) _cmsFree(p ->ContextID, p); } // Inline fixed point interpolation ! cmsINLINE CMS_NO_SANITIZE cmsUInt16Number LinearInterp(cmsS15Fixed16Number a, cmsS15Fixed16Number l, cmsS15Fixed16Number h) { cmsUInt32Number dif = (cmsUInt32Number) (h - l) * a + 0x8000; dif = (dif >> 16) + l; return (cmsUInt16Number) (dif); } // Linear interpolation (Fixed-point optimized) static ! void LinLerp1D(CMSREGISTER const cmsUInt16Number Value[], ! CMSREGISTER cmsUInt16Number Output[], ! CMSREGISTER const cmsInterpParams* p) { cmsUInt16Number y1, y0; int cell0, rest; int val3; const cmsUInt16Number* LutTable = (cmsUInt16Number*) p ->Table; // if last value... if (Value[0] == 0xffff) { Output[0] = LutTable[p -> Domain[0]]; } ! else ! { ! val3 = p->Domain[0] * Value[0]; val3 = _cmsToFixedDomain(val3); // To fixed 15.16 cell0 = FIXED_TO_INT(val3); // Cell is 16 MSB bits rest = FIXED_REST_TO_INT(val3); // Rest is 16 LSB bits y0 = LutTable[cell0]; ! y1 = LutTable[cell0 + 1]; Output[0] = LinearInterp(rest, y0, y1); + } } // To prevent out of bounds indexing cmsINLINE cmsFloat32Number fclamp(cmsFloat32Number v) {
*** 269,302 **** val2 = fclamp(Value[0]); // if last value... if (val2 == 1.0) { Output[0] = LutTable[p -> Domain[0]]; - return; } ! val2 *= p -> Domain[0]; ! ! cell0 = (int) floor(val2); ! cell1 = (int) ceil(val2); // Rest is 16 LSB bits rest = val2 - cell0; ! y0 = LutTable[cell0] ; ! y1 = LutTable[cell1] ; Output[0] = y0 + (y1 - y0) * rest; } // Eval gray LUT having only one input channel ! static ! void Eval1Input(register const cmsUInt16Number Input[], ! register cmsUInt16Number Output[], ! register const cmsInterpParams* p16) { cmsS15Fixed16Number fk; cmsS15Fixed16Number k0, k1, rk, K0, K1; int v; cmsUInt32Number OutChan; --- 269,303 ---- val2 = fclamp(Value[0]); // if last value... if (val2 == 1.0) { Output[0] = LutTable[p -> Domain[0]]; } + else + { + val2 *= p->Domain[0]; ! cell0 = (int)floor(val2); ! cell1 = (int)ceil(val2); // Rest is 16 LSB bits rest = val2 - cell0; ! y0 = LutTable[cell0]; ! y1 = LutTable[cell1]; Output[0] = y0 + (y1 - y0) * rest; + } } // Eval gray LUT having only one input channel ! static CMS_NO_SANITIZE ! void Eval1Input(CMSREGISTER const cmsUInt16Number Input[], ! CMSREGISTER cmsUInt16Number Output[], ! CMSREGISTER const cmsInterpParams* p16) { cmsS15Fixed16Number fk; cmsS15Fixed16Number k0, k1, rk, K0, K1; int v; cmsUInt32Number OutChan;
*** 335,366 **** val2 = fclamp(Value[0]); // if last value... if (val2 == 1.0) { - Output[0] = LutTable[p -> Domain[0]]; - return; - } ! val2 *= p -> Domain[0]; ! cell0 = (int) floor(val2); ! cell1 = (int) ceil(val2); // Rest is 16 LSB bits rest = val2 - cell0; ! cell0 *= p -> opta[0]; ! cell1 *= p -> opta[0]; ! for (OutChan=0; OutChan < p->nOutputs; OutChan++) { ! y0 = LutTable[cell0 + OutChan] ; ! y1 = LutTable[cell1 + OutChan] ; Output[OutChan] = y0 + (y1 - y0) * rest; } } // Bilinear interpolation (16 bits) - cmsFloat32Number version static void BilinearInterpFloat(const cmsFloat32Number Input[], --- 336,373 ---- val2 = fclamp(Value[0]); // if last value... if (val2 == 1.0) { ! y0 = LutTable[p->Domain[0]]; ! for (OutChan = 0; OutChan < p->nOutputs; OutChan++) { ! Output[OutChan] = y0; ! } ! } ! else ! { ! val2 *= p->Domain[0]; ! ! cell0 = (int)floor(val2); ! cell1 = (int)ceil(val2); // Rest is 16 LSB bits rest = val2 - cell0; ! cell0 *= p->opta[0]; ! cell1 *= p->opta[0]; ! for (OutChan = 0; OutChan < p->nOutputs; OutChan++) { ! y0 = LutTable[cell0 + OutChan]; ! y1 = LutTable[cell1 + OutChan]; Output[OutChan] = y0 + (y1 - y0) * rest; } + } } // Bilinear interpolation (16 bits) - cmsFloat32Number version static void BilinearInterpFloat(const cmsFloat32Number Input[],
*** 413,437 **** # undef LERP # undef DENS } // Bilinear interpolation (16 bits) - optimized version ! static ! void BilinearInterp16(register const cmsUInt16Number Input[], ! register cmsUInt16Number Output[], ! register const cmsInterpParams* p) { #define DENS(i,j) (LutTable[(i)+(j)+OutChan]) #define LERP(a,l,h) (cmsUInt16Number) (l + ROUND_FIXED_TO_INT(((h-l)*a))) const cmsUInt16Number* LutTable = (cmsUInt16Number*) p ->Table; int OutChan, TotalOut; cmsS15Fixed16Number fx, fy; ! register int rx, ry; int x0, y0; ! register int X0, X1, Y0, Y1; int d00, d01, d10, d11, dx0, dx1, dxy; TotalOut = p -> nOutputs; --- 420,444 ---- # undef LERP # undef DENS } // Bilinear interpolation (16 bits) - optimized version ! static CMS_NO_SANITIZE ! void BilinearInterp16(CMSREGISTER const cmsUInt16Number Input[], ! CMSREGISTER cmsUInt16Number Output[], ! CMSREGISTER const cmsInterpParams* p) { #define DENS(i,j) (LutTable[(i)+(j)+OutChan]) #define LERP(a,l,h) (cmsUInt16Number) (l + ROUND_FIXED_TO_INT(((h-l)*a))) const cmsUInt16Number* LutTable = (cmsUInt16Number*) p ->Table; int OutChan, TotalOut; cmsS15Fixed16Number fx, fy; ! CMSREGISTER int rx, ry; int x0, y0; ! CMSREGISTER int X0, X1, Y0, Y1; int d00, d01, d10, d11, dx0, dx1, dxy; TotalOut = p -> nOutputs;
*** 544,568 **** # undef LERP # undef DENS } // Trilinear interpolation (16 bits) - optimized version ! static ! void TrilinearInterp16(register const cmsUInt16Number Input[], ! register cmsUInt16Number Output[], ! register const cmsInterpParams* p) { #define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan]) #define LERP(a,l,h) (cmsUInt16Number) (l + ROUND_FIXED_TO_INT(((h-l)*a))) const cmsUInt16Number* LutTable = (cmsUInt16Number*) p ->Table; int OutChan, TotalOut; cmsS15Fixed16Number fx, fy, fz; ! register int rx, ry, rz; int x0, y0, z0; ! register int X0, X1, Y0, Y1, Z0, Z1; int d000, d001, d010, d011, d100, d101, d110, d111, dx00, dx01, dx10, dx11, dxy0, dxy1, dxyz; --- 551,575 ---- # undef LERP # undef DENS } // Trilinear interpolation (16 bits) - optimized version ! static CMS_NO_SANITIZE ! void TrilinearInterp16(CMSREGISTER const cmsUInt16Number Input[], ! CMSREGISTER cmsUInt16Number Output[], ! CMSREGISTER const cmsInterpParams* p) { #define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan]) #define LERP(a,l,h) (cmsUInt16Number) (l + ROUND_FIXED_TO_INT(((h-l)*a))) const cmsUInt16Number* LutTable = (cmsUInt16Number*) p ->Table; int OutChan, TotalOut; cmsS15Fixed16Number fx, fy, fz; ! CMSREGISTER int rx, ry, rz; int x0, y0, z0; ! CMSREGISTER int X0, X1, Y0, Y1, Z0, Z1; int d000, d001, d010, d011, d100, d101, d110, d111, dx00, dx01, dx10, dx11, dxy0, dxy1, dxyz;
*** 724,737 **** #undef DENS ! static ! void TetrahedralInterp16(register const cmsUInt16Number Input[], ! register cmsUInt16Number Output[], ! register const cmsInterpParams* p) { const cmsUInt16Number* LutTable = (cmsUInt16Number*) p -> Table; cmsS15Fixed16Number fx, fy, fz; cmsS15Fixed16Number rx, ry, rz; int x0, y0, z0; --- 731,744 ---- #undef DENS ! static CMS_NO_SANITIZE ! void TetrahedralInterp16(CMSREGISTER const cmsUInt16Number Input[], ! CMSREGISTER cmsUInt16Number Output[], ! CMSREGISTER const cmsInterpParams* p) { const cmsUInt16Number* LutTable = (cmsUInt16Number*) p -> Table; cmsS15Fixed16Number fx, fy, fz; cmsS15Fixed16Number rx, ry, rz; int x0, y0, z0;
*** 858,871 **** } } #define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan]) ! static ! void Eval4Inputs(register const cmsUInt16Number Input[], ! register cmsUInt16Number Output[], ! register const cmsInterpParams* p16) { const cmsUInt16Number* LutTable; cmsS15Fixed16Number fk; cmsS15Fixed16Number k0, rk; int K0, K1; --- 865,878 ---- } } #define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan]) ! static CMS_NO_SANITIZE ! void Eval4Inputs(CMSREGISTER const cmsUInt16Number Input[], ! CMSREGISTER cmsUInt16Number Output[], ! CMSREGISTER const cmsInterpParams* p16) { const cmsUInt16Number* LutTable; cmsS15Fixed16Number fk; cmsS15Fixed16Number k0, rk; int K0, K1;
*** 1087,1101 **** Output[i] = y0 + (y1 - y0) * rest; } } ! static ! void Eval5Inputs(register const cmsUInt16Number Input[], ! register cmsUInt16Number Output[], ! register const cmsInterpParams* p16) { const cmsUInt16Number* LutTable = (cmsUInt16Number*) p16 -> Table; cmsS15Fixed16Number fk; cmsS15Fixed16Number k0, rk; int K0, K1; --- 1094,1108 ---- Output[i] = y0 + (y1 - y0) * rest; } } ! static CMS_NO_SANITIZE ! void Eval5Inputs(CMSREGISTER const cmsUInt16Number Input[], ! CMSREGISTER cmsUInt16Number Output[], ! CMSREGISTER const cmsInterpParams* p16) { const cmsUInt16Number* LutTable = (cmsUInt16Number*) p16 -> Table; cmsS15Fixed16Number fk; cmsS15Fixed16Number k0, rk; int K0, K1;
*** 1176,1189 **** } } ! static ! void Eval6Inputs(register const cmsUInt16Number Input[], ! register cmsUInt16Number Output[], ! register const cmsInterpParams* p16) { const cmsUInt16Number* LutTable = (cmsUInt16Number*) p16 -> Table; cmsS15Fixed16Number fk; cmsS15Fixed16Number k0, rk; int K0, K1; --- 1183,1196 ---- } } ! static CMS_NO_SANITIZE ! void Eval6Inputs(CMSREGISTER const cmsUInt16Number Input[], ! CMSREGISTER cmsUInt16Number Output[], ! CMSREGISTER const cmsInterpParams* p16) { const cmsUInt16Number* LutTable = (cmsUInt16Number*) p16 -> Table; cmsS15Fixed16Number fk; cmsS15Fixed16Number k0, rk; int K0, K1;
*** 1262,1275 **** Output[i] = y0 + (y1 - y0) * rest; } } ! static ! void Eval7Inputs(register const cmsUInt16Number Input[], ! register cmsUInt16Number Output[], ! register const cmsInterpParams* p16) { const cmsUInt16Number* LutTable = (cmsUInt16Number*) p16 -> Table; cmsS15Fixed16Number fk; cmsS15Fixed16Number k0, rk; int K0, K1; --- 1269,1282 ---- Output[i] = y0 + (y1 - y0) * rest; } } ! static CMS_NO_SANITIZE ! void Eval7Inputs(CMSREGISTER const cmsUInt16Number Input[], ! CMSREGISTER cmsUInt16Number Output[], ! CMSREGISTER const cmsInterpParams* p16) { const cmsUInt16Number* LutTable = (cmsUInt16Number*) p16 -> Table; cmsS15Fixed16Number fk; cmsS15Fixed16Number k0, rk; int K0, K1;
*** 1348,1361 **** Output[i] = y0 + (y1 - y0) * rest; } } ! static ! void Eval8Inputs(register const cmsUInt16Number Input[], ! register cmsUInt16Number Output[], ! register const cmsInterpParams* p16) { const cmsUInt16Number* LutTable = (cmsUInt16Number*) p16 -> Table; cmsS15Fixed16Number fk; cmsS15Fixed16Number k0, rk; int K0, K1; --- 1355,1368 ---- Output[i] = y0 + (y1 - y0) * rest; } } ! static CMS_NO_SANITIZE ! void Eval8Inputs(CMSREGISTER const cmsUInt16Number Input[], ! CMSREGISTER cmsUInt16Number Output[], ! CMSREGISTER const cmsInterpParams* p16) { const cmsUInt16Number* LutTable = (cmsUInt16Number*) p16 -> Table; cmsS15Fixed16Number fk; cmsS15Fixed16Number k0, rk; int K0, K1;
< prev index next >