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/fakegam.c | 325 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 325 insertions(+) create mode 100644 gamut/fakegam.c (limited to 'gamut/fakegam.c') diff --git a/gamut/fakegam.c b/gamut/fakegam.c new file mode 100644 index 0000000..ec40457 --- /dev/null +++ b/gamut/fakegam.c @@ -0,0 +1,325 @@ + +/* + * Gamut test code. Generate a fake gamut surface + * + * Author: Graeme W. Gill + * Date: 23/10/2008 + * Version: 1.00 + * + * Copyright 2008, 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: + * + */ + +#include +#include +#include +#include +#include +#include +#include "copyright.h" +#include "aconfig.h" +#include "numlib.h" +#include "gamut.h" + +int get_value(double val[3]); + +#define DEF_POINTS 10 + +void usage(char *diag) { + fprintf(stderr,"Generate a test gamut Version %s\n",ARGYLL_VERSION_STR); + fprintf(stderr,"Author: Graeme W. Gill, licensed under the AGPL Version 3\n"); + fprintf(stderr,"usage: gamtest [options] outputname\n"); + if (diag != NULL) + fprintf(stderr,"Diagnostic: %s\n",diag); + fprintf(stderr," -v Verbose\n"); + fprintf(stderr," -n num Number of points to use (default %d)\n",DEF_POINTS); + fprintf(stderr," -c rad Create a cube\n"); + fprintf(stderr," -p rad Create a sphere\n"); + fprintf(stderr," -s w,d,h Create a sphereoid\n"); + fprintf(stderr," -b w,d,h Create a box\n"); + fprintf(stderr," -S nw,pw,nd,pd,nh,ph Create an asymetric sphereoid\n"); + fprintf(stderr," -B nw,pw,nd,pd,nh,ph Create an asymetric box\n"); + fprintf(stderr," -o x,y,z Offset the shape\n"); + fprintf(stderr," -w Create WRL\n"); + fprintf(stderr," -x No WRL axes\n"); + fprintf(stderr,"\n"); + exit(1); +} + + +int +main(int argc, char *argv[]) { + int fa,nfa; /* argument we're looking at */ + char *xl, out_name[500]; + int npoints = DEF_POINTS; + gamut *gam; + int shape = 1; /* 0 = sphereoid, 1 = box */ + double bsize[6] = { 20.0, 20.0, 20.0, 20.0, 20.0, 20.0 }; /* box/spheroid size */ + double goff[3] = { 0.0, 0.0, 0.0 }; /* Gamut position offset */ + double co[3]; + double wp[3] = { -1e6, 0.0, 0.0 }, bp[3] = { 1e6, 0.0, 0.0 }; + int verb = 0; + int dowrl = 0; + int doaxes = 1; + int i; + +#ifdef NUMSUP_H + error_program = "fakegam"; +#endif + + /* Process the 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) < argc) { + if (argv[fa+1][0] != '-') { + nfa = fa + 1; + na = argv[nfa]; /* next is seperate non-flag argument */ + } + } + } + + if (argv[fa][1] == '?') + usage(NULL); + + /* Verbosity */ + else if (argv[fa][1] == 'v' || argv[fa][1] == 'V') { + verb = 1; + } + /* VRML */ + else if (argv[fa][1] == 'w' || argv[fa][1] == 'W') { + dowrl = 1; + } + /* No axis output */ + else if (argv[fa][1] == 'x' || argv[fa][1] == 'X') { + doaxes = 0; + } + /* Sphere */ + else if (argv[fa][1] == 'p') { + double radius; + fa = nfa; + if (na == NULL) usage("No parameter after flag -h"); + radius = atof(na); + bsize[0] = bsize[2] = bsize[4] = 2.0 * radius; + bsize[1] = bsize[3] = bsize[5] = 2.0 * radius; + shape = 0; + } + /* Cube */ + else if (argv[fa][1] == 'c' || argv[fa][1] == 'C') { + double radius; + fa = nfa; + if (na == NULL) usage("No parameter after flag -h"); + radius = atof(na); + bsize[0] = bsize[2] = bsize[4] = 2.0 * radius; + bsize[1] = bsize[3] = bsize[5] = 2.0 * radius; + shape = 1; + } + /* Sphereoid */ + else if (argv[fa][1] == 's') { + if (na == NULL) usage("Expect parameter to -b"); + + fa = nfa; + if (sscanf(na, " %lf , %lf , %lf ",&bsize[1], &bsize[3], &bsize[5]) == 3) { + bsize[0] = bsize[1]; + bsize[2] = bsize[3]; + bsize[4] = bsize[5]; + } else + usage("Couldn't parse sphereoid size (-b) values"); + shape = 0; + } + /* Box */ + else if (argv[fa][1] == 'b') { + if (na == NULL) usage("Expect parameter to -b"); + + fa = nfa; + if (sscanf(na, " %lf , %lf , %lf ",&bsize[1], &bsize[3], &bsize[5]) == 3) { + bsize[0] = bsize[1]; + bsize[2] = bsize[3]; + bsize[4] = bsize[5]; + } else + usage("Couldn't parse box size (-b) values"); + shape = 1; + } + /* Asymetric Sphereoid */ + else if (argv[fa][1] == 'S') { + if (na == NULL) usage("Expect parameter to -S"); + + fa = nfa; + if (sscanf(na, " %lf , %lf , %lf , %lf , %lf , %lf ", + &bsize[0], &bsize[1], &bsize[2], &bsize[3], &bsize[4], &bsize[5]) == 6) { + bsize[0] *= 2.0; + bsize[1] *= 2.0; + bsize[2] *= 2.0; + bsize[3] *= 2.0; + bsize[4] *= 2.0; + bsize[5] *= 2.0; + } else + usage("Couldn't parse sphereoid size (-S) values"); + shape = 0; + } + /* Asymetric Box */ + else if (argv[fa][1] == 'B') { + if (na == NULL) usage("Expect parameter to -B"); + + fa = nfa; + if (sscanf(na, " %lf , %lf , %lf , %lf , %lf , %lf ", + &bsize[0], &bsize[1], &bsize[2], &bsize[3], &bsize[4], &bsize[5]) == 6) { + bsize[0] *= 2.0; + bsize[1] *= 2.0; + bsize[2] *= 2.0; + bsize[3] *= 2.0; + bsize[4] *= 2.0; + bsize[5] *= 2.0; + } else + usage("Couldn't parse box size (-B) values"); + shape = 1; + } + /* Number of construction points */ + else if (argv[fa][1] == 'n' || argv[fa][1] == 'N') { + fa = nfa; + if (na == NULL) usage("No parameter after flag -t"); + npoints = atoi(na); + } + /* Gamut offset */ + else if (argv[fa][1] == 'o' || argv[fa][1] == 'O') { + if (na == NULL) usage("Expect parameter to -o"); + + fa = nfa; + if (sscanf(na, " %lf , %lf , %lf ",&goff[0], &goff[1], &goff[2]) == 3) { + } else + usage("Couldn't parse gamut offset (-o) value"); + } + else + usage("Unknown flag"); + } else + break; + } + + if (fa >= argc || argv[fa][0] == '-') usage("Output filename expected"); + strcpy(out_name,argv[fa++]); + + if ((xl = strrchr(out_name, '.')) == NULL) { /* Add .gam extention if there isn't one */ + xl = out_name + strlen(out_name); + strcpy(xl,".gam"); + } + + if (verb) { + printf("Number of construction points = %d\n",npoints * npoints * npoints); + } + + /* Creat a gamut object */ + if ((gam = new_gamut(5.0, 0, 0)) == NULL) + error("Failed to create aa gamut object\n"); + + /* Create and add our gridded test points */ + for (co[0] = 0; co[0] < npoints; co[0]++) { + for (co[1] = 0; co[1] < npoints; co[1]++) { + for (co[2] = 0; co[2] < npoints; co[2]++) { + double pp[3], sum, rad; + int m, n; + + /* Make sure at least one coords are 0 & 1 */ + for (n = m = 0; m < 3; m++) { + if (co[m] == 0 || co[m] == (npoints-1)) + n++; + } + if (n < 1) + continue; + + if (shape == 0) { /* Sphereoid */ + + pp[0] = (co[0]/(npoints-1.0) - 0.5); + pp[1] = (co[1]/(npoints-1.0) - 0.5); + pp[2] = (co[2]/(npoints-1.0) - 0.5); + + /* vector length */ + for (sum = 0.0, m = 0; m < 3; m++) { + sum += pp[m] * pp[m]; + } + if (sum < 1e-6) + continue; + sum = sqrt(sum); + + /* Make sum of squares == 0.5 */ + for (m = 0; m < 3; m++) { + pp[m] /= sum; + pp[m] *= 0.5; + } + /* And then scale it */ + if (pp[0] < 0.0) + pp[0] = bsize[4] * pp[0]; + else + pp[0] = bsize[5] * pp[0]; + + if (pp[1] < 0.0) + pp[1] = bsize[0] * pp[1]; + else + pp[1] = bsize[1] * pp[1]; + + if (pp[2] < 0.0) + pp[2] = bsize[2] * pp[2]; + else + pp[2] = bsize[3] * pp[2]; + } else { /* Box */ + if (co[0] < 0.0) + pp[0] = bsize[4] * (co[0]/(npoints-1.0) - 0.5); + else + pp[0] = bsize[4] * (co[0]/(npoints-1.0) - 0.5); + + if (co[1] < 0.0) + pp[1] = bsize[0] * (co[1]/(npoints-1.0) - 0.5); + else + pp[1] = bsize[1] * (co[1]/(npoints-1.0) - 0.5); + + if (co[2] < 0.0) + pp[2] = bsize[1] * (co[2]/(npoints-1.0) - 0.5); + else + pp[2] = bsize[2] * (co[2]/(npoints-1.0) - 0.5); + } + + pp[0] += 50.0 + goff[2]; + pp[1] += goff[0]; + pp[2] += goff[1]; +//printf("~1 point %f %f %f\n",pp[0],pp[1],pp[2]); + gam->expand(gam, pp); + + if (pp[0] > wp[0]) + wp[0] = pp[0]; + if (pp[0] < bp[0]) + bp[0] = pp[0]; + } + } + } + + gam->setwb(gam, wp, bp, NULL); + + /* Write out the gamut */ + if (gam->write_gam(gam, out_name)) + error ("write gamut failed on '%s'",out_name); + + if (dowrl) { + strcpy(xl,".wrl"); + if (gam->write_vrml(gam, out_name, doaxes, 0)) + error ("write vrml failed on '%s'",out_name); + } + + if (verb) + printf("Written out the gamut surface\n"); + + gam->del(gam); + + return 0; +} + -- cgit v1.2.3