summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarti Maria <info@littlecms.com>2012-02-24 11:56:06 +0100
committerMarti Maria <info@littlecms.com>2012-02-24 11:56:06 +0100
commit4d9557eea21946e7c0d682d607d42d327f73d076 (patch)
tree86c859a2f600a9efcc5e91f4b2164cc10d881f57
parente47bbcb41fff93a3737e0b41914541d0af815173 (diff)
downloadlcms2-4d9557eea21946e7c0d682d607d42d327f73d076.tar.gz
Several bugfixing
-rw-r--r--AUTHORS1
-rw-r--r--ChangeLog4
-rw-r--r--src/cmscnvrt.c4
-rw-r--r--src/cmsintrp.c109
4 files changed, 7 insertions, 111 deletions
diff --git a/AUTHORS b/AUTHORS
index 1f4c01c..2408bd6 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -32,3 +32,4 @@ Jos Vernon (WebSupergoo)
Harald Schneider (Maxon)
Christian Albrecht
Dimitrios Anastassakis
+Lemke Software
diff --git a/ChangeLog b/ChangeLog
index 793d74d..55b40ea 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -58,4 +58,6 @@ Added compatibilty with Argyll's CGATS parser
-----------------------
Fixed a bug in the named color devicelink generation
-Fixed uint64 to work in systems without long long native type \ No newline at end of file
+Fixed uint64 to work in systems without long long native type
+Added performance improvements from several contributors, mostly artifex
+Fixed a bug in black preservation checking \ No newline at end of file
diff --git a/src/cmscnvrt.c b/src/cmscnvrt.c
index e184e20..647a60e 100644
--- a/src/cmscnvrt.c
+++ b/src/cmscnvrt.c
@@ -863,8 +863,8 @@ cmsPipeline* BlackPreservingKPlaneIntents(cmsContext ContextID,
// Check for non-cmyk profiles
if (cmsGetColorSpace(hProfiles[0]) != cmsSigCmykData ||
- cmsGetColorSpace(hProfiles[nProfiles-1]) != cmsSigCmykData ||
- cmsGetDeviceClass(hProfiles[nProfiles-1]) != cmsSigOutputClass)
+ !(cmsGetColorSpace(hProfiles[nProfiles-1]) == cmsSigCmykData ||
+ cmsGetDeviceClass(hProfiles[nProfiles-1]) == cmsSigOutputClass))
return DefaultICCintents(ContextID, nProfiles, ICCIntents, hProfiles, BPC, AdaptationStates, dwFlags);
// Allocate an empty LUT for holding the result
diff --git a/src/cmsintrp.c b/src/cmsintrp.c
index bd71dec..9634004 100644
--- a/src/cmsintrp.c
+++ b/src/cmsintrp.c
@@ -675,111 +675,6 @@ void TetrahedralInterpFloat(const cmsFloat32Number Input[],
-#if 0
-
-#define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan])
-
-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;
- cmsS15Fixed16Number c0, c1, c2, c3, Rest;
- cmsUInt32Number OutChan;
- cmsS15Fixed16Number X0, X1, Y0, Y1, Z0, Z1;
- cmsUInt32Number TotalOut = p -> nOutputs;
-
-
- fx = _cmsToFixedDomain((int) Input[0] * p -> Domain[0]);
- fy = _cmsToFixedDomain((int) Input[1] * p -> Domain[1]);
- fz = _cmsToFixedDomain((int) Input[2] * p -> Domain[2]);
-
- x0 = FIXED_TO_INT(fx);
- y0 = FIXED_TO_INT(fy);
- z0 = FIXED_TO_INT(fz);
-
- rx = FIXED_REST_TO_INT(fx);
- ry = FIXED_REST_TO_INT(fy);
- rz = FIXED_REST_TO_INT(fz);
-
- X0 = p -> opta[2] * x0;
- X1 = X0 + (Input[0] == 0xFFFFU ? 0 : p->opta[2]);
-
- Y0 = p -> opta[1] * y0;
- Y1 = Y0 + (Input[1] == 0xFFFFU ? 0 : p->opta[1]);
-
- Z0 = p -> opta[0] * z0;
- Z1 = Z0 + (Input[2] == 0xFFFFU ? 0 : p->opta[0]);
-
- // These are the 6 Tetrahedral
- for (OutChan=0; OutChan < TotalOut; OutChan++) {
-
- c0 = DENS(X0, Y0, Z0);
-
- if (rx >= ry && ry >= rz) {
-
- c1 = DENS(X1, Y0, Z0) - c0;
- c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0);
- c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0);
-
- }
- else
- if (rx >= rz && rz >= ry) {
-
- c1 = DENS(X1, Y0, Z0) - c0;
- c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1);
- c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0);
-
- }
- else
- if (rz >= rx && rx >= ry) {
-
- c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1);
- c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1);
- c3 = DENS(X0, Y0, Z1) - c0;
-
- }
- else
- if (ry >= rx && rx >= rz) {
-
- c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0);
- c2 = DENS(X0, Y1, Z0) - c0;
- c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0);
-
- }
- else
- if (ry >= rz && rz >= rx) {
-
- c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1);
- c2 = DENS(X0, Y1, Z0) - c0;
- c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0);
-
- }
- else
- if (rz >= ry && ry >= rx) {
-
- c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1);
- c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1);
- c3 = DENS(X0, Y0, Z1) - c0;
-
- }
- else {
- c1 = c2 = c3 = 0;
- }
-
- Rest = c1 * rx + c2 * ry + c3 * rz;
-
- Output[OutChan] = (cmsUInt16Number) c0 + ROUND_FIXED_TO_INT(_cmsToFixedDomain(Rest));
- }
-
-}
-#undef DENS
-
-#else
static
void TetrahedralInterp16(register const cmsUInt16Number Input[],
@@ -817,7 +712,7 @@ void TetrahedralInterp16(register const cmsUInt16Number Input[],
LutTable = &LutTable[X0+Y0+Z0];
- // The old code used: x = ROUND_FIXED_TO_INT(_cmsToFixedDomain(Rest))
+ // Output should be computed as x = ROUND_FIXED_TO_INT(_cmsToFixedDomain(Rest))
// which expands as: x = (Rest + ((Rest+0x7fff)/0xFFFF) + 0x8000)>>16
// This can be replaced by: t = Rest+0x8001, x = (t + (t>>16))>>16
// at the cost of being off by one at 7fff and 17ffe.
@@ -914,8 +809,6 @@ void TetrahedralInterp16(register const cmsUInt16Number Input[],
}
-#endif
-
#define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan])
static
void Eval4Inputs(register const cmsUInt16Number Input[],