/* Hello, Emacs, this is -*-C-*- * $Id: gpic.trm,v 1.18 2006/07/21 02:35:46 sfeam Exp $ */ /* GNUPLOT - gpic.trm */ /*[ * Copyright 1993, 1998, 2004 * * 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 complete modified source code. Modifications are to * be distributed as patches to the released version. Permission to * distribute binaries produced by compiling modified sources is granted, * provided you * 1. distribute the corresponding source modifications from the * released version in the form of a patch file along with the binaries, * 2. add special version identification to distinguish your version * in addition to the base release version number, * 3. provide your name and address as the primary contact for the * support of your modified version, and * 4. retain our contact information in regard to use of the base * software. * Permission to distribute the released version of the source code along * with corresponding source modifications in the form of a patch file is * granted with same provisions 2 through 4 for binary distributions. * * This software is provided "as is" without express or implied warranty * to the extent permitted by applicable law. ]*/ /* * This file is included by ../term.c. */ /* * This terminal driver supports: * The GPIC graphics language for groff * * AUTHOR * Sigfrid Lundberg * * send your comments or suggestions to (siglun@volterra.teorekol.lu.se). * */ /* * adapted to the new terminal layout by Stefan Bodewig (Dec. 1995) */ #include "driver.h" #ifdef TERM_REGISTER register_term(gpic) #endif #ifdef TERM_PROTO TERM_PUBLIC void GPIC_options __PROTO((void)); TERM_PUBLIC void GPIC_init __PROTO((void)); TERM_PUBLIC void GPIC_graphics __PROTO((void)); TERM_PUBLIC void GPIC_text __PROTO((void)); TERM_PUBLIC void GPIC_linetype __PROTO((int linetype)); TERM_PUBLIC void GPIC_move __PROTO((unsigned int x, unsigned int y)); TERM_PUBLIC void GPIC_vector __PROTO((unsigned int ux, unsigned int uy)); TERM_PUBLIC void GPIC_arrow __PROTO((unsigned int sx, unsigned int sy, unsigned int ex, unsigned int ey, int head)); TERM_PUBLIC void GPIC_put_text __PROTO((unsigned int x, unsigned int y, const char str[])); TERM_PUBLIC int GPIC_justify_text __PROTO((enum JUSTIFY mode)); TERM_PUBLIC int GPIC_text_angle __PROTO((int ang)); TERM_PUBLIC void GPIC_reset __PROTO((void)); #define GPIC_DOTS_PER_INCH (300) /* 5 inches wide by 3 inches high (default) */ #define GPIC_XMAX (5*GPIC_DOTS_PER_INCH) #define GPIC_YMAX (3*GPIC_DOTS_PER_INCH) #define GPIC_HTIC (5*GPIC_DOTS_PER_INCH/72) #define GPIC_VTIC (5*GPIC_DOTS_PER_INCH/72) #define GPIC_HCHAR (GPIC_DOTS_PER_INCH*53/10/72) #define GPIC_VCHAR (GPIC_DOTS_PER_INCH*11/72) #endif /* TERM_PROTO */ #ifndef TERM_PROTO_ONLY #ifdef TERM_BODY #define GPIC_PTS_PER_INCH (72.27) /* dot size in pt */ #define GPIC_UNIT (GPIC_PTS_PER_INCH/GPIC_DOTS_PER_INCH) #define GPIC_coord(x) ((float)x)/((float)GPIC_DOTS_PER_INCH) static void GPIC_close_line __PROTO((void)); static float GPIC_x, GPIC_y; static unsigned int GPIC_ltype; static enum JUSTIFY GPIC_justify = LEFT; /* for DOTS point style */ static const char *GPIC_lines[] = { "thickness 1.0", /* -2 border */ "", /* -1 axes */ "", /* 0 solid thin */ "dotted", "dashed 0.05", /* 1 solid thick */ "dashed 0.075", /* 2 solid Thick */ }; /* number of linetypes above */ #define GPIC_NUMLINES (sizeof(GPIC_lines)/sizeof(char *)) static int GPIC_linecount = 0; /* number of points in line so far */ TERM_PUBLIC void GPIC_options() { float x, y; struct value a; GPIC_x = 0; GPIC_y = 0; if (!END_OF_COMMAND) { x = real(const_express(&a)); if (!END_OF_COMMAND) { y = real(const_express(&a)); GPIC_x = x; GPIC_y = y; } } sprintf(term_options, "Origin is at (%f,%f)", GPIC_x, GPIC_y); } TERM_PUBLIC void GPIC_init() { GPIC_linetype(-1); fputs(".\\\"GNUPLOT: GROFF picture using the gpic preprocessor\n", gpoutfile); } TERM_PUBLIC void GPIC_graphics() { register struct termentry *t = term; fprintf(gpoutfile, ".PS %f %f\n", GPIC_coord(t->xmax), GPIC_coord(t->ymax)); fprintf(gpoutfile, "x=%f; y=%f\n", GPIC_x, GPIC_y); } TERM_PUBLIC void GPIC_text() { GPIC_close_line(); fputs(".PE\n", gpoutfile); } TERM_PUBLIC void GPIC_linetype(int linetype) { if (linetype < -2) linetype = LT_BLACK; if (linetype >= GPIC_NUMLINES - 2) linetype %= (GPIC_NUMLINES - 2); GPIC_ltype = linetype; } static void GPIC_close_line() { if (GPIC_linecount > 0) { fputs("; reset linewid\n", gpoutfile); GPIC_linecount = 0; } } TERM_PUBLIC void GPIC_move(unsigned int x, unsigned int y) { GPIC_close_line(); fprintf(gpoutfile, "move to (x+%f,y+%f)\n", GPIC_coord(x), GPIC_coord(y)); GPIC_linecount = 1; } TERM_PUBLIC void GPIC_vector(unsigned int ux, unsigned int uy) { if (GPIC_linecount == 1) { fprintf(gpoutfile, "line %s to (x+%f,y+%f)", GPIC_lines[GPIC_ltype + 2], GPIC_coord(ux), GPIC_coord(uy)); } else { fprintf(gpoutfile, "\ \\\n\ then to (x+%f,y+%f)", GPIC_coord(ux), GPIC_coord(uy)); } GPIC_linecount++; } TERM_PUBLIC void GPIC_arrow( unsigned int sx, unsigned int sy, unsigned int ex, unsigned int ey, int head) { GPIC_close_line(); if (head) { fprintf(gpoutfile, "arrowhead=7; arrow from x+%f,y+%f to x+%f,y+%f\n", GPIC_coord(sx), GPIC_coord(sy), GPIC_coord(ex), GPIC_coord(ey)); } else { fprintf(gpoutfile, "line from x+%f,y+%f to x+%f,y+%f\n", GPIC_coord(sx), GPIC_coord(sy), GPIC_coord(ex), GPIC_coord(ey)); } } TERM_PUBLIC void GPIC_put_text(unsigned int x, unsigned int y, const char str[]) { GPIC_close_line(); fprintf(gpoutfile, "\"%s\" ", str); switch (GPIC_justify) { case LEFT:{ fputs("ljust ", gpoutfile); break; } case CENTRE:{ fputs(" ", gpoutfile); break; } case RIGHT:{ fputs("rjust ", gpoutfile); break; } } fprintf(gpoutfile, "at x+%f,y+%f\n", GPIC_coord(x), GPIC_coord(y)); } TERM_PUBLIC int GPIC_justify_text(enum JUSTIFY mode) { GPIC_justify = mode; return (TRUE); } TERM_PUBLIC int GPIC_text_angle(int ang) { (void) ang; GPIC_close_line(); return (FALSE); } TERM_PUBLIC void GPIC_reset() { fflush(gpoutfile); } #endif /* TERM_BODY */ #ifdef TERM_TABLE TERM_TABLE_START(gpic_driver) "gpic", "GPIC -- Produce graphs in groff using the gpic preprocessor", GPIC_XMAX, GPIC_YMAX, GPIC_VCHAR, GPIC_HCHAR, GPIC_VTIC, GPIC_HTIC, GPIC_options, GPIC_init, GPIC_reset, GPIC_text, null_scale, GPIC_graphics, GPIC_move, GPIC_vector, GPIC_linetype, GPIC_put_text, GPIC_text_angle, GPIC_justify_text, line_and_point, GPIC_arrow, set_font_null TERM_TABLE_END(gpic_driver) #undef LAST_TERM #define LAST_TERM gpic_driver #endif /* TERM_TABLE */ #endif /* TERM_PROTO_ONLY */ #ifdef TERM_HELP START_HELP(gpic) "1 gpic", "?commands set terminal gpic", "?set terminal gpic", "?set term gpic", "?terminal gpic", "?term gpic", "?gpic", " The `gpic` terminal driver generates GPIC graphs in the Free Software", " Foundations's \"groff\" package. The default size is 5 x 3 inches. The only", " option is the origin, which defaults to (0,0).", "", " Syntax:", " set terminal gpic { }", "", " where `x` and `y` are in inches.", "", " A simple graph can be formatted using", "", " groff -p -mpic -Tps file.pic > file.ps.", "", " The output from pic can be pipe-lined into eqn, so it is possible to put", " complex functions in a graph with the `set label` and `set {x/y}label`", " commands. For instance,", "", " set ylab '@space 0 int from 0 to x alpha ( t ) roman d t@'", "", " will label the y axis with a nice integral if formatted with the command:", "", " gpic filename.pic | geqn -d@@ -Tps | groff -m[macro-package] -Tps", " > filename.ps", "", " Figures made this way can be scaled to fit into a document. The pic language", " is easy to understand, so the graphs can be edited by hand if need be. All", " co-ordinates in the pic-file produced by `gnuplot` are given as x+gnuplotx", " and y+gnuploty. By default x and y are given the value 0. If this line is", " removed with an editor in a number of files, one can put several graphs in", " one figure like this (default size is 5.0x3.0 inches):", "", " .PS 8.0", " x=0;y=3", " copy \"figa.pic\"", " x=5;y=3", " copy \"figb.pic\"", " x=0;y=0", " copy \"figc.pic\"", " x=5;y=0", " copy \"figd.pic\"", " .PE", "", " This will produce an 8-inch-wide figure with four graphs in two rows on top", " of each other.", "", " One can also achieve the same thing by the command", "", " set terminal gpic x y", "", " for example, using", "", " .PS 6.0", " copy \"trig.pic\"", " .PE" END_HELP(gpic) #endif /* TERM_HELP */