diff options
author | Robin Watts <Robin.Watts@artifex.com> | 2019-09-09 14:19:33 +0100 |
---|---|---|
committer | Robin Watts <Robin.Watts@artifex.com> | 2019-09-09 14:40:02 +0100 |
commit | bc48c29c5e86e6c528e23140c71ecfb58588333f (patch) | |
tree | fa968ff3dc83b98fe66256355fb469496968ecf7 /lcms2mt | |
parent | 63e1fd40674a4f89f6593098cf100382061753e5 (diff) | |
download | ghostpdl-bc48c29c5e86e6c528e23140c71ecfb58588333f.tar.gz |
Optimise Eval{5,6,7,8}Inputs{,Float}.
Only use 1 Temporary array, and avoid needless work in the
0xFFFF cases.
Diffstat (limited to 'lcms2mt')
-rw-r--r-- | lcms2mt/src/cmsintrp.c | 388 |
1 files changed, 156 insertions, 232 deletions
diff --git a/lcms2mt/src/cmsintrp.c b/lcms2mt/src/cmsintrp.c index 3585e4fd6..b6846f693 100644 --- a/lcms2mt/src/cmsintrp.c +++ b/lcms2mt/src/cmsintrp.c @@ -1180,41 +1180,27 @@ void Eval5Inputs(cmsContext ContextID, 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; - const cmsUInt16Number* T; - cmsUInt32Number i; - cmsUInt16Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS]; - cmsInterpParams p1; - - - fk = _cmsToFixedDomain((cmsS15Fixed16Number) Input[0] * p16 -> Domain[0]); - k0 = FIXED_TO_INT(fk); - rk = FIXED_REST_TO_INT(fk); - - K0 = p16 -> opta[4] * k0; - K1 = p16 -> opta[4] * (k0 + (Input[0] != 0xFFFFU ? 1 : 0)); - - p1 = *p16; - memmove(&p1.Domain[0], &p16 ->Domain[1], 4*sizeof(cmsUInt32Number)); + cmsS15Fixed16Number fk; + cmsUInt32Number i, n; + cmsUInt16Number Tmp[MAX_STAGE_CHANNELS]; + cmsInterpParams p1 = *p16; - T = LutTable + K0; - p1.Table = T; + memmove(&p1.Domain[0], &p16 ->Domain[1], 4*sizeof(cmsUInt32Number)); + fk = _cmsToFixedDomain((cmsS15Fixed16Number) Input[0] * p16 -> Domain[0]); + p1.Table = ((cmsUInt16Number*)p16 -> Table) + p16 -> opta[4] * FIXED_TO_INT(fk); - Eval4Inputs(ContextID, Input + 1, Tmp1, &p1); + Eval4Inputs(ContextID, Input + 1, Output, &p1); - T = LutTable + K1; - p1.Table = T; + if (Input[0] == 0xFFFFU) + return; - Eval4Inputs(ContextID, Input + 1, Tmp2, &p1); - - for (i=0; i < p16 -> nOutputs; i++) { - - Output[i] = LinearInterp(rk, Tmp1[i], Tmp2[i]); - } + p1.Table = ((cmsUInt16Number*)p1.Table) + p16 -> opta[4]; + Eval4Inputs(ContextID, Input + 1, Tmp, &p1); + fk = FIXED_REST_TO_INT(fk); + n = p16 -> nOutputs; + for (i=0; i < n; i++) + Output[i] = LinearInterp(fk, Output[i], Tmp[i]); } @@ -1223,42 +1209,36 @@ void Eval5InputsFloat(cmsContext ContextID, const cmsFloat32Number Input[], cmsFloat32Number Output[], const cmsInterpParams* p) { - const cmsFloat32Number* LutTable = (cmsFloat32Number*) p -> Table; - cmsFloat32Number rest; - cmsFloat32Number pk; - int k0, K0, K1; - const cmsFloat32Number* T; - cmsUInt32Number i; - cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS]; - cmsInterpParams p1; - - pk = fclamp(Input[0]) * p->Domain[0]; - k0 = _cmsQuickFloor(pk); - rest = pk - (cmsFloat32Number) k0; + cmsFloat32Number rest; + cmsFloat32Number pk; + int k0; + cmsUInt32Number i, n; + cmsFloat32Number Tmp[MAX_STAGE_CHANNELS]; + cmsInterpParams p1 = *p; + cmsFloat32Number i0 = fclamp(Input[0]); - K0 = p -> opta[4] * k0; - K1 = K0 + (fclamp(Input[0]) >= 1.0 ? 0 : p->opta[4]); + pk = i0 * p->Domain[0]; + k0 = _cmsQuickFloor(pk); + rest = pk - (cmsFloat32Number) k0; - p1 = *p; - memmove(&p1.Domain[0], &p ->Domain[1], 4*sizeof(cmsUInt32Number)); + memmove(&p1.Domain[0], &p ->Domain[1], 4*sizeof(cmsUInt32Number)); + p1.Table = ((cmsFloat32Number*) p -> Table) + p -> opta[4] * k0; - T = LutTable + K0; - p1.Table = T; + Eval4InputsFloat(ContextID, Input + 1, Output, &p1); - Eval4InputsFloat(ContextID, Input + 1, Tmp1, &p1); + if (i0 == 1.0) + return; - T = LutTable + K1; - p1.Table = T; + p1.Table = ((cmsFloat32Number*) p1.Table) + p->opta[4]; + Eval4InputsFloat(ContextID, Input + 1, Tmp, &p1); - Eval4InputsFloat(ContextID, Input + 1, Tmp2, &p1); + n = p -> nOutputs; + for (i=0; i < n; i++) { + cmsFloat32Number y0 = Output[i]; + cmsFloat32Number y1 = Tmp[i]; - for (i=0; i < p -> nOutputs; i++) { - - cmsFloat32Number y0 = Tmp1[i]; - cmsFloat32Number y1 = Tmp2[i]; - - Output[i] = y0 + (y1 - y0) * rest; - } + Output[i] = y0 + (y1 - y0) * rest; + } } @@ -1268,40 +1248,27 @@ void Eval6Inputs(cmsContext ContextID, 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; - const cmsUInt16Number* T; - cmsUInt32Number i; - cmsUInt16Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS]; - cmsInterpParams p1; - - fk = _cmsToFixedDomain((cmsS15Fixed16Number) Input[0] * p16 -> Domain[0]); - k0 = FIXED_TO_INT(fk); - rk = FIXED_REST_TO_INT(fk); - - K0 = p16 -> opta[5] * k0; - K1 = p16 -> opta[5] * (k0 + (Input[0] != 0xFFFFU ? 1 : 0)); - - p1 = *p16; - memmove(&p1.Domain[0], &p16 ->Domain[1], 5*sizeof(cmsUInt32Number)); - - T = LutTable + K0; - p1.Table = T; + cmsS15Fixed16Number fk; + cmsUInt32Number i, n; + cmsUInt16Number Tmp[MAX_STAGE_CHANNELS]; + cmsInterpParams p1 = *p16; - Eval5Inputs(ContextID, Input + 1, Tmp1, &p1); + memmove(&p1.Domain[0], &p16 ->Domain[1], 5*sizeof(cmsUInt32Number)); + fk = _cmsToFixedDomain((cmsS15Fixed16Number) Input[0] * p16 -> Domain[0]); + p1.Table = ((cmsUInt16Number*)p16 -> Table) + p16 -> opta[5] * FIXED_TO_INT(fk); - T = LutTable + K1; - p1.Table = T; + Eval5Inputs(ContextID, Input + 1, Output, &p1); - Eval5Inputs(ContextID, Input + 1, Tmp2, &p1); + if (Input[0] == 0xFFFFU) + return; - for (i=0; i < p16 -> nOutputs; i++) { - - Output[i] = LinearInterp(rk, Tmp1[i], Tmp2[i]); - } + p1.Table = ((cmsUInt16Number*)p1.Table) + p16 -> opta[5]; + Eval5Inputs(ContextID, Input + 1, Tmp, &p1); + fk = FIXED_REST_TO_INT(fk); + n = p16 -> nOutputs; + for (i=0; i < n; i++) + Output[i] = LinearInterp(fk, Output[i], Tmp[i]); } @@ -1310,42 +1277,36 @@ void Eval6InputsFloat(cmsContext ContextID, const cmsFloat32Number Input[], cmsFloat32Number Output[], const cmsInterpParams* p) { - const cmsFloat32Number* LutTable = (cmsFloat32Number*) p -> Table; - cmsFloat32Number rest; - cmsFloat32Number pk; - int k0, K0, K1; - const cmsFloat32Number* T; - cmsUInt32Number i; - cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS]; - cmsInterpParams p1; - - pk = fclamp(Input[0]) * p->Domain[0]; - k0 = _cmsQuickFloor(pk); - rest = pk - (cmsFloat32Number) k0; + cmsFloat32Number rest; + cmsFloat32Number pk; + int k0; + cmsUInt32Number i, n; + cmsFloat32Number Tmp[MAX_STAGE_CHANNELS]; + cmsInterpParams p1 = *p; + cmsFloat32Number i0 = fclamp(Input[0]); - K0 = p -> opta[5] * k0; - K1 = K0 + (fclamp(Input[0]) >= 1.0 ? 0 : p->opta[5]); + pk = i0 * p->Domain[0]; + k0 = _cmsQuickFloor(pk); + rest = pk - (cmsFloat32Number) k0; - p1 = *p; - memmove(&p1.Domain[0], &p ->Domain[1], 5*sizeof(cmsUInt32Number)); + memmove(&p1.Domain[0], &p ->Domain[1], 5*sizeof(cmsUInt32Number)); + p1.Table = ((cmsFloat32Number*) p -> Table) + p -> opta[5] * k0; - T = LutTable + K0; - p1.Table = T; + Eval5InputsFloat(ContextID, Input + 1, Output, &p1); - Eval5InputsFloat(ContextID, Input + 1, Tmp1, &p1); + if (i0 == 1.0) + return; - T = LutTable + K1; - p1.Table = T; + p1.Table = ((cmsFloat32Number*) p1.Table) + p->opta[5]; + Eval5InputsFloat(ContextID, Input + 1, Tmp, &p1); - Eval5InputsFloat(ContextID, Input + 1, Tmp2, &p1); + n = p -> nOutputs; + for (i=0; i < n; i++) { + cmsFloat32Number y0 = Output[i]; + cmsFloat32Number y1 = Tmp[i]; - for (i=0; i < p -> nOutputs; i++) { - - cmsFloat32Number y0 = Tmp1[i]; - cmsFloat32Number y1 = Tmp2[i]; - - Output[i] = y0 + (y1 - y0) * rest; - } + Output[i] = y0 + (y1 - y0) * rest; + } } @@ -1354,39 +1315,27 @@ void Eval7Inputs(cmsContext ContextID, 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; - const cmsUInt16Number* T; - cmsUInt32Number i; - cmsUInt16Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS]; - cmsInterpParams p1; - - - fk = _cmsToFixedDomain((cmsS15Fixed16Number) Input[0] * p16 -> Domain[0]); - k0 = FIXED_TO_INT(fk); - rk = FIXED_REST_TO_INT(fk); - - K0 = p16 -> opta[6] * k0; - K1 = p16 -> opta[6] * (k0 + (Input[0] != 0xFFFFU ? 1 : 0)); + cmsS15Fixed16Number fk; + cmsUInt32Number i, n; + cmsUInt16Number Tmp[MAX_STAGE_CHANNELS]; + cmsInterpParams p1 = *p16; - p1 = *p16; - memmove(&p1.Domain[0], &p16 ->Domain[1], 6*sizeof(cmsUInt32Number)); + memmove(&p1.Domain[0], &p16 ->Domain[1], 6*sizeof(cmsUInt32Number)); + fk = _cmsToFixedDomain((cmsS15Fixed16Number) Input[0] * p16 -> Domain[0]); + p1.Table = ((cmsUInt16Number*)p16 -> Table) + p16 -> opta[6] * FIXED_TO_INT(fk); - T = LutTable + K0; - p1.Table = T; + Eval6Inputs(ContextID, Input + 1, Output, &p1); - Eval6Inputs(ContextID, Input + 1, Tmp1, &p1); + if (Input[0] == 0xFFFFU) + return; - T = LutTable + K1; - p1.Table = T; + p1.Table = ((cmsUInt16Number*)p1.Table) + p16 -> opta[6]; + Eval6Inputs(ContextID, Input + 1, Tmp, &p1); - Eval6Inputs(ContextID, Input + 1, Tmp2, &p1); - - for (i=0; i < p16 -> nOutputs; i++) { - Output[i] = LinearInterp(rk, Tmp1[i], Tmp2[i]); - } + fk = FIXED_REST_TO_INT(fk); + n = p16 -> nOutputs; + for (i=0; i < n; i++) + Output[i] = LinearInterp(fk, Output[i], Tmp[i]); } @@ -1395,44 +1344,36 @@ void Eval7InputsFloat(cmsContext ContextID, const cmsFloat32Number Input[], cmsFloat32Number Output[], const cmsInterpParams* p) { - const cmsFloat32Number* LutTable = (cmsFloat32Number*) p -> Table; - cmsFloat32Number rest; - cmsFloat32Number pk; - int k0, K0, K1; - const cmsFloat32Number* T; - cmsUInt32Number i; - cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS]; - cmsInterpParams p1; - - pk = fclamp(Input[0]) * p->Domain[0]; - k0 = _cmsQuickFloor(pk); - rest = pk - (cmsFloat32Number) k0; - - K0 = p -> opta[6] * k0; - K1 = K0 + (fclamp(Input[0]) >= 1.0 ? 0 : p->opta[6]); - - p1 = *p; - memmove(&p1.Domain[0], &p ->Domain[1], 6*sizeof(cmsUInt32Number)); - - T = LutTable + K0; - p1.Table = T; - - Eval6InputsFloat(ContextID, Input + 1, Tmp1, &p1); + cmsFloat32Number rest; + cmsFloat32Number pk; + int k0; + cmsUInt32Number i, n; + cmsFloat32Number Tmp[MAX_STAGE_CHANNELS]; + cmsInterpParams p1 = *p; + cmsFloat32Number i0 = fclamp(Input[0]); - T = LutTable + K1; - p1.Table = T; + pk = i0 * p->Domain[0]; + k0 = _cmsQuickFloor(pk); + rest = pk - (cmsFloat32Number) k0; - Eval6InputsFloat(ContextID, Input + 1, Tmp2, &p1); + memmove(&p1.Domain[0], &p ->Domain[1], 6*sizeof(cmsUInt32Number)); + p1.Table = ((cmsFloat32Number*) p -> Table) + p -> opta[6] * k0; + Eval6InputsFloat(ContextID, Input + 1, Output, &p1); - for (i=0; i < p -> nOutputs; i++) { + if (i0 == 1.0) + return; - cmsFloat32Number y0 = Tmp1[i]; - cmsFloat32Number y1 = Tmp2[i]; + p1.Table = ((cmsFloat32Number*) p1.Table) + p->opta[6]; + Eval6InputsFloat(ContextID, Input + 1, Tmp, &p1); - Output[i] = y0 + (y1 - y0) * rest; + n = p -> nOutputs; + for (i=0; i < n; i++) { + cmsFloat32Number y0 = Output[i]; + cmsFloat32Number y1 = Tmp[i]; - } + Output[i] = y0 + (y1 - y0) * rest; + } } static CMS_NO_SANITIZE @@ -1440,37 +1381,27 @@ void Eval8Inputs(cmsContext ContextID, 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; - const cmsUInt16Number* T; - cmsUInt32Number i; - cmsUInt16Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS]; - cmsInterpParams p1; - - fk = _cmsToFixedDomain((cmsS15Fixed16Number) Input[0] * p16 -> Domain[0]); - k0 = FIXED_TO_INT(fk); - rk = FIXED_REST_TO_INT(fk); - - K0 = p16 -> opta[7] * k0; - K1 = p16 -> opta[7] * (k0 + (Input[0] != 0xFFFFU ? 1 : 0)); + cmsS15Fixed16Number fk; + cmsUInt32Number i, n; + cmsUInt16Number Tmp[MAX_STAGE_CHANNELS]; + cmsInterpParams p1 = *p16; - p1 = *p16; - memmove(&p1.Domain[0], &p16 ->Domain[1], 7*sizeof(cmsUInt32Number)); + memmove(&p1.Domain[0], &p16 ->Domain[1], 7*sizeof(cmsUInt32Number)); + fk = _cmsToFixedDomain((cmsS15Fixed16Number) Input[0] * p16 -> Domain[0]); + p1.Table = ((cmsUInt16Number*)p16 -> Table) + p16 -> opta[7] * FIXED_TO_INT(fk); - T = LutTable + K0; - p1.Table = T; + Eval7Inputs(ContextID, Input + 1, Output, &p1); - Eval7Inputs(ContextID, Input + 1, Tmp1, &p1); + if (Input[0] == 0xFFFFU) + return; - T = LutTable + K1; - p1.Table = T; - Eval7Inputs(ContextID, Input + 1, Tmp2, &p1); + p1.Table = ((cmsUInt16Number*)p1.Table) + p16 -> opta[7]; + Eval7Inputs(ContextID, Input + 1, Tmp, &p1); - for (i=0; i < p16 -> nOutputs; i++) { - Output[i] = LinearInterp(rk, Tmp1[i], Tmp2[i]); - } + fk = FIXED_REST_TO_INT(fk); + n = p16 -> nOutputs; + for (i=0; i < n; i++) + Output[i] = LinearInterp(fk, Output[i], Tmp[i]); } @@ -1480,43 +1411,36 @@ void Eval8InputsFloat(cmsContext ContextID, const cmsFloat32Number Input[], cmsFloat32Number Output[], const cmsInterpParams* p) { - const cmsFloat32Number* LutTable = (cmsFloat32Number*) p -> Table; - cmsFloat32Number rest; - cmsFloat32Number pk; - int k0, K0, K1; - const cmsFloat32Number* T; - cmsUInt32Number i; - cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS]; - cmsInterpParams p1; + cmsFloat32Number rest; + cmsFloat32Number pk; + int k0; + cmsUInt32Number i, n; + cmsFloat32Number Tmp[MAX_STAGE_CHANNELS]; + cmsInterpParams p1 = *p; + cmsFloat32Number i0 = fclamp(Input[0]); - pk = fclamp(Input[0]) * p->Domain[0]; - k0 = _cmsQuickFloor(pk); - rest = pk - (cmsFloat32Number) k0; + pk = i0 * p->Domain[0]; + k0 = _cmsQuickFloor(pk); + rest = pk - (cmsFloat32Number) k0; - K0 = p -> opta[7] * k0; - K1 = K0 + (fclamp(Input[0]) >= 1.0 ? 0 : p->opta[7]); + memmove(&p1.Domain[0], &p ->Domain[1], 7*sizeof(cmsUInt32Number)); + p1.Table = ((cmsFloat32Number*) p -> Table) + p -> opta[7] * k0; - p1 = *p; - memmove(&p1.Domain[0], &p ->Domain[1], 7*sizeof(cmsUInt32Number)); + Eval7InputsFloat(ContextID, Input + 1, Output, &p1); - T = LutTable + K0; - p1.Table = T; + if (i0 == 1.0) + return; - Eval7InputsFloat(ContextID, Input + 1, Tmp1, &p1); + p1.Table = ((cmsFloat32Number*) p1.Table) + p->opta[7]; + Eval7InputsFloat(ContextID, Input + 1, Tmp, &p1); - T = LutTable + K1; - p1.Table = T; + n = p -> nOutputs; + for (i=0; i < n; i++) { + cmsFloat32Number y0 = Output[i]; + cmsFloat32Number y1 = Tmp[i]; - Eval7InputsFloat(ContextID, Input + 1, Tmp2, &p1); - - - for (i=0; i < p -> nOutputs; i++) { - - cmsFloat32Number y0 = Tmp1[i]; - cmsFloat32Number y1 = Tmp2[i]; - - Output[i] = y0 + (y1 - y0) * rest; - } + Output[i] = y0 + (y1 - y0) * rest; + } } // The default factory |