xref: /plan9/sys/src/cmd/gs/icclib/icc.h (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
13ff48bf5SDavid du Colombier #ifndef ICC_H
23ff48bf5SDavid du Colombier #define ICC_H
33ff48bf5SDavid du Colombier /*
43ff48bf5SDavid du Colombier  * International Color Consortium Format Library (icclib)
53ff48bf5SDavid du Colombier  *
63ff48bf5SDavid du Colombier  * Author:  Graeme W. Gill
73ff48bf5SDavid du Colombier  * Date:    99/11/29
8*593dc095SDavid du Colombier  * Version: 2.01
93ff48bf5SDavid du Colombier  *
103ff48bf5SDavid du Colombier  * Copyright 1997, 1998, 1999, 2000, 2001 Graeme W. Gill
113ff48bf5SDavid du Colombier  * Please refer to Licence.txt file for details.
123ff48bf5SDavid du Colombier  */
133ff48bf5SDavid du Colombier 
143ff48bf5SDavid du Colombier 
153ff48bf5SDavid du Colombier /* We can get some subtle errors if certain headers aren't included */
163ff48bf5SDavid du Colombier #include <stdio.h>
173ff48bf5SDavid du Colombier #include <stdlib.h>
183ff48bf5SDavid du Colombier #include <string.h>
193ff48bf5SDavid du Colombier #include <fcntl.h>
203ff48bf5SDavid du Colombier #include <math.h>
213ff48bf5SDavid du Colombier #include <time.h>
223ff48bf5SDavid du Colombier #include <sys/types.h>
233ff48bf5SDavid du Colombier 
243ff48bf5SDavid du Colombier /*
253ff48bf5SDavid du Colombier  *  Note XYZ scaling to 1.0, not 100.0
263ff48bf5SDavid du Colombier  */
273ff48bf5SDavid du Colombier 
283ff48bf5SDavid du Colombier 
293ff48bf5SDavid du Colombier /* Make allowance for shared library use */
303ff48bf5SDavid du Colombier #ifdef ICCLIB_SHARED		/* Compiling or Using shared library version */
313ff48bf5SDavid du Colombier # ifdef ICCLIB_EXPORTS		/* Compiling shared library */
323ff48bf5SDavid du Colombier #  ifdef NT
333ff48bf5SDavid du Colombier #   define ICCLIB_API __declspec(dllexport)
343ff48bf5SDavid du Colombier #  endif /* NT */
353ff48bf5SDavid du Colombier # else						/* Using shared library */
363ff48bf5SDavid du Colombier #  ifdef NT
373ff48bf5SDavid du Colombier #   define ICCLIB_API __declspec(dllimport)
383ff48bf5SDavid du Colombier #   ifdef ICCLIB_DEBUG
393ff48bf5SDavid du Colombier #    pragma comment (lib, "icclibd.lib")
403ff48bf5SDavid du Colombier #   else
413ff48bf5SDavid du Colombier #    pragma comment (lib, "icclib.lib")
423ff48bf5SDavid du Colombier #   endif	/* DEBUG */
433ff48bf5SDavid du Colombier #  endif /* NT */
443ff48bf5SDavid du Colombier # endif
453ff48bf5SDavid du Colombier #else						/* Using static library */
463ff48bf5SDavid du Colombier # define ICCLIB_API	/* empty */
473ff48bf5SDavid du Colombier #endif
483ff48bf5SDavid du Colombier 
493ff48bf5SDavid du Colombier 
503ff48bf5SDavid du Colombier #ifdef __cplusplus
513ff48bf5SDavid du Colombier 	extern "C" {
523ff48bf5SDavid du Colombier #endif
533ff48bf5SDavid du Colombier 
543ff48bf5SDavid du Colombier 
553ff48bf5SDavid du Colombier /* ---------------------------------------------- */
563ff48bf5SDavid du Colombier /* Platform specific defines */
573ff48bf5SDavid du Colombier /* It is assumed that the native machine size is 32 bits */
58*593dc095SDavid du Colombier #ifndef INR8
59*593dc095SDavid du Colombier #define INR8   signed char		/* 8 bit signed */
603ff48bf5SDavid du Colombier #endif
61*593dc095SDavid du Colombier #ifndef INR16
62*593dc095SDavid du Colombier #define INR16  signed short		/* 16 bit signed */
633ff48bf5SDavid du Colombier #endif
64*593dc095SDavid du Colombier #ifndef INR32
65*593dc095SDavid du Colombier #define INR32  signed long		/* 32 bit signed */
663ff48bf5SDavid du Colombier #endif
673ff48bf5SDavid du Colombier #ifndef ORD8
683ff48bf5SDavid du Colombier #define ORD8   unsigned char	/* 8 bit unsigned */
693ff48bf5SDavid du Colombier #endif
703ff48bf5SDavid du Colombier #ifndef ORD16
713ff48bf5SDavid du Colombier #define ORD16  unsigned short	/* 16 bit unsigned */
723ff48bf5SDavid du Colombier #endif
733ff48bf5SDavid du Colombier #ifndef ORD32
743ff48bf5SDavid du Colombier #define ORD32  unsigned long	/* 32 bit unsigned */
753ff48bf5SDavid du Colombier #endif
763ff48bf5SDavid du Colombier 
773ff48bf5SDavid du Colombier #include "icc9809.h"	/* Standard ICC definitions, version ICC.1:1998-09 with mods noted. */
783ff48bf5SDavid du Colombier 
793ff48bf5SDavid du Colombier /* Note that the prefix icm is used for the native Machine */
803ff48bf5SDavid du Colombier /* equivalents of the file structures defined in icc34.h */
813ff48bf5SDavid du Colombier 
823ff48bf5SDavid du Colombier /* ---------------------------------------------- */
833ff48bf5SDavid du Colombier /* System interface objects. The defaults can be replaced */
843ff48bf5SDavid du Colombier /* for adaption to different system environments */
853ff48bf5SDavid du Colombier 
863ff48bf5SDavid du Colombier /* File access class interface definition */
873ff48bf5SDavid du Colombier #define ICM_FILE_BASE																		\
883ff48bf5SDavid du Colombier 	/* Public: */																			\
893ff48bf5SDavid du Colombier 																							\
903ff48bf5SDavid du Colombier 	/* Set current position to offset. Return 0 on success, nz on failure. */				\
913ff48bf5SDavid du Colombier 	int    (*seek) (struct _icmFile *p, long int offset);									\
923ff48bf5SDavid du Colombier 																							\
933ff48bf5SDavid du Colombier 	/* Read count items of size length. Return number of items successfully read. */ 		\
943ff48bf5SDavid du Colombier 	size_t (*read) (struct _icmFile *p, void *buffer, size_t size, size_t count);			\
953ff48bf5SDavid du Colombier 																							\
963ff48bf5SDavid du Colombier 	/* write count items of size length. Return number of items successfully written. */ 	\
973ff48bf5SDavid du Colombier 	size_t (*write)(struct _icmFile *p, void *buffer, size_t size, size_t count);			\
983ff48bf5SDavid du Colombier 																							\
993ff48bf5SDavid du Colombier 	/* flush all write data out to secondary storage. Return nz on failure. */				\
1003ff48bf5SDavid du Colombier 	int (*flush)(struct _icmFile *p);														\
1013ff48bf5SDavid du Colombier 																							\
1023ff48bf5SDavid du Colombier 	/* we're done with the file object, return nz on failure */								\
1033ff48bf5SDavid du Colombier 	int (*del)(struct _icmFile *p);															\
1043ff48bf5SDavid du Colombier 
1053ff48bf5SDavid du Colombier 
1063ff48bf5SDavid du Colombier /* Common file interface class */
1073ff48bf5SDavid du Colombier struct _icmFile {
1083ff48bf5SDavid du Colombier 	ICM_FILE_BASE
1093ff48bf5SDavid du Colombier }; typedef struct _icmFile icmFile;
1103ff48bf5SDavid du Colombier 
1113ff48bf5SDavid du Colombier 
1123ff48bf5SDavid du Colombier /* - - - - - - - - - - - - - - - - - - - - -  */
1133ff48bf5SDavid du Colombier 
114*593dc095SDavid du Colombier /* Implementation of file access class based on standard file I/O */
1153ff48bf5SDavid du Colombier struct _icmFileStd {
1163ff48bf5SDavid du Colombier 	ICM_FILE_BASE
1173ff48bf5SDavid du Colombier 
1183ff48bf5SDavid du Colombier 	/* Private: */
1193ff48bf5SDavid du Colombier 	FILE *fp;
1203ff48bf5SDavid du Colombier 	int   doclose;		/* nz if free should close */
1213ff48bf5SDavid du Colombier }; typedef struct _icmFileStd icmFileStd;
1223ff48bf5SDavid du Colombier 
1233ff48bf5SDavid du Colombier /* Create given a file name */
1243ff48bf5SDavid du Colombier icmFile *new_icmFileStd_name(char *name, char *mode);
1253ff48bf5SDavid du Colombier 
1263ff48bf5SDavid du Colombier /* Create given a (binary) FILE* */
1273ff48bf5SDavid du Colombier icmFile *new_icmFileStd_fp(FILE *fp);
1283ff48bf5SDavid du Colombier 
1293ff48bf5SDavid du Colombier 
1303ff48bf5SDavid du Colombier 
1313ff48bf5SDavid du Colombier /* - - - - - - - - - - - - - - - - - - - - -  */
132*593dc095SDavid du Colombier /* Implementation of file access class based on a memory image */
1333ff48bf5SDavid du Colombier struct _icmFileMem {
1343ff48bf5SDavid du Colombier 	ICM_FILE_BASE
1353ff48bf5SDavid du Colombier 
1363ff48bf5SDavid du Colombier 	/* Private: */
1373ff48bf5SDavid du Colombier 	unsigned char *start, *cur, *end;
1383ff48bf5SDavid du Colombier 
1393ff48bf5SDavid du Colombier }; typedef struct _icmFileMem icmFileMem;
1403ff48bf5SDavid du Colombier 
1413ff48bf5SDavid du Colombier /* Create a memory image file access class */
1423ff48bf5SDavid du Colombier icmFile *new_icmFileMem(void *base, size_t length);
1433ff48bf5SDavid du Colombier 
1443ff48bf5SDavid du Colombier 
1453ff48bf5SDavid du Colombier /* - - - - - - - - - - - - - - - - - - - - -  */
1463ff48bf5SDavid du Colombier /* Heap allocator class interface definition */
1473ff48bf5SDavid du Colombier #define ICM_ALLOC_BASE																		\
1483ff48bf5SDavid du Colombier 	/* Public: */																			\
1493ff48bf5SDavid du Colombier 																							\
1503ff48bf5SDavid du Colombier 	void *(*malloc) (struct _icmAlloc *p, size_t size);										\
1513ff48bf5SDavid du Colombier 	void *(*calloc) (struct _icmAlloc *p, size_t num, size_t size);							\
1523ff48bf5SDavid du Colombier 	void *(*realloc)(struct _icmAlloc *p, void *ptr, size_t size);							\
1533ff48bf5SDavid du Colombier 	void  (*free)   (struct _icmAlloc *p, void *ptr);										\
1543ff48bf5SDavid du Colombier 																							\
1553ff48bf5SDavid du Colombier 	/* we're done with the allocator object */												\
1563ff48bf5SDavid du Colombier 	void (*del)(struct _icmAlloc *p);														\
1573ff48bf5SDavid du Colombier 
1583ff48bf5SDavid du Colombier /* Common heap allocator interface class */
1593ff48bf5SDavid du Colombier struct _icmAlloc {
1603ff48bf5SDavid du Colombier 	ICM_ALLOC_BASE
1613ff48bf5SDavid du Colombier }; typedef struct _icmAlloc icmAlloc;
1623ff48bf5SDavid du Colombier 
1633ff48bf5SDavid du Colombier /* - - - - - - - - - - - - - - - - - - - - -  */
1643ff48bf5SDavid du Colombier 
165*593dc095SDavid du Colombier /* Implementation of heap class based on standard system malloc */
1663ff48bf5SDavid du Colombier struct _icmAllocStd {
1673ff48bf5SDavid du Colombier 	ICM_ALLOC_BASE
1683ff48bf5SDavid du Colombier }; typedef struct _icmAllocStd icmAllocStd;
1693ff48bf5SDavid du Colombier 
1703ff48bf5SDavid du Colombier /* Create a standard alloc object */
1713ff48bf5SDavid du Colombier icmAlloc *new_icmAllocStd(void);
1723ff48bf5SDavid du Colombier 
1733ff48bf5SDavid du Colombier 
1743ff48bf5SDavid du Colombier /* --------------------------------- */
1753ff48bf5SDavid du Colombier /* Assumed constants                 */
1763ff48bf5SDavid du Colombier 
1773ff48bf5SDavid du Colombier #define MAX_CHAN 15		/* Maximum number of color channels */
1783ff48bf5SDavid du Colombier 
1793ff48bf5SDavid du Colombier /* --------------------------------- */
1803ff48bf5SDavid du Colombier /* tag and other compound structures */
1813ff48bf5SDavid du Colombier 
1823ff48bf5SDavid du Colombier typedef int icmSig;	/* Otherwise un-enumerated 4 byte signature */
1833ff48bf5SDavid du Colombier 
1843ff48bf5SDavid du Colombier typedef struct {
1853ff48bf5SDavid du Colombier 	ORD32 l;			/* High and low components of signed 64 bit */
186*593dc095SDavid du Colombier 	INR32 h;
187*593dc095SDavid du Colombier } icmInt64;
1883ff48bf5SDavid du Colombier 
1893ff48bf5SDavid du Colombier typedef struct {
1903ff48bf5SDavid du Colombier 	ORD32 l,h;			/* High and low components of unsigned 64 bit */
191*593dc095SDavid du Colombier } icmUint64;
1923ff48bf5SDavid du Colombier 
1933ff48bf5SDavid du Colombier /* XYZ Number */
1943ff48bf5SDavid du Colombier typedef struct {
1953ff48bf5SDavid du Colombier     double  X;
1963ff48bf5SDavid du Colombier     double  Y;
1973ff48bf5SDavid du Colombier     double  Z;
1983ff48bf5SDavid du Colombier } icmXYZNumber;
1993ff48bf5SDavid du Colombier 
2003ff48bf5SDavid du Colombier /* Response 16 number */
2013ff48bf5SDavid du Colombier typedef struct {
2023ff48bf5SDavid du Colombier 	double	       deviceValue;	/* The device value in range 0.0 - 1.0 */
2033ff48bf5SDavid du Colombier 	double	       measurement;	/* The reading value */
2043ff48bf5SDavid du Colombier } icmResponse16Number;
2053ff48bf5SDavid du Colombier 
2063ff48bf5SDavid du Colombier /*
2073ff48bf5SDavid du Colombier  *  read and write method error codes:
2083ff48bf5SDavid du Colombier  *  0 = sucess
2093ff48bf5SDavid du Colombier  *  1 = file format/logistical error
2103ff48bf5SDavid du Colombier  *  2 = system error
2113ff48bf5SDavid du Colombier  */
2123ff48bf5SDavid du Colombier 
2133ff48bf5SDavid du Colombier #define ICM_BASE_MEMBERS																\
2143ff48bf5SDavid du Colombier 	/* Private: */																		\
2153ff48bf5SDavid du Colombier 	icTagTypeSignature  ttype;		/* The tag type signature */						\
2163ff48bf5SDavid du Colombier 	struct _icc    *icp;			/* Pointer to ICC we're a part of */				\
2173ff48bf5SDavid du Colombier 	int	           touched;			/* Flag for write bookeeping */						\
2183ff48bf5SDavid du Colombier     int            refcount;		/* Reference count for sharing */					\
2193ff48bf5SDavid du Colombier 	unsigned int   (*get_size)(struct _icmBase *p);										\
2203ff48bf5SDavid du Colombier 	int            (*read)(struct _icmBase *p, unsigned long len, unsigned long of);	\
2213ff48bf5SDavid du Colombier 	int            (*write)(struct _icmBase *p, unsigned long of);						\
2223ff48bf5SDavid du Colombier 	void           (*del)(struct _icmBase *p);											\
2233ff48bf5SDavid du Colombier 																						\
2243ff48bf5SDavid du Colombier 	/* Public: */																		\
2253ff48bf5SDavid du Colombier 	void           (*dump)(struct _icmBase *p, FILE *op, int verb);						\
2263ff48bf5SDavid du Colombier 	int            (*allocate)(struct _icmBase *p);
2273ff48bf5SDavid du Colombier 
2283ff48bf5SDavid du Colombier /* Base tag element data object */
2293ff48bf5SDavid du Colombier struct _icmBase {
2303ff48bf5SDavid du Colombier 	ICM_BASE_MEMBERS
2313ff48bf5SDavid du Colombier }; typedef struct _icmBase icmBase;
2323ff48bf5SDavid du Colombier 
2333ff48bf5SDavid du Colombier /* UInt8 Array */
2343ff48bf5SDavid du Colombier struct _icmUInt8Array {
2353ff48bf5SDavid du Colombier 	ICM_BASE_MEMBERS
2363ff48bf5SDavid du Colombier 
2373ff48bf5SDavid du Colombier 	/* Private: */
2383ff48bf5SDavid du Colombier 	unsigned int   _size;		/* Size currently allocated */
2393ff48bf5SDavid du Colombier 
2403ff48bf5SDavid du Colombier 	/* Public: */
2413ff48bf5SDavid du Colombier 	unsigned long	size;		/* Allocated and used size of the array */
2423ff48bf5SDavid du Colombier     unsigned int   *data;		/* Pointer to array of data */
2433ff48bf5SDavid du Colombier }; typedef struct _icmUInt8Array icmUInt8Array;
2443ff48bf5SDavid du Colombier 
2453ff48bf5SDavid du Colombier /* uInt16 Array */
2463ff48bf5SDavid du Colombier struct _icmUInt16Array {
2473ff48bf5SDavid du Colombier 	ICM_BASE_MEMBERS
2483ff48bf5SDavid du Colombier 
2493ff48bf5SDavid du Colombier 	/* Private: */
2503ff48bf5SDavid du Colombier 	unsigned int   _size;		/* Size currently allocated */
2513ff48bf5SDavid du Colombier 
2523ff48bf5SDavid du Colombier 	/* Public: */
2533ff48bf5SDavid du Colombier 	unsigned long	size;		/* Allocated and used size of the array */
2543ff48bf5SDavid du Colombier     unsigned int	*data;		/* Pointer to array of data */
2553ff48bf5SDavid du Colombier }; typedef struct _icmUInt16Array icmUInt16Array;
2563ff48bf5SDavid du Colombier 
2573ff48bf5SDavid du Colombier /* uInt32 Array */
2583ff48bf5SDavid du Colombier struct _icmUInt32Array {
2593ff48bf5SDavid du Colombier 	ICM_BASE_MEMBERS
2603ff48bf5SDavid du Colombier 
2613ff48bf5SDavid du Colombier 	/* Private: */
2623ff48bf5SDavid du Colombier 	unsigned int   _size;		/* Size currently allocated */
2633ff48bf5SDavid du Colombier 
2643ff48bf5SDavid du Colombier 	/* Public: */
2653ff48bf5SDavid du Colombier 	unsigned long	size;		/* Allocated and used size of the array */
2663ff48bf5SDavid du Colombier     unsigned int	*data;		/* Pointer to array of data */
2673ff48bf5SDavid du Colombier }; typedef struct _icmUInt32Array icmUInt32Array;
2683ff48bf5SDavid du Colombier 
2693ff48bf5SDavid du Colombier /* UInt64 Array */
2703ff48bf5SDavid du Colombier struct _icmUInt64Array {
2713ff48bf5SDavid du Colombier 	ICM_BASE_MEMBERS
2723ff48bf5SDavid du Colombier 
2733ff48bf5SDavid du Colombier 	/* Private: */
2743ff48bf5SDavid du Colombier 	unsigned int   _size;		/* Size currently allocated */
2753ff48bf5SDavid du Colombier 
2763ff48bf5SDavid du Colombier 	/* Public: */
2773ff48bf5SDavid du Colombier 	unsigned long	size;		/* Allocated and used size of the array */
278*593dc095SDavid du Colombier     icmUint64		*data;		/* Pointer to array of hight data */
2793ff48bf5SDavid du Colombier }; typedef struct _icmUInt64Array icmUInt64Array;
2803ff48bf5SDavid du Colombier 
2813ff48bf5SDavid du Colombier /* u16Fixed16 Array */
2823ff48bf5SDavid du Colombier struct _icmU16Fixed16Array {
2833ff48bf5SDavid du Colombier 	ICM_BASE_MEMBERS
2843ff48bf5SDavid du Colombier 
2853ff48bf5SDavid du Colombier 	/* Private: */
2863ff48bf5SDavid du Colombier 	unsigned int   _size;		/* Size currently allocated */
2873ff48bf5SDavid du Colombier 
2883ff48bf5SDavid du Colombier 	/* Public: */
2893ff48bf5SDavid du Colombier 	unsigned long	size;		/* Allocated and used size of the array */
2903ff48bf5SDavid du Colombier     double			*data;		/* Pointer to array of hight data */
2913ff48bf5SDavid du Colombier }; typedef struct _icmU16Fixed16Array icmU16Fixed16Array;
2923ff48bf5SDavid du Colombier 
2933ff48bf5SDavid du Colombier /* s15Fixed16 Array */
2943ff48bf5SDavid du Colombier struct _icmS15Fixed16Array {
2953ff48bf5SDavid du Colombier 	ICM_BASE_MEMBERS
2963ff48bf5SDavid du Colombier 
2973ff48bf5SDavid du Colombier 	/* Private: */
2983ff48bf5SDavid du Colombier 	unsigned int   _size;		/* Size currently allocated */
2993ff48bf5SDavid du Colombier 
3003ff48bf5SDavid du Colombier 	/* Public: */
3013ff48bf5SDavid du Colombier 	unsigned long	size;		/* Allocated and used size of the array */
3023ff48bf5SDavid du Colombier     double			*data;		/* Pointer to array of hight data */
3033ff48bf5SDavid du Colombier }; typedef struct _icmS15Fixed16Array icmS15Fixed16Array;
3043ff48bf5SDavid du Colombier 
3053ff48bf5SDavid du Colombier /* XYZ Array */
3063ff48bf5SDavid du Colombier struct _icmXYZArray {
3073ff48bf5SDavid du Colombier 	ICM_BASE_MEMBERS
3083ff48bf5SDavid du Colombier 
3093ff48bf5SDavid du Colombier 	/* Private: */
3103ff48bf5SDavid du Colombier 	unsigned int   _size;		/* Size currently allocated */
3113ff48bf5SDavid du Colombier 
3123ff48bf5SDavid du Colombier 	/* Public: */
3133ff48bf5SDavid du Colombier 	unsigned long	size;		/* Allocated and used size of the array */
3143ff48bf5SDavid du Colombier     icmXYZNumber	*data;		/* Pointer to array of data */
3153ff48bf5SDavid du Colombier }; typedef struct _icmXYZArray icmXYZArray;
3163ff48bf5SDavid du Colombier 
3173ff48bf5SDavid du Colombier /* Curve */
3183ff48bf5SDavid du Colombier typedef enum {
3193ff48bf5SDavid du Colombier     icmCurveUndef           = -1, /* Undefined curve */
3203ff48bf5SDavid du Colombier     icmCurveLin             = 0,  /* Linear transfer curve */
3213ff48bf5SDavid du Colombier     icmCurveGamma           = 1,  /* Gamma power transfer curve */
3223ff48bf5SDavid du Colombier     icmCurveSpec            = 2   /* Specified curve */
3233ff48bf5SDavid du Colombier } icmCurveStyle;
3243ff48bf5SDavid du Colombier 
3253ff48bf5SDavid du Colombier /* Curve reverse lookup information */
3263ff48bf5SDavid du Colombier typedef struct {
3273ff48bf5SDavid du Colombier 	int inited;				/* Flag */
3283ff48bf5SDavid du Colombier 	double rmin, rmax;		/* Range of reverse grid */
3293ff48bf5SDavid du Colombier 	double qscale;			/* Quantising scale factor */
3303ff48bf5SDavid du Colombier 	long rsize;				/* Number of reverse lists */
3313ff48bf5SDavid du Colombier 	int **rlists;			/* Array of list of fwd values that may contain output value */
3323ff48bf5SDavid du Colombier 							/* Offset 0 = allocated size */
3333ff48bf5SDavid du Colombier 							/* Offset 1 = next free index */
3343ff48bf5SDavid du Colombier 							/* Offset 2 = first fwd index */
3353ff48bf5SDavid du Colombier 	unsigned long size;		/* Copy of forward table size */
3363ff48bf5SDavid du Colombier 	double       *data;		/* Copy of forward table data */
3373ff48bf5SDavid du Colombier } icmRevTable;
3383ff48bf5SDavid du Colombier 
3393ff48bf5SDavid du Colombier struct _icmCurve {
3403ff48bf5SDavid du Colombier 	ICM_BASE_MEMBERS
3413ff48bf5SDavid du Colombier 
3423ff48bf5SDavid du Colombier 	/* Private: */
3433ff48bf5SDavid du Colombier 	unsigned int   _size;		/* Size currently allocated */
3443ff48bf5SDavid du Colombier 	icmRevTable  rt;			/* Reverse table information */
3453ff48bf5SDavid du Colombier 
3463ff48bf5SDavid du Colombier 	/* Public: */
3473ff48bf5SDavid du Colombier     icmCurveStyle   flag;		/* Style of curve */
3483ff48bf5SDavid du Colombier 	unsigned long	size;		/* Allocated and used size of the array */
3493ff48bf5SDavid du Colombier     double         *data;  		/* Curve data scaled to range 0.0 - 1.0 */
3503ff48bf5SDavid du Colombier 								/* or data[0] = gamma value */
3513ff48bf5SDavid du Colombier 	/* Translate a value through the curve, return warning flags */
3523ff48bf5SDavid du Colombier 	int (*lookup_fwd) (struct _icmCurve *p, double *out, double *in);	/* Forwards */
3533ff48bf5SDavid du Colombier 	int (*lookup_bwd) (struct _icmCurve *p, double *out, double *in);	/* Backwards */
3543ff48bf5SDavid du Colombier 
3553ff48bf5SDavid du Colombier }; typedef struct _icmCurve icmCurve;
3563ff48bf5SDavid du Colombier 
3573ff48bf5SDavid du Colombier /* Data */
3583ff48bf5SDavid du Colombier typedef enum {
3593ff48bf5SDavid du Colombier     icmDataUndef           = -1, /* Undefined data curve */
3603ff48bf5SDavid du Colombier     icmDataASCII           = 0,  /* ASCII data curve */
3613ff48bf5SDavid du Colombier     icmDataBin             = 1   /* Binary data */
3623ff48bf5SDavid du Colombier } icmDataStyle;
3633ff48bf5SDavid du Colombier 
3643ff48bf5SDavid du Colombier struct _icmData {
3653ff48bf5SDavid du Colombier 	ICM_BASE_MEMBERS
3663ff48bf5SDavid du Colombier 
3673ff48bf5SDavid du Colombier 	/* Private: */
3683ff48bf5SDavid du Colombier 	unsigned int   _size;		/* Size currently allocated */
3693ff48bf5SDavid du Colombier 
3703ff48bf5SDavid du Colombier 	/* Public: */
3713ff48bf5SDavid du Colombier     icmDataStyle	flag;		/* Style of data */
3723ff48bf5SDavid du Colombier 	unsigned long	size;		/* Allocated and used size of the array (inc ascii null) */
3733ff48bf5SDavid du Colombier     unsigned char	*data;  	/* data or string, NULL if size == 0 */
3743ff48bf5SDavid du Colombier }; typedef struct _icmData icmData;
3753ff48bf5SDavid du Colombier 
3763ff48bf5SDavid du Colombier /* text */
3773ff48bf5SDavid du Colombier struct _icmText {
3783ff48bf5SDavid du Colombier 	ICM_BASE_MEMBERS
3793ff48bf5SDavid du Colombier 
3803ff48bf5SDavid du Colombier 	/* Private: */
3813ff48bf5SDavid du Colombier 	unsigned int   _size;		/* Size currently allocated */
3823ff48bf5SDavid du Colombier 
3833ff48bf5SDavid du Colombier 	/* Public: */
3843ff48bf5SDavid du Colombier 	unsigned long	 size;		/* Allocated and used size of desc, inc null */
3853ff48bf5SDavid du Colombier 	char             *data;		/* ascii string (null terminated), NULL if size==0 */
3863ff48bf5SDavid du Colombier }; typedef struct _icmText icmText;
3873ff48bf5SDavid du Colombier 
3883ff48bf5SDavid du Colombier /* The base date time number */
3893ff48bf5SDavid du Colombier struct _icmDateTimeNumber {
3903ff48bf5SDavid du Colombier 	ICM_BASE_MEMBERS
3913ff48bf5SDavid du Colombier 
3923ff48bf5SDavid du Colombier 	/* Public: */
3933ff48bf5SDavid du Colombier     unsigned int      year;
3943ff48bf5SDavid du Colombier     unsigned int      month;
3953ff48bf5SDavid du Colombier     unsigned int      day;
3963ff48bf5SDavid du Colombier     unsigned int      hours;
3973ff48bf5SDavid du Colombier     unsigned int      minutes;
3983ff48bf5SDavid du Colombier     unsigned int      seconds;
3993ff48bf5SDavid du Colombier }; typedef struct _icmDateTimeNumber icmDateTimeNumber;
4003ff48bf5SDavid du Colombier 
4013ff48bf5SDavid du Colombier #ifdef NEW
4023ff48bf5SDavid du Colombier / * DeviceSettings */
4033ff48bf5SDavid du Colombier 
4043ff48bf5SDavid du Colombier /*
4053ff48bf5SDavid du Colombier    I think this all works like this:
4063ff48bf5SDavid du Colombier 
4073ff48bf5SDavid du Colombier Valid setting = (   (platform == platform1 and platform1.valid)
4083ff48bf5SDavid du Colombier                  or (platform == platform2 and platform2.valid)
4093ff48bf5SDavid du Colombier                  or ...
4103ff48bf5SDavid du Colombier                 )
4113ff48bf5SDavid du Colombier 
4123ff48bf5SDavid du Colombier where
4133ff48bf5SDavid du Colombier 	platformN.valid = (   platformN.combination1.valid
4143ff48bf5SDavid du Colombier 	                   or platformN.combination2.valid
4153ff48bf5SDavid du Colombier 	                   or ...
4163ff48bf5SDavid du Colombier 	                  )
4173ff48bf5SDavid du Colombier 
4183ff48bf5SDavid du Colombier where
4193ff48bf5SDavid du Colombier 	platformN.combinationM.valid = (    platformN.combinationM.settingstruct1.valid
4203ff48bf5SDavid du Colombier 	                                and platformN.combinationM.settingstruct2.valid
4213ff48bf5SDavid du Colombier 	                                and ...
4223ff48bf5SDavid du Colombier 	                               )
4233ff48bf5SDavid du Colombier 
4243ff48bf5SDavid du Colombier where
4253ff48bf5SDavid du Colombier 	platformN.combinationM.settingstructP.valid = (   platformN.combinationM.settingstructP.setting1.valid
4263ff48bf5SDavid du Colombier 	                                               or platformN.combinationM.settingstructP.setting2.valid
4273ff48bf5SDavid du Colombier 	                                               or ...
4283ff48bf5SDavid du Colombier 	                                              )
4293ff48bf5SDavid du Colombier 
4303ff48bf5SDavid du Colombier  */
4313ff48bf5SDavid du Colombier 
4323ff48bf5SDavid du Colombier /* The Settings Structure holds an array of settings of a particular type */
4333ff48bf5SDavid du Colombier struct _icmSettingStruct {
4343ff48bf5SDavid du Colombier 	ICM_BASE_MEMBERS
4353ff48bf5SDavid du Colombier 
4363ff48bf5SDavid du Colombier 	/* Private: */
4373ff48bf5SDavid du Colombier 	unsigned int   _num;				/* Size currently allocated */
4383ff48bf5SDavid du Colombier 
4393ff48bf5SDavid du Colombier 	/* Public: */
4403ff48bf5SDavid du Colombier 	icSettingsSig       settingSig;		/* Setting identification */
4413ff48bf5SDavid du Colombier 	unsigned long       numSettings; 	/* number of setting values */
4423ff48bf5SDavid du Colombier 	union {								/* Setting values - type depends on Sig */
4433ff48bf5SDavid du Colombier 		icUInt64Number      *resolution;
4443ff48bf5SDavid du Colombier 		icDeviceMedia       *media;
4453ff48bf5SDavid du Colombier 		icDeviceDither      *halftone;
4463ff48bf5SDavid du Colombier 	}
4473ff48bf5SDavid du Colombier }; typedef struct _icmSettingStruct icmSettingStruct;
4483ff48bf5SDavid du Colombier 
4493ff48bf5SDavid du Colombier /* A Setting Combination holds all arrays of different setting types */
4503ff48bf5SDavid du Colombier struct _icmSettingComb {
4513ff48bf5SDavid du Colombier 	/* Private: */
4523ff48bf5SDavid du Colombier 	unsigned int   _num;			/* number currently allocated */
4533ff48bf5SDavid du Colombier 
4543ff48bf5SDavid du Colombier 	/* Public: */
4553ff48bf5SDavid du Colombier 	unsigned long       numStructs;   /* num of setting structures */
4563ff48bf5SDavid du Colombier 	icmSettingStruct    *data;
4573ff48bf5SDavid du Colombier }; typedef struct _icmSettingComb icmSettingComb;
4583ff48bf5SDavid du Colombier 
4593ff48bf5SDavid du Colombier /* A Platform Entry holds all setting combinations */
4603ff48bf5SDavid du Colombier struct _icmPlatformEntry {
4613ff48bf5SDavid du Colombier 	/* Private: */
4623ff48bf5SDavid du Colombier 	unsigned int   _num;			/* number currently allocated */
4633ff48bf5SDavid du Colombier 
4643ff48bf5SDavid du Colombier 	/* Public: */
4653ff48bf5SDavid du Colombier 	icPlatformSignature platform;
4663ff48bf5SDavid du Colombier 	unsigned long       numCombinations;    /* num of settings and allocated array size */
4673ff48bf5SDavid du Colombier 	icmSettingComb      *data;
4683ff48bf5SDavid du Colombier }; typedef struct _icmPlatformEntry icmPlatformEntry;
4693ff48bf5SDavid du Colombier 
4703ff48bf5SDavid du Colombier /* The Device Settings holds all platform settings */
4713ff48bf5SDavid du Colombier struct _icmDeviceSettings {
4723ff48bf5SDavid du Colombier 	/* Private: */
4733ff48bf5SDavid du Colombier 	unsigned int   _num;			/* number currently allocated */
4743ff48bf5SDavid du Colombier 
4753ff48bf5SDavid du Colombier 	/* Public: */
4763ff48bf5SDavid du Colombier 	unsigned long       numPlatforms;	/* num of platforms and allocated array size */
4773ff48bf5SDavid du Colombier 	icmPlatformEntry    *data;			/* Array of pointers to platform entry data */
4783ff48bf5SDavid du Colombier }; typedef struct _icmDeviceSettings icmDeviceSettings;
4793ff48bf5SDavid du Colombier 
4803ff48bf5SDavid du Colombier #endif /* NEW */
4813ff48bf5SDavid du Colombier 
4823ff48bf5SDavid du Colombier /* lut */
4833ff48bf5SDavid du Colombier struct _icmLut {
4843ff48bf5SDavid du Colombier 	ICM_BASE_MEMBERS
4853ff48bf5SDavid du Colombier 
4863ff48bf5SDavid du Colombier 	/* Private: */
4873ff48bf5SDavid du Colombier 	/* Cache appropriate normalization routines */
4883ff48bf5SDavid du Colombier 	int dinc[MAX_CHAN];				/* Dimensional increment through clut */
4893ff48bf5SDavid du Colombier 	int dcube[1 << MAX_CHAN];		/* Hyper cube offsets */
4903ff48bf5SDavid du Colombier 	icmRevTable  rit;				/* Reverse input table information */
4913ff48bf5SDavid du Colombier 	icmRevTable  rot;				/* Reverse output table information */
4923ff48bf5SDavid du Colombier 
4933ff48bf5SDavid du Colombier 	unsigned int inputTable_size;	/* size allocated to input table */
4943ff48bf5SDavid du Colombier 	unsigned int clutTable_size;	/* size allocated to clut table */
4953ff48bf5SDavid du Colombier 	unsigned int outputTable_size;	/* size allocated to output table */
4963ff48bf5SDavid du Colombier 
4973ff48bf5SDavid du Colombier 	/* return the minimum and maximum values of the given channel in the clut */
4983ff48bf5SDavid du Colombier 	void (*min_max) (struct _icmLut *pp, double *minv, double *maxv, int chan);
4993ff48bf5SDavid du Colombier 
5003ff48bf5SDavid du Colombier 	/* Translate color values through 3x3 matrix, input tables only, multi-dimensional lut, */
5013ff48bf5SDavid du Colombier 	/* or output tables, */
5023ff48bf5SDavid du Colombier 	int (*lookup_matrix)  (struct _icmLut *pp, double *out, double *in);
5033ff48bf5SDavid du Colombier 	int (*lookup_input)   (struct _icmLut *pp, double *out, double *in);
5043ff48bf5SDavid du Colombier 	int (*lookup_clut_nl) (struct _icmLut *pp, double *out, double *in);
5053ff48bf5SDavid du Colombier 	int (*lookup_clut_sx) (struct _icmLut *pp, double *out, double *in);
5063ff48bf5SDavid du Colombier 	int (*lookup_output)  (struct _icmLut *pp, double *out, double *in);
5073ff48bf5SDavid du Colombier 
5083ff48bf5SDavid du Colombier 	/* Public: */
5093ff48bf5SDavid du Colombier 
5103ff48bf5SDavid du Colombier 	/* return non zero if matrix is non-unity */
5113ff48bf5SDavid du Colombier 	int (*nu_matrix) (struct _icmLut *pp);
5123ff48bf5SDavid du Colombier 
5133ff48bf5SDavid du Colombier     unsigned int	inputChan;      /* Num of input channels */
5143ff48bf5SDavid du Colombier     unsigned int	outputChan;     /* Num of output channels */
5153ff48bf5SDavid du Colombier     unsigned int	clutPoints;     /* Num of grid points */
5163ff48bf5SDavid du Colombier     unsigned int	inputEnt;       /* Num of in-table entries (must be 256 for Lut8) */
5173ff48bf5SDavid du Colombier     unsigned int	outputEnt;      /* Num of out-table entries (must be 256 for Lut8) */
5183ff48bf5SDavid du Colombier     double			e[3][3];		/* 3 * 3 array */
5193ff48bf5SDavid du Colombier 	double	        *inputTable;	/* The in-table: [inputChan * inputEnt] */
5203ff48bf5SDavid du Colombier 	double	        *clutTable;		/* The clut: [(clutPoints ^ inputChan) * outputChan] */
5213ff48bf5SDavid du Colombier 	double	        *outputTable;	/* The out-table: [outputChan * outputEnt] */
5223ff48bf5SDavid du Colombier 	/* inputTable  is organized [inputChan 0..ic-1][inputEnt 0..ie-1] */
5233ff48bf5SDavid du Colombier 	/* clutTable   is organized [inputChan 0, 0..cp-1]..[inputChan ic-1, 0..cp-1]
5243ff48bf5SDavid du Colombier 	                                                                [outputChan 0..oc-1] */
5253ff48bf5SDavid du Colombier 	/* outputTable is organized [outputChan 0..oc-1][outputEnt 0..oe-1] */
5263ff48bf5SDavid du Colombier 
5273ff48bf5SDavid du Colombier 	/* Helper function to setup the three tables contents */
5283ff48bf5SDavid du Colombier 	int (*set_tables) (
5293ff48bf5SDavid du Colombier 		struct _icmLut *p,						/* Pointer to Lut object */
5303ff48bf5SDavid du Colombier 		void   *cbctx,							/* Opaque callback context pointer value */
5313ff48bf5SDavid du Colombier 		icColorSpaceSignature insig, 			/* Input color space */
5323ff48bf5SDavid du Colombier 		icColorSpaceSignature outsig, 			/* Output color space */
5333ff48bf5SDavid du Colombier 		void (*infunc)(void *cbctx, double *out, double *in),
5343ff48bf5SDavid du Colombier 								/* Input transfer function, inspace->inspace' (NULL = default) */
5353ff48bf5SDavid du Colombier 		double *inmin, double *inmax,			/* Maximum range of inspace' values */
5363ff48bf5SDavid du Colombier 												/* (NULL = default) */
5373ff48bf5SDavid du Colombier 		void (*clutfunc)(void *cbntx, double *out, double *in),
5383ff48bf5SDavid du Colombier 								/* inspace' -> outspace' transfer function */
5393ff48bf5SDavid du Colombier 		double *clutmin, double *clutmax,		/* Maximum range of outspace' values */
5403ff48bf5SDavid du Colombier 												/* (NULL = default) */
5413ff48bf5SDavid du Colombier 		void (*outfunc)(void *cbntx, double *out, double *in));
5423ff48bf5SDavid du Colombier 								/* Output transfer function, outspace'->outspace (NULL = deflt) */
5433ff48bf5SDavid du Colombier 
5443ff48bf5SDavid du Colombier }; typedef struct _icmLut icmLut;
5453ff48bf5SDavid du Colombier 
5463ff48bf5SDavid du Colombier /* Measurement Data */
5473ff48bf5SDavid du Colombier struct _icmMeasurement {
5483ff48bf5SDavid du Colombier 	ICM_BASE_MEMBERS
5493ff48bf5SDavid du Colombier 
5503ff48bf5SDavid du Colombier 	/* Public: */
5513ff48bf5SDavid du Colombier     icStandardObserver           observer;       /* Standard observer */
5523ff48bf5SDavid du Colombier     icmXYZNumber                 backing;        /* XYZ for backing */
5533ff48bf5SDavid du Colombier     icMeasurementGeometry        geometry;       /* Meas. geometry */
5543ff48bf5SDavid du Colombier     double                       flare;          /* Measurement flare */
5553ff48bf5SDavid du Colombier     icIlluminant                 illuminant;     /* Illuminant */
5563ff48bf5SDavid du Colombier }; typedef struct _icmMeasurement icmMeasurement;
5573ff48bf5SDavid du Colombier 
5583ff48bf5SDavid du Colombier /* Named color */
5593ff48bf5SDavid du Colombier 
5603ff48bf5SDavid du Colombier /* Structure that holds each named color data */
5613ff48bf5SDavid du Colombier typedef struct {
5623ff48bf5SDavid du Colombier 	struct _icc      *icp;				/* Pointer to ICC we're a part of */
5633ff48bf5SDavid du Colombier 	char              root[32];			/* Root name for color */
5643ff48bf5SDavid du Colombier 	double            pcsCoords[3];		/* icmNC2: PCS coords of color */
5653ff48bf5SDavid du Colombier 	double            deviceCoords[MAX_CHAN];	/* Dev coords of color */
5663ff48bf5SDavid du Colombier } icmNamedColorVal;
5673ff48bf5SDavid du Colombier 
5683ff48bf5SDavid du Colombier struct _icmNamedColor {
5693ff48bf5SDavid du Colombier 	ICM_BASE_MEMBERS
5703ff48bf5SDavid du Colombier 
5713ff48bf5SDavid du Colombier 	/* Private: */
5723ff48bf5SDavid du Colombier 	unsigned int      _count;			/* Count currently allocated */
5733ff48bf5SDavid du Colombier 
5743ff48bf5SDavid du Colombier 	/* Public: */
5753ff48bf5SDavid du Colombier     unsigned int      vendorFlag;		/* Bottom 16 bits for IC use */
5763ff48bf5SDavid du Colombier     unsigned int      count;			/* Count of named colors */
5773ff48bf5SDavid du Colombier     unsigned int      nDeviceCoords;	/* Num of device coordinates */
5783ff48bf5SDavid du Colombier     char              prefix[32];		/* Prefix for each color name (null terminated) */
5793ff48bf5SDavid du Colombier     char              suffix[32];		/* Suffix for each color name (null terminated) */
5803ff48bf5SDavid du Colombier     icmNamedColorVal  *data;			/* Array of [count] color values */
5813ff48bf5SDavid du Colombier }; typedef struct _icmNamedColor icmNamedColor;
5823ff48bf5SDavid du Colombier 
5833ff48bf5SDavid du Colombier /* textDescription */
5843ff48bf5SDavid du Colombier struct _icmTextDescription {
5853ff48bf5SDavid du Colombier 	ICM_BASE_MEMBERS
5863ff48bf5SDavid du Colombier 
5873ff48bf5SDavid du Colombier 	/* Private: */
5883ff48bf5SDavid du Colombier 	unsigned long  _size;			/* Size currently allocated */
5893ff48bf5SDavid du Colombier 	unsigned long  uc_size;			/* uc Size currently allocated */
5903ff48bf5SDavid du Colombier 	int            (*core_read)(struct _icmTextDescription *p, char **bpp, char *end);
5913ff48bf5SDavid du Colombier 	int            (*core_write)(struct _icmTextDescription *p, char **bpp);
5923ff48bf5SDavid du Colombier 
5933ff48bf5SDavid du Colombier 	/* Public: */
5943ff48bf5SDavid du Colombier 	unsigned long	  size;			/* Allocated and used size of desc, inc null */
5953ff48bf5SDavid du Colombier 	char              *desc;		/* ascii string (null terminated) */
5963ff48bf5SDavid du Colombier 
5973ff48bf5SDavid du Colombier 	unsigned int      ucLangCode;	/* UniCode language code */
5983ff48bf5SDavid du Colombier 	unsigned long	  ucSize;		/* Allocated and used size of ucDesc in wchars, inc null */
5993ff48bf5SDavid du Colombier 	ORD16             *ucDesc;		/* The UniCode description (null terminated) */
6003ff48bf5SDavid du Colombier 
6013ff48bf5SDavid du Colombier 	ORD16             scCode;		/* ScriptCode code */
6023ff48bf5SDavid du Colombier 	unsigned long	  scSize;		/* Used size of scDesc in bytes, inc null */
6033ff48bf5SDavid du Colombier 	ORD8              scDesc[67];	/* ScriptCode Description (null terminated, max 67) */
6043ff48bf5SDavid du Colombier }; typedef struct _icmTextDescription icmTextDescription;
6053ff48bf5SDavid du Colombier 
6063ff48bf5SDavid du Colombier /* Profile sequence structure */
6073ff48bf5SDavid du Colombier struct _icmDescStruct {
6083ff48bf5SDavid du Colombier 	/* Private: */
6093ff48bf5SDavid du Colombier 	struct _icc      *icp;				/* Pointer to ICC we're a part of */
6103ff48bf5SDavid du Colombier 
6113ff48bf5SDavid du Colombier 	/* Public: */
6123ff48bf5SDavid du Colombier 	int             (*allocate)(struct _icmDescStruct *p);	/* Allocate method */
6133ff48bf5SDavid du Colombier     icmSig            deviceMfg;		/* Dev Manufacturer */
6143ff48bf5SDavid du Colombier     unsigned int      deviceModel;		/* Dev Model */
615*593dc095SDavid du Colombier     icmUint64         attributes;		/* Dev attributes */
6163ff48bf5SDavid du Colombier     icTechnologySignature technology;	/* Technology sig */
6173ff48bf5SDavid du Colombier 	icmTextDescription device;			/* Manufacturer text (sub structure) */
6183ff48bf5SDavid du Colombier 	icmTextDescription model;			/* Model text (sub structure) */
6193ff48bf5SDavid du Colombier }; typedef struct _icmDescStruct icmDescStruct;
6203ff48bf5SDavid du Colombier 
6213ff48bf5SDavid du Colombier /* Profile sequence description */
6223ff48bf5SDavid du Colombier struct _icmProfileSequenceDesc {
6233ff48bf5SDavid du Colombier 	ICM_BASE_MEMBERS
6243ff48bf5SDavid du Colombier 
6253ff48bf5SDavid du Colombier 	/* Private: */
6263ff48bf5SDavid du Colombier 	unsigned int	 _count;			/* number currently allocated */
6273ff48bf5SDavid du Colombier 
6283ff48bf5SDavid du Colombier 	/* Public: */
6293ff48bf5SDavid du Colombier     unsigned int      count;			/* Number of descriptions */
6303ff48bf5SDavid du Colombier 	icmDescStruct     *data;			/* array of [count] descriptions */
6313ff48bf5SDavid du Colombier }; typedef struct _icmProfileSequenceDesc icmProfileSequenceDesc;
6323ff48bf5SDavid du Colombier 
6333ff48bf5SDavid du Colombier /* signature (only ever used for technology ??) */
6343ff48bf5SDavid du Colombier struct _icmSignature {
6353ff48bf5SDavid du Colombier 	ICM_BASE_MEMBERS
6363ff48bf5SDavid du Colombier 
6373ff48bf5SDavid du Colombier 	/* Public: */
6383ff48bf5SDavid du Colombier     icTechnologySignature sig;	/* Signature */
6393ff48bf5SDavid du Colombier }; typedef struct _icmSignature icmSignature;
6403ff48bf5SDavid du Colombier 
6413ff48bf5SDavid du Colombier /* Per channel Screening Data */
6423ff48bf5SDavid du Colombier typedef struct {
6433ff48bf5SDavid du Colombier 	/* Public: */
6443ff48bf5SDavid du Colombier     double            frequency;		/* Frequency */
6453ff48bf5SDavid du Colombier     double            angle;			/* Screen angle */
6463ff48bf5SDavid du Colombier     icSpotShape       spotShape;		/* Spot Shape encodings below */
6473ff48bf5SDavid du Colombier } icmScreeningData;
6483ff48bf5SDavid du Colombier 
6493ff48bf5SDavid du Colombier struct _icmScreening {
6503ff48bf5SDavid du Colombier 	ICM_BASE_MEMBERS
6513ff48bf5SDavid du Colombier 
6523ff48bf5SDavid du Colombier 	/* Private: */
6533ff48bf5SDavid du Colombier 	unsigned int   _channels;			/* number currently allocated */
6543ff48bf5SDavid du Colombier 
6553ff48bf5SDavid du Colombier 	/* Public: */
6563ff48bf5SDavid du Colombier     unsigned int      screeningFlag;	/* Screening flag */
6573ff48bf5SDavid du Colombier     unsigned int      channels;			/* Number of channels */
6583ff48bf5SDavid du Colombier     icmScreeningData  *data;			/* Array of screening data */
6593ff48bf5SDavid du Colombier }; typedef struct _icmScreening icmScreening;
6603ff48bf5SDavid du Colombier 
6613ff48bf5SDavid du Colombier /* Under color removal, black generation */
6623ff48bf5SDavid du Colombier struct _icmUcrBg {
6633ff48bf5SDavid du Colombier 	ICM_BASE_MEMBERS
6643ff48bf5SDavid du Colombier 
6653ff48bf5SDavid du Colombier 	/* Private: */
6663ff48bf5SDavid du Colombier     unsigned int      UCR_count;		/* Currently allocated UCR count */
6673ff48bf5SDavid du Colombier     unsigned int      BG_count;			/* Currently allocated BG count */
6683ff48bf5SDavid du Colombier 	unsigned long	  _size;			/* Currently allocated string size */
6693ff48bf5SDavid du Colombier 
6703ff48bf5SDavid du Colombier 	/* Public: */
6713ff48bf5SDavid du Colombier     unsigned int      UCRcount;			/* Undercolor Removal Curve length */
6723ff48bf5SDavid du Colombier     double           *UCRcurve;		    /* The array of UCR curve values, 0.0 - 1.0 */
6733ff48bf5SDavid du Colombier 										/* or 0.0 - 100 % if count = 1 */
6743ff48bf5SDavid du Colombier     unsigned int      BGcount;			/* Black generation Curve length */
6753ff48bf5SDavid du Colombier     double           *BGcurve;			/* The array of BG curve values, 0.0 - 1.0 */
6763ff48bf5SDavid du Colombier 										/* or 0.0 - 100 % if count = 1 */
6773ff48bf5SDavid du Colombier 	unsigned long	  size;				/* Allocated and used size of desc, inc null */
6783ff48bf5SDavid du Colombier 	char              *string;			/* UcrBg description (null terminated) */
6793ff48bf5SDavid du Colombier }; typedef struct _icmUcrBg icmUcrBg;
6803ff48bf5SDavid du Colombier 
6813ff48bf5SDavid du Colombier /* viewingConditionsType */
6823ff48bf5SDavid du Colombier struct _icmViewingConditions {
6833ff48bf5SDavid du Colombier 	ICM_BASE_MEMBERS
6843ff48bf5SDavid du Colombier 
6853ff48bf5SDavid du Colombier 	/* Public: */
6863ff48bf5SDavid du Colombier     icmXYZNumber    illuminant;		/* In candelas per sq. meter */
6873ff48bf5SDavid du Colombier     icmXYZNumber    surround;		/* In candelas per sq. meter */
6883ff48bf5SDavid du Colombier     icIlluminant    stdIlluminant;	/* See icIlluminant defines */
6893ff48bf5SDavid du Colombier }; typedef struct _icmViewingConditions icmViewingConditions;
6903ff48bf5SDavid du Colombier 
6913ff48bf5SDavid du Colombier /* Postscript Color Rendering Dictionary names type */
6923ff48bf5SDavid du Colombier struct _icmCrdInfo {
6933ff48bf5SDavid du Colombier 	ICM_BASE_MEMBERS
6943ff48bf5SDavid du Colombier 	/* Private: */
6953ff48bf5SDavid du Colombier     unsigned long    _ppsize;		/* Currently allocated size */
6963ff48bf5SDavid du Colombier 	unsigned long    _crdsize[4];	/* Currently allocated sizes */
6973ff48bf5SDavid du Colombier 
6983ff48bf5SDavid du Colombier 	/* Public: */
6993ff48bf5SDavid du Colombier     unsigned long    ppsize;		/* Postscript product name size (including null) */
7003ff48bf5SDavid du Colombier     char            *ppname;		/* Postscript product name (null terminated) */
7013ff48bf5SDavid du Colombier 	unsigned long    crdsize[4];	/* Rendering intent 0-3 CRD names sizes (icluding null) */
7023ff48bf5SDavid du Colombier 	char            *crdname[4];	/* Rendering intent 0-3 CRD names (null terminated) */
7033ff48bf5SDavid du Colombier }; typedef struct _icmCrdInfo icmCrdInfo;
7043ff48bf5SDavid du Colombier 
7053ff48bf5SDavid du Colombier 
7063ff48bf5SDavid du Colombier /* Apple ColorSync 2.5 video card gamma type */
7073ff48bf5SDavid du Colombier struct _icmVideoCardGammaTable {
7083ff48bf5SDavid du Colombier 	unsigned short   channels;		/* # of gamma channels (1 or 3) */
7093ff48bf5SDavid du Colombier 	unsigned short   entryCount; 	/* 1-based number of entries per channel */
7103ff48bf5SDavid du Colombier 	unsigned short   entrySize;		/* size in bytes of each entry */
7113ff48bf5SDavid du Colombier 	void            *data;			/* variable size data */
7123ff48bf5SDavid du Colombier }; typedef struct _icmVideoCardGammaTable icmVideoCardGammaTable;
7133ff48bf5SDavid du Colombier 
7143ff48bf5SDavid du Colombier struct _icmVideoCardGammaFormula {
7153ff48bf5SDavid du Colombier 	double           redGamma;		/* must be > 0.0 */
7163ff48bf5SDavid du Colombier 	double           redMin;		/* must be > 0.0 and < 1.0 */
7173ff48bf5SDavid du Colombier 	double           redMax;		/* must be > 0.0 and < 1.0 */
7183ff48bf5SDavid du Colombier 	double           greenGamma;   	/* must be > 0.0 */
7193ff48bf5SDavid du Colombier 	double           greenMin;		/* must be > 0.0 and < 1.0 */
7203ff48bf5SDavid du Colombier 	double           greenMax;		/* must be > 0.0 and < 1.0 */
7213ff48bf5SDavid du Colombier 	double           blueGamma;		/* must be > 0.0 */
7223ff48bf5SDavid du Colombier 	double           blueMin;		/* must be > 0.0 and < 1.0 */
7233ff48bf5SDavid du Colombier 	double           blueMax;		/* must be > 0.0 and < 1.0 */
7243ff48bf5SDavid du Colombier }; typedef struct _icmVideoCardGammaFormula icmVideoCardGammaFormula;
7253ff48bf5SDavid du Colombier 
7263ff48bf5SDavid du Colombier enum {
7273ff48bf5SDavid du Colombier 	icmVideoCardGammaTableType = 0,
7283ff48bf5SDavid du Colombier 	icmVideoCardGammaFormulaType = 1
7293ff48bf5SDavid du Colombier };
7303ff48bf5SDavid du Colombier 
7313ff48bf5SDavid du Colombier struct _icmVideoCardGamma {
7323ff48bf5SDavid du Colombier 	ICM_BASE_MEMBERS
7333ff48bf5SDavid du Colombier 	unsigned long                tagType;		/* eg. table or formula, use above enum */
7343ff48bf5SDavid du Colombier 	union {
7353ff48bf5SDavid du Colombier 		icmVideoCardGammaTable   table;
7363ff48bf5SDavid du Colombier 		icmVideoCardGammaFormula formula;
7373ff48bf5SDavid du Colombier 	} u;
7383ff48bf5SDavid du Colombier }; typedef struct _icmVideoCardGamma icmVideoCardGamma;
7393ff48bf5SDavid du Colombier 
7403ff48bf5SDavid du Colombier /* ------------------------------------------------- */
7413ff48bf5SDavid du Colombier /* The Profile header */
7423ff48bf5SDavid du Colombier struct _icmHeader {
7433ff48bf5SDavid du Colombier 	/* Private: */
7443ff48bf5SDavid du Colombier 	unsigned int           (*get_size)(struct _icmHeader *p);
7453ff48bf5SDavid du Colombier 	int                    (*read)(struct _icmHeader *p, unsigned long len, unsigned long of);
7463ff48bf5SDavid du Colombier 	int                    (*write)(struct _icmHeader *p, unsigned long of);
7473ff48bf5SDavid du Colombier 	void                   (*del)(struct _icmHeader *p);
7483ff48bf5SDavid du Colombier 	struct _icc            *icp;			/* Pointer to ICC we're a part of */
7493ff48bf5SDavid du Colombier     unsigned int            size;			/* Profile size in bytes */
7503ff48bf5SDavid du Colombier 
7513ff48bf5SDavid du Colombier 	/* public: */
7523ff48bf5SDavid du Colombier 	void                   (*dump)(struct _icmHeader *p, FILE *op, int verb);
7533ff48bf5SDavid du Colombier 
7543ff48bf5SDavid du Colombier 	/* Values that must be set before writing */
7553ff48bf5SDavid du Colombier     icProfileClassSignature deviceClass;	/* Type of profile */
7563ff48bf5SDavid du Colombier     icColorSpaceSignature   colorSpace;		/* Clr space of data */
7573ff48bf5SDavid du Colombier     icColorSpaceSignature   pcs;			/* PCS: XYZ or Lab */
7583ff48bf5SDavid du Colombier     icRenderingIntent       renderingIntent;/* Rendering intent */
7593ff48bf5SDavid du Colombier 
7603ff48bf5SDavid du Colombier 	/* Values that should be set before writing */
7613ff48bf5SDavid du Colombier     icmSig                  manufacturer;	/* Dev manufacturer */
7623ff48bf5SDavid du Colombier     icmSig		            model;			/* Dev model */
763*593dc095SDavid du Colombier     icmUint64               attributes;		/* Device attributes.l */
7643ff48bf5SDavid du Colombier     unsigned int            flags;			/* Various bits */
7653ff48bf5SDavid du Colombier 
7663ff48bf5SDavid du Colombier 	/* Values that may optionally be set before writing */
767*593dc095SDavid du Colombier     /* icmUint64            attributes;		   Device attributes.h (see above) */
7683ff48bf5SDavid du Colombier     icmSig                  creator;		/* Profile creator */
7693ff48bf5SDavid du Colombier 
7703ff48bf5SDavid du Colombier 	/* Values that are not normally set, since they have defaults */
7713ff48bf5SDavid du Colombier     icmSig                  cmmId;			/* CMM for profile */
7723ff48bf5SDavid du Colombier     int            			majv, minv, bfv;/* Format version - major, minor, bug fix */
7733ff48bf5SDavid du Colombier     icmDateTimeNumber       date;			/* Creation Date */
7743ff48bf5SDavid du Colombier     icPlatformSignature     platform;		/* Primary Platform */
7753ff48bf5SDavid du Colombier     icmXYZNumber            illuminant;		/* Profile illuminant */
7763ff48bf5SDavid du Colombier 
7773ff48bf5SDavid du Colombier }; typedef struct _icmHeader icmHeader;
7783ff48bf5SDavid du Colombier 
7793ff48bf5SDavid du Colombier /* ---------------------------------------------------------- */
7803ff48bf5SDavid du Colombier /* Objects for accessing lookup functions */
7813ff48bf5SDavid du Colombier 
7823ff48bf5SDavid du Colombier /* Public: Parameter to get_luobj function */
7833ff48bf5SDavid du Colombier typedef enum {
7843ff48bf5SDavid du Colombier     icmFwd           = 0,  /* Device to PCS, or Device 1 to Last Device */
7853ff48bf5SDavid du Colombier     icmBwd           = 1,  /* PCS to Device, or Last Device to Device */
7863ff48bf5SDavid du Colombier     icmGamut         = 2,  /* PCS Gamut check */
7873ff48bf5SDavid du Colombier     icmPreview       = 3   /* PCS to PCS preview */
7883ff48bf5SDavid du Colombier } icmLookupFunc;
7893ff48bf5SDavid du Colombier 
7903ff48bf5SDavid du Colombier /* Public: Parameter to get_luobj function */
7913ff48bf5SDavid du Colombier typedef enum {
7923ff48bf5SDavid du Colombier     icmLuOrdNorm     = 0,  /* Normal profile preference: Lut, matrix, monochrome */
793*593dc095SDavid du Colombier     icmLuOrdRev      = 1   /* Reverse profile preference: monochrome, matrix, monochrome */
7943ff48bf5SDavid du Colombier } icmLookupOrder;
7953ff48bf5SDavid du Colombier 
7963ff48bf5SDavid du Colombier /* Public: Lookup algorithm object type */
7973ff48bf5SDavid du Colombier typedef enum {
7983ff48bf5SDavid du Colombier     icmMonoFwdType       = 0,	/* Monochrome, Forward */
7993ff48bf5SDavid du Colombier     icmMonoBwdType       = 1,	/* Monochrome, Backward */
8003ff48bf5SDavid du Colombier     icmMatrixFwdType     = 2,	/* Matrix, Forward */
8013ff48bf5SDavid du Colombier     icmMatrixBwdType     = 3,	/* Matrix, Backward */
8023ff48bf5SDavid du Colombier     icmLutType           = 4	/* Multi-dimensional Lookup Table */
8033ff48bf5SDavid du Colombier } icmLuAlgType;
8043ff48bf5SDavid du Colombier 
8053ff48bf5SDavid du Colombier #define LU_ICM_BASE_MEMBERS																	\
8063ff48bf5SDavid du Colombier 	/* Private: */																		\
8073ff48bf5SDavid du Colombier 	icmLuAlgType   ttype;		    	/* The object tag */							\
8083ff48bf5SDavid du Colombier 	struct _icc    *icp;				/* Pointer to ICC we're a part of */			\
8093ff48bf5SDavid du Colombier 	icRenderingIntent intent;			/* Effective intent */							\
8103ff48bf5SDavid du Colombier 	icmLookupFunc function;				/* Functionality being used */					\
8113ff48bf5SDavid du Colombier 	icmXYZNumber pcswht, whitePoint, blackPoint;	/* White and black point info */	\
8123ff48bf5SDavid du Colombier 	double toAbs[3][3];					/* Matrix to convert from relative to absolute */ \
8133ff48bf5SDavid du Colombier 	double fromAbs[3][3];				/* Matrix to convert from absolute to relative */ \
8143ff48bf5SDavid du Colombier     icColorSpaceSignature inSpace;		/* Native Clr space of input */					\
8153ff48bf5SDavid du Colombier     icColorSpaceSignature outSpace;		/* Native Clr space of output */				\
8163ff48bf5SDavid du Colombier 	icColorSpaceSignature pcs;			/* Native PCS */								\
8173ff48bf5SDavid du Colombier     icColorSpaceSignature e_inSpace;	/* Effective Clr space of input */				\
8183ff48bf5SDavid du Colombier     icColorSpaceSignature e_outSpace;	/* Effective Clr space of output */				\
8193ff48bf5SDavid du Colombier 	icColorSpaceSignature e_pcs;		/* Effective PCS */								\
8203ff48bf5SDavid du Colombier 																						\
8213ff48bf5SDavid du Colombier 	/* Public: */																		\
8223ff48bf5SDavid du Colombier 	void           (*del)(struct _icmLuBase *p);										\
8233ff48bf5SDavid du Colombier 	                            /* Internal native colorspaces */     							\
8243ff48bf5SDavid du Colombier 	void           (*lutspaces) (struct _icmLuBase *p, icColorSpaceSignature *ins, int *inn,	\
8253ff48bf5SDavid du Colombier 	                                                   icColorSpaceSignature *outs, int *outn);	\
8263ff48bf5SDavid du Colombier 	                                                                                        \
8273ff48bf5SDavid du Colombier 	                         /* External effecive colorspaces */							\
8283ff48bf5SDavid du Colombier 	void           (*spaces) (struct _icmLuBase *p, icColorSpaceSignature *ins, int *inn,	\
8293ff48bf5SDavid du Colombier 	                                 icColorSpaceSignature *outs, int *outn,				\
8303ff48bf5SDavid du Colombier 	                                 icmLuAlgType *alg, icRenderingIntent *intt, 			\
8313ff48bf5SDavid du Colombier 	                                 icmLookupFunc *fnc, icColorSpaceSignature *pcs); 		\
8323ff48bf5SDavid du Colombier 																							\
833*593dc095SDavid du Colombier 	/* Get the effective input space and output space ranges */								\
834*593dc095SDavid du Colombier 	void (*get_ranges) (struct _icmLuBase *p,												\
835*593dc095SDavid du Colombier 		double *inmin, double *inmax,		/* Maximum range of inspace values */			\
836*593dc095SDavid du Colombier 		double *outmin, double *outmax);	/* Maximum range of outspace values */			\
837*593dc095SDavid du Colombier 																							\
8383ff48bf5SDavid du Colombier 	void           (*wh_bk_points)(struct _icmLuBase *p, icmXYZNumber *wht, icmXYZNumber *blk);	\
8393ff48bf5SDavid du Colombier 	int            (*lookup) (struct _icmLuBase *p, double *out, double *in);
8403ff48bf5SDavid du Colombier 
8413ff48bf5SDavid du Colombier 	/* Translate color values through profile */
8423ff48bf5SDavid du Colombier 	/* 0 = success */
8433ff48bf5SDavid du Colombier 	/* 1 = warning: clipping occured */
8443ff48bf5SDavid du Colombier 	/* 2 = fatal: other error */
8453ff48bf5SDavid du Colombier 
8463ff48bf5SDavid du Colombier /* Base lookup object */
8473ff48bf5SDavid du Colombier struct _icmLuBase {
8483ff48bf5SDavid du Colombier 	LU_ICM_BASE_MEMBERS
8493ff48bf5SDavid du Colombier }; typedef struct _icmLuBase icmLuBase;
8503ff48bf5SDavid du Colombier 
8513ff48bf5SDavid du Colombier /* Monochrome  Fwd & Bwd type object */
8523ff48bf5SDavid du Colombier struct _icmLuMono {
8533ff48bf5SDavid du Colombier 	LU_ICM_BASE_MEMBERS
8543ff48bf5SDavid du Colombier 	icmCurve    *grayCurve;
8553ff48bf5SDavid du Colombier 
8563ff48bf5SDavid du Colombier 	/* Overall lookups */
8573ff48bf5SDavid du Colombier 	int (*fwd_lookup) (struct _icmLuBase *p, double *out, double *in);
8583ff48bf5SDavid du Colombier 	int (*bwd_lookup) (struct _icmLuBase *p, double *out, double *in);
8593ff48bf5SDavid du Colombier 
8603ff48bf5SDavid du Colombier 	/* Components of lookup */
8613ff48bf5SDavid du Colombier 	int (*fwd_curve) (struct _icmLuMono *p, double *out, double *in);
8623ff48bf5SDavid du Colombier 	int (*fwd_map)   (struct _icmLuMono *p, double *out, double *in);
8633ff48bf5SDavid du Colombier 	int (*fwd_abs)   (struct _icmLuMono *p, double *out, double *in);
8643ff48bf5SDavid du Colombier 	int (*bwd_abs)   (struct _icmLuMono *p, double *out, double *in);
8653ff48bf5SDavid du Colombier 	int (*bwd_map)   (struct _icmLuMono *p, double *out, double *in);
8663ff48bf5SDavid du Colombier 	int (*bwd_curve) (struct _icmLuMono *p, double *out, double *in);
8673ff48bf5SDavid du Colombier 
8683ff48bf5SDavid du Colombier }; typedef struct _icmLuMono icmLuMono;
8693ff48bf5SDavid du Colombier 
8703ff48bf5SDavid du Colombier /* 3D Matrix Fwd & Bwd type object */
8713ff48bf5SDavid du Colombier struct _icmLuMatrix {
8723ff48bf5SDavid du Colombier 	LU_ICM_BASE_MEMBERS
8733ff48bf5SDavid du Colombier 	icmCurve    *redCurve, *greenCurve, *blueCurve;
8743ff48bf5SDavid du Colombier 	icmXYZArray *redColrnt, *greenColrnt, *blueColrnt;
8753ff48bf5SDavid du Colombier     double		mx[3][3];	/* 3 * 3 conversion matrix */
8763ff48bf5SDavid du Colombier     double		bmx[3][3];	/* 3 * 3 backwards conversion matrix */
8773ff48bf5SDavid du Colombier 
8783ff48bf5SDavid du Colombier 	/* Overall lookups */
8793ff48bf5SDavid du Colombier 	int (*fwd_lookup) (struct _icmLuBase *p, double *out, double *in);
8803ff48bf5SDavid du Colombier 	int (*bwd_lookup) (struct _icmLuBase *p, double *out, double *in);
8813ff48bf5SDavid du Colombier 
8823ff48bf5SDavid du Colombier 	/* Components of lookup */
8833ff48bf5SDavid du Colombier 	int (*fwd_curve)  (struct _icmLuMatrix *p, double *out, double *in);
8843ff48bf5SDavid du Colombier 	int (*fwd_matrix) (struct _icmLuMatrix *p, double *out, double *in);
8853ff48bf5SDavid du Colombier 	int (*fwd_abs)    (struct _icmLuMatrix *p, double *out, double *in);
8863ff48bf5SDavid du Colombier 	int (*bwd_abs)    (struct _icmLuMatrix *p, double *out, double *in);
8873ff48bf5SDavid du Colombier 	int (*bwd_matrix) (struct _icmLuMatrix *p, double *out, double *in);
8883ff48bf5SDavid du Colombier 	int (*bwd_curve)  (struct _icmLuMatrix *p, double *out, double *in);
8893ff48bf5SDavid du Colombier 
8903ff48bf5SDavid du Colombier }; typedef struct _icmLuMatrix icmLuMatrix;
8913ff48bf5SDavid du Colombier 
8923ff48bf5SDavid du Colombier /* Multi-D. Lut type object */
8933ff48bf5SDavid du Colombier struct _icmLuLut {
8943ff48bf5SDavid du Colombier 	LU_ICM_BASE_MEMBERS
8953ff48bf5SDavid du Colombier 
8963ff48bf5SDavid du Colombier 	/* private: */
8973ff48bf5SDavid du Colombier 	icmLut *lut;								/* Lut to use */
8983ff48bf5SDavid du Colombier 	int    usematrix;							/* non-zero if matrix should be used */
8993ff48bf5SDavid du Colombier     double imx[3][3];							/* 3 * 3 inverse conversion matrix */
9003ff48bf5SDavid du Colombier 	int    imx_valid;							/* Inverse matrix is valid */
9013ff48bf5SDavid du Colombier 	void (*in_normf)(double *out, double *in);	/* Lut input data normalizing function */
9023ff48bf5SDavid du Colombier 	void (*in_denormf)(double *out, double *in);/* Lut input data de-normalizing function */
9033ff48bf5SDavid du Colombier 	void (*out_normf)(double *out, double *in);	/* Lut output data normalizing function */
9043ff48bf5SDavid du Colombier 	void (*out_denormf)(double *out, double *in);/* Lut output de-normalizing function */
9053ff48bf5SDavid du Colombier 	void (*e_in_denormf)(double *out, double *in);/* Effective input de-normalizing function */
9063ff48bf5SDavid du Colombier 	void (*e_out_denormf)(double *out, double *in);/* Effecive output de-normalizing function */
9073ff48bf5SDavid du Colombier 	/* function chosen out of lut->lookup_clut_sx and lut->lookup_clut_nl to imp. clut() */
9083ff48bf5SDavid du Colombier 	int (*lookup_clut) (struct _icmLut *pp, double *out, double *in);	/* clut function */
9093ff48bf5SDavid du Colombier 
9103ff48bf5SDavid du Colombier 	/* public: */
9113ff48bf5SDavid du Colombier 
9123ff48bf5SDavid du Colombier 	/* Components of lookup */
9133ff48bf5SDavid du Colombier 	int (*in_abs)  (struct _icmLuLut *p, double *out, double *in);	/* Should be in icmLut ? */
9143ff48bf5SDavid du Colombier 	int (*matrix)  (struct _icmLuLut *p, double *out, double *in);
9153ff48bf5SDavid du Colombier 	int (*input)   (struct _icmLuLut *p, double *out, double *in);
9163ff48bf5SDavid du Colombier 	int (*clut)    (struct _icmLuLut *p, double *out, double *in);
9173ff48bf5SDavid du Colombier 	int (*output)  (struct _icmLuLut *p, double *out, double *in);
9183ff48bf5SDavid du Colombier 	int (*out_abs) (struct _icmLuLut *p, double *out, double *in);	/* Should be in icmLut ? */
9193ff48bf5SDavid du Colombier 
9203ff48bf5SDavid du Colombier 	/* Some inverse components */
9213ff48bf5SDavid du Colombier 	/* Should be in icmLut ??? */
9223ff48bf5SDavid du Colombier 	int (*inv_out_abs) (struct _icmLuLut *p, double *out, double *in);
9233ff48bf5SDavid du Colombier 	int (*inv_output)  (struct _icmLuLut *p, double *out, double *in);
9243ff48bf5SDavid du Colombier 	/* inv_clut is beyond scope of icclib. See argyll for solution! */
9253ff48bf5SDavid du Colombier 	int (*inv_input)   (struct _icmLuLut *p, double *out, double *in);
9263ff48bf5SDavid du Colombier 	int (*inv_matrix)  (struct _icmLuLut *p, double *out, double *in);
9273ff48bf5SDavid du Colombier 	int (*inv_in_abs)  (struct _icmLuLut *p, double *out, double *in);
9283ff48bf5SDavid du Colombier 
9293ff48bf5SDavid du Colombier 	/* Get various types of information about the LuLut */
9303ff48bf5SDavid du Colombier 	void (*get_info) (struct _icmLuLut *p, icmLut **lutp,
9313ff48bf5SDavid du Colombier 	                 icmXYZNumber *pcswhtp, icmXYZNumber *whitep,
9323ff48bf5SDavid du Colombier 	                 icmXYZNumber *blackp);
9333ff48bf5SDavid du Colombier 
9343ff48bf5SDavid du Colombier 	/* Get the native input space and output space ranges */
9353ff48bf5SDavid du Colombier 	void (*get_lutranges) (struct _icmLuLut *p,
9363ff48bf5SDavid du Colombier 		double *inmin, double *inmax,		/* Maximum range of inspace values */
9373ff48bf5SDavid du Colombier 		double *outmin, double *outmax);	/* Maximum range of outspace values */
9383ff48bf5SDavid du Colombier 
9393ff48bf5SDavid du Colombier 	/* Get the matrix contents */
9403ff48bf5SDavid du Colombier 	void (*get_matrix) (struct _icmLuLut *p, double m[3][3]);
9413ff48bf5SDavid du Colombier 
9423ff48bf5SDavid du Colombier }; typedef struct _icmLuLut icmLuLut;
9433ff48bf5SDavid du Colombier 
9443ff48bf5SDavid du Colombier /* ---------------------------------------------------------- */
9453ff48bf5SDavid du Colombier /* A tag */
9463ff48bf5SDavid du Colombier typedef struct {
9473ff48bf5SDavid du Colombier     icTagSignature      sig;			/* The tag signature */
9483ff48bf5SDavid du Colombier 	icTagTypeSignature  ttype;			/* The tag type signature */
9493ff48bf5SDavid du Colombier     unsigned int        offset;			/* File offset to start header */
9503ff48bf5SDavid du Colombier     unsigned int        size;			/* Size in bytes */
9513ff48bf5SDavid du Colombier 	icmBase            *objp;			/* In memory data structure */
9523ff48bf5SDavid du Colombier } icmTag;
9533ff48bf5SDavid du Colombier 
9543ff48bf5SDavid du Colombier /* Pseudo enumerations valid as parameter to get_luobj(): */
9553ff48bf5SDavid du Colombier 
9563ff48bf5SDavid du Colombier /* To be specified where an intent is not appropriate */
9573ff48bf5SDavid du Colombier #define icmDefaultIntent ((icRenderingIntent)98)
9583ff48bf5SDavid du Colombier 
9593ff48bf5SDavid du Colombier /* Pseudo PCS colospace used to indicate the native PCS */
9603ff48bf5SDavid du Colombier #define icmSigDefaultData ((icColorSpaceSignature) 0x0)
9613ff48bf5SDavid du Colombier 
9623ff48bf5SDavid du Colombier 
9633ff48bf5SDavid du Colombier /* The ICC object */
9643ff48bf5SDavid du Colombier struct _icc {
9653ff48bf5SDavid du Colombier 	/* Public: */
9663ff48bf5SDavid du Colombier 	unsigned int (*get_size)(struct _icc *p);				/* Return total size needed, 0 = err. */
9673ff48bf5SDavid du Colombier 	int          (*read)(struct _icc *p, icmFile *fp, unsigned long of);	/* Returns error code */
9683ff48bf5SDavid du Colombier 	int          (*write)(struct _icc *p, icmFile *fp, unsigned long of);/* Returns error code */
9693ff48bf5SDavid du Colombier 	void         (*dump)(struct _icc *p, FILE *op, int verb);	/* Dump whole icc */
9703ff48bf5SDavid du Colombier 	void         (*del)(struct _icc *p);						/* Free whole icc */
9713ff48bf5SDavid du Colombier 	int          (*find_tag)(struct _icc *p, icTagSignature sig);
9723ff48bf5SDavid du Colombier 															/* Returns 1 if found, 2 readable */
9733ff48bf5SDavid du Colombier 	icmBase *    (*read_tag)(struct _icc *p, icTagSignature sig);
9743ff48bf5SDavid du Colombier 															/* Returns pointer to object */
9753ff48bf5SDavid du Colombier 	icmBase *    (*add_tag)(struct _icc *p, icTagSignature sig, icTagTypeSignature ttype);
9763ff48bf5SDavid du Colombier 															/* Returns pointer to object */
9773ff48bf5SDavid du Colombier 	int          (*rename_tag)(struct _icc *p, icTagSignature sig, icTagSignature sigNew);
9783ff48bf5SDavid du Colombier 															/* Rename and existing tag */
9793ff48bf5SDavid du Colombier 	icmBase *    (*link_tag)(struct _icc *p, icTagSignature sig, icTagSignature ex_sig);
9803ff48bf5SDavid du Colombier 															/* Returns pointer to object */
9813ff48bf5SDavid du Colombier 	int          (*unread_tag)(struct _icc *p, icTagSignature sig);
9823ff48bf5SDavid du Colombier 														/* Unread a tag (free on refcount == 0 */
9833ff48bf5SDavid du Colombier 	int          (*read_all_tags)(struct _icc *p); /* Read all the tags, non-zero on error. */
9843ff48bf5SDavid du Colombier 
9853ff48bf5SDavid du Colombier 	int          (*delete_tag)(struct _icc *p, icTagSignature sig);
9863ff48bf5SDavid du Colombier 															/* Returns 0 if deleted OK */
9873ff48bf5SDavid du Colombier 	icmLuBase *  (*get_luobj) (struct _icc *p,
9883ff48bf5SDavid du Colombier                                      icmLookupFunc func,			/* Functionality */
9893ff48bf5SDavid du Colombier 	                                 icRenderingIntent intent,		/* Intent */
9903ff48bf5SDavid du Colombier 	                                 icColorSpaceSignature pcsor,	/* PCS overide (0 = def) */
9913ff48bf5SDavid du Colombier 	                                 icmLookupOrder order);			/* Search Order */
9923ff48bf5SDavid du Colombier 	                                 /* Return appropriate lookup object */
9933ff48bf5SDavid du Colombier 	                                 /* NULL on error, check errc+err for reason */
9943ff48bf5SDavid du Colombier 
9953ff48bf5SDavid du Colombier 
9963ff48bf5SDavid du Colombier     icmHeader       *header;			/* The header */
9973ff48bf5SDavid du Colombier 	char             err[512];			/* Error message */
9983ff48bf5SDavid du Colombier 	int              errc;				/* Error code */
9993ff48bf5SDavid du Colombier 
10003ff48bf5SDavid du Colombier 	/* Private: ? */
10013ff48bf5SDavid du Colombier 	icmAlloc        *al;				/* Heap allocator */
10023ff48bf5SDavid du Colombier 	int              del_al;			/* NZ if heap allocator should be deleted */
10033ff48bf5SDavid du Colombier 	icmFile         *fp;				/* File associated with object */
10043ff48bf5SDavid du Colombier 	unsigned long    of;				/* Offset of the profile within the file */
10053ff48bf5SDavid du Colombier     unsigned int     count;				/* Num tags in the profile */
10063ff48bf5SDavid du Colombier     icmTag          *data;    			/* The tagTable and tagData */
10073ff48bf5SDavid du Colombier 
10083ff48bf5SDavid du Colombier 	}; typedef struct _icc icc;
10093ff48bf5SDavid du Colombier 
10103ff48bf5SDavid du Colombier /* ========================================================== */
10113ff48bf5SDavid du Colombier /* Utility structures and declarations */
10123ff48bf5SDavid du Colombier 
10133ff48bf5SDavid du Colombier /* Structure to hold pseudo-hilbert counter info */
10143ff48bf5SDavid du Colombier struct _psh {
10153ff48bf5SDavid du Colombier 	int      di;	/* Dimensionality */
10163ff48bf5SDavid du Colombier 	unsigned res;	/* Resolution per coordinate */
10173ff48bf5SDavid du Colombier 	unsigned bits;	/* Bits per coordinate */
10183ff48bf5SDavid du Colombier 	unsigned ix;	/* Current binary index */
10193ff48bf5SDavid du Colombier 	unsigned tmask;	/* Total 2^n count mask */
10203ff48bf5SDavid du Colombier 	unsigned count;	/* Usable count */
10213ff48bf5SDavid du Colombier }; typedef struct _psh psh;
10223ff48bf5SDavid du Colombier 
10233ff48bf5SDavid du Colombier /* Type of encoding to be returned as a string */
10243ff48bf5SDavid du Colombier typedef enum {
10253ff48bf5SDavid du Colombier     icmScreenEncodings,
10263ff48bf5SDavid du Colombier     icmDeviceAttributes,
10273ff48bf5SDavid du Colombier 	icmProfileHeaderFlags,
10283ff48bf5SDavid du Colombier 	icmAsciiOrBinaryData,
10293ff48bf5SDavid du Colombier 	icmTagSignature,
10303ff48bf5SDavid du Colombier 	icmTechnologySignature,
10313ff48bf5SDavid du Colombier 	icmTypeSignature,
10323ff48bf5SDavid du Colombier 	icmColorSpaceSignature,
10333ff48bf5SDavid du Colombier 	icmProfileClassSignaure,
10343ff48bf5SDavid du Colombier 	icmPlatformSignature,
10353ff48bf5SDavid du Colombier 	icmMeasurementFlare,
10363ff48bf5SDavid du Colombier 	icmMeasurementGeometry,
10373ff48bf5SDavid du Colombier 	icmRenderingIntent,
10383ff48bf5SDavid du Colombier 	icmSpotShape,
10393ff48bf5SDavid du Colombier 	icmStandardObserver,
10403ff48bf5SDavid du Colombier 	icmIlluminant,
10413ff48bf5SDavid du Colombier 	icmLuAlg
10423ff48bf5SDavid du Colombier } icmEnumType;
10433ff48bf5SDavid du Colombier 
10443ff48bf5SDavid du Colombier /* ========================================================== */
10453ff48bf5SDavid du Colombier /* Public function declarations */
10463ff48bf5SDavid du Colombier /* Create an empty object. Return null on error */
10473ff48bf5SDavid du Colombier extern ICCLIB_API icc *new_icc(void);				/* Default allocator */
10483ff48bf5SDavid du Colombier extern ICCLIB_API icc *new_icc_a(icmAlloc *al);		/* With allocator class */
10493ff48bf5SDavid du Colombier 
10503ff48bf5SDavid du Colombier /* - - - - - - - - - - - - - */
10513ff48bf5SDavid du Colombier /* Some useful utilities: */
10523ff48bf5SDavid du Colombier 
10533ff48bf5SDavid du Colombier /* Return a string that represents a tag */
10543ff48bf5SDavid du Colombier extern ICCLIB_API char *tag2str(int tag);
10553ff48bf5SDavid du Colombier 
10563ff48bf5SDavid du Colombier /* Return a tag created from a string */
1057*593dc095SDavid du Colombier extern ICCLIB_API int str2tag(const char *str);
10583ff48bf5SDavid du Colombier 
10593ff48bf5SDavid du Colombier /* Return a string description of the given enumeration value */
1060*593dc095SDavid du Colombier extern ICCLIB_API const char *icm2str(icmEnumType etype, int enumval);
10613ff48bf5SDavid du Colombier 
10623ff48bf5SDavid du Colombier /* CIE XYZ to perceptual Lab */
10633ff48bf5SDavid du Colombier extern ICCLIB_API void icmXYZ2Lab(icmXYZNumber *w, double *out, double *in);
10643ff48bf5SDavid du Colombier 
10653ff48bf5SDavid du Colombier /* Perceptual Lab to CIE XYZ */
10663ff48bf5SDavid du Colombier extern ICCLIB_API void icmLab2XYZ(icmXYZNumber *w, double *out, double *in);
10673ff48bf5SDavid du Colombier 
10683ff48bf5SDavid du Colombier /* The standard D50 illuminant value */
10693ff48bf5SDavid du Colombier extern ICCLIB_API icmXYZNumber icmD50;
10703ff48bf5SDavid du Colombier 
1071*593dc095SDavid du Colombier /* The standard D65 illuminant value */
1072*593dc095SDavid du Colombier extern ICCLIB_API icmXYZNumber icmD65;
1073*593dc095SDavid du Colombier 
10743ff48bf5SDavid du Colombier /* The default black value */
10753ff48bf5SDavid du Colombier extern ICCLIB_API icmXYZNumber icmBlack;
10763ff48bf5SDavid du Colombier 
10773ff48bf5SDavid du Colombier /* Initialise a pseudo-hilbert grid counter, return total usable count. */
10783ff48bf5SDavid du Colombier extern ICCLIB_API unsigned psh_init(psh *p, int di, unsigned res, int co[]);
10793ff48bf5SDavid du Colombier 
10803ff48bf5SDavid du Colombier /* Reset the counter */
10813ff48bf5SDavid du Colombier extern ICCLIB_API void psh_reset(psh *p);
10823ff48bf5SDavid du Colombier 
10833ff48bf5SDavid du Colombier /* Increment pseudo-hilbert coordinates */
10843ff48bf5SDavid du Colombier /* Return non-zero if count rolls over to 0 */
10853ff48bf5SDavid du Colombier extern ICCLIB_API int psh_inc(psh *p, int co[]);
10863ff48bf5SDavid du Colombier 
1087*593dc095SDavid du Colombier /* Chromatic Adaption transform utility */
10883ff48bf5SDavid du Colombier /* Return a 3x3 chromatic adaption matrix */
10893ff48bf5SDavid du Colombier void icmChromAdaptMatrix(
10903ff48bf5SDavid du Colombier 	int flags,				/* Flags as defined below */
10913ff48bf5SDavid du Colombier 	icmXYZNumber d_wp,		/* Destination white point */
10923ff48bf5SDavid du Colombier 	icmXYZNumber s_wp,		/* Source white point */
10933ff48bf5SDavid du Colombier 	double mat[3][3]		/* Destination matrix */
10943ff48bf5SDavid du Colombier );
10953ff48bf5SDavid du Colombier 
10963ff48bf5SDavid du Colombier #define ICM_CAM_BRADFORD	0x0001	/* Use Bradford sharpened response space */
10973ff48bf5SDavid du Colombier #define ICM_CAM_MULMATRIX	0x0002	/* Transform the given matrix */
10983ff48bf5SDavid du Colombier 
1099*593dc095SDavid du Colombier /* Return the normal Delta E given two Lab values */
1100*593dc095SDavid du Colombier extern ICCLIB_API double icmLabDE(double *in1, double *in2);
1101*593dc095SDavid du Colombier 
1102*593dc095SDavid du Colombier /* Return the normal Delta E squared, given two Lab values */
1103*593dc095SDavid du Colombier extern ICCLIB_API double icmLabDEsq(double *in1, double *in2);
1104*593dc095SDavid du Colombier 
1105*593dc095SDavid du Colombier /* Return the CIE94 Delta E color difference measure for two Lab values */
1106*593dc095SDavid du Colombier extern ICCLIB_API double icmCIE94(double *in1, double *in2);
1107*593dc095SDavid du Colombier 
1108*593dc095SDavid du Colombier /* Return the CIE94 Delta E color difference measure squared, for two Lab values */
1109*593dc095SDavid du Colombier extern ICCLIB_API double icmCIE94sq(double *in1, double *in2);
1110*593dc095SDavid du Colombier 
11113ff48bf5SDavid du Colombier /* Simple macro to transfer an array to an XYZ number */
11123ff48bf5SDavid du Colombier #define icmAry2XYZ(xyz, ary) ((xyz).X = (ary)[0], (xyz).Y = (ary)[1], (xyz).Z = (ary)[2])
11133ff48bf5SDavid du Colombier 
11143ff48bf5SDavid du Colombier /* And the reverse */
11153ff48bf5SDavid du Colombier #define icmXYZ2Ary(ary, xyz) ((ary)[0] = (xyz).X, (ary)[1] = (xyz).Y, (ary)[2] = (xyz).Z)
11163ff48bf5SDavid du Colombier 
11173ff48bf5SDavid du Colombier /* ---------------------------------------------------------- */
11183ff48bf5SDavid du Colombier 
11193ff48bf5SDavid du Colombier #ifdef __cplusplus
11203ff48bf5SDavid du Colombier 	}
11213ff48bf5SDavid du Colombier #endif
11223ff48bf5SDavid du Colombier 
11233ff48bf5SDavid du Colombier #endif /* ICC_H */
11243ff48bf5SDavid du Colombier 
1125