From 22f703cab05b7cd368f4de9e03991b7664dc5022 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Frings-F=C3=BCrst?= Date: Mon, 1 Sep 2014 13:56:46 +0200 Subject: Initial import of argyll version 1.5.1-8 --- gamut/maptest.c | 240 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 240 insertions(+) create mode 100644 gamut/maptest.c (limited to 'gamut/maptest.c') diff --git a/gamut/maptest.c b/gamut/maptest.c new file mode 100644 index 0000000..1c595b6 --- /dev/null +++ b/gamut/maptest.c @@ -0,0 +1,240 @@ + +/* + * 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 +#include +#include +#include +#include +#include +#include "copyright.h" +#include "aconfig.h" +#include "numlib.h" +#include "xicc.h" +#include "gamut.h" +#include "rspl.h" +#include "gammap.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; + char in_name[100]; + char img_name[MAXNAMEL+1] = ""; + char out_name[100]; + char diag_name[100]; + int sat = 0; + int verb = 0; + gammap *map; /* Regular split gamut mapping */ + icxGMappingIntent gmi; + + gamut *gin, *gout; /* Input and Output gamuts */ + gamut *gimg = NULL; /* Optional image gamut */ + + error_program = argv[0]; + + 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(); + strcpy(in_name,argv[fa++]); + + if (fa >= argc || argv[fa][0] == '-') usage(); + strcpy(out_name,argv[fa++]); + + if (fa >= argc || argv[fa][0] == '-') usage(); + strcpy(diag_name,argv[fa++]); + + /* - - - - - - - - - - - - - - - - - - - */ + /* 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 = 0; + 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.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.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, + 0, 0, /* Normal black points */ + 0, /* Normal CMY cusp mapping */ + 0, /* No relative weighting override */ + 17, /* rspl resolution of 17 */ + NULL, /* No input range override */ + NULL, + "gammap.wrl" /* 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; +} + -- cgit v1.2.3