aboutsummaryrefslogtreecommitdiff
path: root/nx-X11/lib/X11/CvCols.c
diff options
context:
space:
mode:
Diffstat (limited to 'nx-X11/lib/X11/CvCols.c')
-rw-r--r--nx-X11/lib/X11/CvCols.c1030
1 files changed, 0 insertions, 1030 deletions
diff --git a/nx-X11/lib/X11/CvCols.c b/nx-X11/lib/X11/CvCols.c
deleted file mode 100644
index 87d49311c..000000000
--- a/nx-X11/lib/X11/CvCols.c
+++ /dev/null
@@ -1,1030 +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
- * XcmsCvCols.c
- *
- * DESCRIPTION
- * Xcms API routine that converts between the
- * device-independent color spaces.
- *
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include "Xlibint.h"
-#include "Xcmsint.h"
-#include "Cv.h"
-
-/*
- * LOCAL DEFINES
- */
-#define DD_FORMAT 0x01
-#define DI_FORMAT 0x02
-#define MIX_FORMAT 0x04
-#ifndef MAX
-# define MAX(x,y) ((x) > (y) ? (x) : (y))
-#endif
-
-
-/************************************************************************
- * *
- * PRIVATE ROUTINES *
- * *
- ************************************************************************/
-
-/*
- * NAME
- * EqualCIEXYZ
- *
- * SYNOPSIS
- */
-static int
-EqualCIEXYZ(
- XcmsColor *p1, XcmsColor *p2)
-/*
- * DESCRIPTION
- * Compares two XcmsColor structures that are in XcmsCIEXYZFormat
- *
- * RETURNS
- * Returns 1 if equal; 0 otherwise.
- *
- */
-{
- if (p1->format != XcmsCIEXYZFormat || p2->format != XcmsCIEXYZFormat) {
- return(0);
- }
- if ((p1->spec.CIEXYZ.X != p2->spec.CIEXYZ.X)
- || (p1->spec.CIEXYZ.Y != p2->spec.CIEXYZ.Y)
- || (p1->spec.CIEXYZ.Z != p2->spec.CIEXYZ.Z)) {
- return(0);
- }
- return(1);
-}
-
-
-/*
- * NAME
- * XcmsColorSpace
- *
- * SYNOPSIS
- */
-static XcmsColorSpace *
-ColorSpaceOfID(
- XcmsCCC ccc,
- XcmsColorFormat id)
-/*
- * DESCRIPTION
- * Returns a pointer to the color space structure
- * (XcmsColorSpace) associated with the specified color space
- * ID.
- *
- * RETURNS
- * Pointer to matching XcmsColorSpace structure if found;
- * otherwise NULL.
- */
-{
- XcmsColorSpace **papColorSpaces;
-
- if (ccc == NULL) {
- return(NULL);
- }
-
- /*
- * First try Device-Independent color spaces
- */
- papColorSpaces = _XcmsDIColorSpaces;
- if (papColorSpaces != NULL) {
- while (*papColorSpaces != NULL) {
- if ((*papColorSpaces)->id == id) {
- return(*papColorSpaces);
- }
- papColorSpaces++;
- }
- }
-
- /*
- * Next try Device-Dependent color spaces
- */
- papColorSpaces = ((XcmsFunctionSet *)ccc->pPerScrnInfo->functionSet)->DDColorSpaces;
- if (papColorSpaces != NULL) {
- while (*papColorSpaces != NULL) {
- if ((*papColorSpaces)->id == id) {
- return(*papColorSpaces);
- }
- papColorSpaces++;
- }
- }
-
- return(NULL);
-}
-
-
-/*
- * NAME
- * ValidDIColorSpaceID
- *
- * SYNOPSIS
- */
-static int
-ValidDIColorSpaceID(
- XcmsColorFormat id)
-/*
- * DESCRIPTION
- * Determines if the specified color space ID is a valid
- * Device-Independent color space in the specified Color
- * Conversion Context.
- *
- * RETURNS
- * Returns zero if not valid; otherwise non-zero.
- */
-{
- XcmsColorSpace **papRec;
- papRec = _XcmsDIColorSpaces;
- if (papRec != NULL) {
- while (*papRec != NULL) {
- if ((*papRec)->id == id) {
- return(1);
- }
- papRec++;
- }
- }
- return(0);
-}
-
-
-/*
- * NAME
- * ValidDDColorSpaceID
- *
- * SYNOPSIS
- */
-static int
-ValidDDColorSpaceID(
- XcmsCCC ccc,
- XcmsColorFormat id)
-/*
- * DESCRIPTION
- * Determines if the specified color space ID is a valid
- * Device-Dependent color space in the specified Color
- * Conversion Context.
- *
- * RETURNS
- * Returns zero if not valid; otherwise non-zero.
- */
-{
- XcmsColorSpace **papRec;
-
- if (ccc->pPerScrnInfo->state != XcmsInitNone) {
- papRec = ((XcmsFunctionSet *)ccc->pPerScrnInfo->functionSet)->DDColorSpaces;
- while (*papRec != NULL) {
- if ((*papRec)->id == id) {
- return(1);
- }
- papRec++;
- }
- }
- return(0);
-}
-
-
-/*
- * NAME
- * ConvertMixedColors - Convert XcmsColor structures
- *
- * SYNOPSIS
- */
-static Status
-ConvertMixedColors(
- XcmsCCC ccc,
- XcmsColor *pColors_in_out,
- XcmsColor *pWhitePt,
- unsigned int nColors,
- XcmsColorFormat targetFormat,
- unsigned char format_flag)
-/*
- * DESCRIPTION
- * This routine will only convert the following types of
- * batches:
- * DI to DI
- * DD to DD
- * DD to CIEXYZ
- * In other words, it will not convert the following types of
- * batches:
- * DI to DD
- * DD to DI(not CIEXYZ)
- *
- * format_flag:
- * 0x01 : convert Device-Dependent only specifications to the
- * target format.
- * 0x02 : convert Device-Independent only specifications to the
- * target format.
- * 0x03 : convert all specifications to the target format.
- *
- * RETURNS
- * XcmsFailure if failed,
- * XcmsSuccess if none of the color specifications were
- * compressed in the conversion process
- * XcmsSuccessWithCompression if at least one of the
- * color specifications were compressed in the
- * conversion process.
- *
- */
-{
- XcmsColor *pColor, *pColors_start;
- XcmsColorFormat format;
- Status retval_tmp;
- Status retval = XcmsSuccess;
- unsigned int iColors;
- unsigned int nBatch;
-
- /*
- * Convert array of mixed color specifications in batches of
- * contiguous formats to the target format
- */
- iColors = 0;
- while (iColors < nColors) {
- /*
- * Find contiguous array of color specifications with the
- * same format
- */
- pColor = pColors_start = pColors_in_out + iColors;
- format = pColors_start->format;
- nBatch = 0;
- while (iColors < nColors && pColor->format == format) {
- pColor++;
- nBatch++;
- iColors++;
- }
- if (format != targetFormat) {
- /*
- * Need to convert this batch from current format to target format.
- */
- if (XCMS_DI_ID(format) && (format_flag & DI_FORMAT) &&
- XCMS_DI_ID(targetFormat)) {
- /*
- * DI->DI
- *
- * Format of interest is Device-Independent,
- * This batch contains Device-Independent specifications, and
- * the Target format is Device-Independent.
- */
- retval_tmp = _XcmsDIConvertColors(ccc, pColors_start, pWhitePt,
- nBatch, targetFormat);
- } else if (XCMS_DD_ID(format) && (format_flag & DD_FORMAT) &&
- (targetFormat == XcmsCIEXYZFormat)) {
- /*
- * DD->CIEXYZ
- *
- * Format of interest is Device-Dependent,
- * This batch contains Device-Dependent specifications, and
- * the Target format is CIEXYZ.
- *
- * Since DD->CIEXYZ we can use NULL instead of pCompressed.
- */
- if ((ccc->whitePtAdjProc != NULL) && !_XcmsEqualWhitePts(ccc,
- pWhitePt, ScreenWhitePointOfCCC(ccc))) {
- /*
- * Need to call WhiteAdjustProc (Screen White Point to
- * White Point).
- */
- retval_tmp = (*ccc->whitePtAdjProc)(ccc,
- ScreenWhitePointOfCCC(ccc), pWhitePt,
- XcmsCIEXYZFormat, pColors_start, nBatch,
- (Bool *)NULL);
- } else {
- retval_tmp = _XcmsDDConvertColors(ccc, pColors_start,
- nBatch, XcmsCIEXYZFormat, (Bool *)NULL);
- }
- } else if (XCMS_DD_ID(format) && (format_flag & DD_FORMAT) &&
- XCMS_DD_ID(targetFormat)) {
- /*
- * DD->DD(not CIEXYZ)
- *
- * Format of interest is Device-Dependent,
- * This batch contains Device-Dependent specifications, and
- * the Target format is Device-Dependent and not CIEXYZ.
- */
- retval_tmp = _XcmsDDConvertColors(ccc, pColors_start, nBatch,
- targetFormat, (Bool *)NULL);
- } else {
- /*
- * This routine is called for the wrong reason.
- */
- return(XcmsFailure);
- }
- if (retval_tmp == XcmsFailure) {
- return(XcmsFailure);
- }
- retval = MAX(retval, retval_tmp);
- }
- }
- return(retval);
-}
-
-
-/************************************************************************
- * *
- * API PRIVATE ROUTINES *
- * *
- ************************************************************************/
-
-/*
- * NAME
- * _XcmsEqualWhitePts
- *
- * SYNOPSIS
- */
-int
-_XcmsEqualWhitePts(XcmsCCC ccc, XcmsColor *pWhitePt1, XcmsColor *pWhitePt2)
-/*
- * DESCRIPTION
- *
- * RETURNS
- * Returns 0 if not equal; otherwise 1.
- *
- */
-{
- XcmsColor tmp1, tmp2;
-
- memcpy((char *)&tmp1, (char *)pWhitePt1, sizeof(XcmsColor));
- memcpy((char *)&tmp2, (char *)pWhitePt2, sizeof(XcmsColor));
-
- if (tmp1.format != XcmsCIEXYZFormat) {
- if (_XcmsDIConvertColors(ccc, &tmp1, (XcmsColor *) NULL, 1,
- XcmsCIEXYZFormat)==0) {
- return(0);
- }
- }
-
- if (tmp2.format != XcmsCIEXYZFormat) {
- if (_XcmsDIConvertColors(ccc, &tmp2, (XcmsColor *) NULL, 1,
- XcmsCIEXYZFormat)==0) {
- return(0);
- }
- }
-
- return (EqualCIEXYZ(&tmp1, &tmp2));
-}
-
-
-/*
- * NAME
- * _XcmsDIConvertColors - Convert XcmsColor structures
- *
- * SYNOPSIS
- */
-Status
-_XcmsDIConvertColors(
- XcmsCCC ccc,
- XcmsColor *pColors_in_out,
- XcmsColor *pWhitePt,
- unsigned int nColors,
- XcmsColorFormat newFormat)
-/*
- * DESCRIPTION
- * Convert XcmsColor structures to another Device-Independent
- * form.
- *
- * Here are some assumptions that this routine makes:
- * 1. The calling routine has already checked if
- * pColors_in_out->format == newFormat, therefore
- * there is no need to check again here.
- * 2. The calling routine has already checked nColors,
- * therefore this routine assumes nColors > 0.
- * 3. The calling routine may want to convert only between
- * CIExyY <-> CIEXYZ <-> CIEuvY
- * therefore, this routine allows pWhitePt to equal NULL.
- *
- *
- * RETURNS
- * XcmsFailure if failed,
- * XcmsSuccess if succeeded.
- *
- */
-{
- XcmsColorSpace *pFrom, *pTo;
- XcmsDIConversionProc *src_to_CIEXYZ, *src_from_CIEXYZ;
- XcmsDIConversionProc *dest_to_CIEXYZ, *dest_from_CIEXYZ;
- XcmsDIConversionProc *to_CIEXYZ_stop, *from_CIEXYZ_start;
- XcmsDIConversionProc *tmp;
-
- /*
- * Allow pWhitePt to equal NULL. This appropriate when converting
- * anywhere between:
- * CIExyY <-> CIEXYZ <-> CIEuvY
- */
-
- if (pColors_in_out == NULL ||
- !ValidDIColorSpaceID(pColors_in_out->format) ||
- !ValidDIColorSpaceID(newFormat)) {
- return(XcmsFailure);
- }
-
- /*
- * Get a handle on the function list for the current specification format
- */
- if ((pFrom = ColorSpaceOfID(ccc, pColors_in_out->format))
- == NULL) {
- return(XcmsFailure);
- }
-
- /*
- * Get a handle on the function list for the new specification format
- */
- if ((pTo = ColorSpaceOfID(ccc, newFormat)) == NULL) {
- return(XcmsFailure);
- }
-
- src_to_CIEXYZ = pFrom->to_CIEXYZ;
- src_from_CIEXYZ = pFrom->from_CIEXYZ;
- dest_to_CIEXYZ = pTo->to_CIEXYZ;
- dest_from_CIEXYZ = pTo->from_CIEXYZ;
-
- if (pTo->inverse_flag && pFrom->inverse_flag) {
- /*
- * Find common function pointers
- */
- for (to_CIEXYZ_stop = src_to_CIEXYZ; *to_CIEXYZ_stop; to_CIEXYZ_stop++){
- for (tmp = dest_to_CIEXYZ; *tmp; tmp++) {
- if (*to_CIEXYZ_stop == *tmp) {
- goto Continue;
- }
- }
- }
-
-Continue:
-
- /*
- * Execute the functions to CIEXYZ, stopping short as necessary
- */
- while (src_to_CIEXYZ != to_CIEXYZ_stop) {
- if ((*src_to_CIEXYZ++)(ccc, pWhitePt, pColors_in_out,
- nColors) == XcmsFailure) {
- return(XcmsFailure);
- }
- }
-
- /*
- * Determine where to start on the from_CIEXYZ path.
- */
- from_CIEXYZ_start = dest_from_CIEXYZ;
- tmp = src_from_CIEXYZ;
- while ((*from_CIEXYZ_start == *tmp) && (*from_CIEXYZ_start != NULL)) {
- from_CIEXYZ_start++;
- tmp++;
- }
-
- } else {
- /*
- * The function in at least one of the Color Spaces are not
- * complementary, i.e.,
- * for an i, 0 <= i < n elements
- * from_CIEXYZ[i] is not the inverse of to_CIEXYZ[i]
- *
- * Execute the functions all the way to CIEXYZ
- */
- while (*src_to_CIEXYZ) {
- if ((*src_to_CIEXYZ++)(ccc, pWhitePt, pColors_in_out,
- nColors) == XcmsFailure) {
- return(XcmsFailure);
- }
- }
-
- /*
- * Determine where to start on the from_CIEXYZ path.
- */
- from_CIEXYZ_start = dest_from_CIEXYZ;
- }
-
-
- /*
- * Execute the functions from CIEXYZ.
- */
- while (*from_CIEXYZ_start) {
- if ((*from_CIEXYZ_start++)(ccc, pWhitePt, pColors_in_out,
- nColors) == XcmsFailure) {
- return(XcmsFailure);
- }
- }
-
- return(XcmsSuccess);
-}
-
-
-/*
- * NAME
- * _XcmsDDConvertColors - Convert XcmsColor structures
- *
- * SYNOPSIS
- */
-Status
-_XcmsDDConvertColors(
- XcmsCCC ccc,
- XcmsColor *pColors_in_out,
- unsigned int nColors,
- XcmsColorFormat newFormat,
- Bool *pCompressed)
-/*
- * DESCRIPTION
- * Convert XcmsColor structures:
- *
- * 1. From CIEXYZ to Device-Dependent formats (typically RGB and
- * RGBi),
- * or
- * 2. Between Device-Dependent formats (typically RGB and RGBi).
- *
- * Assumes that these specifications have already been white point
- * adjusted if necessary from Client White Point to Screen
- * White Point. Therefore, the white point now associated
- * with the specifications is the Screen White Point.
- *
- * pCompressed may be NULL. If so this indicates that the
- * calling routine is not interested in knowing exactly which
- * color was compressed, if any.
- *
- *
- * RETURNS
- * XcmsFailure if failed,
- * XcmsSuccess if none of the color specifications were
- * compressed in the conversion process
- * XcmsSuccessWithCompression if at least one of the
- * color specifications were compressed in the
- * conversion process.
- *
- */
-{
- XcmsColorSpace *pFrom, *pTo;
- XcmsDDConversionProc *src_to_CIEXYZ, *src_from_CIEXYZ;
- XcmsDDConversionProc *dest_to_CIEXYZ, *dest_from_CIEXYZ;
- XcmsDDConversionProc *from_CIEXYZ_start, *to_CIEXYZ_stop;
- XcmsDDConversionProc *tmp;
- int retval;
- int hasCompressed = 0;
-
- if (ccc == NULL || pColors_in_out == NULL) {
- return(XcmsFailure);
- }
-
- if (nColors == 0 || pColors_in_out->format == newFormat) {
- /* do nothing */
- return(XcmsSuccess);
- }
-
- if (((XcmsFunctionSet *)ccc->pPerScrnInfo->functionSet) == NULL) {
- return(XcmsFailure); /* hmm, an internal error? */
- }
-
- /*
- * Its ok if pColors_in_out->format == XcmsCIEXYZFormat
- * or
- * if newFormat == XcmsCIEXYZFormat
- */
- if ( !( ValidDDColorSpaceID(ccc, pColors_in_out->format)
- ||
- (pColors_in_out->format == XcmsCIEXYZFormat))
- ||
- !(ValidDDColorSpaceID(ccc, newFormat)
- ||
- newFormat == XcmsCIEXYZFormat)) {
- return(XcmsFailure);
- }
-
- if ((pFrom = ColorSpaceOfID(ccc, pColors_in_out->format)) == NULL){
- return(XcmsFailure);
- }
-
- if ((pTo = ColorSpaceOfID(ccc, newFormat)) == NULL) {
- return(XcmsFailure);
- }
-
- src_to_CIEXYZ = (XcmsDDConversionProc *)pFrom->to_CIEXYZ;
- src_from_CIEXYZ = (XcmsDDConversionProc *)pFrom->from_CIEXYZ;
- dest_to_CIEXYZ = (XcmsDDConversionProc *)pTo->to_CIEXYZ;
- dest_from_CIEXYZ = (XcmsDDConversionProc *)pTo->from_CIEXYZ;
-
- if (pTo->inverse_flag && pFrom->inverse_flag) {
- /*
- * Find common function pointers
- */
- for (to_CIEXYZ_stop = src_to_CIEXYZ; *to_CIEXYZ_stop; to_CIEXYZ_stop++){
- for (tmp = dest_to_CIEXYZ; *tmp; tmp++) {
- if (*to_CIEXYZ_stop == *tmp) {
- goto Continue;
- }
- }
- }
-Continue:
-
- /*
- * Execute the functions
- */
- while (src_to_CIEXYZ != to_CIEXYZ_stop) {
- retval = (*src_to_CIEXYZ++)(ccc, pColors_in_out, nColors,
- pCompressed);
- if (retval == XcmsFailure) {
- return(XcmsFailure);
- }
- hasCompressed |= (retval == XcmsSuccessWithCompression);
- }
-
- /*
- * Determine where to start on the from_CIEXYZ path.
- */
- from_CIEXYZ_start = dest_from_CIEXYZ;
- tmp = src_from_CIEXYZ;
- while ((*from_CIEXYZ_start == *tmp) && (*from_CIEXYZ_start != NULL)) {
- from_CIEXYZ_start++;
- tmp++;
- }
-
- } else {
- /*
- * The function in at least one of the Color Spaces are not
- * complementary, i.e.,
- * for an i, 0 <= i < n elements
- * from_CIEXYZ[i] is not the inverse of to_CIEXYZ[i]
- *
- * Execute the functions all the way to CIEXYZ
- */
- while (*src_to_CIEXYZ) {
- retval = (*src_to_CIEXYZ++)(ccc, pColors_in_out, nColors,
- pCompressed);
- if (retval == XcmsFailure) {
- return(XcmsFailure);
- }
- hasCompressed |= (retval == XcmsSuccessWithCompression);
- }
-
- /*
- * Determine where to start on the from_CIEXYZ path.
- */
- from_CIEXYZ_start = dest_from_CIEXYZ;
- }
-
- while (*from_CIEXYZ_start) {
- retval = (*from_CIEXYZ_start++)(ccc, pColors_in_out, nColors,
- pCompressed);
- if (retval == XcmsFailure) {
- return(XcmsFailure);
- }
- hasCompressed |= (retval == XcmsSuccessWithCompression);
- }
-
- return(hasCompressed ? XcmsSuccessWithCompression : XcmsSuccess);
-}
-
-
-/************************************************************************
- * *
- * PUBLIC ROUTINES *
- * *
- ************************************************************************/
-
-/*
- * NAME
- * XcmsConvertColors - Convert XcmsColor structures
- *
- * SYNOPSIS
- */
-Status
-XcmsConvertColors(
- XcmsCCC ccc,
- XcmsColor *pColors_in_out,
- unsigned int nColors,
- XcmsColorFormat targetFormat,
- Bool *pCompressed)
-/*
- * DESCRIPTION
- * Convert XcmsColor structures to another format
- *
- * RETURNS
- * XcmsFailure if failed,
- * XcmsSuccess if succeeded without gamut compression,
- * XcmsSuccessWithCompression if succeeded with gamut
- * compression.
- *
- */
-{
- XcmsColor clientWhitePt;
- XcmsColor Color1;
- XcmsColor *pColors_tmp;
- int callWhiteAdjustProc = 0;
- XcmsColorFormat format;
- Status retval;
- unsigned char contents_flag = 0x00;
- unsigned int iColors;
-
- if (ccc == NULL || pColors_in_out == NULL ||
- !(ValidDIColorSpaceID(targetFormat) ||
- ValidDDColorSpaceID(ccc, targetFormat))) {
- return(XcmsFailure);
- }
-
- /*
- * Check formats in color specification array
- */
- format = pColors_in_out->format;
- for (pColors_tmp = pColors_in_out, iColors = nColors; iColors; pColors_tmp++, iColors--) {
- if (!(ValidDIColorSpaceID(pColors_tmp->format) ||
- ValidDDColorSpaceID(ccc, pColors_tmp->format))) {
- return(XcmsFailure);
- }
- if (XCMS_DI_ID(pColors_tmp->format)) {
- contents_flag |= DI_FORMAT;
- } else {
- contents_flag |= DD_FORMAT;
- }
- if (pColors_tmp->format != format) {
- contents_flag |= MIX_FORMAT;
- }
- }
-
- /*
- * Check if we need the Client White Point.
- */
- if ((contents_flag & DI_FORMAT) || XCMS_DI_ID(targetFormat)) {
- /* To proceed, we need to get the Client White Point */
- memcpy((char *)&clientWhitePt, (char *)&ccc->clientWhitePt,
- sizeof(XcmsColor));
- if (clientWhitePt.format == XcmsUndefinedFormat) {
- /*
- * Client White Point is undefined, therefore set to the Screen
- * White Point.
- * Since Client White Point == Screen White Point, WhiteAdjustProc
- * is not called.
- */
- memcpy((char *)&clientWhitePt,
- (char *)&ccc->pPerScrnInfo->screenWhitePt,
- sizeof(XcmsColor));
- } else if ((ccc->whitePtAdjProc != NULL) && !_XcmsEqualWhitePts(ccc,
- &clientWhitePt, ScreenWhitePointOfCCC(ccc))) {
- /*
- * Client White Point != Screen White Point, and WhiteAdjustProc
- * is not NULL, therefore, will need to call it when
- * converting between DI and DD specifications.
- */
- callWhiteAdjustProc = 1;
- }
- }
-
- /*
- * Make copy of array of color specifications
- */
- if (nColors > 1) {
- pColors_tmp = Xmalloc(nColors * sizeof(XcmsColor));
- } else {
- pColors_tmp = &Color1;
- }
- memcpy((char *)pColors_tmp, (char *)pColors_in_out,
- nColors * sizeof(XcmsColor));
-
- /*
- * zero out pCompressed
- */
- if (pCompressed) {
- bzero((char *)pCompressed, nColors * sizeof(Bool));
- }
-
- if (contents_flag == DD_FORMAT || contents_flag == DI_FORMAT) {
- /*
- * ENTIRE ARRAY IS IN ONE FORMAT.
- */
- if (XCMS_DI_ID(format) && XCMS_DI_ID(targetFormat)) {
- /*
- * DI-to-DI only conversion
- */
- retval = _XcmsDIConvertColors(ccc, pColors_tmp,
- &clientWhitePt, nColors, targetFormat);
- } else if (XCMS_DD_ID(format) && XCMS_DD_ID(targetFormat)) {
- /*
- * DD-to-DD only conversion
- * Since DD->DD there will be no compressed thus we can
- * pass NULL instead of pCompressed.
- */
- retval = _XcmsDDConvertColors(ccc, pColors_tmp, nColors,
- targetFormat, (Bool *)NULL);
- } else {
- /*
- * Otherwise we have:
- * 1. Device-Independent to Device-Dependent Conversion
- * OR
- * 2. Device-Dependent to Device-Independent Conversion
- *
- * We need to go from oldFormat -> CIEXYZ -> targetFormat
- * adjusting for white points as necessary.
- */
-
- if (XCMS_DI_ID(format)) {
- /*
- * 1. Device-Independent to Device-Dependent Conversion
- */
- if (callWhiteAdjustProc) {
- /*
- * White Point Adjustment
- * Client White Point to Screen White Point
- */
- retval = (*ccc->whitePtAdjProc)(ccc, &clientWhitePt,
- ScreenWhitePointOfCCC(ccc), targetFormat,
- pColors_tmp, nColors, pCompressed);
- } else {
- if (_XcmsDIConvertColors(ccc, pColors_tmp,
- &clientWhitePt, nColors, XcmsCIEXYZFormat)
- == XcmsFailure) {
- goto Failure;
- }
- retval = _XcmsDDConvertColors(ccc, pColors_tmp, nColors,
- targetFormat, pCompressed);
- }
- } else {
- /*
- * 2. Device-Dependent to Device-Independent Conversion
- */
- if (callWhiteAdjustProc) {
- /*
- * White Point Adjustment
- * Screen White Point to Client White Point
- */
- retval = (*ccc->whitePtAdjProc)(ccc,
- ScreenWhitePointOfCCC(ccc), &clientWhitePt,
- targetFormat, pColors_tmp, nColors, pCompressed);
- } else {
- /*
- * Since DD->CIEXYZ, no compression takes place therefore
- * we can pass NULL instead of pCompressed.
- */
- if (_XcmsDDConvertColors(ccc, pColors_tmp, nColors,
- XcmsCIEXYZFormat, (Bool *)NULL) == XcmsFailure) {
- goto Failure;
- }
- retval = _XcmsDIConvertColors(ccc, pColors_tmp,
- &clientWhitePt, nColors, targetFormat);
- }
- }
- }
- } else {
- /*
- * ARRAY HAS MIXED FORMATS.
- */
- if ((contents_flag == (DI_FORMAT | MIX_FORMAT)) &&
- XCMS_DI_ID(targetFormat)) {
- /*
- * Convert from DI to DI in batches of contiguous formats
- *
- * Because DI->DI, WhiteAdjustProc not called.
- */
- retval = ConvertMixedColors(ccc, pColors_tmp, &clientWhitePt,
- nColors, targetFormat, (unsigned char)DI_FORMAT);
- } else if ((contents_flag == (DD_FORMAT | MIX_FORMAT)) &&
- XCMS_DD_ID(targetFormat)) {
- /*
- * Convert from DD to DD in batches of contiguous formats
- *
- * Because DD->DD, WhiteAdjustProc not called.
- */
- retval = ConvertMixedColors(ccc, pColors_tmp,
- (XcmsColor *)NULL, nColors, targetFormat,
- (unsigned char)DD_FORMAT);
- } else if (XCMS_DI_ID(targetFormat)) {
- /*
- * We need to convert from DI-to-DI and DD-to-DI, therefore
- * 1. convert DD specifications to CIEXYZ, then
- * 2. convert all in batches to the target DI format.
- *
- * Note that ConvertMixedColors will call WhiteAdjustProc
- * as necessary.
- */
-
- /*
- * Convert only DD specifications in batches of contiguous formats
- * to CIEXYZ
- *
- * Since DD->CIEXYZ, ConvertMixedColors will apply WhiteAdjustProc
- * if required.
- */
- retval = ConvertMixedColors(ccc, pColors_tmp, &clientWhitePt,
- nColors, XcmsCIEXYZFormat, (unsigned char)DD_FORMAT);
-
- /*
- * Because at this point we may have a mix of DI formats
- * (e.g., CIEXYZ, CIELuv) we must convert the specs to the
- * target DI format in batches of contiguous source formats.
- */
- retval = ConvertMixedColors(ccc, pColors_tmp, &clientWhitePt,
- nColors, targetFormat, (unsigned char)DI_FORMAT);
- } else {
- /*
- * We need to convert from DI-to-DD and DD-to-DD, therefore
- * 1. convert DI specifications to CIEXYZ, then
- * 2. convert all to the DD target format.
- *
- * This allows white point adjustment and gamut compression
- * to be applied to all the color specifications in one
- * swoop if those functions do in fact modify the entire
- * group of color specifications.
- */
-
- /*
- * Convert in batches to CIEXYZ
- *
- * If DD->CIEXYZ, ConvertMixedColors will apply WhiteAdjustProc
- * if required.
- */
- if ((retval = ConvertMixedColors(ccc, pColors_tmp, &clientWhitePt,
- nColors, XcmsCIEXYZFormat,
- (unsigned char)(DI_FORMAT | DD_FORMAT))) == XcmsFailure) {
- goto Failure;
- }
-
- /*
- * Convert all specifications (now in CIEXYZ format) to
- * the target DD format.
- * Since CIEXYZ->DD, compression MAY take place therefore
- * we must pass pCompressed.
- * Note that WhiteAdjustProc must be used if necessary.
- */
- if (callWhiteAdjustProc) {
- /*
- * White Point Adjustment
- * Client White Point to Screen White Point
- */
- retval = (*ccc->whitePtAdjProc)(ccc,
- &clientWhitePt, ScreenWhitePointOfCCC(ccc),
- targetFormat, pColors_tmp, nColors, pCompressed);
- } else {
- retval = _XcmsDDConvertColors(ccc, pColors_tmp, nColors,
- targetFormat, pCompressed);
- }
- }
- }
-
- if (retval != XcmsFailure) {
- memcpy((char *)pColors_in_out, (char *)pColors_tmp,
- nColors * sizeof(XcmsColor));
- }
- if (nColors > 1) {
- Xfree(pColors_tmp);
- }
- return(retval);
-
-Failure:
- if (nColors > 1) {
- Xfree(pColors_tmp);
- }
- return(XcmsFailure);
-}
-
-
-/*
- * NAME
- * XcmsRegFormatOfPrefix
- *
- * SYNOPSIS
- */
-XcmsColorFormat
-_XcmsRegFormatOfPrefix(
- _Xconst char *prefix)
-/*
- * DESCRIPTION
- * Returns a color space ID associated with the specified
- * X Consortium registered color space prefix.
- *
- * RETURNS
- * The color space ID if found;
- * otherwise NULL.
- */
-{
- XcmsRegColorSpaceEntry *pEntry = _XcmsRegColorSpaces;
-
- while (pEntry->prefix != NULL) {
- if (strcmp(prefix, pEntry->prefix) == 0) {
- return(pEntry->id);
- }
- pEntry++;
- }
- return(XcmsUndefinedFormat);
-}