home *** CD-ROM | disk | FTP | other *** search
- /* GNUPLOT - dumb.trm */
- /*
- * Copyright (C) 1991
- *
- * Permission to use, copy, and distribute this software and its
- * documentation for any purpose with or without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and
- * that both that copyright notice and this permission notice appear
- * in supporting documentation.
- *
- * Permission to modify the software is granted, but not the right to
- * distribute the modified code. Modifications are to be distributed
- * as patches to released version.
- *
- * This software is provided "as is" without express or implied warranty.
- *
- * This file is included by ../term.c.
- *
- * This terminal driver supports:
- * DUMB terminals
- *
- * AUTHORS
- * Francois Pinard, 91-04-03
- * INTERNET: pinard@iro.umontreal.ca
- *
- * send your comments or suggestions to (pixar!info-gnuplot@sun.com).
- *
- */
-
- #define DUMB_AXIS_CONST '\1'
- #define DUMB_BORDER_CONST '\2'
-
- #define DUMB_XMAX 79
- #define DUMB_YMAX 24
-
- static char *dumb_matrix = NULL; /* matrix of characters */
- static char *dumb_priority = NULL; /* matrix of priority at each position */
- static char dumb_pen; /* current character used to draw */
- static int dumb_x; /* current X position */
- static int dumb_y; /* current Y position */
- static int dumb_xmax = DUMB_XMAX;
- static int dumb_ymax = DUMB_YMAX;
-
- #define DUMB_PIXEL(x,y) dumb_matrix[dumb_xmax*(y)+(x)]
-
-
- dumb_set_pixel(x,y,v,p)
- int x,y,v,p;
- {
- if (p > dumb_priority[dumb_xmax*y+x])
- {
- dumb_matrix[dumb_xmax*y+x] = v;
- dumb_priority[dumb_xmax*y+x] = p;
- }
- }
-
-
- DUMB_options()
- {
- int x,y;
- struct value a;
- extern struct value *const_express();
- extern double real();
-
- if (!END_OF_COMMAND) {
- x = (int) real(const_express(&a));
- if (!END_OF_COMMAND) {
- y = (int) real(const_express(&a));
- dumb_xmax = term_tbl[term].xmax = x;
- dumb_ymax = term_tbl[term].ymax = y;
- }
- }
-
- sprintf(term_options, "%d %d",dumb_xmax,dumb_ymax);
- }
-
-
- DUMB_init()
- {
- if (dumb_matrix)
- free(dumb_matrix);
-
- dumb_matrix = alloc (dumb_xmax * dumb_ymax * 2, "dumb terminal");
-
- dumb_priority = dumb_matrix + dumb_xmax * dumb_ymax;
- }
-
-
- char *
- DUMB_str_state()
- {
- static char str[80];
-
- sprintf( str, "%d %d", dumb_xmax, dumb_ymax );
-
- return str;
- }
-
-
- DUMB_graphics ()
- {
- int i;
- char *pm = dumb_matrix, *pp = dumb_priority;
-
- for ( i = dumb_xmax * dumb_ymax; i > 0; i-- ) {
- *pm++ = ' ';
- *pp++ = 0;
- }
- }
-
-
- DUMB_text ()
- {
- int x, y, l;
-
- putc ('\f', outfile);
- for (y = dumb_ymax - 1; y >= 0; y--)
- {
- for (l = dumb_xmax; l > 0 && DUMB_PIXEL (l - 1, y) == ' '; l--)
- ;
- for (x = 0; x < l; x++)
- putc (DUMB_PIXEL (x, y), outfile);
- if (y > 0)
- putc ('\n', outfile);
- }
- fflush (outfile);
- }
-
-
- DUMB_reset()
- {
- free (dumb_matrix);
- dumb_matrix = NULL;
- }
-
-
- DUMB_linetype(linetype)
- int linetype;
- {
- static char pen_type[7] = {'*', '#', '$', '%', '@', '&', '='};
-
- if (linetype == -2)
- dumb_pen = DUMB_BORDER_CONST;
- else if (linetype == -1)
- dumb_pen = DUMB_AXIS_CONST;
- else
- {
- linetype = linetype % 7;
- dumb_pen = pen_type[linetype];
- }
- }
-
-
- DUMB_move(x, y)
- int x, y;
- {
- dumb_x = x;
- dumb_y = y;
- }
-
-
- DUMB_point(x,y,point)
- int x,y,point;
- {
- dumb_set_pixel (x, y, point == -1 ? '.' : point % 26 + 'A', 4);
- }
-
-
- DUMB_vector(x,y)
- int x,y;
- {
- char pen, pen1;
- int priority;
- int delta;
-
- if (abs (y - dumb_y) > abs (x - dumb_x))
- {
- switch (dumb_pen)
- {
- case DUMB_AXIS_CONST:
- pen = ':';
- pen1 = '+';
- priority = 1;
- break;
-
- case DUMB_BORDER_CONST:
- pen = '|';
- pen1 = '+';
- priority = 2;
- break;
-
- default:
- pen = dumb_pen;
- pen1 = dumb_pen;
- priority = 3;
- break;
- }
- dumb_set_pixel (dumb_x, dumb_y, pen1, priority);
- for (delta = 1; delta < abs (y - dumb_y); delta++)
- dumb_set_pixel (dumb_x
- + (int) ((double) (x - dumb_x) * delta / abs(y - dumb_y)
- + 0.5),
- dumb_y + delta * sign (y - dumb_y),
- pen, priority);
- dumb_set_pixel (x, y, pen1, priority);
- }
- else if (abs (x - dumb_x) > abs (y - dumb_y))
- {
- switch (dumb_pen)
- {
- case DUMB_AXIS_CONST:
- pen = '.';
- pen1 = '+';
- priority = 1;
- break;
-
- case DUMB_BORDER_CONST:
- pen = '-';
- pen1 = '+';
- priority = 2;
- break;
-
- default:
- pen = dumb_pen;
- pen1 = dumb_pen;
- priority = 3;
- break;
- }
- dumb_set_pixel (dumb_x, dumb_y, pen1, priority);
- for (delta = 1; delta < abs (x - dumb_x); delta++)
- dumb_set_pixel (dumb_x + delta * sign (x - dumb_x),
- dumb_y +
- (int) ((double) (y - dumb_y) * delta / abs(x - dumb_x)
- + 0.5),
- pen, priority);
- dumb_set_pixel (x, y, pen1, priority);
- }
- else
- {
- switch (dumb_pen)
- {
- case DUMB_AXIS_CONST: /* zero length axis */
- pen = '+';
- priority = 1;
- break;
-
- case DUMB_BORDER_CONST: /* zero length border */
- pen = '+';
- priority = 2;
- break;
-
- default:
- pen = dumb_pen;
- priority = 3;
- break;
- }
- for (delta = 0; delta <= abs (x - dumb_x); delta++)
- dumb_set_pixel (dumb_x + delta * sign (x - dumb_x),
- dumb_y + delta * sign (y - dumb_y),
- pen, priority);
- }
- dumb_x = x;
- dumb_y = y;
- }
-
-
- DUMB_put_text(x,y,str)
- int x, y;
- char *str;
- {
- int length;
- int delta;
-
- length = strlen(str);
- if (x + length > dumb_xmax)
- x = max (0, dumb_xmax - length);
-
- for (; x < dumb_xmax && *str; x++, str++)
- dumb_set_pixel (x, y, *str, 5);
- }
-
-
- DUMB_arrow (sx,sy,ex,ey)
- int sx,sy,ex,ey;
- {
- char saved_pen;
- char saved_x;
- char saved_y;
-
- saved_pen = dumb_pen;
- saved_x = dumb_x;
- saved_y = dumb_y;
-
- dumb_pen = '>';
- dumb_x = sx;
- dumb_y = sy;
- DUMB_vector (ex,ey);
-
- dumb_pen = saved_pen;
- dumb_x = saved_x;
- dumb_y = saved_y;
- }
-