Warning: Attempt to read property "date" on null in /usr/local/www/websvn.planix.org/blame.php on line 247

Warning: Attempt to read property "msg" on null in /usr/local/www/websvn.planix.org/blame.php on line 247
WebSVN – planix.SVN – Blame – /os/branches/feature-vt/sys/src/cmd/gs/icclib/icc.h – Rev 2

Subversion Repositories planix.SVN

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#ifndef ICC_H
2
#define ICC_H
3
/* 
4
 * International Color Consortium Format Library (icclib)
5
 *
6
 * Author:  Graeme W. Gill
7
 * Date:    99/11/29
8
 * Version: 2.01
9
 *
10
 * Copyright 1997, 1998, 1999, 2000, 2001 Graeme W. Gill
11
 * Please refer to Licence.txt file for details.
12
 */
13
 
14
 
15
/* We can get some subtle errors if certain headers aren't included */
16
#include <stdio.h>
17
#include <stdlib.h>
18
#include <string.h>
19
#include <fcntl.h>
20
#include <math.h>
21
#include <time.h>
22
#include <sys/types.h>
23
 
24
/*
25
 *  Note XYZ scaling to 1.0, not 100.0
26
 */
27
 
28
 
29
/* Make allowance for shared library use */
30
#ifdef ICCLIB_SHARED		/* Compiling or Using shared library version */
31
# ifdef ICCLIB_EXPORTS		/* Compiling shared library */
32
#  ifdef NT
33
#   define ICCLIB_API __declspec(dllexport)
34
#  endif /* NT */
35
# else						/* Using shared library */
36
#  ifdef NT
37
#   define ICCLIB_API __declspec(dllimport)
38
#   ifdef ICCLIB_DEBUG
39
#    pragma comment (lib, "icclibd.lib")
40
#   else
41
#    pragma comment (lib, "icclib.lib")
42
#   endif	/* DEBUG */
43
#  endif /* NT */
44
# endif
45
#else						/* Using static library */
46
# define ICCLIB_API	/* empty */
47
#endif
48
 
49
 
