summaryrefslogtreecommitdiff
path: root/gamut/fakegam.c
diff options
context:
space:
mode:
Diffstat (limited to 'gamut/fakegam.c')
-rw-r--r--gamut/fakegam.c325
1 files changed, 325 insertions, 0 deletions
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 <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 "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;
+}
+