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