#ifndef _XCMSINT_H_
#define _XCMSINT_H_
#include <X11/Xcms.h>
#define _XCMS_NEWNAME -1
#define XCMS_DD_ID(id) ((id) & (XcmsColorFormat)0x80000000)
#define XCMS_DI_ID(id) (!((id) & (XcmsColorFormat)0x80000000))
#define XCMS_UNREG_ID(id) ((id) & (XcmsColorFormat)0x40000000)
#define XCMS_REG_ID(id) (!((id) & (XcmsColorFormat)0x40000000))
#define XCMS_FIRST_REG_DI_ID (XcmsColorFormat)0x00000001
#define XCMS_FIRST_UNREG_DI_ID (XcmsColorFormat)0x40000000
#define XCMS_FIRST_REG_DD_ID (XcmsColorFormat)0x80000000
#define XCMS_FIRST_UNREG_DD_ID (XcmsColorFormat)0xc0000000
typedef struct _XcmsCmapRec {
Colormap cmapID;
Display *dpy;
Window windowID;
Visual *visual;
struct _XcmsCCC *ccc;
struct _XcmsCmapRec *pNext;
} XcmsCmapRec;
typedef struct _IntensityRec {
unsigned short value;
XcmsFloat intensity;
} IntensityRec;
typedef struct _IntensityTbl {
IntensityRec *pBase;
unsigned int nEntries;
} IntensityTbl;
typedef struct _XcmsIntensityMap {
VisualID visualID;
XPointer screenData;
void (*pFreeScreenData)(XPointer pScreenDataTemp);
struct _XcmsIntensityMap *pNext;
} XcmsIntensityMap;
typedef struct _XcmsRegColorSpaceEntry {
const char *prefix;
XcmsColorFormat id;
} XcmsRegColorSpaceEntry;
typedef struct _XcmsPerDpyInfo {
XcmsCCC paDefaultCCC;
XcmsCmapRec *pClientCmaps;
} XcmsPerDpyInfo, *XcmsPerDpyInfoPtr;
#define XDCCC_NUMBER 0x8000000L
#ifdef GRAY
#define XDCCC_SCREENWHITEPT_ATOM_NAME "XDCCC_GRAY_SCREENWHITEPOINT"
#define XDCCC_GRAY_CORRECT_ATOM_NAME "XDCCC_GRAY_CORRECTION"
#endif
#ifndef _ConversionValues
typedef struct _ConversionValues {
IntensityTbl IntensityTbl;
} ConversionValues;
#endif
#ifdef GRAY
typedef struct {
IntensityTbl *IntensityTbl;
} GRAY_SCCData;
#endif
#define XDCCC_MATRIX_ATOM_NAME "XDCCC_LINEAR_RGB_MATRICES"
#define XDCCC_CORRECT_ATOM_NAME "XDCCC_LINEAR_RGB_CORRECTION"
typedef struct {
XcmsFloat XYZtoRGBmatrix[3][3];
XcmsFloat RGBtoXYZmatrix[3][3];
IntensityTbl *pRedTbl;
IntensityTbl *pGreenTbl;
IntensityTbl *pBlueTbl;
} LINEAR_RGB_SCCData;
extern XcmsCmapRec *
_XcmsAddCmapRec(
Display *dpy,
Colormap cmap,
Window windowID,
Visual *visual);
extern void
_XcmsRGB_to_XColor(
XcmsColor *pColors,
XColor *pXColors,
unsigned int nColors);
extern Status
_XcmsResolveColorString (
XcmsCCC ccc,
const char **color_string,
XcmsColor *pColor_exact_return,
XcmsColorFormat result_format);
extern void
_XUnresolveColor(
XcmsCCC ccc,
XColor *pXColor);
#define XCMS_ATAN(x) _XcmsArcTangent(x)
#define XCMS_COS(x) _XcmsCosine(x)
#define XCMS_CUBEROOT(x) _XcmsCubeRoot(x)
#define XCMS_FABS(x) ((x) < 0.0 ? -(x) : (x))
#define XCMS_SIN(x) _XcmsSine(x)
#define XCMS_SQRT(x) _XcmsSquareRoot(x)
#define XCMS_TAN(x) (XCMS_SIN(x) / XCMS_COS(x))
double _XcmsArcTangent(double a);
double _XcmsCosine(double a);
double _XcmsCubeRoot(double a);
double _XcmsSine(double a);
double _XcmsSquareRoot(double a);
#ifndef PI
# ifdef M_PI
# define PI M_PI
# else
# define PI 3.14159265358979323846264338327950
# endif
#endif
#ifndef degrees
# define degrees(r) ((XcmsFloat)(r) * 180.0 / PI)
#endif
#ifndef radians
# define radians(d) ((XcmsFloat)(d) * PI / 180.0)
#endif
#define XCMS_CIEUSTAROFHUE(h,c) \
((XCMS_COS((h)) == 0.0) ? (XcmsFloat)0.0 : (XcmsFloat) \
((XcmsFloat)(c) / (XcmsFloat)XCMS_SQRT((XCMS_TAN(h) * XCMS_TAN(h)) + \
(XcmsFloat)1.0)))
#define XCMS_CIEVSTAROFHUE(h,c) \
((XCMS_COS((h)) == 0.0) ? (XcmsFloat)0.0 : (XcmsFloat) \
((XcmsFloat)(c) / (XcmsFloat)XCMS_SQRT(((XcmsFloat)1.0 / \
(XcmsFloat)(XCMS_TAN(h) * XCMS_TAN(h))) + (XcmsFloat)1.0)))
#define XCMS_CIELUV_PMETRIC_HUE(u,v) \
(((u) != 0.0) ? XCMS_ATAN( (v) / (u)) : ((v >= 0.0) ? PI / 2 : -(PI / 2)))
#define XCMS_CIELUV_PMETRIC_CHROMA(u,v) XCMS_SQRT(((u)*(u)) + ((v)*(v)))
#define XCMS_CIEASTAROFHUE(h,c) XCMS_CIEUSTAROFHUE((h), (c))
#define XCMS_CIEBSTAROFHUE(h,c) XCMS_CIEVSTAROFHUE((h), (c))
#define XCMS_CIELAB_PMETRIC_HUE(a,b) XCMS_CIELUV_PMETRIC_HUE((a), (b))
#define XCMS_CIELAB_PMETRIC_CHROMA(a,b) XCMS_CIELUV_PMETRIC_CHROMA((a), (b))
#endif