summaryrefslogtreecommitdiff
path: root/profile/invprofcheck.c
diff options
context:
space:
mode:
Diffstat (limited to 'profile/invprofcheck.c')
-rwxr-xr-x[-rw-r--r--]profile/invprofcheck.c116
1 files changed, 108 insertions, 8 deletions
diff --git a/profile/invprofcheck.c b/profile/invprofcheck.c
index 8cb9f34..5cb1101 100644..100755
--- a/profile/invprofcheck.c
+++ b/profile/invprofcheck.c
@@ -89,9 +89,12 @@ void usage(void) {
fprintf(stderr," -v [level] verbosity level (default 1), 2 to print each DE\n");
fprintf(stderr," -l limit set total ink limit (estimate by default)\n");
fprintf(stderr," -L klimit set black channel ink limit (estimate by default)\n");
+ fprintf(stderr," -i intent a = absolute, r = relative colorimetric (def.)\n");
+ fprintf(stderr," p = perceptual, s = saturation\n");
fprintf(stderr," -h high res test (%d)\n",HTRES);
fprintf(stderr," -u Ultra high res test (%d)\n",UHTRES);
fprintf(stderr," -R res Specific grid resolution\n");
+ fprintf(stderr," -I Do bwd to fwd check\n");
fprintf(stderr," -c Show CIE94 delta E values\n");
fprintf(stderr," -k Show CIEDE2000 delta E values\n");
fprintf(stderr," -w create %s visualisation (profile%s)\n",vrml_format(),vrml_ext());
@@ -124,9 +127,11 @@ main(
icmFile *rd_fp;
icc *icco;
int rv = 0;
+ int inv = 0;
int tres = TRES;
double tlimit = -1.0;
double klimit = -1.0;
+ icRenderingIntent intent = icRelativeColorimetric; /* Default */
vrml *wrl = NULL;
error_program = "invprofcheck";
@@ -165,8 +170,8 @@ main(
/* Resolution */
else if (argv[fa][1] == 'h' || argv[fa][1] == 'H') {
tres = HTRES;
-
}
+
/* Resolution */
else if (argv[fa][1] == 'u' || argv[fa][1] == 'U') {
tres = UHTRES;
@@ -175,18 +180,23 @@ main(
/* Resolution */
else if (argv[fa][1] == 'R') {
int res;
- fa = nfa;
if (na == NULL) usage();
+ fa = nfa;
res = atoi(na);
if (res < 2 || res > 500)
usage();
tres = res;
}
+ /* Inverse */
+ else if (argv[fa][1] == 'I') {
+ inv = 1;
+ }
+
else if (argv[fa][1] == 'l') {
int limit;
- fa = nfa;
if (na == NULL) usage();
+ fa = nfa;
limit = atoi(na);
if (limit < 1)
limit = 1;
@@ -195,14 +205,36 @@ main(
else if (argv[fa][1] == 'L') {
int limit;
- fa = nfa;
if (na == NULL) usage();
+ fa = nfa;
limit = atoi(na);
if (limit < 1)
limit = 1;
klimit = limit/100.0;
}
+ /* Intent */
+ else if (argv[fa][1] == 'i') {
+ if (na == NULL) usage();
+ fa = nfa;
+ switch (na[0]) {
+ case 'p':
+ intent = icPerceptual;
+ break;
+ case 'r':
+ intent = icRelativeColorimetric;
+ break;
+ case 's':
+ intent = icSaturation;
+ break;
+ case 'a':
+ intent = icAbsoluteColorimetric;
+ break;
+ default:
+ usage();
+ }
+ }
+
/* VRML/X3D */
else if (argv[fa][1] == 'w' || argv[fa][1] == 'W')
dovrml = 1;
@@ -235,7 +267,6 @@ main(
if (fa >= argc || argv[fa][0] == '-') usage();
strncpy(in_name,argv[fa++],MAXNAMEL); in_name[MAXNAMEL] = '\000';
-
strncpy(out_name,in_name,MAXNAMEL-4); out_name[MAXNAMEL-4] = '\000';
if ((xl = strrchr(out_name, '.')) == NULL) /* Figure where extention is */
xl = out_name + strlen(out_name);
@@ -265,7 +296,7 @@ main(
double nsamps = 0.0;
/* Get a Device to PCS conversion object */
- if ((luo1 = icco->get_luobj(icco, icmFwd, icRelativeColorimetric, icSigLabData, icmLuOrdNorm)) == NULL) {
+ if ((luo1 = icco->get_luobj(icco, icmFwd, intent, icSigLabData, icmLuOrdNorm)) == NULL) {
if ((luo1 = icco->get_luobj(icco, icmFwd, icmDefaultIntent, icSigLabData, icmLuOrdNorm)) == NULL)
error ("%d, %s",icco->errc, icco->err);
}
@@ -273,7 +304,7 @@ main(
luo1->spaces(luo1, &ins, &inn, &outs, &outn, NULL, NULL, NULL, NULL, NULL);
/* Get a PCS to Device conversion object */
- if ((luo2 = icco->get_luobj(icco, icmBwd, icRelativeColorimetric, icSigLabData, icmLuOrdNorm)) == NULL) {
+ if ((luo2 = icco->get_luobj(icco, icmBwd, intent, icSigLabData, icmLuOrdNorm)) == NULL) {
if ((luo2 = icco->get_luobj(icco, icmBwd, icmDefaultIntent, icSigLabData, icmLuOrdNorm)) == NULL)
error ("%d, %s",icco->errc, icco->err);
}
@@ -309,7 +340,8 @@ main(
printf("Input black ink limit assumed is %3.1f%%\n",100.0 * klimit);
}
- {
+ /* Device -> PCS -> Device */
+ if (!inv) {
double dev[MAX_CHAN], cdev[MAX_CHAN], pcsin[3], devout[MAX_CHAN], pcsout[3];
DCOUNT(co, inn, 0, 0, tres); /* Multi-D counter */
@@ -394,6 +426,74 @@ main(
DC_INC(co);
}
+
+ /* PCS -> Device -> PCS */
+ } else {
+ double dev[MAX_CHAN], cdev[MAX_CHAN], pcsin[3], devout[MAX_CHAN], pcsout[3];
+ DCOUNT(co, 3, 0, 0, tres); /* Multi-D counter */
+
+ /* Go through the chosen Lab grid */
+ DC_INIT(co)
+ for (; !DC_DONE(co);) {
+ int n, rv1, rv2;
+ double sum;
+ double de;
+
+ pcsin[0] = 100.0 * co[0]/(tres-1.0);
+ pcsin[1] = (127.0 * 2.0 * co[1]/(tres-1.0)) - 127.0;
+ pcsin[2] = (127.0 * 2.0 * co[2]/(tres-1.0)) - 127.0;
+
+ /* PCS -> Device */
+ if ((rv2 = luo2->lookup(luo2, devout, pcsin)) > 1)
+ error ("%d, %s",icco->errc,icco->err);
+
+ /* Device to PCS */
+ if ((rv2 = luo1->lookup(luo1, pcsout, devout)) > 1)
+ error ("%d, %s",icco->errc,icco->err);
+
+ /* Delta E */
+ if (dovrml) {
+// if (fabs(pcsin[0] - 5.0) < 0.1 && dovrml) {
+ int ix[2];
+
+ /* Add the verticies */
+ ix[0] = wrl->add_vertex(wrl, 0, pcsin);
+ ix[1] = wrl->add_vertex(wrl, 0, pcsout);
+
+ /* Add the line */
+ if (dodecol) { /* Lines with color determined by length */
+ double rgb[3];
+ DE2RGB(rgb, icmNorm33(pcsin, pcsout));
+ wrl->add_col_line(wrl, 0, ix, rgb);
+
+ } else { /* Natural color */
+ wrl->add_line(wrl, 0, ix);
+ }
+ }
+
+ /* Check the result */
+ if (cie2k)
+ de = icmCIE2K(pcsout, pcsin);
+ else if (cie94)
+ de = icmCIE94(pcsout, pcsin);
+ else
+ de = icmLabDE(pcsout, pcsin);
+
+ aerr += de;
+ rerr += de * de;
+ if (de > merr)
+ merr = de;
+ nsamps++;
+
+ if (verb > 1) {
+ printf("[%f] %f %f %f -> ",de, pcsin[0], pcsin[1], pcsin[2]);
+ for (n = 0; n < inn; n++)
+ printf("%f ",devout[n]);
+ printf("-> %f %f %f\n",pcsout[0], pcsout[1], pcsout[2]);
+ }
+
+ DC_INC(co);
+ }
}
if (dovrml) {
wrl->make_lines_vc(wrl, 0, 0.0);