Annotation of OpenXM_contrib/gnuplot/term/dumb.trm, Revision 1.1.1.1
1.1 maekawa 1: /*
2: * $Id: dumb.trm,v 1.24 1998/04/14 00:17:37 drd Exp $
3: *
4: */
5:
6: /* GNUPLOT - dumb.trm */
7:
8: /*[
9: * Copyright 1991 - 1993, 1998 Thomas Williams, Colin Kelley
10: *
11: * Permission to use, copy, and distribute this software and its
12: * documentation for any purpose with or without fee is hereby granted,
13: * provided that the above copyright notice appear in all copies and
14: * that both that copyright notice and this permission notice appear
15: * in supporting documentation.
16: *
17: * Permission to modify the software is granted, but not the right to
18: * distribute the complete modified source code. Modifications are to
19: * be distributed as patches to the released version. Permission to
20: * distribute binaries produced by compiling modified sources is granted,
21: * provided you
22: * 1. distribute the corresponding source modifications from the
23: * released version in the form of a patch file along with the binaries,
24: * 2. add special version identification to distinguish your version
25: * in addition to the base release version number,
26: * 3. provide your name and address as the primary contact for the
27: * support of your modified version, and
28: * 4. retain our contact information in regard to use of the base
29: * software.
30: * Permission to distribute the released version of the source code along
31: * with corresponding source modifications in the form of a patch file is
32: * granted with same provisions 2 through 4 for binary distributions.
33: *
34: * This software is provided "as is" without express or implied warranty
35: * to the extent permitted by applicable law.
36: ]*/
37:
38: /*
39: * This file is included by ../term.c.
40: *
41: * This terminal driver supports:
42: * DUMB terminals
43: *
44: * AUTHORS
45: * Francois Pinard, 91-04-03
46: * INTERNET: pinard@iro.umontreal.ca
47: *
48: * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
49: *
50: */
51: #include "driver.h"
52:
53: #ifdef TERM_REGISTER
54: register_term(dumb_driver)
55: #endif
56:
57: #ifdef TERM_PROTO
58: TERM_PUBLIC void DUMB_options __PROTO((void));
59: TERM_PUBLIC void DUMB_init __PROTO((void));
60: TERM_PUBLIC void DUMB_graphics __PROTO((void));
61: TERM_PUBLIC void DUMB_text __PROTO((void));
62: TERM_PUBLIC void DUMB_reset __PROTO((void));
63: TERM_PUBLIC void DUMB_linetype __PROTO((int linetype));
64: TERM_PUBLIC void DUMB_move __PROTO((unsigned int x, unsigned int y));
65: TERM_PUBLIC void DUMB_point __PROTO((unsigned int x, unsigned int y,
66: int point));
67: TERM_PUBLIC void DUMB_vector __PROTO((unsigned int x, unsigned int y));
68: TERM_PUBLIC void DUMB_put_text __PROTO((unsigned int x, unsigned int y,
69: char *str));
70: TERM_PUBLIC void DUMB_arrow __PROTO((unsigned int sx, unsigned int sy,
71: unsigned int ex, unsigned int ey,
72: int head));
73:
74: #define DUMB_XMAX 79
75: #define DUMB_YMAX 24
76:
77: #endif /* TERM_PROTO */
78:
79: #ifdef TERM_BODY
80:
81: #define DUMB_AXIS_CONST '\1'
82: #define DUMB_BORDER_CONST '\2'
83:
84: /* matrix of characters */
85: static char *dumb_matrix = NULL;
86: /* matrix of priority at each position */
87: static char *dumb_priority = NULL;
88: /* current character used to draw */
89: static char dumb_pen;
90: /* current X position */
91: static int dumb_x;
92: /* current Y position */
93: static int dumb_y;
94: static int dumb_xmax = DUMB_XMAX;
95: static int dumb_ymax = DUMB_YMAX;
96: static int dumb_feed = 1;
97:
98: #define DUMB_PIXEL(x,y) dumb_matrix[dumb_xmax*(y)+(x)]
99:
100: static void dumb_set_pixel __PROTO((int x, int y, int v, int p));
101:
102:
103: static void dumb_set_pixel(x, y, v, p)
104: int x, y, v, p;
105: {
106: if ((unsigned) x <= dumb_xmax && /* ie x>=0 && x<=dumb_xmax */
107: (unsigned) y <= dumb_ymax &&
108: p > dumb_priority[dumb_xmax * y + x]) {
109: dumb_matrix[dumb_xmax * y + x] = v;
110: dumb_priority[dumb_xmax * y + x] = p;
111: }
112: }
113:
114:
115: TERM_PUBLIC void DUMB_options()
116: {
117: int x, y;
118: struct value a;
119:
120: if (almost_equals(c_token, "f$eed"))
121: ++c_token, dumb_feed = 1;
122: else if (almost_equals(c_token, "nof$eed"))
123: ++c_token, dumb_feed = 0;
124:
125: if (!END_OF_COMMAND) {
126: x = (int) real(const_express(&a));
127: if (!END_OF_COMMAND) {
128: y = (int) real(const_express(&a));
129: dumb_xmax = term->xmax = x;
130: dumb_ymax = term->ymax = y;
131: }
132: }
133: sprintf(term_options, "%sfeed %d %d",
134: dumb_feed ? "" : "no", dumb_xmax, dumb_ymax);
135: }
136:
137:
138: TERM_PUBLIC void DUMB_init()
139: {
140: if (dumb_matrix)
141: free(dumb_matrix);
142:
143: dumb_matrix = gp_alloc((unsigned long) dumb_xmax * dumb_ymax * 2, "dumb terminal");
144:
145: dumb_priority = dumb_matrix + dumb_xmax * dumb_ymax;
146: }
147:
148:
149: TERM_PUBLIC void DUMB_graphics()
150: {
151: int i;
152: char *pm = dumb_matrix, *pp = dumb_priority;
153:
154: for (i = dumb_xmax * dumb_ymax; i > 0; i--) {
155: *pm++ = ' ';
156: *pp++ = 0;
157: }
158: }
159:
160:
161: TERM_PUBLIC void DUMB_text()
162: {
163: int x, y, l;
164:
165: putc('\f', gpoutfile);
166: for (y = dumb_ymax - 1; y >= 0; y--) {
167: for (l = dumb_xmax; l > 0 && DUMB_PIXEL(l - 1, y) == ' '; l--);
168: for (x = 0; x < l; x++)
169: putc(DUMB_PIXEL(x, y), gpoutfile);
170: if (dumb_feed || y > 0)
171: putc('\n', gpoutfile);
172: }
173: fflush(gpoutfile);
174: }
175:
176:
177: TERM_PUBLIC void DUMB_reset()
178: {
179: free(dumb_matrix);
180: dumb_matrix = NULL;
181: }
182:
183:
184: TERM_PUBLIC void DUMB_linetype(linetype)
185: int linetype;
186: {
187: static char pen_type[7] = { '*', '#', '$', '%', '@', '&', '=' };
188:
189: if (linetype == -2)
190: dumb_pen = DUMB_BORDER_CONST;
191: else if (linetype == -1)
192: dumb_pen = DUMB_AXIS_CONST;
193: else {
194: linetype = linetype % 7;
195: dumb_pen = pen_type[linetype];
196: }
197: }
198:
199:
200: TERM_PUBLIC void DUMB_move(x, y)
201: unsigned int x, y;
202: {
203: dumb_x = x;
204: dumb_y = y;
205: }
206:
207:
208: TERM_PUBLIC void DUMB_point(x, y, point)
209: unsigned int x, y;
210: int point;
211: {
212: dumb_set_pixel(x, y, point == -1 ? '.' : point % 26 + 'A', 4);
213: }
214:
215:
216: TERM_PUBLIC void DUMB_vector(_x, _y)
217: unsigned int _x, _y;
218: {
219: int x = _x; /* we need signed int, since
220: * unsigned-signed=unsigned and */
221: int y = _y; /* abs and cast to double wouldn't work */
222: char pen, pen1;
223: int priority;
224: int delta;
225:
226: if (ABS(y - dumb_y) > ABS(x - dumb_x)) {
227: switch (dumb_pen) {
228: case DUMB_AXIS_CONST:
229: pen = ':';
230: pen1 = '+';
231: priority = 1;
232: break;
233:
234: case DUMB_BORDER_CONST:
235: pen = '|';
236: pen1 = '+';
237: priority = 2;
238: break;
239:
240: default:
241: pen = dumb_pen;
242: pen1 = dumb_pen;
243: priority = 3;
244: break;
245: }
246: dumb_set_pixel(dumb_x, dumb_y, pen1, priority);
247: for (delta = 1; delta < ABS(y - dumb_y); delta++) {
248: dumb_set_pixel(dumb_x + (int) ((double) (x - dumb_x) *
249: delta / ABS(y - dumb_y) + 0.5),
250: dumb_y + delta * sign(y - dumb_y), pen, priority);
251: }
252: dumb_set_pixel(x, y, pen1, priority);
253: } else if (ABS(x - dumb_x) > ABS(y - dumb_y)) {
254: switch (dumb_pen) {
255: case DUMB_AXIS_CONST:
256: pen = '.';
257: pen1 = '+';
258: priority = 1;
259: break;
260:
261: case DUMB_BORDER_CONST:
262: pen = '-';
263: pen1 = '+';
264: priority = 2;
265: break;
266:
267: default:
268: pen = dumb_pen;
269: pen1 = dumb_pen;
270: priority = 3;
271: break;
272: }
273: dumb_set_pixel(dumb_x, dumb_y, pen1, priority);
274: for (delta = 1; delta < ABS(x - dumb_x); delta++)
275: dumb_set_pixel(dumb_x + delta * sign(x - dumb_x),
276: dumb_y +
277: (int) ((double) (y - dumb_y) * delta / ABS(x - dumb_x)
278: + 0.5),
279: pen, priority);
280: dumb_set_pixel(x, y, pen1, priority);
281: } else {
282: switch (dumb_pen) {
283: case DUMB_AXIS_CONST: /* zero length axis */
284: pen = '+';
285: priority = 1;
286: break;
287:
288: case DUMB_BORDER_CONST: /* zero length border */
289: pen = '+';
290: priority = 2;
291: break;
292:
293: default:
294: pen = dumb_pen;
295: priority = 3;
296: break;
297: }
298: for (delta = 0; delta <= ABS(x - dumb_x); delta++)
299: dumb_set_pixel(dumb_x + delta * sign(x - dumb_x),
300: dumb_y + delta * sign(y - dumb_y),
301: pen, priority);
302: }
303: dumb_x = x;
304: dumb_y = y;
305: }
306:
307:
308: TERM_PUBLIC void DUMB_put_text(x, y, str)
309: unsigned int x, y;
310: char *str;
311: {
312: int length;
313:
314: length = strlen(str);
315: if (x + length > dumb_xmax)
316: x = GPMAX(0, dumb_xmax - length);
317:
318: for (; x < dumb_xmax && *str; x++, str++)
319: dumb_set_pixel(x, y, *str, 5);
320: }
321:
322:
323: TERM_PUBLIC void DUMB_arrow(sx, sy, ex, ey, head)
324: unsigned int sx, sy, ex, ey;
325: int head; /* ignored */
326: {
327: char saved_pen;
328: char saved_x;
329: char saved_y;
330:
331: saved_pen = dumb_pen;
332: saved_x = dumb_x;
333: saved_y = dumb_y;
334:
335: dumb_pen = '>';
336: dumb_x = sx;
337: dumb_y = sy;
338: DUMB_vector(ex, ey);
339:
340: dumb_pen = saved_pen;
341: dumb_x = saved_x;
342: dumb_y = saved_y;
343: }
344:
345: #endif /* TERM_BODY */
346:
347: #ifdef TERM_TABLE
348: TERM_TABLE_START(dumb_driver)
349: "dumb", "printer or glass dumb terminal",
350: DUMB_XMAX, DUMB_YMAX, 1, 1,
351: 1, 1, DUMB_options, DUMB_init, DUMB_reset,
352: DUMB_text, null_scale, DUMB_graphics, DUMB_move, DUMB_vector,
353: DUMB_linetype, DUMB_put_text, null_text_angle,
354: null_justify_text, DUMB_point, DUMB_arrow, set_font_null,
355: 0, /* pointsize */
356: TERM_CAN_MULTIPLOT
357: TERM_TABLE_END(dumb_driver)
358:
359: #undef LAST_TERM
360: #define LAST_TERM dumb_driver
361:
362: #endif /* TERM_TABLE */
363:
364: #ifdef TERM_HELP
365: START_HELP(dumb)
366: "1 dumb",
367: "?commands set terminal dumb",
368: "?set terminal dumb",
369: "?set term dumb",
370: "?terminal dumb",
371: "?term dumb",
372: "?dumb",
373: " The `dumb` terminal driver has an optional size specification and trailing",
374: " linefeed control.",
375: "",
376: " Syntax:",
377: " set terminal dumb {[no]feed} {<xsize> <ysize>}",
378: "",
379: " where <xsize> and <ysize> set the size of the dumb terminals. Default is",
380: " 79 by 24. The last newline is printed only if `feed` is enabled.",
381: "",
382: " Examples:",
383: " set term dumb nofeed",
384: " set term dumb 79 49 # VGA screen---why would anyone do that?"
385: END_HELP(dumb)
386: #endif /* TERM_HELP */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>