diff options
Diffstat (limited to 'nx-X11/lib/X11/cmsColNm.c')
-rw-r--r-- | nx-X11/lib/X11/cmsColNm.c | 1050 |
1 files changed, 0 insertions, 1050 deletions
diff --git a/nx-X11/lib/X11/cmsColNm.c b/nx-X11/lib/X11/cmsColNm.c deleted file mode 100644 index c6f1e0f31..000000000 --- a/nx-X11/lib/X11/cmsColNm.c +++ /dev/null @@ -1,1050 +0,0 @@ - -/* - * 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. - * - * NAME - * XcmsColNm.c - * - * DESCRIPTION - * Source for _XcmsLookupColorName(). - * - * - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif -#include "Xlibint.h" -#include "Xcmsint.h" -#include <nx-X11/Xos.h> -#include <sys/stat.h> -#include <stdio.h> -#include <ctype.h> -#include <limits.h> -#define XK_LATIN1 -#include <nx-X11/keysymdef.h> -#include "Cv.h" - -/* forwards/locals */ -static Status LoadColornameDB(void); - - -/* - * LOCAL DEFINES - * #define declarations local to this package. - */ -#ifndef XCMSDB -#define XCMSDB XCMSDIR "/Xcms.txt" -#endif - -#ifndef isgraph -# define isgraph(c) (isprint((c)) && !isspace((c))) -#endif - -#ifndef XCMSDB_MAXLINELEN -# define XCMSDB_MAXLINELEN 256 -#endif - -#define FORMAT_VERSION "0.1" -#define START_TOKEN "XCMS_COLORDB_START" -#define END_TOKEN "XCMS_COLORDB_END" -#define DELIM_CHAR '\t' - -#define NOT_VISITED 0x0 -#define VISITED 0x1 -#define CYCLE 0xFFFF -#define XcmsDbInitNone -1 -#define XcmsDbInitFailure 0 -#define XcmsDbInitSuccess 1 - -/* - * LOCAL TYPEDEFS - */ -typedef struct _XcmsPair { - const char *first; - const char *second; - int flag; -} XcmsPair; - -/* - * LOCAL VARIABLES - */ -static int XcmsColorDbState = XcmsDbInitNone; -static int nEntries; -static char *strings; -static XcmsPair *pairs; -static const char whitePtStr[] = "WhitePoint"; - - -/************************************************************************ - * * - * PRIVATE ROUTINES * - * * - ************************************************************************/ - -/* - * NAME - * _XcmsColorSpaceOfString - * - * SYNOPSIS - */ -static XcmsColorSpace * -_XcmsColorSpaceOfString( - XcmsCCC ccc, - const char *color_string) -/* - * DESCRIPTION - * Returns a pointer to the color space structure - * (XcmsColorSpace) associated with the specified color string. - * - * RETURNS - * Pointer to matching XcmsColorSpace structure if found; - * otherwise NULL. - * - * CAVEATS - * - */ -{ - XcmsColorSpace **papColorSpaces; - size_t n; - char *pchar; - - if ((pchar = strchr(color_string, ':')) == NULL) { - return(XcmsFailure); - } - n = (size_t)(pchar - color_string); - - if (ccc == NULL) { - return(NULL); - } - - /* - * First try Device-Independent color spaces - */ - papColorSpaces = _XcmsDIColorSpaces; - if (papColorSpaces != NULL) { - while (*papColorSpaces != NULL) { - if (strncmp((*papColorSpaces)->prefix, color_string, n) == 0 && - !((*papColorSpaces)->prefix)[n]) { - return(*papColorSpaces); - } - papColorSpaces++; - } - } - - /* - * Next try Device-Dependent color spaces - */ - papColorSpaces = ((XcmsFunctionSet *)ccc->pPerScrnInfo->functionSet)->DDColorSpaces; - if (papColorSpaces != NULL) { - while (*papColorSpaces != NULL) { - if (strncmp((*papColorSpaces)->prefix, color_string, n) == 0 && - !((*papColorSpaces)->prefix)[n]) { - return(*papColorSpaces); - } - papColorSpaces++; - } - } - - return(NULL); -} - - -/* - * NAME - * _XcmsParseColorString - * - * SYNOPSIS - */ -static int -_XcmsParseColorString( - XcmsCCC ccc, - const char *color_string, - XcmsColor *pColor) -/* - * DESCRIPTION - * Assuming color_string contains a numerical string color - * specification, attempts to parse a string into an - * XcmsColor structure. - * - * RETURNS - * 0 if failed; otherwise non-zero. - * - * CAVEATS - * A color string containing a numerical color specification - * must be in ISO Latin-1 encoding! - */ -{ - XcmsColorSpace *pColorSpace; - char string_buf[64]; - char *string_lowered; - size_t len; - int res; - - if (ccc == NULL) { - return(0); - } - - /* - * While copying color_string to string_lowered, convert to lowercase - */ - if ((len = strlen(color_string)) >= sizeof(string_buf)) { - string_lowered = Xmalloc(len+1); - } else { - string_lowered = string_buf; - } - - _XcmsCopyISOLatin1Lowered(string_lowered, color_string); - - if (*string_lowered == '#') { - if ((pColorSpace = _XcmsColorSpaceOfString(ccc, "rgb:")) != NULL) { - res = (*pColorSpace->parseString)(string_lowered, pColor); - if (len >= sizeof(string_buf)) Xfree(string_lowered); - return res; - } - } - - if ((pColorSpace = _XcmsColorSpaceOfString(ccc, string_lowered)) != NULL) { - res = (*pColorSpace->parseString)(string_lowered, pColor); - if (len >= sizeof(string_buf)) Xfree(string_lowered); - return res; - } - - if (len >= sizeof(string_buf)) Xfree(string_lowered); - return(0); -} - - -/* - * NAME - * FirstCmp - Compare color names of pair recs - * - * SYNOPSIS - */ -static int -FirstCmp(const void *p1, const void *p2) -/* - * DESCRIPTION - * Compares the color names of XcmsColorTuples. - * This routine is public to allow access from qsort???. - * - * RETURNS - * 0 if equal; - * < 0 if first precedes second, - * > 0 if first succeeds second. - * - */ -{ - return(strcmp(((const XcmsPair *)p1)->first, ((const XcmsPair *)p2)->first)); -} - - - -/* - * NAME - * stringSectionSize - determine memory needed for strings - * - * SYNOPSIS - */ -static void -SetNoVisit(void) -/* - * DESCRIPTION - * - * RETURNS - * void - * - */ -{ - int i; - XcmsPair *pair = pairs; - - for (i = 0; i < nEntries; i++, pair++) { - if (pair->flag != CYCLE) { - pair->flag = NOT_VISITED; - } - } -} - - - - -/* - * NAME - * field2 - extract two fields - * - * SYNOPSIS - */ -static int -field2( - char *pBuf, - char delim, /* in: field delimiter */ - char **p1, /* in/out: pointer to pointer to field 1 */ - char **p2) /* in/out: pointer to pointer to field 2 */ -/* - * DESCRIPTION - * Extracts two fields from a "record". - * - * RETURNS - * XcmsSuccess if succeeded, otherwise XcmsFailure. - * - */ -{ - *p1 = *p2 = NULL; - - /* Find Field 1 */ - while (!isgraph(*pBuf)) { - if ((*pBuf != '\n') || (*pBuf != '\0')) { - return(XcmsFailure); - } - if (isspace(*pBuf) || (*pBuf == delim)) { - pBuf++; - } - } - *p1 = pBuf; - - /* Find end of Field 2 */ - while (isprint(*pBuf) && (*pBuf != delim)) { - pBuf++; - } - if ((*pBuf == '\n') || (*pBuf == '\0')) { - return(XcmsFailure); - } - if ((*pBuf == ' ') || (*pBuf == delim)) { - *pBuf++ = '\0'; /* stuff end of string character */ - } else { - return(XcmsFailure); - } - - /* Find Field 2 */ - while (!isgraph(*pBuf)) { - if ((*pBuf == '\n') || (*pBuf == '\0')) { - return(XcmsFailure); - } - if (isspace(*pBuf) || (*pBuf == delim)) { - pBuf++; - } - } - *p2 = pBuf; - - /* Find end of Field 2 */ - while (isprint(*pBuf) && (*pBuf != delim)) { - pBuf++; - } - if (*pBuf != '\0') { - *pBuf = '\0'; /* stuff end of string character */ - } - - return(XcmsSuccess); -} - - -/* - * NAME - * _XcmsLookupColorName - Lookup DB entry for a color name - * - * SYNOPSIS - */ -static Status -_XcmsLookupColorName( - XcmsCCC ccc, - const char **name, - XcmsColor *pColor) -/* - * DESCRIPTION - * Searches for an entry in the Device-Independent Color Name - * Database for the specified string. - * - * RETURNS - * XcmsFailure if failed to find a matching entry in - * the database. - * XcmsSuccess if succeeded in converting color name to - * XcmsColor. - * _XCMS_NEWNAME if succeeded in converting color string (which - * is a color name to yet another color name. Note - * that the new name is passed back via 'name'. - */ - { - Status retval = 0; - char name_lowered_64[64]; - char *name_lowered; - register int i, j, left, right; - int len; - const char *tmpName; - XcmsPair *pair = NULL; - - /* - * Check state of Database: - * XcmsDbInitNone - * XcmsDbInitSuccess - * XcmsDbInitFailure - */ - if (XcmsColorDbState == XcmsDbInitFailure) { - return(XcmsFailure); - } - if (XcmsColorDbState == XcmsDbInitNone) { - if (!LoadColornameDB()) { - return(XcmsFailure); - } - } - - SetNoVisit(); - - /* - * While copying name to name_lowered, convert to lowercase - */ - - tmpName = *name; - -Retry: - if ((len = strlen(tmpName)) > 63) { - name_lowered = Xmalloc(len+1); - } else { - name_lowered = name_lowered_64; - } - - _XcmsCopyISOLatin1Lowered(name_lowered, tmpName); - - /* - * Now, remove spaces. - */ - for (i = 0, j = 0; j < len; j++) { - if (!isspace(name_lowered[j])) { - name_lowered[i++] = name_lowered[j]; - } - } - name_lowered[i] = '\0'; - - left = 0; - right = nEntries - 1; - while (left <= right) { - i = (left + right) >> 1; - pair = &pairs[i]; - j = strcmp(name_lowered, pair->first); - if (j < 0) - right = i - 1; - else if (j > 0) - left = i + 1; - else { - break; - } - } - if (len > 63) Xfree(name_lowered); - - if (left > right) { - if (retval == 2) { - if (*name != tmpName) { - *name = tmpName; - } - return(_XCMS_NEWNAME); - } - return(XcmsFailure); - } - - if (pair->flag == CYCLE) { - return(XcmsFailure); - } - if (pair->flag == VISITED) { - pair->flag = CYCLE; - return(XcmsFailure); - } - - if (_XcmsParseColorString(ccc, pair->second, pColor) == XcmsSuccess) { - /* f2 contains a numerical string specification */ - return(XcmsSuccess); - } else { - /* f2 does not contain a numerical string specification */ - tmpName = pair->second; - pair->flag = VISITED; - retval = 2; - goto Retry; - } -} - - -/* - * NAME - * RemoveSpaces - * - * SYNOPSIS - */ -static int -RemoveSpaces( - char *pString) -/* - * DESCRIPTION - * Removes spaces from string. - * - * RETURNS - * Void - * - */ -{ - int i, count = 0; - char *cptr; - - /* REMOVE SPACES */ - cptr = pString; - for (i = strlen(pString); i; i--, cptr++) { - if (!isspace(*cptr)) { - *pString++ = *cptr; - count++; - } - } - *pString = '\0'; - return(count); -} - - -/* - * NAME - * stringSectionSize - determine memory needed for strings - * - * SYNOPSIS - */ -static int -stringSectionSize( - FILE *stream, - int *pNumEntries, - int *pSectionSize) -/* - * DESCRIPTION - * Determines the amount of memory required to store the - * color name strings and also the number of strings. - * - * RETURNS - * XcmsSuccess if succeeded, otherwise XcmsFailure. - * - */ -{ - char buf[XCMSDB_MAXLINELEN]; - char token[XCMSDB_MAXLINELEN]; - char token2[XCMSDB_MAXLINELEN]; - char *pBuf; - char *f1; - char *f2; - size_t i; - - unsigned int numEntries = 0; - unsigned int sectionSize = 0; - - *pNumEntries = 0; - *pSectionSize = 0; - - /* - * Advance to START_TOKEN - * Anything before is just considered as comments. - */ - - while((pBuf = fgets(buf, XCMSDB_MAXLINELEN, stream)) != NULL) { - if ((sscanf(buf, "%s %s", token, token2)) - && (strcmp(token, START_TOKEN) == 0)) { - if (strcmp(token2, FORMAT_VERSION) != 0) { - /* text file not in the right format */ - return(XcmsFailure); - } - break; - } /* else it was just a blank line or comment */ - } - - if (pBuf == NULL) { - return(XcmsFailure); - } - - while((fgets(buf, XCMSDB_MAXLINELEN, stream)) != NULL) { - if ((sscanf(buf, "%s", token)) && (strcmp(token, END_TOKEN) == 0)) { - break; - } - - if (field2(buf, DELIM_CHAR, &f1, &f2) != XcmsSuccess) { - return(XcmsFailure); - } - - numEntries++; - if (numEntries >= INT_MAX) - return(XcmsFailure); - - i = strlen(f1); - if (i >= INT_MAX - sectionSize) - return(XcmsFailure); - sectionSize += i + 1; - for (; i; i--, f1++) { - /* REMOVE SPACES FROM COUNT */ - if (isspace(*f1)) { - sectionSize--; - } - } - - i = strlen(f2); - if (i >= INT_MAX - sectionSize) - return(XcmsFailure); - sectionSize += i + 1; - for (; i; i--, f2++) { - /* REMOVE SPACES FROM COUNT */ - if (isspace(*f2)) { - sectionSize--; - } - } - - } - - *pNumEntries = (int) numEntries; - *pSectionSize = (int) sectionSize; - - return(XcmsSuccess); -} - - -/* - * NAME - * ReadColornameDB - Read the Color Name Database - * - * SYNOPSIS - */ -static Status -ReadColornameDB( - FILE *stream, - XcmsPair *pRec, - char *pString) -/* - * DESCRIPTION - * Loads the Color Name Database from a text file. - * - * RETURNS - * XcmsSuccess if succeeded, otherwise XcmsFailure. - * - */ -{ - char buf[XCMSDB_MAXLINELEN]; - char token[XCMSDB_MAXLINELEN]; - char token2[XCMSDB_MAXLINELEN]; - char *f1; - char *f2; - char *pBuf; - - /* - * Advance to START_TOKEN - * Anything before is just considered as comments. - */ - - while((pBuf = fgets(buf, XCMSDB_MAXLINELEN, stream)) != NULL) { - if ((sscanf(buf, "%s %s", token, token2)) - && (strcmp(token, START_TOKEN) == 0)) { - if (strcmp(token2, FORMAT_VERSION) != 0) { - /* text file not in the right format */ - return(XcmsFailure); - } - break; - } /* else it was just a blank line or comment */ - } - - if (pBuf == NULL) { - return(XcmsFailure); - } - - /* - * Process lines between START_TOKEN to END_TOKEN - */ - - while ((fgets(buf, XCMSDB_MAXLINELEN, stream)) != NULL) { - if ((sscanf(buf, "%s", token)) && (strcmp(token, END_TOKEN) == 0)) { - /* - * Found END_TOKEN so break out of for loop - */ - break; - } - - /* - * Get pairs - */ - if (field2(buf, DELIM_CHAR, &f1, &f2) != XcmsSuccess) { - /* Invalid line */ - continue; - } - - /* - * Add strings - */ - - /* Left String */ - pRec->first = pString; - _XcmsCopyISOLatin1Lowered(pString, f1); - pString += (1 + RemoveSpaces(pString)); - pRec->second = pString; - /* Right String */ - _XcmsCopyISOLatin1Lowered(pString, f2); - pString += RemoveSpaces(pString) + 1; - pRec++; - - } - - return(XcmsSuccess); -} - - -/* - * NAME - * LoadColornameDB - Load the Color Name Database - * - * SYNOPSIS - */ -static Status -LoadColornameDB(void) -/* - * DESCRIPTION - * Loads the Color Name Database from a text file. - * - * RETURNS - * XcmsSuccess if succeeded, otherwise XcmsFailure. - * - */ -{ - int size; - FILE *stream; - const char *pathname; - struct stat txt; - int length; - - /* use and name of this env var is not part of the standard */ - /* implementation-dependent feature */ - if ((pathname = getenv("XCMSDB")) == NULL) { - pathname = XCMSDB; - } - - length = strlen(pathname); - if ((length == 0) || (length >= (BUFSIZ - 5))){ - XcmsColorDbState = XcmsDbInitFailure; - return(XcmsFailure); - } - - if (stat(pathname, &txt)) { - /* can't stat file */ - XcmsColorDbState = XcmsDbInitFailure; - return(XcmsFailure); - } - - if ((stream = _XFopenFile (pathname, "r")) == NULL) { - /* can't open file */ - XcmsColorDbState = XcmsDbInitFailure; - return(XcmsFailure); - } - - if (stringSectionSize(stream, &nEntries, &size) != XcmsSuccess || - nEntries == 0) { - (void) fclose(stream); - XcmsColorDbState = XcmsDbInitFailure; - return(XcmsFailure); - } - rewind(stream); - - strings = Xmalloc(size); - pairs = Xcalloc(nEntries, sizeof(XcmsPair)); - - ReadColornameDB(stream, pairs, strings); - (void) fclose(stream); - - /* - * sort the pair recs - */ - qsort((char *)pairs, nEntries, sizeof(XcmsPair), FirstCmp); - - XcmsColorDbState = XcmsDbInitSuccess; - return(XcmsSuccess); -} - - -/************************************************************************ - * * - * API PRIVATE ROUTINES * - * * - ************************************************************************/ - -/* - * NAME - * _XcmsCopyISOLatin1Lowered - * - * SYNOPSIS - */ -void -_XcmsCopyISOLatin1Lowered( - char *dst, - const char *src) -/* - * DESCRIPTION - * ISO Latin-1 case conversion routine - * Identical to XmuCopyISOLatin1Lowered() but provided here - * to eliminate need to link with libXmu.a. - * - * IMPLEMENTORS NOTE: - * This routine is also used in XcmsFormatOfPrefix. - * - * RETURNS - * Void - * - */ -{ - register unsigned char *dest; - register const unsigned char *source; - - for (dest = (unsigned char *)dst, source = (const unsigned char *)src; - *source; - source++, dest++) - { - if ((*source >= XK_A) && (*source <= XK_Z)) - *dest = *source + (XK_a - XK_A); - else if ((*source >= XK_Agrave) && (*source <= XK_Odiaeresis)) - *dest = *source + (XK_agrave - XK_Agrave); - else if ((*source >= XK_Ooblique) && (*source <= XK_Thorn)) - *dest = *source + (XK_oslash - XK_Ooblique); - else - *dest = *source; - } - *dest = '\0'; -} - - -/* - * NAME - * _XcmsResolveColorString - - * - * SYNOPSIS - */ -Status -_XcmsResolveColorString ( - XcmsCCC ccc, - const char **color_string, - XcmsColor *pColor_exact_return, - XcmsColorFormat result_format) -/* - * DESCRIPTION - * The XcmsLookupColor function finds the color specification - * associated with a color name in the Device-Independent Color - * Name Database. - * RETURNS - * XcmsFailure if failed to convert valid color string. - * XcmsSuccess if succeeded in converting color string to - * XcmsColor. - * _XCMS_NEWNAME if failed to parse the string or find it in - * the database, or if succeeded in looking it up and - * found another name which is not in the database. - * Note that the new name is returned in color_string. - * - * This function returns both the color specification found in the - * database (db specification) and the color specification for the - * color displayable by the specified screen (screen - * specification). The calling routine sets the format for these - * returned specifications in the XcmsColor format component. - * If XcmsUndefinedFormat, the specification is returned in the - * format used to store the color in the database. - */ -{ - XcmsColor dbWhitePt; /* whitePt associated with pColor_exact_return*/ - /* the screen's white point */ - XcmsColor *pClientWhitePt; - int retval; - const char *strptr = whitePtStr; - -/* - * 0. Check for invalid arguments. - */ - if (ccc == NULL || (*color_string)[0] == '\0' || pColor_exact_return == NULL) { - return(XcmsFailure); - } - -/* - * 1. First attempt to parse the string - * If successful, then convert the specification to the target format - * and return. - */ - if (_XcmsParseColorString(ccc, *color_string, pColor_exact_return) - == 1) { - if (result_format != XcmsUndefinedFormat - && pColor_exact_return->format != result_format) { - /* need to be converted to the target format */ - return(XcmsConvertColors(ccc, pColor_exact_return, 1, - result_format, (Bool *)NULL)); - } else { - return(XcmsSuccess); - } - } - -/* - * 2. Attempt to find it in the DI Color Name Database - */ - - /* - * a. Convert String into a XcmsColor structure - * Attempt to extract the specification for color_string from the - * DI Database (pColor_exact_return). If the DI Database does not - * have this entry, then return failure. - */ - retval = _XcmsLookupColorName(ccc, color_string, pColor_exact_return); - - if (retval != XcmsSuccess) { - /* color_string replaced with a color name, or not found */ - return(_XCMS_NEWNAME); - } - - if (pColor_exact_return->format == XcmsUndefinedFormat) { - return(XcmsFailure); - } - - /* - * b. If result_format not defined, then assume target format - * is the exact format. - */ - if (result_format == XcmsUndefinedFormat) { - result_format = pColor_exact_return->format; - } - - if ((ClientWhitePointOfCCC(ccc))->format == XcmsUndefinedFormat) { - pClientWhitePt = ScreenWhitePointOfCCC(ccc); - } else { - pClientWhitePt = ClientWhitePointOfCCC(ccc); - } - - /* - * c. Convert to the target format, making adjustments for white - * point differences as necessary. - */ - if (XCMS_DD_ID(pColor_exact_return->format)) { - /* - * The spec format is Device-Dependent, therefore assume the - * its white point is the Screen White Point. - */ - if (XCMS_DD_ID(result_format)) { - /* - * Target format is Device-Dependent - * Therefore, DD --> DD conversion - */ - return(_XcmsDDConvertColors(ccc, pColor_exact_return, - 1, result_format, (Bool *) NULL)); - } else { - /* - * Target format is Device-Independent - * Therefore, DD --> DI conversion - */ - if (ccc->whitePtAdjProc && !_XcmsEqualWhitePts(ccc, - pClientWhitePt, ScreenWhitePointOfCCC(ccc))) { - return((*ccc->whitePtAdjProc)(ccc, ScreenWhitePointOfCCC(ccc), - pClientWhitePt, result_format, - pColor_exact_return, 1, (Bool *) NULL)); - } else { - if (_XcmsDDConvertColors(ccc, pColor_exact_return, 1, - XcmsCIEXYZFormat, (Bool *) NULL) == XcmsFailure) { - return(XcmsFailure); - } - return(_XcmsDIConvertColors(ccc, pColor_exact_return, - pClientWhitePt, 1, result_format)); - } - } - } else { - /* - * The spec format is Device-Independent, therefore attempt - * to find a database white point. - * - * If the Database does not have a white point, then assume the - * database white point is the same as the Screen White Point. - */ - - if (_XcmsLookupColorName(ccc, &strptr, &dbWhitePt) != 1) { - memcpy((char *)&dbWhitePt, - (char *)&ccc->pPerScrnInfo->screenWhitePt, - sizeof(XcmsColor)); - } - if (XCMS_DD_ID(result_format)) { - /* - * Target format is Device-Dependent - * Therefore, DI --> DD conversion - */ - if (ccc->whitePtAdjProc && !_XcmsEqualWhitePts(ccc, - &dbWhitePt, ScreenWhitePointOfCCC(ccc))) { - return((*ccc->whitePtAdjProc)(ccc, &dbWhitePt, - ScreenWhitePointOfCCC(ccc), result_format, - pColor_exact_return, 1, (Bool *)NULL)); - } else { - if (pColor_exact_return->format != XcmsCIEXYZFormat) { - if (_XcmsDIConvertColors(ccc, pColor_exact_return, - &dbWhitePt, 1, XcmsCIEXYZFormat) == XcmsFailure) { - return(XcmsFailure); - } - } - return (_XcmsDDConvertColors(ccc, pColor_exact_return, 1, - result_format, (Bool *)NULL)); - } - } else { - /* - * Target format is Device-Independent - * Therefore, DI --> DI conversion - */ - if (ccc->whitePtAdjProc && !_XcmsEqualWhitePts(ccc, - &dbWhitePt, pClientWhitePt)) { - /* - * The calling routine wants to resolve this color - * in terms if it's white point (i.e. Client White Point). - * Therefore, apply white adjustment for the displacement - * between dbWhitePt to clientWhitePt. - */ - return((*ccc->whitePtAdjProc)(ccc, &dbWhitePt, - pClientWhitePt, result_format, - pColor_exact_return, 1, (Bool *)NULL)); - } else if (_XcmsEqualWhitePts(ccc, - &dbWhitePt, pClientWhitePt)) { - /* - * Can use either dbWhitePt or pClientWhitePt to - * convert to the result_format. - */ - if (pColor_exact_return->format == result_format) { - return(XcmsSuccess); - } else { - return (_XcmsDIConvertColors(ccc, pColor_exact_return, - &dbWhitePt, 1, result_format)); - } - } else { - /* - * Need to convert to a white point independent color - * space (let's choose CIEXYZ) then convert to the - * target color space. Why? Lets assume that - * pColor_exact_return->format and result format - * are white point dependent format (e.g., CIELUV, CIELAB, - * TekHVC ... same or any combination). If so, we'll - * need to convert the color with dbWhitePt to an absolute - * spec (i.e. non-white point dependent) then convert that - * absolute value with clientWhitePt to the result_format. - */ - if (pColor_exact_return->format != XcmsCIEXYZFormat) { - if (_XcmsDIConvertColors(ccc, pColor_exact_return, - &dbWhitePt, 1, XcmsCIEXYZFormat) == XcmsFailure) { - return(XcmsFailure); - } - } - if (result_format == XcmsCIEXYZFormat) { - return(XcmsSuccess); - } else { - return(_XcmsDIConvertColors(ccc, pColor_exact_return, - pClientWhitePt, 1, result_format)); - } - } - } - } -} |