Files
gronod b94487108a
Linux x86_64 Release Build / build (push) Failing after 1m4s
Windows x86_64 Release Build / build (push) Has been cancelled
macOS Release Build / build (arm64, macOS_arm64_bin, arm64-apple-darwin, macos-latest) (push) Has been cancelled
macOS Release Build / build (x86_64, osx10.6_x86_64_bin, x86_64-apple-darwin, macos-13) (push) Has been cancelled
Fix ui.h includes in gamut and imdi tools
2026-08-22 23:00:36 +01:00

329 lines
8.4 KiB
C

/*
* 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 "cgats.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);
}
#include "ui.h"
int
main(int argc, char *argv[]) {
int fa,nfa; /* argument we're looking at */
static char *xl, out_name[MAXNAMEL+1];
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");
strncpy(out_name,argv[fa++],MAXNAMEL); out_name[MAXNAMEL] = '\000';
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;
}