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.  TekColor is a
8 * trademark of Tektronix, Inc.  The term "TekHVC" designates a particular
9 * color space that is the subject of U.S. Patent No. 4,985,853 (equivalent
10 * foreign patents pending).  Permission is hereby granted to use, copy,
11 * modify, sell, and otherwise distribute this software and its
12 * documentation for any purpose and without fee, provided that:
13 *
14 * 1. This copyright, permission, and disclaimer notice is reproduced in
15 *    all copies of this software and any modification thereof and in
16 *    supporting documentation;
17 * 2. Any color-handling application which displays TekHVC color
18 *    cooordinates identifies these as TekHVC color coordinates in any
19 *    interface that displays these coordinates and in any associated
20 *    documentation;
21 * 3. The term "TekHVC" is always used, and is only used, in association
22 *    with the mathematical derivations of the TekHVC Color Space,
23 *    including those provided in this file and any equivalent pathways and
24 *    mathematical derivations, regardless of digital (e.g., floating point
25 *    or integer) representation.
26 *
27 * Tektronix makes no representation about the suitability of this software
28 * for any purpose.  It is provided "as is" and with all faults.
29 *
30 * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
31 * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
32 * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX BE LIABLE FOR ANY
33 * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
34 * RESULTING FROM LOSS OF USE, DATA, OR PROFITS, WHETHER IN AN ACTION OF
35 * CONTRACT, NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
36 * CONNECTION WITH THE USE OR THE PERFORMANCE OF THIS SOFTWARE.
37 *
38 *	NAME
39 *		TekHVCGcC.c
40 *
41 *	DESCRIPTION
42 *		Source for XcmsTekHVCClipC() gamut compression routine.
43 *
44 */
45
46#ifdef HAVE_CONFIG_H
47#include <config.h>
48#endif
49#include "Xlibint.h"
50#include "Xcmsint.h"
51#include "Cv.h"
52
53
54/************************************************************************
55 *									*
56 *			 PUBLIC ROUTINES				*
57 *									*
58 ************************************************************************/
59
60/*
61 *	NAME
62 *		XcmsTekHVCClipC - Reduce the chroma for a hue and value
63 *
64 *	SYNOPSIS
65 */
66/* ARGSUSED */
67Status
68XcmsTekHVCClipC (
69    XcmsCCC ccc,
70    XcmsColor *pColors_in_out,
71    unsigned int nColors,
72    unsigned int i,
73    Bool *pCompressed)
74/*
75 *	DESCRIPTION
76 *		Reduce the Chroma for a specific hue and value to
77 *		to bring the given color into the gamut of the
78 *		specified device.  As required of gamut compression
79 *		functions in Xcms, this routine returns pColor_in_out
80 *		in XcmsCIEXYZFormat on successful completion.
81 *
82 *		Since this routine works with the value within
83 *		pColor_in_out intermediate results may be returned
84 *		even though it may be invalid.
85 *
86 *	RETURNS
87 *		XcmsFailure - Failure
88 *              XcmsSuccess - Succeeded
89 *
90 */
91{
92    Status retval;
93    XcmsColor *pColor;
94
95    /*
96     * Color specification passed as input can be assumed to:
97     *	1. Be in XcmsCIEXYZFormat
98     *	2. Already be white point adjusted for the Screen White Point.
99     *	    This means that the white point now associated with this
100     *	    color spec is the Screen White Point (even if the
101     *	    ccc->clientWhitePt differs).
102     */
103
104    /*
105     * Insure TekHVC installed
106     */
107    if (XcmsAddColorSpace(&XcmsTekHVCColorSpace) == XcmsFailure) {
108	return(XcmsFailure);
109    }
110
111    pColor = pColors_in_out + i;
112
113    if (ccc->visual->class < StaticColor &&
114	    FunctionSetOfCCC(ccc) != (XPointer) &XcmsLinearRGBFunctionSet) {
115	/*
116	 * GRAY !
117	 */
118	_XcmsDIConvertColors(ccc, pColor, &ccc->pPerScrnInfo->screenWhitePt,
119		1, XcmsTekHVCFormat);
120	pColor->spec.TekHVC.H = pColor->spec.TekHVC.C = 0.0;
121	_XcmsDIConvertColors(ccc, pColor, &ccc->pPerScrnInfo->screenWhitePt,
122		1, XcmsCIEXYZFormat);
123	if (pCompressed) {
124	    *(pCompressed + i) = True;
125	}
126	return(XcmsSuccess);
127    } else {
128	if (pColor->format != XcmsTekHVCFormat) {
129	    if (_XcmsDIConvertColors(ccc, pColor,
130		    &ccc->pPerScrnInfo->screenWhitePt, 1, XcmsTekHVCFormat)
131		    == XcmsFailure) {
132		return(XcmsFailure);
133	    }
134	}
135	if (XcmsTekHVCQueryMaxC(ccc,
136		pColor->spec.TekHVC.H,
137		pColor->spec.TekHVC.V,
138		pColor)
139		== XcmsFailure) {
140	    return(XcmsFailure);
141	}
142	retval = _XcmsDIConvertColors(ccc, pColor,
143		&ccc->pPerScrnInfo->screenWhitePt, 1, XcmsCIEXYZFormat);
144	if (retval != XcmsFailure && pCompressed != NULL) {
145	    *(pCompressed + i) = True;
146	}
147	return(retval);
148    }
149}
150