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  *		XcmsAddDIC.c
28  *
29  *	DESCRIPTION
30  *		Source for XcmsAddColorSpace
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 /*
44  *      DEFINES
45  */
46 #define NextUnregDiCsID(lastid) \
47 	    (XCMS_UNREG_ID(lastid) ? ++lastid : XCMS_FIRST_UNREG_DI_ID)
48 #define MAX(x,y) ((x) < (y) ? (y) : (x))
49 
50 
51 /*
52  *	NAME
53  *		XcmsAddColorSpace - Add a Device-Independent Color Space
54  *
55  *	SYNOPSIS
56  */
57 Status
XcmsAddColorSpace(XcmsColorSpace * pCS)58 XcmsAddColorSpace(XcmsColorSpace *pCS)
59 /*
60  *	DESCRIPTION
61  *		DI Color Spaces are managed on a global basis.
62  *		This means that with exception of the provided DI color spaces:
63  *			CIEXYZ, CIExyY, CIELab, CIEuvY, CIELuv, and TekHVC
64  *		DI color spaces may have different XcmsColorFormat IDs between
65  *		clients.  So, you must be careful when using XcmsColor
66  *		structures between clients!  Use the routines XcmsFormatOfPrefix()
67  *		and XcmsPrefixOfFormat() appropriately.
68  *
69  *	RETURNS
70  *		XcmsSuccess if succeeded, otherwise XcmsFailure
71  */
72 {
73     XcmsColorSpace **papColorSpaces;
74     XcmsColorSpace *ptmpCS;
75     XcmsColorFormat lastID = 0;
76 
77     if ((pCS->id = _XcmsRegFormatOfPrefix(pCS->prefix)) != 0) {
78 	if (XCMS_DD_ID(pCS->id)) {
79 	    /* This is a Device-Dependent Color Space */
80 	    return(XcmsFailure);
81 	}
82 	/*
83 	 * REGISTERED DI Color Space
84 	 *    then see if the color space has already been added to the
85 	 *    system:
86 	 *	    a. If the same ID/prefix and same XcmsColorSpec is found,
87 	 *		then its a duplicate, so return success.
88 	 *	    b. If same ID/prefix but different XcmsColorSpec is
89 	 *		found, then add the color space to the front of the
90 	 *		list using the same ID.  This allows one to override
91 	 *		an existing DI Color Space.
92 	 *	    c. Otherwise none found so just add the color space.
93 	 */
94 	if ((papColorSpaces = _XcmsDIColorSpaces) != NULL) {
95 	    while ((ptmpCS = *papColorSpaces++) != NULL) {
96 		if (pCS->id == ptmpCS->id) {
97 		    if (pCS == ptmpCS) {
98 			/* a. duplicate*/
99 			return(XcmsSuccess);
100 		    }
101 		    /* b. same ID/prefix but different XcmsColorSpace */
102 		    break;
103 		}
104 	    }
105 	}
106 	/* c. None found */
107     } else {
108 	/*
109 	 * UNREGISTERED DI Color Space
110 	 *    then see if the color space has already been added to the
111 	 *    system:
112 	 *	    a. If same prefix and XcmsColorSpec, then
113 	 *		its a duplicate ... return success.
114 	 *	    b. If same prefix but different XcmsColorSpec, then
115 	 *		add the color space to the front of the list using
116 	 *		the same ID.  This allows one to override an existing
117 	 *		DI Color Space.
118 	 *	    c. Otherwise none found so, add the color space using the
119 	 *		next unregistered ID for the connection.
120 	 */
121 	if ((papColorSpaces = _XcmsDIColorSpaces) != NULL) {
122 	    while ((ptmpCS = *papColorSpaces++) != NULL) {
123 		lastID = MAX(lastID, ptmpCS->id);
124 		if (strcmp(pCS->prefix, ptmpCS->prefix) == 0) {
125 		    if (pCS == ptmpCS) {
126 			/* a. duplicate */
127 			return(XcmsSuccess);
128 		    }
129 		    /* b. same prefix but different XcmsColorSpec */
130 		    pCS->id = ptmpCS->id;
131 		    goto AddColorSpace;
132 		}
133 	    }
134 	}
135 	/* c. None found */
136 	pCS->id = NextUnregDiCsID(lastID);
137     }
138 
139 
140 AddColorSpace:
141     if ((papColorSpaces = (XcmsColorSpace **)
142 	    _XcmsPushPointerArray((XPointer *)_XcmsDIColorSpaces,
143 	    (XPointer)pCS,
144 	    (XPointer *)_XcmsDIColorSpacesInit)) == NULL) {
145 	return(XcmsFailure);
146     }
147     _XcmsDIColorSpaces = papColorSpaces;
148     return(XcmsSuccess);
149 }
150