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