summaryrefslogtreecommitdiff
path: root/gamut/surftest.c
diff options
context:
space:
mode:
Diffstat (limited to 'gamut/surftest.c')
-rw-r--r--gamut/surftest.c255
1 files changed, 255 insertions, 0 deletions
diff --git a/gamut/surftest.c b/gamut/surftest.c
new file mode 100644
index 0000000..ca2a786
--- /dev/null
+++ b/gamut/surftest.c
@@ -0,0 +1,255 @@
+
+/*
+ * surftest
+ *
+ * Do a torture test of the gamut surfacing algorithm in gamut.
+ *
+ * Author: Graeme W. Gill
+ * Date: 11/11/2006
+ * Version: 1.00
+ *
+ * Copyright 2000, 2006 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.
+ */
+
+
+#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 "icc.h"
+//#include "xicc.h"
+#include "gamut.h"
+
+#define DEF_POINTS 5
+#define DEF_TPOINTS 50
+#define DEF_HEIGHT 5.0
+
+void usage(char *diag) {
+ fprintf(stderr,"Do gamut surface torture test, Version %s\n",ARGYLL_VERSION_STR);
+ fprintf(stderr,"Author: Graeme W. Gill, licensed under the AGPL Version 3\n");
+ fprintf(stderr,"usage: surftest [options] npoints\n");
+ if (diag != NULL)
+ fprintf(stderr,"Diagnostic: %s\n",diag);
+ fprintf(stderr," -v Verbose\n");
+ fprintf(stderr," -r Random points\n");
+ fprintf(stderr," -n Don't add VRML axes or white/black point\n");
+ fprintf(stderr," -h height Height above sqhere (default %f)\n",DEF_HEIGHT);
+ fprintf(stderr," -f Do segemented maxima filtering (default is not)\n");
+ fprintf(stderr," -t ntpoints Number of test points (default %d)\n",DEF_TPOINTS);
+ fprintf(stderr," npoints Number of random points, default %d^3\n",DEF_POINTS);
+ fprintf(stderr," Outputs surftest.wrl");
+ fprintf(stderr,"\n");
+ exit(1);
+}
+
+int
+main(int argc, char *argv[]) {
+ int fa,nfa; /* argument we're looking at */
+ char out_name[100];
+ int npoints = DEF_POINTS;
+ int ntpoints = DEF_TPOINTS;
+ double height = DEF_HEIGHT;
+ gamut *gam;
+ int rand = 0;
+ int verb = 0;
+ int doaxes = 1;
+ int dofilt = 0;
+ int i;
+
+#ifdef NUMSUP_H
+ error_program = "surftest";
+#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;
+ }
+ /* Random */
+ else if (argv[fa][1] == 'r' || argv[fa][1] == 'R') {
+ rand = 1;
+ }
+ /* No axis output */
+ else if (argv[fa][1] == 'n' || argv[fa][1] == 'N') {
+ doaxes = 0;
+ }
+ /* Segmented maxima filtering */
+ else if (argv[fa][1] == 'f' || argv[fa][1] == 'F') {
+ dofilt = 1;
+ }
+ /* Height */
+ else if (argv[fa][1] == 'h' || argv[fa][1] == 'H') {
+ fa = nfa;
+ if (na == NULL) usage("No parameter after flag -h");
+ height = atof(na);
+ }
+ /* Number of test points */
+ else if (argv[fa][1] == 't' || argv[fa][1] == 'T') {
+ fa = nfa;
+ if (na == NULL) usage("No parameter after flag -t");
+ ntpoints = atoi(na);
+ }
+ else
+ usage("Unknown flag");
+ } else
+ break;
+ }
+
+ if (fa < argc && argv[fa][0] != '-')
+ npoints = atoi(argv[fa]);
+
+ strcpy(out_name,"surftest.wrl");
+
+ if (verb) {
+ printf("Number of surface points = %d\n",npoints * npoints * npoints);
+ printf("Number of test points = %d\n",ntpoints);
+ }
+
+ /* Creat a gamut object */
+ if ((gam = new_gamut(0.0, 0, 0)) == NULL)
+ error("Failed to create aa gamut object\n");
+
+ if (dofilt == 0)
+ gam->setnofilt(gam);
+
+ if (rand) {
+ npoints = npoints * npoints * npoints;
+
+ /* Create and add our random test points */
+ for (i = 0; i < npoints;) {
+ int j;
+ double pp[3], sum, rad;
+
+ /* Make normalzed random direction vector on sphere radius 30 */
+ for (sum = 0.0, j = 0; j < 3; j++) {
+ double tt = d_rand(-1.0, 1.0);
+ pp[j] = tt;
+ sum += tt * tt;
+ }
+ if (sum < 1e-6)
+ continue;
+ sum = sqrt(sum);
+ rad = d_rand(30.0, 30.0 + height);
+ for (j = 0; j < 3; j++) {
+ pp[j] /= sum;
+ pp[j] *= rad;
+ }
+ pp[0] += 50.0;
+//printf("~1 point %f %f %f\n",pp[0],pp[1],pp[2]);
+// if (verb) printf("\r%d",i+1); fflush(stdout);
+ gam->expand(gam, pp);
+ i++;
+ }
+// if (verb) printf("\n");
+ } else {
+ int co[3];
+
+ /* 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;
+
+#ifndef NEVER
+ /* 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;
+#endif
+ pp[0] = 2.0 * (co[0]/(npoints-1.0) - 0.5);
+ pp[1] = 2.0 * (co[1]/(npoints-1.0) - 0.5);
+ pp[2] = 2.0 * (co[2]/(npoints-1.0) - 0.5);
+
+#ifdef NEVER
+ /* Make normalzed random direction vector on sphere radius 30 */
+ for (sum = 0.0, m = 0; m < 3; m++) {
+ sum += pp[m] * pp[m];
+ }
+ if (sum < 1e-6)
+ continue;
+ sum = sqrt(sum);
+#else
+
+ sum = 1.0;
+#endif /* NEVER */
+ rad = d_rand(30.0, 30.0 + height);
+ for (m = 0; m < 3; m++) {
+ pp[m] /= sum;
+ pp[m] *= rad;
+ }
+ pp[0] += 50.0;
+//printf("~1 point %f %f %f\n",pp[0],pp[1],pp[2]);
+ gam->expand(gam, pp);
+ }
+ }
+ }
+ }
+
+ /* Write out the gamut surface */
+ 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");
+
+ /* Test the gamut surface */
+ for (i = 0; i < ntpoints;) {
+ int j;
+ double pp[3], sum;
+ double r, out[3];
+
+ /* Make normalzed random direction vector on sphere */
+ for (sum = 0.0, j = 0; j < 3; j++) {
+ double tt = d_rand(-1.0, 1.0);
+ pp[j] = tt;
+ sum += tt * tt;
+ }
+ if (sum < 1e-6)
+ continue;
+ sum = sqrt(sum);
+ for (j = 0; j < 3; j++) {
+ pp[j] /= sum;
+ }
+
+ /* Test surface */
+ r = gam->radial(gam, out, pp);
+ i++;
+ }
+
+ gam->del(gam);
+
+ return 0;
+}
+
+