summaryrefslogtreecommitdiff
path: root/rspl/gam.h
diff options
context:
space:
mode:
Diffstat (limited to 'rspl/gam.h')
-rw-r--r--rspl/gam.h131
1 files changed, 131 insertions, 0 deletions
diff --git a/rspl/gam.h b/rspl/gam.h
new file mode 100644
index 0000000..0892e4d
--- /dev/null
+++ b/rspl/gam.h
@@ -0,0 +1,131 @@
+#ifndef RSPL_GAM_H
+#define RSPL_GAM_H
+
+/*
+ * Argyll Color Correction System
+ * Multi-dimensional regularized spline data structure
+ *
+ * Precise gamut surface, gamut pruning, ink limiting and K min/max
+ * support routine.s
+ *
+ * Author: Graeme W. Gill
+ * Date: 2008/11/21
+ *
+ * Copyright 1999 - 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.
+ *
+ * Latest simplex/linear equation version.
+ */
+
+/* In practice the gamut is only ever computed for 2D or 3D output */
+/* dimensions. The gamut surface is composed of simplexes ("triangles") */
+/* of dimensions fdi-1, with fdi verticies */
+
+#include "llist.h"
+
+#define MXNE 16 /* Maximum number of edges per triangle allowed */
+
+#define VHASHSIZE 6863 /* Vertex hash index size */
+#define EHASHSIZE 2659 /* Edge hash index size */
+#define THASHSIZE 2659 /* Triangle hash index size */
+
+/* ----------------------------------------- */
+
+/* Vertex node - all vertex nodes are part of the grid */
+struct _rvert {
+ struct _rvert *next; /* Hash linked list */
+ int n; /* Index number of vertex */
+ int gix; /* Grid index - used to identify and order nodes */
+ float *fg; /* Pointer to grid data */
+
+// double p[MXDO]; /* Poistion of node */
+ double v[MXDO]; /* Output value of node */
+ double r[MXDO]; /* Radial coordinates */
+ struct _rvert *list; /* Next in linked list */
+}; typedef struct _rvert rvert;
+
+/* ------------------------------------ */
+
+/* An edge shared by one or more triangle in the mesh */
+struct _redge {
+ struct _redge *next; /* Hash linked list */
+ int n; /* Serial number */
+// float *f[MXDO-1]; /* fdi-1 grid verticies of edge in base simplex order. */
+ struct _rvert *v[MXDO-1]; /* fdi-1 Verticies of edge in base simplex order. */
+ double pe[MXDO+1]; /* Plane equation for edge for side of edge testing. */
+ /* fdi for normal + constant */
+ int nt; /* Total number of triangles that share this edge */
+ int npt; /* Positive side triangles that share this edge */
+ int nnt; /* Negative side triangles that share this edge */
+ struct _rtri *t[MXNE]; /* nt triangles edge is part of */
+
+ struct _redge *list; /* Next in linked list */
+}; typedef struct _redge redge;
+
+/* ------------------------------------ */
+
+/* A "triangle" (simplex dimension fdi-1) in the surface mesh */
+struct _rtri {
+ struct _rtri *next; /* Hash linked list */
+ int n; /* Serial number */
+// float *f[MXDO]; /* fdi grid verticies in gix order */
+ struct _rvert *v[MXDO]; /* fdi verticies in gix order */
+
+// struct _redge *e[((MXDO+1) * MXDO)/2]; /* Edges in vertex sorted order */
+// double mix[2][MXDO]; /* nn: Bounding box min and max */
+
+ struct _rtri *list; /* Next in linked list */
+}; typedef struct _rtri rtri;
+
+/* ----------------------------------------- */
+/* Gamut info stored in main rspl function */
+struct _gam_struct {
+ int inited;
+
+ double cent[MXDO]; /* Center of radial distance calculation */
+ double scale[MXDO]; /* Scale of radial distance calculation */
+
+ void (*outf)(void *cntxf, double *out, double *in); /* Optional rspl val -> output value */
+ void *cntxf; /* Context for function */
+ void (*outb)(void *cntxb, double *out, double *in); /* Optional output value -> rspl val */
+ void *cntxb; /* Context for function */
+
+ ssxinfo ssi[MXDO-1]; /* Sub-simplex information for sdi from 0..fdi-1 */
+
+ int rvert_no; /* Number of rverts allocated */
+ int vhsize; /* Vertex hash list size */
+ rvert **verts; /* Hash list, NULL if not allocated */
+ rvert *vtop; /* Top of list of verticies */
+ rvert *vbot; /* Bottom of list of verticies */
+
+ int redge_no; /* Number of redges allocated */
+ int ehsize; /* Edge hash list size */
+ redge **edges; /* Edges between the triangles linked list */
+ redge *etop; /* Top of list of edges */
+ redge *ebot; /* Bottom of list of edges */
+
+ int rtri_no; /* Number of rtris allocated */
+ int thsize; /* Triangle hash list size */
+ rtri **tris; /* Hash list, NULL if not allocated */
+ rtri *ttop; /* Surface triangles linked list */
+
+}; typedef struct _gam_struct gam_struct;
+
+#endif /* RSPL_GAM_H */
+
+
+
+
+
+
+
+
+
+
+
+
+
+