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