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