1 /* Copyright (C) 1992-1998 The Geometry Center
2 * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips
3 *
4 * This file is part of Geomview.
5 *
6 * Geomview is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU Lesser General Public License as published
8 * by the Free Software Foundation; either version 2, or (at your option)
9 * any later version.
10 *
11 * Geomview is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with Geomview; see the file COPYING. If not, write
18 * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139,
19 * USA, or visit http://www.gnu.org.
20 */
21
22 #if HAVE_CONFIG_H
23 # include "config.h"
24 #endif
25
26 #if 0
27 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\
28 Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips";
29 #endif
30
31 #include <stdio.h>
32 #include <stdlib.h> /* for abs() */
33
34 #include "geom.h"
35 #include "vectP.h"
36 #include "crayolaP.h"
37
38 static char msg[] = "crayVect.c";
39
40 void *cray_vect_HasColor(int sel, Geom *geom, va_list *args);
41 void *cray_vect_HasVColor(int sel, Geom *geom, va_list *args);
42 void *cray_vect_HasFColor(int sel, Geom *geom, va_list *args);
43
44 void *cray_vect_UseVColor(int sel, Geom *geom, va_list *args);
45 void *cray_vect_UseFColor(int sel, Geom *geom, va_list *args);
46
47 void *cray_vect_EliminateColor(int sel, Geom *geom, va_list *args);
48
49 void *cray_vect_SetColorAt(int sel, Geom *geom, va_list *args);
50 void *cray_vect_SetColorAtV(int sel, Geom *geom, va_list *args);
51
52 void *cray_vect_GetColorAt(int sel, Geom *geom, va_list *args);
53 void *cray_vect_GetColorAtV(int sel, Geom *geom, va_list *args);
54
55 #define MAX_METHODS 12
56
57 static craySpecFunc methods[] = {
58 {"crayHasColor", cray_vect_HasColor},
59 {"crayHasVColor", cray_vect_HasVColor},
60 {"crayHasFColor", cray_vect_HasFColor},
61
62 {"crayCanUseVColor", crayTrue},
63 {"crayCanUseFColor", crayTrue},
64
65 {"crayUseVColor", cray_vect_UseVColor},
66 {"crayUseFColor", cray_vect_UseFColor},
67
68 {"crayEliminateColor", cray_vect_EliminateColor},
69
70 {"craySetColorAt", cray_vect_SetColorAt},
71 {"craySetColorAtV", cray_vect_SetColorAtV},
72
73 {"crayGetColorAt", cray_vect_GetColorAt},
74 {"crayGetColorAtV", cray_vect_GetColorAtV}
75 };
76
77 int
cray_vect_init()78 cray_vect_init() {
79 crayInitSpec(methods, MAX_METHODS, GeomClassLookup("vect"));
80 return 0;
81 }
82
cray_vect_HasColor(int sel,Geom * geom,va_list * args)83 void *cray_vect_HasColor(int sel, Geom *geom, va_list *args) {
84 Vect *v = (Vect *)geom;
85 return (void *)(long)(v->ncolor);
86 }
87
cray_vect_HasFColor(int sel,Geom * geom,va_list * args)88 void *cray_vect_HasFColor(int sel, Geom *geom, va_list *args) {
89 Vect *v = (Vect *)geom;
90 return (void *)(long)((v->ncolor == v->nvec) ? 1 : 0);
91 }
92
cray_vect_HasVColor(int sel,Geom * geom,va_list * args)93 void *cray_vect_HasVColor(int sel, Geom *geom, va_list *args) {
94 Vect *v = (Vect *)geom;
95 return (void *)(long)((v->ncolor == v->nvert) ? 1 : 0);
96 }
97
cray_vect_UseVColor(int sel,Geom * geom,va_list * args)98 void *cray_vect_UseVColor(int sel, Geom *geom, va_list *args) {
99 Vect *v = (Vect *)geom;
100 int h, i, j, k;
101 ColorA *color, *def;
102
103 def = va_arg(*args, ColorA *);
104
105 /* h = current point
106 * i = current polyline
107 * j = current point in polyline
108 * k = current color index (in cold list of colors)
109 */
110 color = OOGLNewNE(ColorA, v->nvert, msg);
111 for (h = i = k = 0; i < v->nvec; i++) {
112 if (v->vncolor[i]) def = &v->c[k];
113 for (j = 0; j < abs(v->vnvert[i]); j++) {
114 color[h++] = *def;
115 if (v->vncolor[i] > 1) def++;
116 }
117 k += v->vncolor[i];
118 v->vncolor[i] = abs(v->vnvert[i]);
119 }
120
121 if (v->c != NULL) OOGLFree(v->c);
122 v->c = color;
123 v->ncolor = v->nvert;
124 return (void *)geom;
125 }
126
cray_vect_UseFColor(int sel,Geom * geom,va_list * args)127 void *cray_vect_UseFColor(int sel, Geom *geom, va_list *args)
128 {
129 Vect *v = (Vect *)geom;
130 int i, k;
131 ColorA *color, *def;
132
133 def = va_arg(*args, ColorA *);
134
135 color = OOGLNewNE(ColorA, v->nvec, msg);
136
137 /*
138 * i = current polyline
139 * j = current vertex of current polyline
140 * k = current color
141 * h = current vertex of vect
142 */
143 for (i = k = 0; i < v->nvec; i++) {
144 switch(v->vncolor[i]) {
145 case 1:
146 def = &v->c[k++];
147 case 0:
148 color[i] = *def;
149 break;
150 default:
151 if (v->vncolor[i] != abs(v->vnvert[i])) {
152 OOGLError(1, "Illegal # of colors / # of vertices combination.");
153 return (void *)0;
154 }
155 def = &v->c[k + 1];
156 color[i] = *def;
157 k += abs(v->vnvert[i]);
158 break;
159 }
160 v->vncolor[i] = 1;
161 }
162
163 if (v->c != NULL) OOGLFree(v->c);
164 v->c = color;
165 v->ncolor = v->nvec;
166
167 return (void *)geom;
168 }
169
170
cray_vect_EliminateColor(int sel,Geom * geom,va_list * args)171 void *cray_vect_EliminateColor(int sel, Geom *geom, va_list *args)
172 {
173 int i;
174 Vect *v = (Vect *)geom;
175 if (!crayHasColor(geom, NULL)) return 0;
176 if (v->ncolor) OOGLFree(v->c);
177 v->c = NULL;
178 v->ncolor = 0;
179 for (i = 0; i < v->nvec; i++) v->vncolor[i] = 0;
180 return (void *)geom;
181 }
182
cray_vect_SetColorAt(int sel,Geom * geom,va_list * args)183 void *cray_vect_SetColorAt(int sel, Geom *geom, va_list *args) {
184 ColorA *color;
185 int vindex, *eindex;
186 HPoint3 *pt;
187
188 color = va_arg(*args, ColorA *);
189 vindex = va_arg(*args, int);
190 /*findex = */(void)va_arg(*args, int);
191 eindex = va_arg(*args, int *);
192 pt = va_arg(*args, HPoint3 *);
193 if (vindex != -1) craySetColorAtV(geom, color, vindex, NULL, pt);
194 else {
195 craySetColorAtV(geom, color, eindex[0], NULL, pt);
196 craySetColorAtV(geom, color, eindex[1], NULL, pt);
197 }
198 return (void *)geom;
199 }
200
cray_vect_SetColorAtV(int sel,Geom * geom,va_list * args)201 void *cray_vect_SetColorAtV(int sel, Geom *geom, va_list *args) {
202 Vect *v = (Vect *)geom;
203 ColorA *color;
204 int index;
205 int i, j, k;
206
207 color = va_arg(*args, ColorA *);
208 index = va_arg(*args, int);
209 if (index == -1) return NULL;
210 for (i = j = k = 0; i < v->nvec;
211 i++, j+= abs(v->vnvert[i]), k += v->vncolor[i])
212 if (j + abs(v->vnvert[i]) > index) break;
213 switch(v->vncolor[i]) {
214 case 0:
215 return NULL;
216 case 1:
217 v->c[k] = *color;
218 break;
219 default:
220 v->c[k + (index - j)] = *color;
221 break;
222 }
223
224 return (void *)geom;
225 }
226
cray_vect_GetColorAt(int sel,Geom * geom,va_list * args)227 void *cray_vect_GetColorAt(int sel, Geom *geom, va_list *args)
228 {
229 ColorA *color;
230 int vindex, *eindex;
231
232 color = va_arg(*args, ColorA *);
233 vindex = va_arg(*args, int);
234 /*findex = */(void)va_arg(*args, int);
235 eindex = va_arg(*args, int *);
236 if (vindex != -1)
237 return (void *)(long)crayGetColorAtV(geom, color, vindex, NULL, NULL);
238 else return (void *)(long)crayGetColorAtV(geom, color, eindex[0], NULL, NULL);
239 }
240
cray_vect_GetColorAtV(int sel,Geom * geom,va_list * args)241 void *cray_vect_GetColorAtV(int sel, Geom *geom, va_list *args) {
242 Vect *v = (Vect *)geom;
243 ColorA *color;
244 int index;
245 int i, j, k;
246
247 color = va_arg(*args, ColorA *);
248 index = va_arg(*args, int);
249 if (index == -1 || !v->ncolor) return NULL;
250 for (i = j = k = 0; i < v->nvec;
251 i++, j+= abs(v->vnvert[i]), k += v->vncolor[i])
252 if (j + abs(v->vnvert[i]) > index) break;
253 switch(v->vncolor[i]) {
254 case 1:
255 k++;
256 case 0:
257 *color = v->c[k];
258 break;
259 default:
260 *color = v->c[k + (index - j)];
261 break;
262 }
263
264 return (void *)geom;
265 }
266