summaryrefslogtreecommitdiff
path: root/xicc/ccmx.h
blob: 03d29d10d7f89886410aa80b2a41200baaf404ec (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#ifndef CCMX_H
#define CCMX_H

/* 
 * Argyll Color Correction System
 * Colorimeter Correction Matrix support.
 *
 */

/*
 * Author: Graeme W. Gill
 * Date:   19/8/2010
 *
 * Copyright 2010 Graeme W. Gill
 * All rights reserved.
 *
 * This material is licenced under the GNU GENERAL PUBLIC LICENSE Version 2 or later :-
 * see the License2.txt file for licencing details.
 *
 * NOTE though that if SALONEINSTLIB is not defined, that this file depends
 * on other libraries that are licenced under the GNU AFFERO GENERAL PUBLIC LICENSE Version 3.
 *
 */

#ifdef __cplusplus
	extern "C" {
#endif

/*
 * This object provides storage and application of a 3x3 XYZ
 * corretion matrix suitable for corrected a particular
 * display colorimeter for a particular display.
 */

/* ------------------------------------------------------------------------------ */

struct _ccmx {

  /* Public: */
	void (*del)(struct _ccmx *p);

	/* Set the contents of the ccmx. return nz on error. */
	int (*set_ccmx)(struct _ccmx *p, char *desc, char *inst, char *disp, disptech dtech,
	                int refrmode, int cbid, char *sel, char *refd, int oem, double mtx[3][3]);	

	/* Create a ccmx from measurements. return nz on error. */
	int (*create_ccmx)(struct _ccmx *p, char *desc, char *inst, char *disp, disptech dtech,
	               int refrmode, int cbid, char *sel, char *refd, int oem,
	               int nsamples, double (*refs)[3], double (*cols)[3]);

	/* write to a CGATS .ccmx file */
	int (*write_ccmx)(struct _ccmx *p, char *filename);

	/* write a CGATS .ccmx file to a memory buffer. */
	/* return nz on error, with message in err[] */
	int (*buf_write_ccmx)(struct _ccmx *p, unsigned char **buf, size_t *len);

	/* read from a CGATS .ccmx file */
	int (*read_ccmx)(struct _ccmx *p, char *filename);

	/* read from a CGATS .ccmx file from a memory buffer. */
	int (*buf_read_ccmx)(struct _ccmx *p, unsigned char *buf, size_t len);

	/* Correct an XYZ value */
	void (*xform) (struct _ccmx *p,
	               double *out,					/* Output XYZ */
	               double *in);					/* Input XYZ */

  /* Private: */
	/* (All char * are owned by ccmx) */
	char *desc;		/* Desciption (optional) */
	char *inst;		/* Name of colorimeter instrument */
	char *disp;		/* Name of display (optional if tech) */
	disptech dtech;	/* Display Technology enumeration (optional if disp) */
	char *tech;		/* Technology string (Looked up from dtech enum) */
	int cc_cbid;	/* Calibration display type base ID required, 0 if not known */
	int refrmode;	/* Refresh mode, -1 if unknown, 0 of no, 1 if yes */
	char *sel;		/* Optional UI selector characters. May be NULL */
	char *ref;		/* Name of spectrometer instrument (optional) */
	int oem;			/* nz if oem origin */
	double matrix[3][3];	/* Transform matrix */
	double av_err;			/* Average error of fit */
	double mx_err;			/* Maximum error of fit */
	
	/* Houskeeping */
	int errc;				/* Error code */
	char err[200];			/* Error message */
}; typedef struct _ccmx ccmx;

/* Create a new, uninitialised ccmx */
ccmx *new_ccmx(void);

#ifdef __cplusplus
	}
#endif

#endif /* CCMX_H */