< 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 >