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