1 
2 /*
3  * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
4  * 	All Rights Reserved
5  *
6  * This file is a component of an X Window System-specific implementation
7  * of Xcms based on the TekColor Color Management System.  Permission is
8  * hereby granted to use, copy, modify, sell, and otherwise distribute this
9  * software and its documentation for any purpose and without fee, provided
10  * that this copyright, permission, and disclaimer notice is reproduced in
11  * all copies of this software and in supporting documentation.  TekColor
12  * is a trademark of Tektronix, Inc.
13  *
14  * Tektronix makes no representation about the suitability of this software
15  * for any purpose.  It is provided "as is" and with all faults.
16  *
17  * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
18  * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
19  * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX BE LIABLE FOR ANY
20  * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
21  * RESULTING FROM LOSS OF USE, DATA, OR PROFITS, WHETHER IN AN ACTION OF
22  * CONTRACT, NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
23  * CONNECTION WITH THE USE OR THE PERFORMANCE OF THIS SOFTWARE.
24  *
25  *
26  *	DESCRIPTION
27  *		Private include file for Color Management System.
28  *		(i.e., for API internal use only)
29  *
30  */
31 
32 #ifndef _XCMSINT_H_
33 #define _XCMSINT_H_
34 
35 #include <X11/Xcms.h>
36 
37 /*
38  *	DEFINES
39  */
40 
41 	/*
42 	 * Private Status Value
43 	 */
44 #define	_XCMS_NEWNAME	-1
45 
46 	/*
47 	 * Color Space ID's are of XcmsColorFormat type.
48 	 *
49 	 *	bit 31
50 	 *	    0 == Device-Independent
51 	 *	    1 == Device-Dependent
52 	 *
53 	 *	bit 30:
54          *          0 == Registered with X Consortium
55          *          1 == Unregistered
56          */
57 #define       XCMS_DD_ID(id)          ((id) & (XcmsColorFormat)0x80000000)
58 #define       XCMS_DI_ID(id)          (!((id) & (XcmsColorFormat)0x80000000))
59 #define       XCMS_UNREG_ID(id)       ((id) & (XcmsColorFormat)0x40000000)
60 #define       XCMS_REG_ID(id)         (!((id) & (XcmsColorFormat)0x40000000))
61 #define       XCMS_FIRST_REG_DI_ID    (XcmsColorFormat)0x00000001
62 #define       XCMS_FIRST_UNREG_DI_ID  (XcmsColorFormat)0x40000000
63 #define       XCMS_FIRST_REG_DD_ID    (XcmsColorFormat)0x80000000
64 #define       XCMS_FIRST_UNREG_DD_ID  (XcmsColorFormat)0xc0000000
65 
66 /*
67  *	TYPEDEFS
68  */
69 
70     /*
71      * Structure for caching Colormap info.
72      *    This is provided for the Xlib modifications to:
73      *		XAllocNamedColor()
74      *		XLookupColor()
75      *		XParseColor()
76      *		XStoreNamedColor()
77      */
78 typedef struct _XcmsCmapRec {
79     Colormap cmapID;
80     Display *dpy;
81     Window windowID;
82     Visual *visual;
83     struct _XcmsCCC *ccc;
84     struct _XcmsCmapRec *pNext;
85 } XcmsCmapRec;
86 
87     /*
88      * Intensity Record (i.e., value / intensity tuple)
89      */
90 typedef struct _IntensityRec {
91     unsigned short value;
92     XcmsFloat intensity;
93 } IntensityRec;
94 
95     /*
96      * Intensity Table
97      */
98 typedef struct _IntensityTbl {
99     IntensityRec *pBase;
100     unsigned int nEntries;
101 } IntensityTbl;
102 
103     /*
104      * Structure for storing per-Visual Intensity Tables (aka gamma maps).
105      */
106 typedef struct _XcmsIntensityMap {
107     VisualID visualID;
108     XPointer	screenData;	/* pointer to corresponding Screen Color*/
109 				/*	Characterization Data		*/
110     void (*pFreeScreenData)(XPointer pScreenDataTemp);	/* Function that frees a Screen		*/
111 				/*   structure.				*/
112     struct _XcmsIntensityMap *pNext;
113 } XcmsIntensityMap;
114 
115 
116     /*
117      * Structure for storing "registered" color space prefix/ID
118      */
119 typedef struct _XcmsRegColorSpaceEntry {
120     const char *prefix;	/* Color Space prefix (e.g., "CIEXYZ:") */
121     XcmsColorFormat id;	/* Color Space ID (e.g., XcmsCIEXYZFormat) */
122 } XcmsRegColorSpaceEntry;
123 
124 
125     /*
126      * Xcms Per Display (i.e. connection) related data
127      */
128 typedef struct _XcmsPerDpyInfo {
129 
130     XcmsCCC paDefaultCCC; /* based on default visual of screen */
131 	    /*
132 	     * Pointer to an array of XcmsCCC structures, one for
133 	     * each screen.
134 	     */
135     XcmsCmapRec *pClientCmaps;	/* Pointer to linked list of XcmsCmapRec's */
136 
137 } XcmsPerDpyInfo, *XcmsPerDpyInfoPtr;
138 
139 /*
140  *	DEFINES
141  */
142 
143 #define XDCCC_NUMBER	0x8000000L	/* 2**27 per XDCCC */
144 
145 #ifdef GRAY
146 #define XDCCC_SCREENWHITEPT_ATOM_NAME	"XDCCC_GRAY_SCREENWHITEPOINT"
147 #define XDCCC_GRAY_CORRECT_ATOM_NAME	"XDCCC_GRAY_CORRECTION"
148 #endif /* GRAY */
149 
150 #ifndef _ConversionValues
151 typedef struct _ConversionValues {
152     IntensityTbl IntensityTbl;
153 } ConversionValues;
154 #endif
155 
156 #ifdef GRAY
157 typedef struct {
158     IntensityTbl *IntensityTbl;
159 } GRAY_SCCData;
160 #endif /* GRAY */
161 
162 /*
163  *	DEFINES
164  */
165 
166 #define XDCCC_MATRIX_ATOM_NAME	"XDCCC_LINEAR_RGB_MATRICES"
167 #define XDCCC_CORRECT_ATOM_NAME "XDCCC_LINEAR_RGB_CORRECTION"
168 
169 typedef struct {
170     XcmsFloat XYZtoRGBmatrix[3][3];
171     XcmsFloat RGBtoXYZmatrix[3][3];
172     IntensityTbl *pRedTbl;
173     IntensityTbl *pGreenTbl;
174     IntensityTbl *pBlueTbl;
175 } LINEAR_RGB_SCCData;
176 
177 /* function prototypes */
178 extern XcmsCmapRec *
179 _XcmsAddCmapRec(
180     Display *dpy,
181     Colormap cmap,
182     Window windowID,
183     Visual *visual);
184 extern void
185 _XcmsRGB_to_XColor(
186     XcmsColor *pColors,
187     XColor *pXColors,
188     unsigned int nColors);
189 extern Status
190 _XcmsResolveColorString (
191     XcmsCCC ccc,
192     const char **color_string,
193     XcmsColor *pColor_exact_return,
194     XcmsColorFormat result_format);
195 extern void
196 _XUnresolveColor(
197     XcmsCCC ccc,
198     XColor *pXColor);
199 /*
200  *	DESCRIPTION
201  *		Include file for defining the math macros used in the
202  *		XCMS source.  Instead of using math library routines
203  *		directly, XCMS uses macros so that based on the
204  *		definitions here, vendors and sites can specify exactly
205  *		what routine will be called (those from libm.a or their
206  *		custom routines).  If not defined to math library routines
207  *		(e.g., sqrt in libm.a), then the client is not forced to
208  *		be linked with -lm.
209  */
210 
211 #define XCMS_ATAN(x)		_XcmsArcTangent(x)
212 #define XCMS_COS(x)		_XcmsCosine(x)
213 #define XCMS_CUBEROOT(x)	_XcmsCubeRoot(x)
214 #define XCMS_FABS(x)		((x) < 0.0 ? -(x) : (x))
215 #define XCMS_SIN(x)		_XcmsSine(x)
216 #define XCMS_SQRT(x)		_XcmsSquareRoot(x)
217 #define XCMS_TAN(x)		(XCMS_SIN(x) / XCMS_COS(x))
218 
219 double _XcmsArcTangent(double a);
220 double _XcmsCosine(double a);
221 double _XcmsCubeRoot(double a);
222 double _XcmsSine(double a);
223 double _XcmsSquareRoot(double a);
224 
225 /*
226  *  DEFINES FOR GAMUT COMPRESSION AND QUERY ROUTINES
227  */
228 #ifndef PI
229 #  ifdef M_PI
230 #    define PI M_PI
231 #  else
232 #    define PI 3.14159265358979323846264338327950
233 #  endif /* M_PI */
234 #endif /* PI */
235 #ifndef degrees
236 #  define degrees(r) ((XcmsFloat)(r) * 180.0 / PI)
237 #endif /* degrees */
238 #ifndef radians
239 #  define radians(d) ((XcmsFloat)(d) * PI / 180.0)
240 #endif /* radians */
241 
242 #define XCMS_CIEUSTAROFHUE(h,c)	\
243 ((XCMS_COS((h)) == 0.0) ? (XcmsFloat)0.0 : (XcmsFloat) \
244 ((XcmsFloat)(c) / (XcmsFloat)XCMS_SQRT((XCMS_TAN(h) * XCMS_TAN(h)) + \
245 (XcmsFloat)1.0)))
246 #define XCMS_CIEVSTAROFHUE(h,c)	\
247 ((XCMS_COS((h)) == 0.0) ? (XcmsFloat)0.0 : (XcmsFloat) \
248 ((XcmsFloat)(c) / (XcmsFloat)XCMS_SQRT(((XcmsFloat)1.0 / \
249 (XcmsFloat)(XCMS_TAN(h) * XCMS_TAN(h))) + (XcmsFloat)1.0)))
250 /* this hue is returned in radians */
251 #define XCMS_CIELUV_PMETRIC_HUE(u,v)	\
252 (((u) != 0.0) ? XCMS_ATAN( (v) / (u)) : ((v >= 0.0) ? PI / 2 : -(PI / 2)))
253 #define XCMS_CIELUV_PMETRIC_CHROMA(u,v)	XCMS_SQRT(((u)*(u)) + ((v)*(v)))
254 
255 #define XCMS_CIEASTAROFHUE(h,c)		XCMS_CIEUSTAROFHUE((h), (c))
256 #define XCMS_CIEBSTAROFHUE(h,c)		XCMS_CIEVSTAROFHUE((h), (c))
257 #define XCMS_CIELAB_PMETRIC_HUE(a,b)	XCMS_CIELUV_PMETRIC_HUE((a), (b))
258 #define XCMS_CIELAB_PMETRIC_CHROMA(a,b)	XCMS_CIELUV_PMETRIC_CHROMA((a), (b))
259 
260 #endif /* _XCMSINT_H_ */
261