50
#ifdef __cplusplus
51
	extern "C" {
52
#endif
53
 
54
 
55
/* ---------------------------------------------- */
56
/* Platform specific defines */
57
/* It is assumed that the native machine size is 32 bits */
58
#ifndef INR8
59
#define INR8   signed char		/* 8 bit signed */
60
#endif
61
#ifndef INR16
62
#define INR16  signed short		/* 16 bit signed */
63
#endif
64
#ifndef INR32
65
#define INR32  signed long		/* 32 bit signed */
66
#endif
67
#ifndef ORD8
68
#define ORD8   unsigned char	/* 8 bit unsigned */
69
#endif
70
#ifndef ORD16
71
#define ORD16  unsigned short	/* 16 bit unsigned */
72
#endif
73
#ifndef ORD32
74
#define ORD32  unsigned long	/* 32 bit unsigned */
75
#endif
76
 
77
#include "icc9809.h"	/* Standard ICC definitions, version ICC.1:1998-09 with mods noted. */ 
78
 
79
/* Note that the prefix icm is used for the native Machine */
80
/* equivalents of the file structures defined in icc34.h */
81
 
82
/* ---------------------------------------------- */
83
/* System interface objects. The defaults can be replaced */
84
/* for adaption to different system environments */
85
 
86
/* File access class interface definition */
87
#define ICM_FILE_BASE																		\
88
	/* Public: */																			\
89
																							\
90
	/* Set current position to offset. Return 0 on success, nz on failure. */				\
91
	int    (*seek) (struct _icmFile *p, long int offset);									\
92
																							\
93
	/* Read count items of size length. Return number of items successfully read. */ 		\
94
	size_t (*read) (struct _icmFile *p, void *buffer, size_t size, size_t count);			\
95
																							\
96
	/* write count items of size length. Return number of items successfully written. */ 	\
97
	size_t (*write)(struct _icmFile *p, void *buffer, size_t size, size_t count);			\
98
																							\
99
	/* flush all write data out to secondary storage. Return nz on failure. */				\
100
	int (*flush)(struct _icmFile *p);														\
101
																							\
102
	/* we're done with the file object, return nz on failure */								\
103
	int (*del)(struct _icmFile *p);															\
104
 
105
 
106
/* Common file interface class */
107
struct _icmFile {
108
	ICM_FILE_BASE
109
}; typedef struct _icmFile icmFile;
110
 
111
 
112
/* - - - - - - - - - - - - - - - - - - - - -  */
113
 
114
/* Implementation of file access class based on standard file I/O */
115
struct _icmFileStd {
116
	ICM_FILE_BASE
117
 
118
	/* Private: */
119
	FILE *fp;
120
	int   doclose;		/* nz if free should close */
121
}; typedef struct _icmFileStd icmFileStd;
122
 
123
/* Create given a file name */
124
icmFile *new_icmFileStd_name(char *name, char *mode);
125
 
126
/* Create given a (binary) FILE* */
127
icmFile *new_icmFileStd_fp(FILE *fp);
128
 
129
 
130
 
131
/* - - - - - - - - - - - - - - - - - - - - -  */
132
/* Implementation of file access class based on a memory image */
133
struct _icmFileMem {
134
	ICM_FILE_BASE
135
 
136
	/* Private: */
137
	unsigned char *start, *cur, *end;
138
 
139
}; typedef struct _icmFileMem icmFileMem;
140
 
141
/* Create a memory image file access class */
142
icmFile *new_icmFileMem(void *base, size_t length);
143
 
144
 
145
/* - - - - - - - - - - - - - - - - - - - - -  */
146
/* Heap allocator class interface definition */
147
#define ICM_ALLOC_BASE																		\
148
	/* Public: */																			\
149
																							\
150
	void *(*malloc) (struct _icmAlloc *p, size_t size);										\
151
	void *(*calloc) (struct _icmAlloc *p, size_t num, size_t size);							\
152
	void *(*realloc)(struct _icmAlloc *p, void *ptr, size_t size);							\
153
	void  (*free)   (struct _icmAlloc *p, void *ptr);										\
154
																							\
155
	/* we're done with the allocator object */												\
156
	void (*del)(struct _icmAlloc *p);														\
157
 
158
/* Common heap allocator interface class */
159
struct _icmAlloc {
160
	ICM_ALLOC_BASE
161
}; typedef struct _icmAlloc icmAlloc;
162
 
163
/* - - - - - - - - - - - - - - - - - - - - -  */
164
 
165
/* Implementation of heap class based on standard system malloc */
166
struct _icmAllocStd {
167
	ICM_ALLOC_BASE
168
}; typedef struct _icmAllocStd icmAllocStd;
169
 
170
/* Create a standard alloc object */
171
icmAlloc *new_icmAllocStd(void);
172
 
173
 
174
/* --------------------------------- */
175
/* Assumed constants                 */
176
 
177
#define MAX_CHAN 15		/* Maximum number of color channels */
178
 
179
/* --------------------------------- */
180
/* tag and other compound structures */
181
 
182
typedef int icmSig;	/* Otherwise un-enumerated 4 byte signature */
183
 
184
typedef struct {
185
	ORD32 l;			/* High and low components of signed 64 bit */
186
	INR32 h;
187
} icmInt64;
188
 
189
typedef struct {
190
	ORD32 l,h;			/* High and low components of unsigned 64 bit */
191
} icmUint64;
192
 
193
/* XYZ Number */
194
typedef struct {
195
    double  X;
196
    double  Y;
197
    double  Z;
198
} icmXYZNumber;
199
 
200
/* Response 16 number */
201
typedef struct {
202
	double	       deviceValue;	/* The device value in range 0.0 - 1.0 */
203
	double	       measurement;	/* The reading value */
204
} icmResponse16Number;
205
 
206
/*
207
 *  read and write method error codes:
208
 *  0 = sucess
209
 *  1 = file format/logistical error
210
 *  2 = system error
211
 */
212
 
213
#define ICM_BASE_MEMBERS																\
214
	/* Private: */																		\
215
	icTagTypeSignature  ttype;		/* The tag type signature */						\
216
	struct _icc    *icp;			/* Pointer to ICC we're a part of */				\
217
	int	           touched;			/* Flag for write bookeeping */						\
218
    int            refcount;		/* Reference count for sharing */					\
219
	unsigned int   (*get_size)(struct _icmBase *p);										\
220
	int            (*read)(struct _icmBase *p, unsigned long len, unsigned long of);	\
221
	int            (*write)(struct _icmBase *p, unsigned long of);						\
222
	void           (*del)(struct _icmBase *p);											\
223
																						\
224
	/* Public: */																		\
225
	void           (*dump)(struct _icmBase *p, FILE *op, int verb);						\
226
	int            (*allocate)(struct _icmBase *p);									
227
 
228
/* Base tag element data object */
229
struct _icmBase {
230
	ICM_BASE_MEMBERS
231
}; typedef struct _icmBase icmBase;
232
 
233
/* UInt8 Array */
234
struct _icmUInt8Array {
235
	ICM_BASE_MEMBERS
236
 
237
	/* Private: */
238
	unsigned int   _size;		/* Size currently allocated */
239
 
240
	/* Public: */
241
	unsigned long	size;		/* Allocated and used size of the array */
242
    unsigned int   *data;		/* Pointer to array of data */ 
243
}; typedef struct _icmUInt8Array icmUInt8Array;
244
 
245
/* uInt16 Array */
246
struct _icmUInt16Array {
247
	ICM_BASE_MEMBERS
248
 
249
	/* Private: */
250
	unsigned int   _size;		/* Size currently allocated */
251
 
252
	/* Public: */
253
	unsigned long	size;		/* Allocated and used size of the array */
254
    unsigned int	*data;		/* Pointer to array of data */ 
255
}; typedef struct _icmUInt16Array icmUInt16Array;
256
 
257
/* uInt32 Array */
258
struct _icmUInt32Array {
259
	ICM_BASE_MEMBERS
260
 
261
	/* Private: */
262
	unsigned int   _size;		/* Size currently allocated */
263
 
264
	/* Public: */
265
	unsigned long	size;		/* Allocated and used size of the array */
266
    unsigned int	*data;		/* Pointer to array of data */ 
267
}; typedef struct _icmUInt32Array icmUInt32Array;
268
 
269
/* UInt64 Array */
270
struct _icmUInt64Array {
271
	ICM_BASE_MEMBERS
272
 
273
	/* Private: */
274
	unsigned int   _size;		/* Size currently allocated */
275
 
276
	/* Public: */
277
	unsigned long	size;		/* Allocated and used size of the array */
278
    icmUint64		*data;		/* Pointer to array of hight data */ 
279
}; typedef struct _icmUInt64Array icmUInt64Array;
280
 
281
/* u16Fixed16 Array */
282
struct _icmU16Fixed16Array {
283
	ICM_BASE_MEMBERS
284
 
285
	/* Private: */
286
	unsigned int   _size;		/* Size currently allocated */
287
 
288
	/* Public: */
289
	unsigned long	size;		/* Allocated and used size of the array */
290
    double			*data;		/* Pointer to array of hight data */ 
291
}; typedef struct _icmU16Fixed16Array icmU16Fixed16Array;
292
 
293
/* s15Fixed16 Array */
294
struct _icmS15Fixed16Array {
295
	ICM_BASE_MEMBERS
296
 
297
	/* Private: */
298
	unsigned int   _size;		/* Size currently allocated */
299
 
300
	/* Public: */
301
	unsigned long	size;		/* Allocated and used size of the array */
302
    double			*data;		/* Pointer to array of hight data */ 
303
}; typedef struct _icmS15Fixed16Array icmS15Fixed16Array;
304
 
305
/* XYZ Array */
306
struct _icmXYZArray {
307
	ICM_BASE_MEMBERS
308
 
309
	/* Private: */
310
	unsigned int   _size;		/* Size currently allocated */
311
 
312
	/* Public: */
313
	unsigned long	size;		/* Allocated and used size of the array */
314
    icmXYZNumber	*data;		/* Pointer to array of data */ 
315
}; typedef struct _icmXYZArray icmXYZArray;
316
 
317
/* Curve */
318
typedef enum {
319
    icmCurveUndef           = -1, /* Undefined curve */
320
    icmCurveLin             = 0,  /* Linear transfer curve */
321
    icmCurveGamma           = 1,  /* Gamma power transfer curve */
322
    icmCurveSpec            = 2   /* Specified curve */
323
} icmCurveStyle;
324
 
325
/* Curve reverse lookup information */
326
typedef struct {
327
	int inited;				/* Flag */
328
	double rmin, rmax;		/* Range of reverse grid */
329
	double qscale;			/* Quantising scale factor */
330
	long rsize;				/* Number of reverse lists */
331
	int **rlists;			/* Array of list of fwd values that may contain output value */
332
							/* Offset 0 = allocated size */
333
							/* Offset 1 = next free index */
334
							/* Offset 2 = first fwd index */
335
	unsigned long size;		/* Copy of forward table size */
336
	double       *data;		/* Copy of forward table data */
337
} icmRevTable;
338
 
339
struct _icmCurve {
340
	ICM_BASE_MEMBERS
341
 
342
	/* Private: */
343
	unsigned int   _size;		/* Size currently allocated */
344
	icmRevTable  rt;			/* Reverse table information */
345
 
346
	/* Public: */
347
    icmCurveStyle   flag;		/* Style of curve */
348
	unsigned long	size;		/* Allocated and used size of the array */
349
    double         *data;  		/* Curve data scaled to range 0.0 - 1.0 */
350
								/* or data[0] = gamma value */
351
	/* Translate a value through the curve, return warning flags */
352
	int (*lookup_fwd) (struct _icmCurve *p, double *out, double *in);	/* Forwards */
353
	int (*lookup_bwd) (struct _icmCurve *p, double *out, double *in);	/* Backwards */
354
 
355
}; typedef struct _icmCurve icmCurve;
356
 
357
/* Data */
358
typedef enum {
359
    icmDataUndef           = -1, /* Undefined data curve */
360
    icmDataASCII           = 0,  /* ASCII data curve */
361
    icmDataBin             = 1   /* Binary data */
362
} icmDataStyle;
363
 
364
struct _icmData {
365
	ICM_BASE_MEMBERS
366
 
367
	/* Private: */
368
	unsigned int   _size;		/* Size currently allocated */
369
 
370
	/* Public: */
371
    icmDataStyle	flag;		/* Style of data */
372
	unsigned long	size;		/* Allocated and used size of the array (inc ascii null) */
373
    unsigned char	*data;  	/* data or string, NULL if size == 0 */
374
}; typedef struct _icmData icmData;
375
 
376
/* text */
377
struct _icmText {
378
	ICM_BASE_MEMBERS
379
 
380
	/* Private: */
381
	unsigned int   _size;		/* Size currently allocated */
382
 
383
	/* Public: */
384
	unsigned long	 size;		/* Allocated and used size of desc, inc null */
385
	char             *data;		/* ascii string (null terminated), NULL if size==0 */
386
}; typedef struct _icmText icmText;
387
 
388
/* The base date time number */
389
struct _icmDateTimeNumber {
390
	ICM_BASE_MEMBERS
391
 
392
	/* Public: */
393
    unsigned int      year;
394
    unsigned int      month;
395
    unsigned int      day;
396
    unsigned int      hours;
397
    unsigned int      minutes;
398
    unsigned int      seconds;
399
}; typedef struct _icmDateTimeNumber icmDateTimeNumber;
400
 
401
#ifdef NEW
402
/ * DeviceSettings */
403
 
404
/*
405
   I think this all works like this:
406
 
407
Valid setting = (   (platform == platform1 and platform1.valid)
408
                 or (platform == platform2 and platform2.valid)
409
                 or ...
410
                )
411
 
412
where
413
	platformN.valid = (   platformN.combination1.valid
414
	                   or platformN.combination2.valid
415
	                   or ...
416
	                  )
417
 
418
where
419
	platformN.combinationM.valid = (    platformN.combinationM.settingstruct1.valid
420
	                                and platformN.combinationM.settingstruct2.valid
421
	                                and ...
422
	                               )
423
 
424
where
425
	platformN.combinationM.settingstructP.valid = (   platformN.combinationM.settingstructP.setting1.valid
426
	                                               or platformN.combinationM.settingstructP.setting2.valid
427
	                                               or ...
428
	                                              )
429
 
430
 */
431
 
432
/* The Settings Structure holds an array of settings of a particular type */
433
struct _icmSettingStruct {
434
	ICM_BASE_MEMBERS
435
 
436
	/* Private: */
437
	unsigned int   _num;				/* Size currently allocated */
438
 
439
	/* Public: */
440
	icSettingsSig       settingSig;		/* Setting identification */
441
	unsigned long       numSettings; 	/* number of setting values */
442
	union {								/* Setting values - type depends on Sig */
443
		icUInt64Number      *resolution;
444
		icDeviceMedia       *media;
445
		icDeviceDither      *halftone;
446
	}
447
}; typedef struct _icmSettingStruct icmSettingStruct;
448
 
449
/* A Setting Combination holds all arrays of different setting types */
450
struct _icmSettingComb {
451
	/* Private: */
452
	unsigned int   _num;			/* number currently allocated */
453
 
454
	/* Public: */
455
	unsigned long       numStructs;   /* num of setting structures */
456
	icmSettingStruct    *data;
457
}; typedef struct _icmSettingComb icmSettingComb;
458
 
459
/* A Platform Entry holds all setting combinations */
460
struct _icmPlatformEntry {
461
	/* Private: */
462
	unsigned int   _num;			/* number currently allocated */
463
 
464
	/* Public: */
465
	icPlatformSignature platform;
466
	unsigned long       numCombinations;    /* num of settings and allocated array size */
467
	icmSettingComb      *data; 
468
}; typedef struct _icmPlatformEntry icmPlatformEntry;
469
 
470
/* The Device Settings holds all platform settings */
471
struct _icmDeviceSettings {
472
	/* Private: */
473
	unsigned int   _num;			/* number currently allocated */
474
 
475
	/* Public: */
476
	unsigned long       numPlatforms;	/* num of platforms and allocated array size */
477
	icmPlatformEntry    *data;			/* Array of pointers to platform entry data */
478
}; typedef struct _icmDeviceSettings icmDeviceSettings;
479
 
480
#endif /* NEW */
481
 
482
/* lut */
483
struct _icmLut {
484
	ICM_BASE_MEMBERS
485
 
486
	/* Private: */
487
	/* Cache appropriate normalization routines */
488
	int dinc[MAX_CHAN];				/* Dimensional increment through clut */
489
	int dcube[1 << MAX_CHAN];		/* Hyper cube offsets */
490
	icmRevTable  rit;				/* Reverse input table information */
491
	icmRevTable  rot;				/* Reverse output table information */
492
 
493
	unsigned int inputTable_size;	/* size allocated to input table */
494
	unsigned int clutTable_size;	/* size allocated to clut table */
495
	unsigned int outputTable_size;	/* size allocated to output table */
496
 
497
	/* return the minimum and maximum values of the given channel in the clut */
498
	void (*min_max) (struct _icmLut *pp, double *minv, double *maxv, int chan);
499
 
500
	/* Translate color values through 3x3 matrix, input tables only, multi-dimensional lut, */
501
	/* or output tables, */
502
	int (*lookup_matrix)  (struct _icmLut *pp, double *out, double *in);
503
	int (*lookup_input)   (struct _icmLut *pp, double *out, double *in);
504
	int (*lookup_clut_nl) (struct _icmLut *pp, double *out, double *in);
505
	int (*lookup_clut_sx) (struct _icmLut *pp, double *out, double *in);
506
	int (*lookup_output)  (struct _icmLut *pp, double *out, double *in);
507
 
508
	/* Public: */
509
 
510
	/* return non zero if matrix is non-unity */
511
	int (*nu_matrix) (struct _icmLut *pp);
512
 
513
    unsigned int	inputChan;      /* Num of input channels */
514
    unsigned int	outputChan;     /* Num of output channels */
515
    unsigned int	clutPoints;     /* Num of grid points */
516
    unsigned int	inputEnt;       /* Num of in-table entries (must be 256 for Lut8) */
517
    unsigned int	outputEnt;      /* Num of out-table entries (must be 256 for Lut8) */
518
    double			e[3][3];		/* 3 * 3 array */
519
	double	        *inputTable;	/* The in-table: [inputChan * inputEnt] */
520
	double	        *clutTable;		/* The clut: [(clutPoints ^ inputChan) * outputChan] */
521
	double	        *outputTable;	/* The out-table: [outputChan * outputEnt] */
522
	/* inputTable  is organized [inputChan 0..ic-1][inputEnt 0..ie-1] */
523
	/* clutTable   is organized [inputChan 0, 0..cp-1]..[inputChan ic-1, 0..cp-1]
524
	                                                                [outputChan 0..oc-1] */
525
	/* outputTable is organized [outputChan 0..oc-1][outputEnt 0..oe-1] */
526
 
527
	/* Helper function to setup the three tables contents */
528
	int (*set_tables) (
529
		struct _icmLut *p,						/* Pointer to Lut object */
530
		void   *cbctx,							/* Opaque callback context pointer value */
531
		icColorSpaceSignature insig, 			/* Input color space */
532
		icColorSpaceSignature outsig, 			/* Output color space */
533
		void (*infunc)(void *cbctx, double *out, double *in),
534
								/* Input transfer function, inspace->inspace' (NULL = default) */
535
		double *inmin, double *inmax,			/* Maximum range of inspace' values */
536
												/* (NULL = default) */
537
		void (*clutfunc)(void *cbntx, double *out, double *in),
538
								/* inspace' -> outspace' transfer function */
539
		double *clutmin, double *clutmax,		/* Maximum range of outspace' values */
540
												/* (NULL = default) */
541
		void (*outfunc)(void *cbntx, double *out, double *in));
542
								/* Output transfer function, outspace'->outspace (NULL = deflt) */
543
 
544
}; typedef struct _icmLut icmLut;
545
 
546
/* Measurement Data */
547
struct _icmMeasurement {
548
	ICM_BASE_MEMBERS
549
 
550
	/* Public: */
551
    icStandardObserver           observer;       /* Standard observer */
552
    icmXYZNumber                 backing;        /* XYZ for backing */
553
    icMeasurementGeometry        geometry;       /* Meas. geometry */
554
    double                       flare;          /* Measurement flare */
555
    icIlluminant                 illuminant;     /* Illuminant */
556
}; typedef struct _icmMeasurement icmMeasurement;
557
 
558
/* Named color */
559
 
560
/* Structure that holds each named color data */
561
typedef struct {
562
	struct _icc      *icp;				/* Pointer to ICC we're a part of */
563
	char              root[32];			/* Root name for color */
564
	double            pcsCoords[3];		/* icmNC2: PCS coords of color */
565
	double            deviceCoords[MAX_CHAN];	/* Dev coords of color */
566
} icmNamedColorVal;
567
 
568
struct _icmNamedColor {
569
	ICM_BASE_MEMBERS
570
 
571
	/* Private: */
572
	unsigned int      _count;			/* Count currently allocated */
573
 
574
	/* Public: */
575
    unsigned int      vendorFlag;		/* Bottom 16 bits for IC use */
576
    unsigned int      count;			/* Count of named colors */
577
    unsigned int      nDeviceCoords;	/* Num of device coordinates */
578
    char              prefix[32];		/* Prefix for each color name (null terminated) */
579
    char              suffix[32];		/* Suffix for each color name (null terminated) */
580
    icmNamedColorVal  *data;			/* Array of [count] color values */
581
}; typedef struct _icmNamedColor icmNamedColor;
582
 
583
/* textDescription */
584
struct _icmTextDescription {
585
	ICM_BASE_MEMBERS
586
 
587
	/* Private: */
588
	unsigned long  _size;			/* Size currently allocated */
589
	unsigned long  uc_size;			/* uc Size currently allocated */
590
	int            (*core_read)(struct _icmTextDescription *p, char **bpp, char *end);
591
	int            (*core_write)(struct _icmTextDescription *p, char **bpp);
592
 
593
	/* Public: */
594
	unsigned long	  size;			/* Allocated and used size of desc, inc null */
595
	char              *desc;		/* ascii string (null terminated) */
596
 
597
	unsigned int      ucLangCode;	/* UniCode language code */
598
	unsigned long	  ucSize;		/* Allocated and used size of ucDesc in wchars, inc null */
599
	ORD16             *ucDesc;		/* The UniCode description (null terminated) */
600
 
601
	ORD16             scCode;		/* ScriptCode code */
602
	unsigned long	  scSize;		/* Used size of scDesc in bytes, inc null */
603
	ORD8              scDesc[67];	/* ScriptCode Description (null terminated, max 67) */
604
}; typedef struct _icmTextDescription icmTextDescription;
605
 
606
/* Profile sequence structure */
607
struct _icmDescStruct {
608
	/* Private: */
609
	struct _icc      *icp;				/* Pointer to ICC we're a part of */
610
 
611
	/* Public: */
612
	int             (*allocate)(struct _icmDescStruct *p);	/* Allocate method */
613
    icmSig            deviceMfg;		/* Dev Manufacturer */
614
    unsigned int      deviceModel;		/* Dev Model */
615
    icmUint64         attributes;		/* Dev attributes */
616
    icTechnologySignature technology;	/* Technology sig */
617
	icmTextDescription device;			/* Manufacturer text (sub structure) */
618
	icmTextDescription model;			/* Model text (sub structure) */
619
}; typedef struct _icmDescStruct icmDescStruct;
620
 
621
/* Profile sequence description */
622
struct _icmProfileSequenceDesc {
623
	ICM_BASE_MEMBERS
624
 
625
	/* Private: */
626
	unsigned int	 _count;			/* number currently allocated */
627
 
628
	/* Public: */
629
    unsigned int      count;			/* Number of descriptions */
630
	icmDescStruct     *data;			/* array of [count] descriptions */
631
}; typedef struct _icmProfileSequenceDesc icmProfileSequenceDesc;
632
 
633
/* signature (only ever used for technology ??) */
634
struct _icmSignature {
635
	ICM_BASE_MEMBERS
636
 
637
	/* Public: */
638
    icTechnologySignature sig;	/* Signature */
639
}; typedef struct _icmSignature icmSignature;
640
 
641
/* Per channel Screening Data */
642
typedef struct {
643
	/* Public: */
644
    double            frequency;		/* Frequency */
645
    double            angle;			/* Screen angle */
646
    icSpotShape       spotShape;		/* Spot Shape encodings below */
647
} icmScreeningData;
648
 
649
struct _icmScreening {
650
	ICM_BASE_MEMBERS
651
 
652
	/* Private: */
653
	unsigned int   _channels;			/* number currently allocated */
654
 
655
	/* Public: */
656
    unsigned int      screeningFlag;	/* Screening flag */
657
    unsigned int      channels;			/* Number of channels */
658
    icmScreeningData  *data;			/* Array of screening data */
659
}; typedef struct _icmScreening icmScreening;
660
 
661
/* Under color removal, black generation */
662
struct _icmUcrBg {
663
	ICM_BASE_MEMBERS
664
 
665
	/* Private: */
666
    unsigned int      UCR_count;		/* Currently allocated UCR count */
667
    unsigned int      BG_count;			/* Currently allocated BG count */
668
	unsigned long	  _size;			/* Currently allocated string size */
669
 
670
	/* Public: */
671
    unsigned int      UCRcount;			/* Undercolor Removal Curve length */
672
    double           *UCRcurve;		    /* The array of UCR curve values, 0.0 - 1.0 */
673
										/* or 0.0 - 100 % if count = 1 */
674
    unsigned int      BGcount;			/* Black generation Curve length */
675
    double           *BGcurve;			/* The array of BG curve values, 0.0 - 1.0 */
676
										/* or 0.0 - 100 % if count = 1 */
677
	unsigned long	  size;				/* Allocated and used size of desc, inc null */
678
	char              *string;			/* UcrBg description (null terminated) */
679
}; typedef struct _icmUcrBg icmUcrBg;
680
 
681
/* viewingConditionsType */
682
struct _icmViewingConditions {
683
	ICM_BASE_MEMBERS
684
 
685
	/* Public: */
686
    icmXYZNumber    illuminant;		/* In candelas per sq. meter */
687
    icmXYZNumber    surround;		/* In candelas per sq. meter */
688
    icIlluminant    stdIlluminant;	/* See icIlluminant defines */
689
}; typedef struct _icmViewingConditions icmViewingConditions;
690
 
691
/* Postscript Color Rendering Dictionary names type */
692
struct _icmCrdInfo {
693
	ICM_BASE_MEMBERS
694
	/* Private: */
695
    unsigned long    _ppsize;		/* Currently allocated size */
696
	unsigned long    _crdsize[4];	/* Currently allocated sizes */
697
 
698
	/* Public: */
699
    unsigned long    ppsize;		/* Postscript product name size (including null) */
700
    char            *ppname;		/* Postscript product name (null terminated) */
701
	unsigned long    crdsize[4];	/* Rendering intent 0-3 CRD names sizes (icluding null) */
702
	char            *crdname[4];	/* Rendering intent 0-3 CRD names (null terminated) */
703
}; typedef struct _icmCrdInfo icmCrdInfo;
704
 
705
 
706
/* Apple ColorSync 2.5 video card gamma type */
707
struct _icmVideoCardGammaTable {
708
	unsigned short   channels;		/* # of gamma channels (1 or 3) */
709
	unsigned short   entryCount; 	/* 1-based number of entries per channel */
710
	unsigned short   entrySize;		/* size in bytes of each entry */
711
	void            *data;			/* variable size data */
712
}; typedef struct _icmVideoCardGammaTable icmVideoCardGammaTable;
713
 
714
struct _icmVideoCardGammaFormula {
715
	double           redGamma;		/* must be > 0.0 */
716
	double           redMin;		/* must be > 0.0 and < 1.0 */
717
	double           redMax;		/* must be > 0.0 and < 1.0 */
718
	double           greenGamma;   	/* must be > 0.0 */
719
	double           greenMin;		/* must be > 0.0 and < 1.0 */
720
	double           greenMax;		/* must be > 0.0 and < 1.0 */
721
	double           blueGamma;		/* must be > 0.0 */
722
	double           blueMin;		/* must be > 0.0 and < 1.0 */
723
	double           blueMax;		/* must be > 0.0 and < 1.0 */
724
}; typedef struct _icmVideoCardGammaFormula icmVideoCardGammaFormula;
725
 
726
enum {
727
	icmVideoCardGammaTableType = 0,
728
	icmVideoCardGammaFormulaType = 1
729
};
730
 
731
struct _icmVideoCardGamma {
732
	ICM_BASE_MEMBERS
733
	unsigned long                tagType;		/* eg. table or formula, use above enum */
734
	union {
735
		icmVideoCardGammaTable   table;
736
		icmVideoCardGammaFormula formula;
737
	} u;
738
}; typedef struct _icmVideoCardGamma icmVideoCardGamma;
739
 
740
/* ------------------------------------------------- */
741
/* The Profile header */
742
struct _icmHeader {
743
	/* Private: */
744
	unsigned int           (*get_size)(struct _icmHeader *p);
745
	int                    (*read)(struct _icmHeader *p, unsigned long len, unsigned long of);
746
	int                    (*write)(struct _icmHeader *p, unsigned long of);
747
	void                   (*del)(struct _icmHeader *p);
748
	struct _icc            *icp;			/* Pointer to ICC we're a part of */
749
    unsigned int            size;			/* Profile size in bytes */
750
 
751
	/* public: */
752
	void                   (*dump)(struct _icmHeader *p, FILE *op, int verb);
753
 
754
	/* Values that must be set before writing */
755
    icProfileClassSignature deviceClass;	/* Type of profile */
756
    icColorSpaceSignature   colorSpace;		/* Clr space of data */
757
    icColorSpaceSignature   pcs;			/* PCS: XYZ or Lab */
758
    icRenderingIntent       renderingIntent;/* Rendering intent */
759
 
760
	/* Values that should be set before writing */
761
    icmSig                  manufacturer;	/* Dev manufacturer */
762
    icmSig		            model;			/* Dev model */
763
    icmUint64               attributes;		/* Device attributes.l */
764
    unsigned int            flags;			/* Various bits */
765
 
766
	/* Values that may optionally be set before writing */
767
    /* icmUint64            attributes;		   Device attributes.h (see above) */
768
    icmSig                  creator;		/* Profile creator */
769
 
770
	/* Values that are not normally set, since they have defaults */
771
    icmSig                  cmmId;			/* CMM for profile */
772
    int            			majv, minv, bfv;/* Format version - major, minor, bug fix */
773
    icmDateTimeNumber       date;			/* Creation Date */
774
    icPlatformSignature     platform;		/* Primary Platform */
775
    icmXYZNumber            illuminant;		/* Profile illuminant */
776
 
777
}; typedef struct _icmHeader icmHeader;
778
 
779
/* ---------------------------------------------------------- */
780
/* Objects for accessing lookup functions */
781
 
782
/* Public: Parameter to get_luobj function */
783
typedef enum {
784
    icmFwd           = 0,  /* Device to PCS, or Device 1 to Last Device */
785
    icmBwd           = 1,  /* PCS to Device, or Last Device to Device */
786
    icmGamut         = 2,  /* PCS Gamut check */
787
    icmPreview       = 3   /* PCS to PCS preview */
788
} icmLookupFunc;
789
 
790
/* Public: Parameter to get_luobj function */
791
typedef enum {
792
    icmLuOrdNorm     = 0,  /* Normal profile preference: Lut, matrix, monochrome */
793
    icmLuOrdRev      = 1   /* Reverse profile preference: monochrome, matrix, monochrome */
794
} icmLookupOrder;
795
 
796
/* Public: Lookup algorithm object type */
797
typedef enum {
798
    icmMonoFwdType       = 0,	/* Monochrome, Forward */
799
    icmMonoBwdType       = 1,	/* Monochrome, Backward */
800
    icmMatrixFwdType     = 2,	/* Matrix, Forward */
801
    icmMatrixBwdType     = 3,	/* Matrix, Backward */
802
    icmLutType           = 4	/* Multi-dimensional Lookup Table */
803
} icmLuAlgType;
804
 
805
#define LU_ICM_BASE_MEMBERS																	\
806
	/* Private: */																		\
807
	icmLuAlgType   ttype;		    	/* The object tag */							\
808
	struct _icc    *icp;				/* Pointer to ICC we're a part of */			\
809
	icRenderingIntent intent;			/* Effective intent */							\
810
	icmLookupFunc function;				/* Functionality being used */					\
811
	icmXYZNumber pcswht, whitePoint, blackPoint;	/* White and black point info */	\
812
	double toAbs[3][3];					/* Matrix to convert from relative to absolute */ \
813
	double fromAbs[3][3];				/* Matrix to convert from absolute to relative */ \
814
    icColorSpaceSignature inSpace;		/* Native Clr space of input */					\
815
    icColorSpaceSignature outSpace;		/* Native Clr space of output */				\
816
	icColorSpaceSignature pcs;			/* Native PCS */								\
817
    icColorSpaceSignature e_inSpace;	/* Effective Clr space of input */				\
818
    icColorSpaceSignature e_outSpace;	/* Effective Clr space of output */				\
819
	icColorSpaceSignature e_pcs;		/* Effective PCS */								\
820
																						\
821
	/* Public: */																		\
822
	void           (*del)(struct _icmLuBase *p);										\
823
	                            /* Internal native colorspaces */     							\
824
	void           (*lutspaces) (struct _icmLuBase *p, icColorSpaceSignature *ins, int *inn,	\
825
	                                                   icColorSpaceSignature *outs, int *outn);	\
826
	                                                                                        \
827
	                         /* External effecive colorspaces */							\
828
	void           (*spaces) (struct _icmLuBase *p, icColorSpaceSignature *ins, int *inn,	\
829
	                                 icColorSpaceSignature *outs, int *outn,				\
830
	                                 icmLuAlgType *alg, icRenderingIntent *intt, 			\
831
	                                 icmLookupFunc *fnc, icColorSpaceSignature *pcs); 		\
832
																							\
833
	/* Get the effective input space and output space ranges */								\
834
	void (*get_ranges) (struct _icmLuBase *p,												\
835
		double *inmin, double *inmax,		/* Maximum range of inspace values */			\
836
		double *outmin, double *outmax);	/* Maximum range of outspace values */			\
837
																							\
838
	void           (*wh_bk_points)(struct _icmLuBase *p, icmXYZNumber *wht, icmXYZNumber *blk);	\
839
	int            (*lookup) (struct _icmLuBase *p, double *out, double *in);
840
 
841
	/* Translate color values through profile */
842
	/* 0 = success */
843
	/* 1 = warning: clipping occured */
844
	/* 2 = fatal: other error */
845
 
846
/* Base lookup object */
847
struct _icmLuBase {
848
	LU_ICM_BASE_MEMBERS
849
}; typedef struct _icmLuBase icmLuBase;
850
 
851
/* Monochrome  Fwd & Bwd type object */
852
struct _icmLuMono {
853
	LU_ICM_BASE_MEMBERS
854
	icmCurve    *grayCurve;
855
 
856
	/* Overall lookups */
857
	int (*fwd_lookup) (struct _icmLuBase *p, double *out, double *in);
858
	int (*bwd_lookup) (struct _icmLuBase *p, double *out, double *in);
859
 
860
	/* Components of lookup */
861
	int (*fwd_curve) (struct _icmLuMono *p, double *out, double *in);
862
	int (*fwd_map)   (struct _icmLuMono *p, double *out, double *in);
863
	int (*fwd_abs)   (struct _icmLuMono *p, double *out, double *in);
864
	int (*bwd_abs)   (struct _icmLuMono *p, double *out, double *in);
865
	int (*bwd_map)   (struct _icmLuMono *p, double *out, double *in);
866
	int (*bwd_curve) (struct _icmLuMono *p, double *out, double *in);
867
 
868
}; typedef struct _icmLuMono icmLuMono;
869
 
870
/* 3D Matrix Fwd & Bwd type object */
871
struct _icmLuMatrix {
872
	LU_ICM_BASE_MEMBERS
873
	icmCurve    *redCurve, *greenCurve, *blueCurve;
874
	icmXYZArray *redColrnt, *greenColrnt, *blueColrnt;
875
    double		mx[3][3];	/* 3 * 3 conversion matrix */
876
    double		bmx[3][3];	/* 3 * 3 backwards conversion matrix */
877
 
878
	/* Overall lookups */
879
	int (*fwd_lookup) (struct _icmLuBase *p, double *out, double *in);
880
	int (*bwd_lookup) (struct _icmLuBase *p, double *out, double *in);
881
 
882
	/* Components of lookup */
883
	int (*fwd_curve)  (struct _icmLuMatrix *p, double *out, double *in);
884
	int (*fwd_matrix) (struct _icmLuMatrix *p, double *out, double *in);
885
	int (*fwd_abs)    (struct _icmLuMatrix *p, double *out, double *in);
886
	int (*bwd_abs)    (struct _icmLuMatrix *p, double *out, double *in);
887
	int (*bwd_matrix) (struct _icmLuMatrix *p, double *out, double *in);
888
	int (*bwd_curve)  (struct _icmLuMatrix *p, double *out, double *in);
889
 
890
}; typedef struct _icmLuMatrix icmLuMatrix;
891
 
892
/* Multi-D. Lut type object */
893
struct _icmLuLut {
894
	LU_ICM_BASE_MEMBERS
895
 
896
	/* private: */
897
	icmLut *lut;								/* Lut to use */
898
	int    usematrix;							/* non-zero if matrix should be used */
899
    double imx[3][3];							/* 3 * 3 inverse conversion matrix */
900
	int    imx_valid;							/* Inverse matrix is valid */
901
	void (*in_normf)(double *out, double *in);	/* Lut input data normalizing function */
902
	void (*in_denormf)(double *out, double *in);/* Lut input data de-normalizing function */
903
	void (*out_normf)(double *out, double *in);	/* Lut output data normalizing function */
904
	void (*out_denormf)(double *out, double *in);/* Lut output de-normalizing function */
905
	void (*e_in_denormf)(double *out, double *in);/* Effective input de-normalizing function */
906
	void (*e_out_denormf)(double *out, double *in);/* Effecive output de-normalizing function */
907
	/* function chosen out of lut->lookup_clut_sx and lut->lookup_clut_nl to imp. clut() */
908
	int (*lookup_clut) (struct _icmLut *pp, double *out, double *in);	/* clut function */
909
 
910
	/* public: */
911
 
912
	/* Components of lookup */
913
	int (*in_abs)  (struct _icmLuLut *p, double *out, double *in);	/* Should be in icmLut ? */
914
	int (*matrix)  (struct _icmLuLut *p, double *out, double *in);
915
	int (*input)   (struct _icmLuLut *p, double *out, double *in);
916
	int (*clut)    (struct _icmLuLut *p, double *out, double *in);
917
	int (*output)  (struct _icmLuLut *p, double *out, double *in);
918
	int (*out_abs) (struct _icmLuLut *p, double *out, double *in);	/* Should be in icmLut ? */
919
 
920
	/* Some inverse components */
921
	/* Should be in icmLut ??? */
922
	int (*inv_out_abs) (struct _icmLuLut *p, double *out, double *in);
923
	int (*inv_output)  (struct _icmLuLut *p, double *out, double *in);
924
	/* inv_clut is beyond scope of icclib. See argyll for solution! */
925
	int (*inv_input)   (struct _icmLuLut *p, double *out, double *in);
926
	int (*inv_matrix)  (struct _icmLuLut *p, double *out, double *in);
927
	int (*inv_in_abs)  (struct _icmLuLut *p, double *out, double *in);
928
 
929
	/* Get various types of information about the LuLut */
930
	void (*get_info) (struct _icmLuLut *p, icmLut **lutp,
931
	                 icmXYZNumber *pcswhtp, icmXYZNumber *whitep,
932
	                 icmXYZNumber *blackp);
933
 
934
	/* Get the native input space and output space ranges */
935
	void (*get_lutranges) (struct _icmLuLut *p,
936
		double *inmin, double *inmax,		/* Maximum range of inspace values */
937
		double *outmin, double *outmax);	/* Maximum range of outspace values */
938
 
939
	/* Get the matrix contents */
940
	void (*get_matrix) (struct _icmLuLut *p, double m[3][3]);
941
 
942
}; typedef struct _icmLuLut icmLuLut;
943
 
944
/* ---------------------------------------------------------- */
945
/* A tag */
946
typedef struct {
947
    icTagSignature      sig;			/* The tag signature */
948
	icTagTypeSignature  ttype;			/* The tag type signature */
949
    unsigned int        offset;			/* File offset to start header */
950
    unsigned int        size;			/* Size in bytes */
951
	icmBase            *objp;			/* In memory data structure */
952
} icmTag;
953
 
954
/* Pseudo enumerations valid as parameter to get_luobj(): */
955
 
956
/* To be specified where an intent is not appropriate */
957
#define icmDefaultIntent ((icRenderingIntent)98)
958
 
959
/* Pseudo PCS colospace used to indicate the native PCS */
960
#define icmSigDefaultData ((icColorSpaceSignature) 0x0)
961
 
962
 
963
/* The ICC object */
964
struct _icc {
965
	/* Public: */
966
	unsigned int (*get_size)(struct _icc *p);				/* Return total size needed, 0 = err. */
967
	int          (*read)(struct _icc *p, icmFile *fp, unsigned long of);	/* Returns error code */
968
	int          (*write)(struct _icc *p, icmFile *fp, unsigned long of);/* Returns error code */
969
	void         (*dump)(struct _icc *p, FILE *op, int verb);	/* Dump whole icc */
970
	void         (*del)(struct _icc *p);						/* Free whole icc */
971
	int          (*find_tag)(struct _icc *p, icTagSignature sig);
972
															/* Returns 1 if found, 2 readable */
973
	icmBase *    (*read_tag)(struct _icc *p, icTagSignature sig);
974
															/* Returns pointer to object */
975
	icmBase *    (*add_tag)(struct _icc *p, icTagSignature sig, icTagTypeSignature ttype);
976
															/* Returns pointer to object */
977
	int          (*rename_tag)(struct _icc *p, icTagSignature sig, icTagSignature sigNew);
978
															/* Rename and existing tag */
979
	icmBase *    (*link_tag)(struct _icc *p, icTagSignature sig, icTagSignature ex_sig);
980
															/* Returns pointer to object */
981
	int          (*unread_tag)(struct _icc *p, icTagSignature sig);
982
														/* Unread a tag (free on refcount == 0 */
983
	int          (*read_all_tags)(struct _icc *p); /* Read all the tags, non-zero on error. */
984
 
985
	int          (*delete_tag)(struct _icc *p, icTagSignature sig);
986
															/* Returns 0 if deleted OK */
987
	icmLuBase *  (*get_luobj) (struct _icc *p,
988
                                     icmLookupFunc func,			/* Functionality */
989
	                                 icRenderingIntent intent,		/* Intent */
990
	                                 icColorSpaceSignature pcsor,	/* PCS overide (0 = def) */
991
	                                 icmLookupOrder order);			/* Search Order */
992
	                                 /* Return appropriate lookup object */
993
	                                 /* NULL on error, check errc+err for reason */
994
 
995
 
996
    icmHeader       *header;			/* The header */
997
	char             err[512];			/* Error message */
998
	int              errc;				/* Error code */
999
 
1000
	/* Private: ? */
1001
	icmAlloc        *al;				/* Heap allocator */
1002
	int              del_al;			/* NZ if heap allocator should be deleted */
1003
	icmFile         *fp;				/* File associated with object */
1004
	unsigned long    of;				/* Offset of the profile within the file */
1005
    unsigned int     count;				/* Num tags in the profile */
1006
    icmTag          *data;    			/* The tagTable and tagData */
1007
 
1008
	}; typedef struct _icc icc;
1009
 
1010
/* ========================================================== */
1011
/* Utility structures and declarations */
1012
 
1013
/* Structure to hold pseudo-hilbert counter info */
1014
struct _psh {
1015
	int      di;	/* Dimensionality */
1016
	unsigned res;	/* Resolution per coordinate */
1017
	unsigned bits;	/* Bits per coordinate */
1018
	unsigned ix;	/* Current binary index */
1019
	unsigned tmask;	/* Total 2^n count mask */
1020
	unsigned count;	/* Usable count */
1021
}; typedef struct _psh psh;
1022
 
1023
/* Type of encoding to be returned as a string */
1024
typedef enum {
1025
    icmScreenEncodings,
1026
    icmDeviceAttributes,
1027
	icmProfileHeaderFlags,
1028
	icmAsciiOrBinaryData,
1029
	icmTagSignature,
1030
	icmTechnologySignature,
1031
	icmTypeSignature,
1032
	icmColorSpaceSignature,
1033
	icmProfileClassSignaure,
1034
	icmPlatformSignature,
1035
	icmMeasurementFlare,
1036
	icmMeasurementGeometry,
1037
	icmRenderingIntent,
1038
	icmSpotShape,
1039
	icmStandardObserver,
1040
	icmIlluminant,
1041
	icmLuAlg
1042
} icmEnumType;
1043
 
1044
/* ========================================================== */
1045
/* Public function declarations */
1046
/* Create an empty object. Return null on error */
1047
extern ICCLIB_API icc *new_icc(void);				/* Default allocator */
1048
extern ICCLIB_API icc *new_icc_a(icmAlloc *al);		/* With allocator class */
1049
 
1050
/* - - - - - - - - - - - - - */
1051
/* Some useful utilities: */
1052
 
1053
/* Return a string that represents a tag */
1054
extern ICCLIB_API char *tag2str(int tag);
1055
 
1056
/* Return a tag created from a string */
1057
extern ICCLIB_API int str2tag(const char *str);
1058
 
1059
/* Return a string description of the given enumeration value */
1060
extern ICCLIB_API const char *icm2str(icmEnumType etype, int enumval);
1061
 
1062
/* CIE XYZ to perceptual Lab */
1063
extern ICCLIB_API void icmXYZ2Lab(icmXYZNumber *w, double *out, double *in);
1064
 
1065
/* Perceptual Lab to CIE XYZ */
1066
extern ICCLIB_API void icmLab2XYZ(icmXYZNumber *w, double *out, double *in);
1067
 
1068
/* The standard D50 illuminant value */
1069
extern ICCLIB_API icmXYZNumber icmD50;
1070
 
1071
/* The standard D65 illuminant value */
1072
extern ICCLIB_API icmXYZNumber icmD65;
1073
 
1074
/* The default black value */
1075
extern ICCLIB_API icmXYZNumber icmBlack;
1076
 
1077
/* Initialise a pseudo-hilbert grid counter, return total usable count. */
1078
extern ICCLIB_API unsigned psh_init(psh *p, int di, unsigned res, int co[]);
1079
 
1080
/* Reset the counter */
1081
extern ICCLIB_API void psh_reset(psh *p);
1082
 
1083
/* Increment pseudo-hilbert coordinates */
1084
/* Return non-zero if count rolls over to 0 */
1085
extern ICCLIB_API int psh_inc(psh *p, int co[]);
1086
 
1087
/* Chromatic Adaption transform utility */
1088
/* Return a 3x3 chromatic adaption matrix */
1089
void icmChromAdaptMatrix(
1090
	int flags,				/* Flags as defined below */
1091
	icmXYZNumber d_wp,		/* Destination white point */
1092
	icmXYZNumber s_wp,		/* Source white point */
1093
	double mat[3][3]		/* Destination matrix */
1094
);
1095
 
1096
#define ICM_CAM_BRADFORD	0x0001	/* Use Bradford sharpened response space */
1097
#define ICM_CAM_MULMATRIX	0x0002	/* Transform the given matrix */
1098
 
1099
/* Return the normal Delta E given two Lab values */
1100
extern ICCLIB_API double icmLabDE(double *in1, double *in2);
1101
 
1102
/* Return the normal Delta E squared, given two Lab values */
1103
extern ICCLIB_API double icmLabDEsq(double *in1, double *in2);
1104
 
1105
/* Return the CIE94 Delta E color difference measure for two Lab values */
1106
extern ICCLIB_API double icmCIE94(double *in1, double *in2);
1107
 
1108
/* Return the CIE94 Delta E color difference measure squared, for two Lab values */
1109
extern ICCLIB_API double icmCIE94sq(double *in1, double *in2);
1110
 
1111
/* Simple macro to transfer an array to an XYZ number */
1112
#define icmAry2XYZ(xyz, ary) ((xyz).X = (ary)[0], (xyz).Y = (ary)[1], (xyz).Z = (ary)[2])
1113
 
1114
/* And the reverse */
1115
#define icmXYZ2Ary(ary, xyz) ((ary)[0] = (xyz).X, (ary)[1] = (xyz).Y, (ary)[2] = (xyz).Z)
1116
 
1117
/* ---------------------------------------------------------- */
1118
 
1119
#ifdef __cplusplus
1120
	}
1121
#endif
1122
 
1123
#endif /* ICC_H */
1124