mirror of
https://github.com/Stichting-MINIX-Research-Foundation/xsrc.git
synced 2025-09-09 12:49:44 -04:00
263 lines
7.6 KiB
C
263 lines
7.6 KiB
C
/* $Xorg: Xcmsint.h,v 1.3 2000/08/17 19:45:05 cpqbld Exp $ */
|
|
|
|
/*
|
|
* Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
|
|
* All Rights Reserved
|
|
*
|
|
* This file is a component of an X Window System-specific implementation
|
|
* of Xcms based on the TekColor Color Management System. Permission is
|
|
* hereby granted to use, copy, modify, sell, and otherwise distribute this
|
|
* software and its documentation for any purpose and without fee, provided
|
|
* that this copyright, permission, and disclaimer notice is reproduced in
|
|
* all copies of this software and in supporting documentation. TekColor
|
|
* is a trademark of Tektronix, Inc.
|
|
*
|
|
* Tektronix makes no representation about the suitability of this software
|
|
* for any purpose. It is provided "as is" and with all faults.
|
|
*
|
|
* TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
|
|
* INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
|
* PARTICULAR PURPOSE. IN NO EVENT SHALL TEKTRONIX BE LIABLE FOR ANY
|
|
* SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
|
|
* RESULTING FROM LOSS OF USE, DATA, OR PROFITS, WHETHER IN AN ACTION OF
|
|
* CONTRACT, NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
|
* CONNECTION WITH THE USE OR THE PERFORMANCE OF THIS SOFTWARE.
|
|
*
|
|
*
|
|
* DESCRIPTION
|
|
* Private include file for Color Management System.
|
|
* (i.e., for API internal use only)
|
|
*
|
|
*/
|
|
/* $XFree86: xc/lib/X11/Xcmsint.h,v 3.4 2003/04/13 19:22:19 dawes Exp $ */
|
|
|
|
#ifndef _XCMSINT_H_
|
|
#define _XCMSINT_H_
|
|
|
|
#include <X11/Xcms.h>
|
|
|
|
/*
|
|
* DEFINES
|
|
*/
|
|
|
|
/*
|
|
* Private Status Value
|
|
*/
|
|
#define _XCMS_NEWNAME -1
|
|
|
|
/*
|
|
* Color Space ID's are of XcmsColorFormat type.
|
|
*
|
|
* bit 31
|
|
* 0 == Device-Independent
|
|
* 1 == Device-Dependent
|
|
*
|
|
* bit 30:
|
|
* 0 == Registered with X Consortium
|
|
* 1 == Unregistered
|
|
*/
|
|
#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
|
|
|
|
/*
|
|
* TYPEDEFS
|
|
*/
|
|
|
|
/*
|
|
* Structure for caching Colormap info.
|
|
* This is provided for the Xlib modifications to:
|
|
* XAllocNamedColor()
|
|
* XLookupColor()
|
|
* XParseColor()
|
|
* XStoreNamedColor()
|
|
*/
|
|
typedef struct _XcmsCmapRec {
|
|
Colormap cmapID;
|
|
Display *dpy;
|
|
Window windowID;
|
|
Visual *visual;
|
|
struct _XcmsCCC *ccc;
|
|
struct _XcmsCmapRec *pNext;
|
|
} XcmsCmapRec;
|
|
|
|
/*
|
|
* Intensity Record (i.e., value / intensity tuple)
|
|
*/
|
|
typedef struct _IntensityRec {
|
|
unsigned short value;
|
|
XcmsFloat intensity;
|
|
} IntensityRec;
|
|
|
|
/*
|
|
* Intensity Table
|
|
*/
|
|
typedef struct _IntensityTbl {
|
|
IntensityRec *pBase;
|
|
unsigned int nEntries;
|
|
} IntensityTbl;
|
|
|
|
/*
|
|
* Structure for storing per-Visual Intensity Tables (aka gamma maps).
|
|
*/
|
|
typedef struct _XcmsIntensityMap {
|
|
VisualID visualID;
|
|
XPointer screenData; /* pointer to corresponding Screen Color*/
|
|
/* Characterization Data */
|
|
void (*pFreeScreenData)(XPointer pScreenDataTemp); /* Function that frees a Screen */
|
|
/* structure. */
|
|
struct _XcmsIntensityMap *pNext;
|
|
} XcmsIntensityMap;
|
|
|
|
|
|
/*
|
|
* Structure for storing "registered" color space prefix/ID
|
|
*/
|
|
typedef struct _XcmsRegColorSpaceEntry {
|
|
const char *prefix; /* Color Space prefix (e.g., "CIEXYZ:") */
|
|
XcmsColorFormat id; /* Color Space ID (e.g., XcmsCIEXYZFormat) */
|
|
} XcmsRegColorSpaceEntry;
|
|
|
|
|
|
/*
|
|
* Xcms Per Display (i.e. connection) related data
|
|
*/
|
|
typedef struct _XcmsPerDpyInfo {
|
|
|
|
XcmsCCC paDefaultCCC; /* based on default visual of screen */
|
|
/*
|
|
* Pointer to an array of XcmsCCC structures, one for
|
|
* each screen.
|
|
*/
|
|
XcmsCmapRec *pClientCmaps; /* Pointer to linked list of XcmsCmapRec's */
|
|
|
|
} XcmsPerDpyInfo, *XcmsPerDpyInfoPtr;
|
|
|
|
/*
|
|
* DEFINES
|
|
*/
|
|
|
|
#define XDCCC_NUMBER 0x8000000L /* 2**27 per XDCCC */
|
|
|
|
#ifdef GRAY
|
|
#define XDCCC_SCREENWHITEPT_ATOM_NAME "XDCCC_GRAY_SCREENWHITEPOINT"
|
|
#define XDCCC_GRAY_CORRECT_ATOM_NAME "XDCCC_GRAY_CORRECTION"
|
|
#endif /* GRAY */
|
|
|
|
#ifndef _ConversionValues
|
|
typedef struct _ConversionValues {
|
|
IntensityTbl IntensityTbl;
|
|
} ConversionValues;
|
|
#endif
|
|
|
|
#ifdef GRAY
|
|
typedef struct {
|
|
IntensityTbl *IntensityTbl;
|
|
} GRAY_SCCData;
|
|
#endif /* GRAY */
|
|
|
|
/*
|
|
* DEFINES
|
|
*/
|
|
|
|
#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;
|
|
|
|
/* function prototypes */
|
|
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);
|
|
/*
|
|
* DESCRIPTION
|
|
* Include file for defining the math macros used in the
|
|
* XCMS source. Instead of using math library routines
|
|
* directly, XCMS uses macros so that based on the
|
|
* definitions here, vendors and sites can specify exactly
|
|
* what routine will be called (those from libm.a or their
|
|
* custom routines). If not defined to math library routines
|
|
* (e.g., sqrt in libm.a), then the client is not forced to
|
|
* be linked with -lm.
|
|
*/
|
|
|
|
#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);
|
|
|
|
/*
|
|
* DEFINES FOR GAMUT COMPRESSION AND QUERY ROUTINES
|
|
*/
|
|
#ifndef PI
|
|
# ifdef M_PI
|
|
# define PI M_PI
|
|
# else
|
|
# define PI 3.14159265358979323846264338327950
|
|
# endif /* M_PI */
|
|
#endif /* PI */
|
|
#ifndef degrees
|
|
# define degrees(r) ((XcmsFloat)(r) * 180.0 / PI)
|
|
#endif /* degrees */
|
|
#ifndef radians
|
|
# define radians(d) ((XcmsFloat)(d) * PI / 180.0)
|
|
#endif /* radians */
|
|
|
|
#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)))
|
|
/* this hue is returned in radians */
|
|
#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 /* _XCMSINT_H_ */
|