xref: /netbsd-src/games/testpat/testpat.c (revision 3377e30f0d6ecca980965e8ef906e588d857dd10)
1*3377e30fSnat /* $NetBSD: testpat.c,v 1.6 2021/11/13 20:59:13 nat Exp $ */
2ad733c96Snat 
3ad733c96Snat /*-
4ad733c96Snat  * Copyright (c) 2016 Nathanial Sloss <nathanialsloss@yahoo.com.au>
5ad733c96Snat  * All rights reserved.
6ad733c96Snat  *
7ad733c96Snat  * Redistribution and use in source and binary forms, with or without
8ad733c96Snat  * modification, are permitted provided that the following conditions
9ad733c96Snat  * are met:
10ad733c96Snat  * 1. Redistributions of source code must retain the above copyright
11ad733c96Snat  *    notice, this list of conditions and the following disclaimer.
12ad733c96Snat  * 2. Redistributions in binary form must reproduce the above copyright
13ad733c96Snat  *    notice, this list of conditions and the following disclaimer in the
14ad733c96Snat  *    documentation and/or other materials provided with the distribution.
15ad733c96Snat  *
16ad733c96Snat  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
17ad733c96Snat  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18ad733c96Snat  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19ad733c96Snat  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20ad733c96Snat  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21ad733c96Snat  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22ad733c96Snat  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23ad733c96Snat  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24ad733c96Snat  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25ad733c96Snat  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26ad733c96Snat  * POSSIBILITY OF SUCH DAMAGE.
27ad733c96Snat  */
286fceff0aSchristos #include <sys/cdefs.h>
29*3377e30fSnat __RCSID("$NetBSD: testpat.c,v 1.6 2021/11/13 20:59:13 nat Exp $");
306fceff0aSchristos 
316fceff0aSchristos #include <sys/types.h>
326fceff0aSchristos #include <sys/time.h>
33ad733c96Snat 
34ad733c96Snat #include <curses.h>
35ad733c96Snat #include <err.h>
36ad733c96Snat #include <errno.h>
37ad733c96Snat #include <math.h>
38ad733c96Snat #include <stdio.h>
39ad733c96Snat #include <stdlib.h>
40ad733c96Snat #include <string.h>
41ad733c96Snat #include <time.h>
42ad733c96Snat 
436fceff0aSchristos static int colour_list[6] = {
44ad733c96Snat 	COLOR_YELLOW,
45ad733c96Snat 	COLOR_CYAN,
46ad733c96Snat 	COLOR_GREEN,
47ad733c96Snat 	COLOR_MAGENTA,
48ad733c96Snat 	COLOR_RED,
49ad733c96Snat 	COLOR_BLUE,
50ad733c96Snat };
516fceff0aSchristos static int numcolours = (int)__arraycount(colour_list);
52ad733c96Snat 
main(int argc,char * argv[])536fceff0aSchristos int main(int argc, char *argv[]) {
546fceff0aSchristos 	int i, col, colour, line, x_limit, y_limit, colourOK, spacing;
556fceff0aSchristos 	int xpos, ypos, spacing_residual, spacing_start, spacing_end;
566fceff0aSchristos 	int grid_x, grid_y, **circle_pos;
576fceff0aSchristos 	size_t ncpos;
586fceff0aSchristos 	float grid_unit;
596fceff0aSchristos 	const char *title = "NetBSD";
60ad733c96Snat 	float coord_x, circle_int;
61ad733c96Snat 	float a_axis, b_axis;
62ad733c96Snat 
636fceff0aSchristos 	if (!initscr()) {
646fceff0aSchristos 		errx(EXIT_FAILURE, "Unknown terminal type");
65ad733c96Snat 	}
666fceff0aSchristos 
6785827960Sjmcneill 	curs_set(0);
68ad733c96Snat 
69ad733c96Snat 	if (argc > 2) {
70ad733c96Snat 		endwin();
716fceff0aSchristos 		fprintf(stderr, "Usage: %s <title>", getprogname());
726fceff0aSchristos 		return EXIT_FAILURE;
73ad733c96Snat 	}
74ad733c96Snat 
756fceff0aSchristos 	if (argc == 2) {
766fceff0aSchristos 		title = argv[1];
776fceff0aSchristos 		if (strlen(title) >= (size_t)COLS) {
78ad733c96Snat 			endwin();
796fceff0aSchristos 			errx(EXIT_FAILURE,
806fceff0aSchristos 			    "Title string is longer than display cols");
816fceff0aSchristos 		}
82ad733c96Snat 	}
83ad733c96Snat 
84ad733c96Snat 	colourOK = has_colors();
85ad733c96Snat 
86ad733c96Snat 	if (COLS < 13 || LINES < 13) {
87ad733c96Snat 		endwin();
886fceff0aSchristos 		errx(EXIT_FAILURE, "Terminal size must be at least 72x25.");
89ad733c96Snat 	}
90ad733c96Snat 
91ad733c96Snat 	if (colourOK) {
92ad733c96Snat 		start_color();
93ad733c96Snat 
94ad733c96Snat 	    	init_pair(0, COLOR_WHITE, COLOR_BLACK);
95ad733c96Snat 	    	init_pair(1, COLOR_WHITE, COLOR_RED);
96ad733c96Snat 	    	init_pair(2, COLOR_WHITE, COLOR_GREEN);
97ad733c96Snat 	    	init_pair(3, COLOR_WHITE, COLOR_YELLOW);
98ad733c96Snat 	    	init_pair(4, COLOR_WHITE, COLOR_BLUE);
99ad733c96Snat 	    	init_pair(5, COLOR_WHITE, COLOR_MAGENTA);
100ad733c96Snat 	    	init_pair(6, COLOR_WHITE, COLOR_CYAN);
101ad733c96Snat 	    	init_pair(7, COLOR_BLACK, COLOR_WHITE);
102ad733c96Snat 
103ad733c96Snat 		attrset(COLOR_PAIR(0));
104ad733c96Snat 	}
105ad733c96Snat 
106ad733c96Snat 	x_limit = (COLS - 1) / 2;
107ad733c96Snat 	x_limit = x_limit * 2;
108ad733c96Snat 	y_limit = (LINES - 2) / 2;
109ad733c96Snat 	y_limit = y_limit * 2;
110ad733c96Snat 	spacing = 2 * y_limit / numcolours;
111ad733c96Snat 	spacing_residual = ((2 * y_limit) % numcolours) / 2;
112ad733c96Snat 	a_axis = y_limit / 2;
113ad733c96Snat 	b_axis = y_limit;
114ad733c96Snat 	grid_unit = b_axis / 13;
115ad733c96Snat 	grid_y = grid_unit;
116ad733c96Snat 	grid_x = grid_unit * 2;
117ad733c96Snat 
1186fceff0aSchristos 
1196fceff0aSchristos 	ncpos = y_limit * sizeof(*circle_pos)
1206fceff0aSchristos 	    + y_limit * 2 * sizeof(**circle_pos);
1216fceff0aSchristos 	circle_pos = malloc(ncpos);
1226fceff0aSchristos 	if (circle_pos == NULL) {
1236fceff0aSchristos 		endwin();
1246fceff0aSchristos 		errx(EXIT_FAILURE, "Can't allocate circle positions");
1256fceff0aSchristos 	}
1266fceff0aSchristos 	for (i = 0; i < y_limit; i++) {
1276fceff0aSchristos 	    circle_pos[i] = (void *)&circle_pos[y_limit + i * 2];
1286fceff0aSchristos 	    circle_pos[i][0] = circle_pos[i][1] = -1;
1296fceff0aSchristos 	}
130ad733c96Snat 
131ad733c96Snat 	for (i = 0; i < y_limit; i++) {
1326fceff0aSchristos 		/* Draw an ellipse (looks more circular.) */
133ad733c96Snat 		circle_int = (i - a_axis) / a_axis;
134ad733c96Snat 		circle_int = 1 - powf(circle_int, 2);
135ad733c96Snat 		circle_int = circle_int * powf(b_axis, 2);
136ad733c96Snat #if 0
137ad733c96Snat 		/* Draw a circle, commented out as elipse looks better.*/
138ad733c96Snat 		circle_int = powf(a_axis, 2) - powf(i - a_axis, 2);
139ad733c96Snat #endif
140ad733c96Snat 		coord_x = sqrtf(circle_int);
141ad733c96Snat 		circle_pos[i][0] = (-coord_x + ((float)x_limit / 2));
142ad733c96Snat 		circle_pos[i][1] = (coord_x + ((float)x_limit / 2));
143ad733c96Snat 	}
144ad733c96Snat 
145ad733c96Snat 	clear();
146ad733c96Snat 
147ad733c96Snat 	attron(A_ALTCHARSET);
148ad733c96Snat 	move(0, 0);
149ad733c96Snat 
150ad733c96Snat 	/* Draw a grid. */
151ad733c96Snat 	for (line = 1; line < y_limit; line += grid_y) {
152ad733c96Snat 		for (col = 1; col < x_limit; col = col + grid_x) {
153ad733c96Snat 			xpos = col;
154ad733c96Snat 			while ((xpos < col + grid_x - 1) && (xpos <
155ad733c96Snat 			    x_limit)) {
156ad733c96Snat 				mvaddch(line + grid_y - 1, xpos, 113 |
157ad733c96Snat 				    A_ALTCHARSET);
158ad733c96Snat 				xpos++;
159ad733c96Snat 			}
160ad733c96Snat 			if (xpos < x_limit)
161ad733c96Snat 				mvaddch(line + grid_y - 1, xpos, 110 |
162ad733c96Snat 				    A_ALTCHARSET);
163ad733c96Snat 		}
164ad733c96Snat 		ypos = line;
165ad733c96Snat 		while (ypos < line + grid_y - 1) {
166ad733c96Snat 			for (col = grid_x - 1; col < x_limit; col += grid_x) {
167ad733c96Snat 				mvaddch(ypos, col + 1, 120 | A_ALTCHARSET);
168ad733c96Snat 			}
169ad733c96Snat 			ypos++;
170ad733c96Snat 		}
171ad733c96Snat 	}
172ad733c96Snat 
173ad733c96Snat 	for (line = 1; line < y_limit; line += grid_y) {
174ad733c96Snat 		mvaddch(line + grid_y - 1, 0, 116 | A_ALTCHARSET);
175ad733c96Snat 		mvaddch(line + grid_y - 1, x_limit, 117 | A_ALTCHARSET);
176ad733c96Snat 
177ad733c96Snat 		ypos = line;
178ad733c96Snat 		while (ypos < line + grid_y - 1) {
179ad733c96Snat 			mvaddch(ypos, 0, 120 | A_ALTCHARSET);
180ad733c96Snat 			mvaddch(ypos, x_limit, 120 | A_ALTCHARSET);
181ad733c96Snat 			ypos++;
182ad733c96Snat 		}
183ad733c96Snat 	}
184ad733c96Snat 
185ad733c96Snat 	for (col = 1; col < x_limit; col += grid_x) {
186ad733c96Snat 		mvaddch(0, col + grid_x - 1, 119 | A_ALTCHARSET);
187ad733c96Snat 		mvaddch(y_limit, col + grid_x - 1, 118 | A_ALTCHARSET);
188ad733c96Snat 
189ad733c96Snat 		xpos = col;
190ad733c96Snat 		while ((xpos < col + grid_x - 1) && (xpos < x_limit)) {
191ad733c96Snat 			mvaddch(0, xpos, 113 | A_ALTCHARSET);
192ad733c96Snat 			mvaddch(y_limit, xpos, 113 | A_ALTCHARSET);
193ad733c96Snat 			xpos++;
194ad733c96Snat 		}
195ad733c96Snat 	}
196ad733c96Snat 
197ad733c96Snat 	mvaddch(0, 0, 108 | A_ALTCHARSET);
198ad733c96Snat 	mvaddch(0, x_limit, 107 | A_ALTCHARSET);
199ad733c96Snat 	mvaddch(y_limit, 0, 109 | A_ALTCHARSET);
200ad733c96Snat 	mvaddch(y_limit, x_limit, 106 | A_ALTCHARSET);
201ad733c96Snat 
202ad733c96Snat 	/* Draw a white circle. */
203ad733c96Snat 	for (i = 1; i < y_limit; i++) {
204ad733c96Snat 		for (col = circle_pos[i][0]; col <= circle_pos[i][1]; col++) {
205ad733c96Snat 			mvaddch(i, col, 32 | A_REVERSE);
206ad733c96Snat 		}
207ad733c96Snat 	}
208ad733c96Snat 
209ad733c96Snat 	/* Add title segment. */
210ad733c96Snat 	for (i = roundf(1 * grid_unit); i < roundf(2 * grid_unit); i++) {
211ad733c96Snat 		if (colourOK)
212ad733c96Snat     			attrset(COLOR_PAIR(COLOR_BLACK));
213*3377e30fSnat 		else
214*3377e30fSnat 			attrset(A_NORMAL);
215ad733c96Snat 
216ad733c96Snat 		for (col = roundf((4 * grid_unit * 2) +
217ad733c96Snat 		    circle_pos[y_limit / 2][0]); col <= roundf((9 * grid_unit
218ad733c96Snat 		    * 2) + circle_pos[y_limit / 2][0]); col++)
219ad733c96Snat 			mvaddch(i, col, ' ');
220ad733c96Snat 	}
221ad733c96Snat 
222ad733c96Snat 	i = roundf(1.4 * grid_unit);
223ad733c96Snat 
224*3377e30fSnat 	if (!colourOK)
225*3377e30fSnat 		attrset(A_NORMAL);
226*3377e30fSnat 
227ad733c96Snat 	col = y_limit - (strlen(title) / 2) + circle_pos[y_limit / 2][0];
228ad733c96Snat 		mvprintw(i, col, "%s", title);
229ad733c96Snat 
230ad733c96Snat 	/* Add black segments at top. */
231ad733c96Snat 	for (line = roundf(2 * grid_unit); line < 4 * grid_unit; line++) {
232ad733c96Snat 		if (colourOK)
233ad733c96Snat     			attrset(COLOR_PAIR(COLOR_BLACK));
234*3377e30fSnat 		else
235*3377e30fSnat 			attrset(A_NORMAL);
236ad733c96Snat 
237ad733c96Snat 		for (col = 0; col <= roundf((3.5 * grid_unit * 2)); col++) {
238ad733c96Snat 				xpos = col + circle_pos[y_limit / 2][0];
239ad733c96Snat 				if (xpos >= circle_pos[line][0] &&
240ad733c96Snat 				    xpos <= circle_pos[line][1])
241ad733c96Snat 					mvaddch(line, xpos, ' ');
242ad733c96Snat 		}
243ad733c96Snat 
244ad733c96Snat 		for (col = roundf((9.5 * grid_unit * 2)); col <
245ad733c96Snat 		    roundf((13 * grid_unit * 2)); col++) {
246ad733c96Snat 				xpos = col + circle_pos[y_limit / 2][0];
247ad733c96Snat 				if (xpos >= circle_pos[line][0] &&
248ad733c96Snat 				    xpos <= circle_pos[line][1])
249ad733c96Snat 					mvaddch(line, xpos, ' ');
250ad733c96Snat 		}
251ad733c96Snat 	}
252ad733c96Snat 
253ad733c96Snat 	/* Add black and white squares close to top. */
254ad733c96Snat 	int gap = (circle_pos[(int)(5 * grid_unit)][1] -
255ad733c96Snat 	    circle_pos[(int)(5 * grid_unit)][0]) / 13;
256ad733c96Snat 
257ad733c96Snat 	for (i = roundf(3 * grid_unit); i < roundf(4 * grid_unit); i++) {
258ad733c96Snat 		for (xpos = 0; xpos <= x_limit; xpos += 2 * gap) {
259ad733c96Snat 			if (colourOK)
260ad733c96Snat     				attrset(COLOR_PAIR(COLOR_BLACK));
261*3377e30fSnat 			else
262*3377e30fSnat 				attrset(A_NORMAL);
263ad733c96Snat 
264ad733c96Snat 			for (col = xpos; col < xpos + gap; col++) {
265ad733c96Snat 				if (col >= circle_pos[i][0] &&
266ad733c96Snat 				    col <= circle_pos[i][1])
267ad733c96Snat 					mvaddch(i, col, ' ');
268ad733c96Snat 			}
269ad733c96Snat 
270ad733c96Snat 			if (colourOK)
271ad733c96Snat     				attrset(COLOR_PAIR(COLOR_WHITE));
272*3377e30fSnat 			else
273*3377e30fSnat 				attrset(A_REVERSE);
274ad733c96Snat 
275ad733c96Snat 			for (col = xpos + gap ; col < xpos + (2 * gap);
276ad733c96Snat 			    col++) {
277ad733c96Snat 				if (col >= circle_pos[i][0] &&
278ad733c96Snat 				    col <= circle_pos[i][1])
279ad733c96Snat 					mvaddch(i, col, ' ');
280ad733c96Snat 			}
281ad733c96Snat 		}
282ad733c96Snat 	}
283ad733c96Snat 
284ad733c96Snat 	/* Add colour bars. */
285ad733c96Snat 	for (i = 0; i < numcolours; i++) {
286ad733c96Snat 		colour = colour_list[i];
287ad733c96Snat 		if (colourOK)
288ad733c96Snat 	    		attrset(COLOR_PAIR(colour));
289*3377e30fSnat 		else if (i & 1)
290*3377e30fSnat 			attrset(A_NORMAL);
291*3377e30fSnat 		else
292*3377e30fSnat 			attrset(A_REVERSE);
293ad733c96Snat 
294ad733c96Snat 		if (i == 0)
295ad733c96Snat 			spacing_start = 0;
296ad733c96Snat 		else
297ad733c96Snat 			spacing_start = (spacing * i) + spacing_residual;
298ad733c96Snat 
299ad733c96Snat 		if (i == numcolours - 1)
300ad733c96Snat 			spacing_end = circle_pos[y_limit / 2][1];
301ad733c96Snat 		else
302ad733c96Snat 			spacing_end = (spacing * (i + 1)) + spacing_residual;
303ad733c96Snat 
304ad733c96Snat 	    	for (line = roundf(4 * grid_unit); line < (y_limit / 2);
305ad733c96Snat 		    line++) {
306ad733c96Snat 			for (col = spacing_start; col < spacing_end; col++) {
307ad733c96Snat 				xpos = col + circle_pos[y_limit / 2][0];
308ad733c96Snat 				if (xpos >= circle_pos[line][0] &&
309ad733c96Snat 				    xpos <= circle_pos[line][1])
310ad733c96Snat 	    				mvprintw(line, xpos, " ");
311ad733c96Snat 			}
312ad733c96Snat 	    	}
313ad733c96Snat 	}
314ad733c96Snat 
315ad733c96Snat 	/* Add black segment under centre line. */
316ad733c96Snat 	for (line = y_limit / 2; line < (9.5 * grid_unit); line++) {
317ad733c96Snat 		if (colourOK)
318ad733c96Snat     			attrset(COLOR_PAIR(COLOR_BLACK));
319*3377e30fSnat 		else
320*3377e30fSnat 			attrset(A_NORMAL);
321ad733c96Snat 
322ad733c96Snat 		for (col = circle_pos[line][0]; col <= circle_pos[line][1];
323ad733c96Snat 		    col++)
324ad733c96Snat 			mvaddch(line, col, ' ');
325ad733c96Snat 
326ad733c96Snat 		for (col = roundf((1.5 * grid_unit * 2)); col <
327ad733c96Snat 		    roundf((4.3 * grid_unit * 2)); col++) {
328ad733c96Snat 				xpos = col + circle_pos[y_limit / 2][0];
329ad733c96Snat 				if (xpos >= circle_pos[line][0] &&
330ad733c96Snat 				    xpos < circle_pos[line][1])
331ad733c96Snat 					mvaddch(line, xpos, 120 | A_ALTCHARSET);
332ad733c96Snat 		}
333ad733c96Snat 
334ad733c96Snat 		for (col = roundf((4.3 * grid_unit * 2)); col <
335ad733c96Snat 		    roundf((7.6 * grid_unit * 2)); col++) {
336ad733c96Snat 				xpos = col + circle_pos[y_limit / 2][0];
337ad733c96Snat 				if (xpos >= circle_pos[line][0] &&
338ad733c96Snat 				    xpos < circle_pos[line][1])
339ad733c96Snat 					mvaddch(line, xpos, '|');
340ad733c96Snat 		}
341ad733c96Snat 
342ad733c96Snat 		for (col = roundf((7.6 * grid_unit * 2)); col <
343ad733c96Snat 		    roundf((11.5 * grid_unit * 2)); col++) {
344ad733c96Snat 				xpos = col + circle_pos[y_limit / 2][0];
345ad733c96Snat 				if (xpos >= circle_pos[line][0] &&
346ad733c96Snat 				    xpos < circle_pos[line][1])
347ad733c96Snat 					mvaddch(line, xpos, 97 | A_ALTCHARSET);
348ad733c96Snat 		}
349ad733c96Snat 	}
350ad733c96Snat 
351ad733c96Snat 	/* Add black segment close to bottom. */
352ad733c96Snat 	for (line = roundf(9.5 * grid_unit); line <= (10.5 * grid_unit);
353ad733c96Snat 	    line++) {
354ad733c96Snat 		if (colourOK)
355ad733c96Snat     			attrset(COLOR_PAIR(COLOR_BLACK));
356*3377e30fSnat 		else
357*3377e30fSnat 			attrset(A_NORMAL);
358ad733c96Snat 
359ad733c96Snat 		for (col = roundf((0 * grid_unit * 2)); col <
360ad733c96Snat 		    roundf((4 * grid_unit * 2)); col++) {
361ad733c96Snat 				xpos = col + circle_pos[y_limit / 2][0];
362ad733c96Snat 				if (xpos >= circle_pos[line][0] &&
363ad733c96Snat 				    xpos < circle_pos[line][1])
364ad733c96Snat 					mvaddch(line, xpos, ' ');
365ad733c96Snat 		}
366ad733c96Snat 
367ad733c96Snat 		for (col = roundf((4 * grid_unit * 2)); col <
368ad733c96Snat 		    roundf((6.5 * grid_unit * 2)); col++) {
369ad733c96Snat 				xpos = col + circle_pos[y_limit / 2][0];
370ad733c96Snat 				if (xpos >= circle_pos[line][0] &&
371ad733c96Snat 				    xpos < circle_pos[line][1])
372ad733c96Snat 					mvaddch(line, xpos, 97 | A_ALTCHARSET);
373ad733c96Snat 		}
374ad733c96Snat 
375ad733c96Snat 		if (colourOK)
376ad733c96Snat     			attrset(COLOR_PAIR(COLOR_WHITE));
377*3377e30fSnat 		else
378*3377e30fSnat 			attrset(A_REVERSE);
379ad733c96Snat 
380ad733c96Snat 		for (col = roundf((6.5 * grid_unit * 2)); col <
381ad733c96Snat 		    roundf((9 * grid_unit * 2)); col++) {
382ad733c96Snat 				xpos = col + circle_pos[y_limit / 2][0];
383ad733c96Snat 				if (xpos >= circle_pos[line][0] &&
384ad733c96Snat 				    xpos < circle_pos[line][1])
385ad733c96Snat 					mvaddch(line, xpos, 97 | A_ALTCHARSET);
386ad733c96Snat 		}
387ad733c96Snat 
388ad733c96Snat 		for (col = roundf((9 * grid_unit * 2)); col <
389ad733c96Snat 		    roundf((13 * grid_unit * 2)); col++) {
390ad733c96Snat 				xpos = col + circle_pos[y_limit / 2][0];
391ad733c96Snat 				if (xpos >= circle_pos[line][0] &&
392ad733c96Snat 				    xpos < circle_pos[line][1])
393ad733c96Snat 					mvaddch(line, xpos, ' ');
394ad733c96Snat 		}
395ad733c96Snat 	}
396ad733c96Snat 
397ad733c96Snat 	/* Add name segment close to bottom. */
398ad733c96Snat 	for (line = roundf(10.5 * grid_unit); line < (12 * grid_unit);
399ad733c96Snat 	    line++) {
400ad733c96Snat 		if (colourOK)
401ad733c96Snat     			attrset(COLOR_PAIR(COLOR_BLACK));
402*3377e30fSnat 		else
403*3377e30fSnat 			attrset(A_NORMAL);
404ad733c96Snat 
405ad733c96Snat 		for (col = roundf(3.5 * grid_unit * 2); col <= roundf(9.5 *
406ad733c96Snat 		    grid_unit * 2); col++) {
407ad733c96Snat 			xpos = col + circle_pos[y_limit / 2][0];
408ad733c96Snat 			if (xpos >= circle_pos[line][0] &&
409ad733c96Snat 			    xpos < circle_pos[line][1])
410ad733c96Snat 				mvaddch(line, xpos, ' ');
411ad733c96Snat 		}
412ad733c96Snat 
413ad733c96Snat 		if (colourOK)
414ad733c96Snat     			attrset(COLOR_PAIR(COLOR_WHITE));
415*3377e30fSnat 		else
416*3377e30fSnat 			attrset(A_REVERSE);
417ad733c96Snat 
418ad733c96Snat 		for (col = roundf(0 * grid_unit * 2); col <= roundf(3.5 *
419ad733c96Snat 		    grid_unit * 2); col++) {
420ad733c96Snat 			xpos = col + circle_pos[y_limit / 2][0];
421ad733c96Snat 			if (xpos >= circle_pos[line][0] &&
422ad733c96Snat 			    xpos < circle_pos[line][1])
423ad733c96Snat 				mvaddch(line, xpos, ' ');
424ad733c96Snat 		}
425ad733c96Snat 
426ad733c96Snat 		for (col = roundf(9.5 * grid_unit * 2); col <= roundf(13 *
427ad733c96Snat 		    grid_unit * 2); col++) {
428ad733c96Snat 			xpos = col + circle_pos[y_limit / 2][0];
429ad733c96Snat 			if (xpos >= circle_pos[line][0] &&
430ad733c96Snat 			    xpos < circle_pos[line][1])
431ad733c96Snat 				mvaddch(line, xpos, ' ');
432ad733c96Snat 		}
433ad733c96Snat 	}
434ad733c96Snat 
435ad733c96Snat 	/* Add yellow segment at bottom. */
436ad733c96Snat 	for (line = 12 * grid_unit; line < y_limit; line++) {
437ad733c96Snat 		if (colourOK)
438ad733c96Snat     			attrset(COLOR_PAIR(COLOR_YELLOW));
439*3377e30fSnat 		else
440*3377e30fSnat     			attrset(A_REVERSE);
441*3377e30fSnat 
442ad733c96Snat 
443ad733c96Snat 		for (col = circle_pos[line][0]; col <= circle_pos[line][1];
444ad733c96Snat 		    col++)
445ad733c96Snat 			mvaddch(line, col, ' ');
446ad733c96Snat 
447ad733c96Snat 		if (colourOK)
448ad733c96Snat     			attrset(COLOR_PAIR(COLOR_RED));
449*3377e30fSnat 		else
450*3377e30fSnat     			attrset(A_NORMAL);
451ad733c96Snat 
452ad733c96Snat 		for (col = roundf((6 * grid_unit * 2)); col <
453ad733c96Snat 		    roundf((7 * grid_unit * 2)); col++) {
454ad733c96Snat 				xpos = col + circle_pos[y_limit / 2][0];
455ad733c96Snat 				if (xpos >= circle_pos[line][0] &&
456ad733c96Snat 				    xpos < circle_pos[line][1])
457ad733c96Snat 					mvaddch(line, xpos, ' ');
458ad733c96Snat 		}
459ad733c96Snat 	}
460ad733c96Snat 
461ad733c96Snat 	if (colourOK)
462ad733c96Snat     		attrset(COLOR_PAIR(COLOR_BLACK));
463*3377e30fSnat 	else
464*3377e30fSnat     		attrset(A_NORMAL);
465ad733c96Snat 
466ad733c96Snat 	for (line = 6 * grid_unit; line <= (7 * grid_unit) + 1; line++) {
467ad733c96Snat 		if (colourOK)
468ad733c96Snat     			attrset(COLOR_PAIR(COLOR_BLACK));
469*3377e30fSnat 		else
470*3377e30fSnat     			attrset(A_NORMAL);
471ad733c96Snat 
472ad733c96Snat 		col = x_limit / 2;
473ad733c96Snat 		if (line != a_axis) {
474ad733c96Snat 			mvaddch(line, col - 1, ' ');
475ad733c96Snat 			mvaddch(line, col, 120 | A_ALTCHARSET);
476ad733c96Snat 			mvaddch(line, col + 1, ' ');
477ad733c96Snat 		}
478ad733c96Snat 	}
479ad733c96Snat 
480ad733c96Snat 	line = y_limit / 2;
481ad733c96Snat 	for (col = 1; col < x_limit; col = col + grid_x) {
482ad733c96Snat 		xpos = col;
483ad733c96Snat 		while (xpos < col + grid_x - 1) {
4846fceff0aSchristos 			if (xpos >= circle_pos[line][0]
4856fceff0aSchristos 			    && xpos < circle_pos[line][1])
486ad733c96Snat 				mvaddch(line, xpos, 113 | A_ALTCHARSET);
487ad733c96Snat 			xpos++;
488ad733c96Snat 		}
489ad733c96Snat 		if (xpos >= circle_pos[line][0] && xpos < circle_pos[line][1])
490ad733c96Snat 			mvaddch(line, xpos, 110 | A_ALTCHARSET);
491ad733c96Snat 	}
492ad733c96Snat 
493ad733c96Snat 	line = y_limit / 2;
494ad733c96Snat 	col = x_limit / 2;
495ad733c96Snat 	mvaddch(line, col, 110 | A_ALTCHARSET);
496ad733c96Snat 	mvaddch(line, col - 1, 113 | A_ALTCHARSET);
497ad733c96Snat 	mvaddch(line, col + 1, 113 | A_ALTCHARSET);
498ad733c96Snat 
499ad733c96Snat 	refresh();
500ad733c96Snat 
501ad733c96Snat 	getch();
502ad733c96Snat 
503ad733c96Snat 	endwin();
504ad733c96Snat 
505ad733c96Snat 	return EXIT_SUCCESS;
506ad733c96Snat }
507ad733c96Snat 
508