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.  Permission is
8 * hereby granted to use, copy, modify, sell, and otherwise distribute this
9 * software and its documentation for any purpose and without fee, provided
10 * that this copyright, permission, and disclaimer notice is reproduced in
11 * all copies of this software and in supporting documentation.  TekColor
12 * is a trademark of Tektronix, Inc.
13 *
14 * Tektronix makes no representation about the suitability of this software
15 * for any purpose.  It is provided "as is" and with all faults.
16 *
17 * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
18 * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
19 * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX BE LIABLE FOR ANY
20 * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
21 * RESULTING FROM LOSS OF USE, DATA, OR PROFITS, WHETHER IN AN ACTION OF
22 * CONTRACT, NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
23 * CONNECTION WITH THE USE OR THE PERFORMANCE OF THIS SOFTWARE.
24 *
25 *
26 *	NAME
27 *		XcmsAddSF.c
28 *
29 *	DESCRIPTION
30 *		Source for XcmsAddFunctionSet
31 *
32 *
33 */
34
35#ifdef HAVE_CONFIG_H
36#include <config.h>
37#endif
38#include "Xlibint.h"
39#include "Xcmsint.h"
40#include "Cv.h"
41
42/*
43 *      DEFINES
44 */
45#define NextUnregDdCsID(lastid) \
46	    (XCMS_UNREG_ID(lastid) ? ++lastid : XCMS_FIRST_UNREG_DD_ID)
47#define MIN(x,y) ((x) > (y) ? (y) : (x))
48
49
50/*
51 *	NAME
52 *		XcmsAddFunctionSet - Add an Screen Color Characterization
53 *					Function Set
54 *
55 *	SYNOPSIS
56 */
57Status
58XcmsAddFunctionSet(XcmsFunctionSet *pNewFS)
59/*
60 *	DESCRIPTION
61 *		Additional Screen Color Characterization Function Sets are
62 *		managed on a global basis.  This means that with exception
63 *		of the provided DD color spaces:
64 *			    RGB and RGBi
65 *		DD color spaces may have different XcmsColorFormat IDs between
66 *		clients.  So, you must be careful when using XcmsColorFormat
67 *		across clients!  Use the routines XcmsFormatOfPrefix()
68 *		and XcmsPrefixOfFormat() appropriately.
69 *
70 *	RETURNS
71 *		XcmsSuccess if succeeded, otherwise XcmsFailure
72 *
73 *	CAVEATS
74 *		Additional Screen Color Characterization Function Sets
75 *		should be added prior to any use of the routine
76 *		XcmsCreateCCC().  If not, XcmsCCC structures created
77 *		prior to the call of this routines will not have had
78 *		a chance to initialize using the added Screen Color
79 *		Characterization Function Set.
80 */
81{
82    XcmsFunctionSet **papSCCFuncSets = _XcmsSCCFuncSets;
83    XcmsColorSpace **papNewCSs;
84    XcmsColorSpace *pNewCS, **paptmpCS;
85    XcmsColorFormat lastID = 0;
86
87
88    if (papSCCFuncSets != NULL) {
89	if ((papNewCSs = pNewFS->DDColorSpaces) == NULL) {
90	    /*
91	     * Error, new Screen Color Characterization Function Set
92	     *	missing color spaces
93	     */
94	    return(XcmsFailure);
95	}
96	while ((pNewCS = *papNewCSs++) != NULL) {
97	    if ((pNewCS->id = _XcmsRegFormatOfPrefix(pNewCS->prefix)) != 0) {
98		if (XCMS_DI_ID(pNewCS->id)) {
99		    /* This is a Device-Independent Color Space */
100		    return(XcmsFailure);
101		}
102		/*
103		 * REGISTERED DD Color Space
104		 *    therefore use the registered ID.
105		 */
106	    } else {
107		/*
108		 * UNREGISTERED DD Color Space
109		 *    then see if the color space is already in
110		 *    _XcmsDDColorSpaces.
111		 *	    a. If same prefix, then use the same ID.
112		 *	    b. Otherwise, use a new ID.
113		 */
114		for (paptmpCS = _XcmsDDColorSpaces; *paptmpCS != NULL;
115			paptmpCS++){
116		    lastID = MIN(lastID, (*paptmpCS)->id);
117		    if (strcmp(pNewCS->prefix, (*paptmpCS)->prefix) == 0) {
118			pNewCS->id = (*paptmpCS)->id;
119			break;
120		    }
121		}
122		if (pNewCS->id == 0) {
123		    /* still haven't found one */
124		    pNewCS->id = NextUnregDdCsID(lastID);
125		    if ((paptmpCS = (XcmsColorSpace **)_XcmsPushPointerArray(
126		   	    (XPointer *) _XcmsDDColorSpaces,
127			    (XPointer) pNewCS,
128			    (XPointer *) _XcmsDDColorSpacesInit)) == NULL) {
129			return(XcmsFailure);
130		    }
131		    _XcmsDDColorSpaces = paptmpCS;
132		}
133	    }
134	}
135    }
136    if ((papSCCFuncSets = (XcmsFunctionSet **)
137	    _XcmsPushPointerArray((XPointer *) _XcmsSCCFuncSets,
138	    (XPointer) pNewFS,
139	    (XPointer *)_XcmsSCCFuncSetsInit)) == NULL) {
140	return(XcmsFailure);
141    }
142    _XcmsSCCFuncSets = papSCCFuncSets;
143
144    return(XcmsSuccess);
145}
146