diff options
Diffstat (limited to 'rspl/gam.h')
-rw-r--r-- | rspl/gam.h | 131 |
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 */ + + + + + + + + + + + + + + |