1 /*****************************************************************************
2 Copyright 1988, 1989 by Digital Equipment Corporation, Maynard, Massachusetts.
3
4 All Rights Reserved
5
6 Permission to use, copy, modify, and distribute this software and its
7 documentation for any purpose and without fee is hereby granted,
8 provided that the above copyright notice appear in all copies and that
9 both that copyright notice and this permission notice appear in
10 supporting documentation, and that the name of Digital not be
11 used in advertising or publicity pertaining to distribution of the
12 software without specific, written prior permission.
13
14 DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
15 ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
16 DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
17 ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
18 WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
19 ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
20 SOFTWARE.
21
22 ******************************************************************************/
23
24 #include "x11perf.h"
25
26 static XArc *arcs;
27 static GC pgc;
28
29 #define DegreesToX(degrees) (degrees * 64)
30
31 static void
GenerateCircles(XParms xp,Parms p,Bool partialArcs,Bool ddashed)32 GenerateCircles(XParms xp, Parms p, Bool partialArcs, Bool ddashed)
33 {
34 int i;
35 int rows; /* Number of rows filled in current column */
36 int x, y; /* base of square to draw the circle in */
37 int xorg, yorg; /* Used to get from column to column or row to row */
38 int size;
39 int half;
40 int startAngle, arcAngle;
41
42 if(ddashed)
43 pgc = xp->ddfggc;
44 else
45 pgc = xp->fggc;
46
47 size = p->special;
48 half = (size + 19) / 20;
49 arcs = (XArc *)malloc((p->objects) * sizeof(XArc));
50 x = xorg = half; y = yorg = half;
51 rows = 0;
52 startAngle = DegreesToX(0);
53 arcAngle = DegreesToX(360);
54
55 for (i = 0; i != p->objects; i++) {
56 arcs[i].x = x;
57 arcs[i].y = y;
58 arcs[i].width = size;
59 arcs[i].height = size;
60 arcs[i].angle1 = startAngle;
61 arcs[i].angle2 = arcAngle;
62
63 if (partialArcs) {
64 startAngle += DegreesToX(30);
65 if (startAngle >= DegreesToX(360)) startAngle -= DegreesToX(360);
66 arcAngle -= DegreesToX(20);
67 if (arcAngle <= DegreesToX(0)) arcAngle += DegreesToX(360);
68 }
69
70 y += size + 1;
71 rows++;
72 if (y >= HEIGHT - size - half || rows == MAXROWS) {
73 /* Go to next column */
74 rows = 0;
75 x += size + 1;
76 if (x >= WIDTH - size) {
77 yorg++;
78 if (yorg >= size + half || yorg >= HEIGHT - size - half) {
79 yorg = half;
80 xorg++;
81 if (xorg >= size + half || xorg >= WIDTH - size - half) {
82 xorg = half;
83 }
84 }
85 x = xorg;
86 }
87 y = yorg;
88 }
89 }
90 }
91
92 int
InitCircles(XParms xp,Parms p,int64_t reps)93 InitCircles(XParms xp, Parms p, int64_t reps)
94 {
95 GenerateCircles(xp, p, False, False);
96 return reps;
97 }
98
99 int
InitPartCircles(XParms xp,Parms p,int64_t reps)100 InitPartCircles(XParms xp, Parms p, int64_t reps)
101 {
102 GenerateCircles(xp, p, True, False);
103 return reps;
104 }
105
106
107 int
InitChordPartCircles(XParms xp,Parms p,int64_t reps)108 InitChordPartCircles(XParms xp, Parms p, int64_t reps)
109 {
110 GenerateCircles(xp, p, True, False);
111 XSetArcMode(xp->d, xp->bggc, ArcChord);
112 XSetArcMode(xp->d, xp->fggc, ArcChord);
113 return reps;
114 }
115
116
117 int
InitSlicePartCircles(XParms xp,Parms p,int64_t reps)118 InitSlicePartCircles(XParms xp, Parms p, int64_t reps)
119 {
120 GenerateCircles(xp, p, True, False);
121 XSetArcMode(xp->d, xp->bggc, ArcPieSlice);
122 XSetArcMode(xp->d, xp->fggc, ArcPieSlice);
123 return reps;
124 }
125
126 static void
GenerateWideCircles(XParms xp,Parms p,Bool partialArcs,Bool ddashed)127 GenerateWideCircles(XParms xp, Parms p, Bool partialArcs, Bool ddashed)
128 {
129 int size;
130
131 GenerateCircles(xp, p, partialArcs, ddashed);
132
133 size = p->special;
134 if(ddashed) {
135 XSetLineAttributes(xp->d, xp->ddbggc, (int) ((size + 9) / 10),
136 LineSolid, CapRound, JoinRound);
137 XSetLineAttributes(xp->d, xp->ddfggc, (int) ((size + 9) / 10),
138 LineSolid, CapRound, JoinRound);
139 }
140 else {
141 XSetLineAttributes(xp->d, xp->bggc, (int) ((size + 9) / 10),
142 LineSolid, CapRound, JoinRound);
143 XSetLineAttributes(xp->d, xp->fggc, (int) ((size + 9) / 10),
144 LineSolid, CapRound, JoinRound);
145 }
146 }
147
148 int
InitWideCircles(XParms xp,Parms p,int64_t reps)149 InitWideCircles(XParms xp, Parms p, int64_t reps)
150 {
151 GenerateWideCircles (xp, p, False, False);
152 return reps;
153 }
154
155 int
InitPartWideCircles(XParms xp,Parms p,int64_t reps)156 InitPartWideCircles(XParms xp, Parms p, int64_t reps)
157 {
158 GenerateWideCircles (xp, p, True, False);
159 return reps;
160 }
161
162 int
InitDashedCircles(XParms xp,Parms p,int64_t reps)163 InitDashedCircles(XParms xp, Parms p, int64_t reps)
164 {
165 char dashes[2];
166
167 GenerateCircles(xp, p, False, False);
168
169 /* Modify GCs to draw dashed */
170 XSetLineAttributes(xp->d, xp->bggc, 0, LineOnOffDash, CapButt, JoinMiter);
171 XSetLineAttributes(xp->d, xp->fggc, 0, LineOnOffDash, CapButt, JoinMiter);
172 dashes[0] = 3; dashes[1] = 2;
173 XSetDashes(xp->d, xp->fggc, 0, dashes, 2);
174 XSetDashes(xp->d, xp->bggc, 0, dashes, 2);
175 return reps;
176 }
177
178 int
InitWideDashedCircles(XParms xp,Parms p,int64_t reps)179 InitWideDashedCircles(XParms xp, Parms p, int64_t reps)
180 {
181 int size;
182 XGCValues gcv;
183 char dashes[2];
184
185 GenerateWideCircles(xp, p, False, False);
186 size = p->special;
187 size = (size + 9) / 10;
188
189 /* Modify GCs to draw dashed */
190 dashes[0] = 2*size; dashes[1] = 2*size;
191 gcv.line_style = LineOnOffDash;
192 XChangeGC(xp->d, xp->fggc, GCLineStyle, &gcv);
193 XChangeGC(xp->d, xp->bggc, GCLineStyle, &gcv);
194 XSetDashes(xp->d, xp->fggc, 0, dashes, 2);
195 XSetDashes(xp->d, xp->bggc, 0, dashes, 2);
196 return reps;
197 }
198
199 int
InitDoubleDashedCircles(XParms xp,Parms p,int64_t reps)200 InitDoubleDashedCircles(XParms xp, Parms p, int64_t reps)
201 {
202 char dashes[2];
203
204 GenerateCircles(xp, p, False, True);
205
206 /* Modify GCs to draw dashed */
207 XSetLineAttributes(xp->d, xp->ddbggc, 0, LineDoubleDash, CapButt, JoinMiter);
208 XSetLineAttributes(xp->d, xp->ddfggc, 0, LineDoubleDash, CapButt, JoinMiter);
209 dashes[0] = 3; dashes[1] = 2;
210 XSetDashes(xp->d, xp->ddfggc, 0, dashes, 2);
211 XSetDashes(xp->d, xp->ddbggc, 0, dashes, 2);
212 return reps;
213 }
214
215 int
InitWideDoubleDashedCircles(XParms xp,Parms p,int64_t reps)216 InitWideDoubleDashedCircles(XParms xp, Parms p, int64_t reps)
217 {
218 int size;
219 XGCValues gcv;
220 char dashes[2];
221
222 GenerateWideCircles(xp, p, False, True);
223 size = p->special;
224 size = (size + 9) / 10;
225
226 /* Modify GCs to draw dashed */
227 dashes[0] = 2*size; dashes[1] = 2*size;
228 gcv.line_style = LineDoubleDash;
229 XChangeGC(xp->d, xp->ddfggc, GCLineStyle, &gcv);
230 XChangeGC(xp->d, xp->ddbggc, GCLineStyle, &gcv);
231 XSetDashes(xp->d, xp->ddfggc, 0, dashes, 2);
232 XSetDashes(xp->d, xp->ddbggc, 0, dashes, 2);
233 return reps;
234 }
235
236 static void
GenerateEllipses(XParms xp,Parms p,int partialArcs,Bool ddashed)237 GenerateEllipses(XParms xp, Parms p, int partialArcs, Bool ddashed)
238 {
239 int size;
240 int half;
241 int rows; /* Number of rows filled in current column */
242 int i;
243 int x, y; /* base of square to draw ellipse in */
244 int vsize, vsizeinc;
245 int dir;
246 int startAngle, arcAngle;
247
248 if(ddashed)
249 pgc = xp->ddfggc;
250 else
251 pgc = xp->fggc;
252
253 size = p->special;
254 half = (size + 19) / 20;
255 arcs = (XArc *)malloc((p->objects) * sizeof(XArc));
256 vsize = 1;
257 vsizeinc = (size - 1) / (p->objects - 1);
258 if (vsizeinc == 0) vsizeinc = 1;
259
260 x = half; y = half;
261 dir = 0;
262 rows = 0;
263 startAngle = DegreesToX(0);
264 arcAngle = DegreesToX(360);
265
266 for (i = 0; i != p->objects; i++) {
267 arcs[i].x = x;
268 arcs[i].y = y;
269 if ((i & 1) ^ dir) {
270 /* Make vertical axis longer */
271 arcs[i].width = vsize;
272 arcs[i].height = size;
273 } else {
274 /* Make horizontal axis longer */
275 arcs[i].width = size;
276 arcs[i].height = vsize;
277 }
278 arcs[i].angle1 = startAngle;
279 arcs[i].angle2 = arcAngle;
280
281 if (partialArcs) {
282 startAngle += DegreesToX(30);
283 if (startAngle >= DegreesToX(360)) startAngle -= DegreesToX(360);
284 arcAngle -= DegreesToX(20);
285 if (arcAngle <= DegreesToX(0)) arcAngle += DegreesToX(360);
286 }
287
288 y += size + 1;
289 rows++;
290 if (y >= HEIGHT - size - half || rows == MAXROWS) {
291 /* Go to next column */
292 rows = 0;
293 y = half;
294 x += size + 1;
295 if (x >= WIDTH - size - half) {
296 x = half;
297 }
298 }
299
300 vsize += vsizeinc;
301 if (vsize > size) {
302 vsize -= size;
303 dir = 1 - dir;
304 }
305 }
306 }
307
308 int
InitEllipses(XParms xp,Parms p,int64_t reps)309 InitEllipses(XParms xp, Parms p, int64_t reps)
310 {
311 GenerateEllipses(xp, p, False, False);
312 return reps;
313 }
314
315
316 int
InitPartEllipses(XParms xp,Parms p,int64_t reps)317 InitPartEllipses(XParms xp, Parms p, int64_t reps)
318 {
319 GenerateEllipses(xp, p, True, False);
320 return reps;
321 }
322
323
324 int
InitChordPartEllipses(XParms xp,Parms p,int64_t reps)325 InitChordPartEllipses(XParms xp, Parms p, int64_t reps)
326 {
327 GenerateEllipses(xp, p, True, False);
328 XSetArcMode(xp->d, xp->bggc, ArcChord);
329 XSetArcMode(xp->d, xp->fggc, ArcChord);
330 return reps;
331 }
332
333
334 int
InitSlicePartEllipses(XParms xp,Parms p,int64_t reps)335 InitSlicePartEllipses(XParms xp, Parms p, int64_t reps)
336 {
337 GenerateEllipses(xp, p, True, False);
338 XSetArcMode(xp->d, xp->bggc, ArcPieSlice);
339 XSetArcMode(xp->d, xp->fggc, ArcPieSlice);
340 return reps;
341 }
342
343
344 static void
GenerateWideEllipses(XParms xp,Parms p,Bool partialArcs,Bool ddashed)345 GenerateWideEllipses(XParms xp, Parms p, Bool partialArcs, Bool ddashed)
346 {
347 int size;
348
349 GenerateEllipses (xp, p, partialArcs, ddashed);
350 size = p->special;
351 if(ddashed) {
352 XSetLineAttributes(xp->d, xp->ddbggc, (int) ((size + 9) / 10),
353 LineSolid, CapRound, JoinRound);
354 XSetLineAttributes(xp->d, xp->ddfggc, (int) ((size + 9) / 10),
355 LineSolid, CapRound, JoinRound);
356 }
357 else {
358 XSetLineAttributes(xp->d, xp->bggc, (int) ((size + 9) / 10),
359 LineSolid, CapRound, JoinRound);
360 XSetLineAttributes(xp->d, xp->fggc, (int) ((size + 9) / 10),
361 LineSolid, CapRound, JoinRound);
362 }
363
364 }
365
366 int
InitWideEllipses(XParms xp,Parms p,int64_t reps)367 InitWideEllipses(XParms xp, Parms p, int64_t reps)
368 {
369 GenerateWideEllipses(xp, p, False, False);
370 return reps;
371 }
372
373 int
InitPartWideEllipses(XParms xp,Parms p,int64_t reps)374 InitPartWideEllipses(XParms xp, Parms p, int64_t reps)
375 {
376 GenerateWideEllipses(xp, p, True, False);
377 return reps;
378 }
379
380 int
InitDashedEllipses(XParms xp,Parms p,int64_t reps)381 InitDashedEllipses(XParms xp, Parms p, int64_t reps)
382 {
383 char dashes[2];
384
385 GenerateEllipses(xp, p, False, False);
386
387 /* Modify GCs to draw dashed */
388 XSetLineAttributes(xp->d, xp->bggc, 0, LineOnOffDash, CapButt, JoinMiter);
389 XSetLineAttributes(xp->d, xp->fggc, 0, LineOnOffDash, CapButt, JoinMiter);
390 dashes[0] = 3; dashes[1] = 2;
391 XSetDashes(xp->d, xp->fggc, 0, dashes, 2);
392 XSetDashes(xp->d, xp->bggc, 0, dashes, 2);
393 return reps;
394 }
395
396 int
InitWideDashedEllipses(XParms xp,Parms p,int64_t reps)397 InitWideDashedEllipses(XParms xp, Parms p, int64_t reps)
398 {
399 int size;
400 XGCValues gcv;
401 char dashes[2];
402
403 GenerateWideEllipses(xp, p, False, False);
404 size = p->special;
405 size = (size + 9) / 10;
406
407 /* Modify GCs to draw dashed */
408 dashes[0] = 2*size; dashes[1] = 2*size;
409 gcv.line_style = LineOnOffDash;
410 XChangeGC(xp->d, xp->fggc, GCLineStyle, &gcv);
411 XChangeGC(xp->d, xp->bggc, GCLineStyle, &gcv);
412 XSetDashes(xp->d, xp->fggc, 0, dashes, 2);
413 XSetDashes(xp->d, xp->bggc, 0, dashes, 2);
414 return reps;
415 }
416
417 int
InitDoubleDashedEllipses(XParms xp,Parms p,int64_t reps)418 InitDoubleDashedEllipses(XParms xp, Parms p, int64_t reps)
419 {
420 char dashes[2];
421
422 GenerateEllipses(xp, p, False, True);
423
424 /* Modify GCs to draw dashed */
425 XSetLineAttributes(xp->d, xp->ddbggc, 0, LineDoubleDash, CapButt, JoinMiter);
426 XSetLineAttributes(xp->d, xp->ddfggc, 0, LineDoubleDash, CapButt, JoinMiter);
427 dashes[0] = 3; dashes[1] = 2;
428 XSetDashes(xp->d, xp->ddfggc, 0, dashes, 2);
429 XSetDashes(xp->d, xp->ddbggc, 0, dashes, 2);
430 return reps;
431 }
432
433 int
InitWideDoubleDashedEllipses(XParms xp,Parms p,int64_t reps)434 InitWideDoubleDashedEllipses(XParms xp, Parms p, int64_t reps)
435 {
436 int size;
437 XGCValues gcv;
438 char dashes[2];
439
440 GenerateWideEllipses(xp, p, False, True);
441 size = p->special;
442 size = (size + 9) / 10;
443
444 /* Modify GCs to draw dashed */
445 dashes[0] = 2*size; dashes[1] = 2*size;
446 gcv.line_style = LineDoubleDash;
447 XChangeGC(xp->d, xp->ddfggc, GCLineStyle, &gcv);
448 XChangeGC(xp->d, xp->ddbggc, GCLineStyle, &gcv);
449 XSetDashes(xp->d, xp->ddfggc, 0, dashes, 2);
450 XSetDashes(xp->d, xp->ddbggc, 0, dashes, 2);
451 return reps;
452 }
453
454 void
DoArcs(XParms xp,Parms p,int64_t reps)455 DoArcs(XParms xp, Parms p, int64_t reps)
456 {
457 int i;
458
459 for (i = 0; i != reps; i++) {
460 XDrawArcs(xp->d, xp->w, pgc, arcs, p->objects);
461 if (pgc == xp->ddbggc)
462 pgc = xp->ddfggc;
463 else if(pgc == xp->ddfggc)
464 pgc = xp->ddbggc;
465 else if (pgc == xp->bggc)
466 pgc = xp->fggc;
467 else
468 pgc = xp->bggc;
469 CheckAbort ();
470 }
471 }
472
473 void
DoFilledArcs(XParms xp,Parms p,int64_t reps)474 DoFilledArcs(XParms xp, Parms p, int64_t reps)
475 {
476 int i;
477
478 for (i = 0; i != reps; i++) {
479 XFillArcs(xp->d, xp->w, pgc, arcs, p->objects);
480 if (pgc == xp->ddbggc)
481 pgc = xp->ddfggc;
482 else if(pgc == xp->ddfggc)
483 pgc = xp->ddbggc;
484 else if (pgc == xp->bggc)
485 pgc = xp->fggc;
486 else
487 pgc = xp->bggc;
488 CheckAbort ();
489 }
490 }
491
492 void
EndArcs(XParms xp,Parms p)493 EndArcs(XParms xp, Parms p)
494 {
495 free(arcs);
496 }
497
498