249 lines
6.6 KiB
C
249 lines
6.6 KiB
C
|
|
/*
|
|
* Gamut mapping test code. Test the gamut mapping library.
|
|
*
|
|
* Author: Graeme W. Gill
|
|
* Date: 29/10/00
|
|
* Version: 1.00
|
|
*
|
|
* Copyright 2000, Graeme W. Gill
|
|
* All rights reserved.
|
|
*
|
|
* This material is licenced under the GNU AFFERO GENERAL PUBLIC LICENSE Version 3 :-
|
|
* see the License.txt file for licencing details.
|
|
*/
|
|
|
|
/* TTBD:
|
|
*
|
|
*/
|
|
|
|
#undef DEBUG /* test a single value out */
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <stdarg.h>
|
|
#include <fcntl.h>
|
|
#include <string.h>
|
|
#include <math.h>
|
|
#include "copyright.h"
|
|
#include "aconfig.h"
|
|
#include "numlib.h"
|
|
#include "conv.h"
|
|
#include "xicc.h"
|
|
#include "gamut.h"
|
|
#include "rspl.h"
|
|
#include "gammap.h"
|
|
#include "vrml.h"
|
|
|
|
void usage(void) {
|
|
fprintf(stderr,"Map bteween two gamuts, Version %s\n",ARGYLL_VERSION_STR);
|
|
fprintf(stderr,"Author: Graeme W. Gill, licensed under the AGPL Version 3\n");
|
|
fprintf(stderr,"usage: maptest [options] ingamut outgamut diag_gamut\n");
|
|
fprintf(stderr," -v Verbose\n");
|
|
fprintf(stderr," -s Do saturation style expand/compress\n");
|
|
fprintf(stderr," -i imggamut.gam Use an image gamut\n");
|
|
exit(1);
|
|
}
|
|
|
|
int
|
|
main(int argc, char *argv[]) {
|
|
int fa, nfa, mfa;
|
|
char *xl;
|
|
static char in_name[MAXNAMEL+10+1];
|
|
static char img_name[MAXNAMEL+10+1] = "";
|
|
static char out_name[MAXNAMEL+10+1];
|
|
static char diag_name[MAXNAMEL+10+1];
|
|
int sat = 0;
|
|
int verb = 0;
|
|
gammap *map; /* Regular split gamut mapping */
|
|
icxGMappingIntent gmi;
|
|
char gammapwrl[30] = "gammap"; /* Diagnostic file name */
|
|
|
|
gamut *gin, *gout; /* Input and Output gamuts */
|
|
gamut *gimg = NULL; /* Optional image gamut */
|
|
|
|
error_program = argv[0];
|
|
|
|
strcat(gammapwrl, vrml_ext());
|
|
|
|
if (argc < 3)
|
|
usage();
|
|
|
|
/* Process the arguments */
|
|
mfa = 3; /* Minimum final arguments */
|
|
for(fa = 1;fa < argc;fa++) {
|
|
nfa = fa; /* skip to nfa if next argument is used */
|
|
if (argv[fa][0] == '-') { /* Look for any flags */
|
|
char *na = NULL; /* next argument after flag, null if none */
|
|
|
|
if (argv[fa][2] != '\000')
|
|
na = &argv[fa][2]; /* next is directly after flag */
|
|
else {
|
|
if ((fa+1+mfa) < argc) {
|
|
if (argv[fa+1][0] != '-') {
|
|
nfa = fa + 1;
|
|
na = argv[nfa]; /* next is seperate non-flag argument */
|
|
}
|
|
}
|
|
}
|
|
|
|
if (argv[fa][1] == '?')
|
|
usage();
|
|
|
|
/* Verbosity */
|
|
else if (argv[fa][1] == 'v' || argv[fa][1] == 'V') {
|
|
verb = 1;
|
|
}
|
|
|
|
/* Saturation */
|
|
else if (argv[fa][1] == 's' || argv[fa][1] == 'S') {
|
|
sat = 1;
|
|
}
|
|
|
|
/* Image gamut */
|
|
else if (argv[fa][1] == 'i' || argv[fa][1] == 'I') {
|
|
if (na == NULL) usage();
|
|
fa = nfa;
|
|
strncpy(img_name,na,MAXNAMEL); img_name[MAXNAMEL] = '\000';
|
|
}
|
|
|
|
else
|
|
usage();
|
|
} else
|
|
break;
|
|
}
|
|
|
|
if (fa >= argc || argv[fa][0] == '-') usage();
|
|
strncpy(in_name,argv[fa++],MAXNAMEL); in_name[MAXNAMEL] = '\000';
|
|
|
|
if (fa >= argc || argv[fa][0] == '-') usage();
|
|
strncpy(out_name,argv[fa++],MAXNAMEL); out_name[MAXNAMEL] = '\000';
|
|
|
|
if (fa >= argc || argv[fa][0] == '-') usage();
|
|
strncpy(diag_name,argv[fa++],MAXNAMEL); diag_name[MAXNAMEL] = '\000';
|
|
|
|
/* - - - - - - - - - - - - - - - - - - - */
|
|
/* read the input device gamut */
|
|
|
|
gin = new_gamut(0.0, 0, 0);
|
|
|
|
if ((xl = strrchr(in_name, '.')) == NULL) { /* Add .gam extention if there isn't one */
|
|
xl = in_name + strlen(in_name);
|
|
strcpy(xl,".gam");
|
|
}
|
|
|
|
if (gin->read_gam(gin, in_name))
|
|
error("Reading input gamut failed");
|
|
|
|
/* - - - - - - - - - - - - - - - - - - - */
|
|
/* read the optional image gamut */
|
|
|
|
if (img_name[0] != '\000') {
|
|
|
|
gimg = new_gamut(0.0, 0, 0);
|
|
|
|
if ((xl = strrchr(img_name, '.')) == NULL) { /* Add .gam extention if there isn't one */
|
|
xl = img_name + strlen(img_name);
|
|
strcpy(xl,".gam");
|
|
}
|
|
|
|
if (gimg->read_gam(gimg, img_name))
|
|
error("Reading image gamut failed");
|
|
} else {
|
|
gimg = gin;
|
|
}
|
|
|
|
/* - - - - - - - - - - - - - - - - - - - */
|
|
/* read the output device gamut */
|
|
|
|
gout = new_gamut(0.0, 0, 0);
|
|
|
|
if ((xl = strrchr(out_name, '.')) == NULL) { /* Add .gam extention if there isn't one */
|
|
xl = out_name + strlen(out_name);
|
|
strcpy(xl,".gam");
|
|
}
|
|
|
|
if (gout->read_gam(gout, out_name))
|
|
error("Reading output gamut failed");
|
|
|
|
/* - - - - - - - - - - - - - - - - - - - */
|
|
|
|
/* Create the gamut mapping */
|
|
gmi.usecas = 1; /* Abs. L*a*b* */
|
|
gmi.usemap = 1;
|
|
gmi.greymf = 1.0; /* Gray axis hue matching factor, 0.0 - 1.0 */
|
|
gmi.glumwcpf = 1.0; /* Grey axis luminance white compression factor, 0.0 - 1.0 */
|
|
gmi.glumwexf = 1.0; /* Grey axis luminance white expansion factor, 0.0 - 1.0 */
|
|
gmi.glumbcpf = 1.0; /* Grey axis luminance black compression factor, 0.0 - 1.0 */
|
|
gmi.glumbexf = 1.0; /* Grey axis luminance black expansion factor, 0.0 - 1.0 */
|
|
gmi.glumknf = 0.7; /* Gray axis luminance knee factor, 0.0 - 1.0 */
|
|
gmi.bph = gmm_bendBP; /* Extend and bend */
|
|
gmi.gamcpf = 1.0; /* Gamut compression factor, 0.0 - 1.0 */
|
|
if (sat)
|
|
gmi.gamexf = 1.0; /* Gamut expansion factor, 0.0 - 1.0 */
|
|
else
|
|
gmi.gamexf = 0.0; /* Gamut expansion factor, 0.0 - 1.0 */
|
|
gmi.gamcknf = 0.1; /* Gamut comp. knee factor, 0.0 - 1.0 */
|
|
gmi.gamxknf = 0.1; /* Gamut exp. knee factor, 0.0 - 1.0 */
|
|
if (sat) {
|
|
gmi.gampwf = 0.0; /* Gamut Perceptual Map weighting factor, 0.0 - 1.0 */
|
|
gmi.gamswf = 1.0; /* Gamut Saturation Map weighting factor, 0.0 - 1.0 */
|
|
} else {
|
|
gmi.gampwf = 1.0; /* Gamut Perceptual Map weighting factor, 0.0 - 1.0 */
|
|
gmi.gamswf = 0.0; /* Gamut Saturation Map weighting factor, 0.0 - 1.0 */
|
|
}
|
|
gmi.gamlpwf = 0.0; /* Gamut Lightness preserving perceptual Map whtg. factor, 0.0 - 1.0 */
|
|
gmi.satenh = 0.0; /* Saturation enhancement factor */
|
|
gmi.desc = "mapetest";
|
|
gmi.icci = 0;
|
|
|
|
map = new_gammap(
|
|
verb,
|
|
gin, /* Source gamut */
|
|
gimg, /* Image gamut */
|
|
gout, /* Destination gamut */
|
|
&gmi,
|
|
NULL, /* No gamut hull gamut */
|
|
0, 0, /* Normal black points */
|
|
0, /* Normal CMY cusp mapping */
|
|
0, /* No relative weighting override */
|
|
19, /* rspl resolution of 17 */
|
|
NULL, /* No input range override */
|
|
NULL,
|
|
gammapwrl /* Diagnostic plot */
|
|
);
|
|
|
|
if (map == NULL) {
|
|
error("new_gammap() failed\n");
|
|
}
|
|
|
|
if (verb)
|
|
printf("Got gamut mapping\n");
|
|
|
|
/* Transform the input gamut by the gamut mapping */
|
|
{ /* Bad - delving inside gamut! */
|
|
int i;
|
|
for (i = 0; i < gin->nv; i++) {
|
|
|
|
/* transform the input gamutboundary points */
|
|
map->domap(map, gin->verts[i]->p, gin->verts[i]->p);
|
|
}
|
|
}
|
|
|
|
/* Output a transformed gamut */
|
|
if ((xl = strrchr(diag_name, '.')) == NULL) { /* Add .gam extention if there isn't one */
|
|
xl = diag_name + strlen(diag_name);
|
|
strcpy(xl,".gam");
|
|
}
|
|
gin->write_gam(gin, diag_name);
|
|
|
|
/* Clean up */
|
|
gout->del(gout);
|
|
gin->del(gin);
|
|
if (gimg != gin)
|
|
gimg->del(gimg);
|
|
|
|
return 0;
|
|
}
|
|
|