Annotation of OpenXM_contrib/gnuplot/term/gpic.trm, Revision 1.1.1.1
1.1 maekawa 1: /*
2: * $Id: gpic.trm,v 1.16 1998/04/14 00:17:46 drd Exp $
3: */
4:
5: /* GNUPLOT - gpic.trm -*-C-*- */
6:
7: /*[
8: * Copyright 1993, 1998
9: *
10: * Permission to use, copy, and distribute this software and its
11: * documentation for any purpose with or without fee is hereby granted,
12: * provided that the above copyright notice appear in all copies and
13: * that both that copyright notice and this permission notice appear
14: * in supporting documentation.
15: *
16: * Permission to modify the software is granted, but not the right to
17: * distribute the complete modified source code. Modifications are to
18: * be distributed as patches to the released version. Permission to
19: * distribute binaries produced by compiling modified sources is granted,
20: * provided you
21: * 1. distribute the corresponding source modifications from the
22: * released version in the form of a patch file along with the binaries,
23: * 2. add special version identification to distinguish your version
24: * in addition to the base release version number,
25: * 3. provide your name and address as the primary contact for the
26: * support of your modified version, and
27: * 4. retain our contact information in regard to use of the base
28: * software.
29: * Permission to distribute the released version of the source code along
30: * with corresponding source modifications in the form of a patch file is
31: * granted with same provisions 2 through 4 for binary distributions.
32: *
33: * This software is provided "as is" without express or implied warranty
34: * to the extent permitted by applicable law.
35: ]*/
36:
37: /*
38: * This file is included by ../term.c.
39: */
40:
41: /*
42: * This terminal driver supports:
43: * The GPIC graphics language for groff
44: *
45: * AUTHOR
46: * Sigfrid Lundberg
47: *
48: * send your comments or suggestions to (siglun@volterra.teorekol.lu.se).
49: *
50: */
51:
52: /*
53: * adapted to the new terminal layout by Stefan Bodewig (Dec. 1995)
54: */
55:
56: #include "driver.h"
57:
58: #ifdef TERM_REGISTER
59: register_term(gpic)
60: #endif
61:
62: #ifdef TERM_PROTO
63: TERM_PUBLIC void GPIC_options __PROTO((void));
64: TERM_PUBLIC void GPIC_init __PROTO((void));
65: TERM_PUBLIC void GPIC_graphics __PROTO((void));
66: TERM_PUBLIC void GPIC_text __PROTO((void));
67: TERM_PUBLIC void GPIC_linetype __PROTO((int linetype));
68: TERM_PUBLIC void GPIC_move __PROTO((unsigned int x, unsigned int y));
69: TERM_PUBLIC void GPIC_vector __PROTO((unsigned int ux, unsigned int uy));
70: TERM_PUBLIC void GPIC_arrow __PROTO((unsigned int sx, unsigned int sy,
71: unsigned int ex, unsigned int ey,
72: TBOOLEAN head));
73: TERM_PUBLIC void GPIC_put_text __PROTO((unsigned int x, unsigned int y,
74: char str[]));
75: TERM_PUBLIC int GPIC_justify_text __PROTO((enum JUSTIFY mode));
76: TERM_PUBLIC int GPIC_text_angle __PROTO((int ang));
77: TERM_PUBLIC void GPIC_reset __PROTO((void));
78: #define GPIC_DOTS_PER_INCH (300)
79:
80: /* 5 inches wide by 3 inches high (default) */
81: #define GPIC_XMAX (5*GPIC_DOTS_PER_INCH)
82: #define GPIC_YMAX (3*GPIC_DOTS_PER_INCH)
83:
84: #define GPIC_HTIC (5*GPIC_DOTS_PER_INCH/72)
85: #define GPIC_VTIC (5*GPIC_DOTS_PER_INCH/72)
86: #define GPIC_HCHAR (GPIC_DOTS_PER_INCH*53/10/72)
87: #define GPIC_VCHAR (GPIC_DOTS_PER_INCH*11/72)
88: #endif /* TERM_PROTO */
89:
90: #ifndef TERM_PROTO_ONLY
91: #ifdef TERM_BODY
92:
93: #define GPIC_PTS_PER_INCH (72.27)
94: /* dot size in pt */
95: #define GPIC_UNIT (GPIC_PTS_PER_INCH/GPIC_DOTS_PER_INCH)
96: #define GPIC_coord(x) ((float)x)/((float)GPIC_DOTS_PER_INCH)
97:
98: void GPIC_close_line __PROTO((void));
99: static float GPIC_x, GPIC_y;
100: static unsigned int GPIC_ltype;
101: enum JUSTIFY GPIC_justify = LEFT;
102:
103: /* for DOTS point style */
104:
105: static char *GPIC_lines[] =
106: {
107: "thickness 1.0", /* -2 border */
108: "", /* -1 axes */
109: "", /* 0 solid thin */
110: "dotted",
111: "dashed 0.05", /* 1 solid thick */
112: "dashed 0.075", /* 2 solid Thick */
113: };
114:
115: /* number of linetypes above */
116: #define GPIC_NUMLINES (sizeof(GPIC_lines)/sizeof(char *))
117:
118:
119: static int GPIC_linecount = 0; /* number of points in line so far */
120:
121:
122: TERM_PUBLIC void GPIC_options()
123: {
124: float x, y;
125: struct value a;
126:
127: GPIC_x = 0;
128: GPIC_y = 0;
129:
130: if (!END_OF_COMMAND) {
131: x = real(const_express(&a));
132: if (!END_OF_COMMAND) {
133: y = real(const_express(&a));
134: GPIC_x = x;
135: GPIC_y = y;
136: }
137: }
138: sprintf(term_options, "Origin is at (%f,%f)", GPIC_x, GPIC_y);
139:
140: }
141:
142: TERM_PUBLIC void GPIC_init()
143: {
144: GPIC_linetype(-1);
145: fputs(".\\\"GNUPLOT: GROFF picture using the gpic preprocessor\n", gpoutfile);
146: }
147:
148:
149:
150: TERM_PUBLIC void GPIC_graphics()
151: {
152: register struct termentry *t = term;
153:
154: fprintf(gpoutfile, ".PS %f %f\n", GPIC_coord(t->xmax),
155: GPIC_coord(t->ymax));
156: fprintf(gpoutfile, "x=%f; y=%f\n", GPIC_x, GPIC_y);
157: }
158:
159:
160: TERM_PUBLIC void GPIC_text()
161: {
162: GPIC_close_line();
163: fputs(".PE\n", gpoutfile);
164: }
165:
166: TERM_PUBLIC void GPIC_linetype(linetype)
167: int linetype;
168: {
169: if (linetype >= GPIC_NUMLINES - 2)
170: linetype %= (GPIC_NUMLINES - 2);
171: GPIC_ltype = linetype;
172: }
173:
174: void GPIC_close_line()
175: {
176: if (GPIC_linecount > 0) {
177: fputs("; reset linewid\n", gpoutfile);
178: GPIC_linecount = 0;
179: }
180: }
181:
182: TERM_PUBLIC void GPIC_move(x, y)
183: unsigned int x, y;
184: {
185: GPIC_close_line();
186: fprintf(gpoutfile, "move to (x+%f,y+%f)\n", GPIC_coord(x), GPIC_coord(y));
187: GPIC_linecount = 1;
188: }
189:
190:
191: TERM_PUBLIC void GPIC_vector(ux, uy)
192: unsigned int ux, uy;
193: {
194: if (GPIC_linecount == 1) {
195: fprintf(gpoutfile, "line %s to (x+%f,y+%f)",
196: GPIC_lines[GPIC_ltype + 2],
197: GPIC_coord(ux), GPIC_coord(uy));
198: } else {
199: fprintf(gpoutfile, "\
200: \\\n\
201: then to (x+%f,y+%f)",
202: GPIC_coord(ux), GPIC_coord(uy));
203: }
204: GPIC_linecount++;
205: }
206:
207:
208: TERM_PUBLIC void GPIC_arrow(sx, sy, ex, ey, head)
209: unsigned int sx, sy, ex, ey;
210: TBOOLEAN head;
211: {
212: GPIC_close_line();
213: if (head) {
214: fprintf(gpoutfile, "arrowhead=7; arrow from x+%f,y+%f to x+%f,y+%f\n",
215: GPIC_coord(sx), GPIC_coord(sy), GPIC_coord(ex), GPIC_coord(ey));
216: } else {
217: fprintf(gpoutfile, "line from x+%f,y+%f to x+%f,y+%f\n",
218: GPIC_coord(sx), GPIC_coord(sy), GPIC_coord(ex), GPIC_coord(ey));
219: }
220: }
221:
222:
223: TERM_PUBLIC void GPIC_put_text(x, y, str)
224: unsigned int x, y; /* reference point of string */
225: char str[]; /* the text */
226: {
227: GPIC_close_line();
228: fprintf(gpoutfile, "\"%s\" ", str);
229: switch (GPIC_justify) {
230: case LEFT:{
231: fputs("ljust ", gpoutfile);
232: break;
233: }
234: case CENTRE:{
235: fputs(" ", gpoutfile);
236: break;
237: }
238: case RIGHT:{
239: fputs("rjust ", gpoutfile);
240: break;
241: }
242: }
243: fprintf(gpoutfile, "at x+%f,y+%f\n", GPIC_coord(x), GPIC_coord(y));
244: }
245:
246:
247:
248: TERM_PUBLIC int GPIC_justify_text(mode)
249: enum JUSTIFY mode;
250: {
251: GPIC_justify = mode;
252: return (TRUE);
253: }
254:
255: TERM_PUBLIC int GPIC_text_angle(ang)
256: int ang;
257: {
258: GPIC_close_line();
259: return (FALSE);
260: }
261:
262: TERM_PUBLIC void GPIC_reset()
263: {
264: fflush(gpoutfile);
265: }
266:
267: #endif /* TERM_BODY */
268:
269: #ifdef TERM_TABLE
270:
271: TERM_TABLE_START(gpic_driver)
272: "gpic", "GPIC -- Produce graphs in groff using the gpic preprocessor",
273: GPIC_XMAX, GPIC_YMAX, GPIC_VCHAR, GPIC_HCHAR,
274: GPIC_VTIC, GPIC_HTIC, GPIC_options, GPIC_init, GPIC_reset,
275: GPIC_text, null_scale, GPIC_graphics, GPIC_move, GPIC_vector,
276: GPIC_linetype, GPIC_put_text, GPIC_text_angle,
277: GPIC_justify_text, line_and_point, GPIC_arrow, set_font_null
278: TERM_TABLE_END(gpic_driver)
279: #undef LAST_TERM
280: #define LAST_TERM gpic_driver
281:
282: #endif /* TERM_TABLE */
283: #endif /* TERM_PROTO_ONLY */
284:
285: #ifdef TERM_HELP
286: START_HELP(gpic)
287: "1 gpic",
288: "?commands set terminal gpic",
289: "?set terminal gpic",
290: "?set term gpic",
291: "?terminal gpic",
292: "?term gpic",
293: "?gpic",
294: " The `gpic` terminal driver generates GPIC graphs in the Free Software",
295: " Foundations's \"groff\" package. The default size is 5 x 3 inches. The only",
296: " option is the origin, which defaults to (0,0).",
297: "",
298: " Syntax:",
299: " set terminal gpic {<x> <y>}",
300: "",
301: " where `x` and `y` are in inches.",
302: "",
303: " A simple graph can be formatted using",
304: "",
305: " groff -p -mpic -Tps file.pic > file.ps.",
306: "",
307: " The output from pic can be pipe-lined into eqn, so it is possible to put",
308: " complex functions in a graph with the `set label` and `set {x/y}label`",
309: " commands. For instance,",
310: "",
311: " set ylab '@space 0 int from 0 to x alpha ( t ) roman d t@'",
312: "",
313: " will label the y axis with a nice integral if formatted with the command:",
314: "",
315: " gpic filename.pic | geqn -d@@ -Tps | groff -m[macro-package] -Tps",
316: " > filename.ps",
317: "",
318: " Figures made this way can be scaled to fit into a document. The pic language",
319: " is easy to understand, so the graphs can be edited by hand if need be. All",
320: " co-ordinates in the pic-file produced by `gnuplot` are given as x+gnuplotx",
321: " and y+gnuploty. By default x and y are given the value 0. If this line is",
322: " removed with an editor in a number of files, one can put several graphs in",
323: " one figure like this (default size is 5.0x3.0 inches):",
324: "",
325: " .PS 8.0",
326: " x=0;y=3",
327: " copy \"figa.pic\"",
328: " x=5;y=3",
329: " copy \"figb.pic\"",
330: " x=0;y=0",
331: " copy \"figc.pic\"",
332: " x=5;y=0",
333: " copy \"figd.pic\"",
334: " .PE",
335: "",
336: " This will produce an 8-inch-wide figure with four graphs in two rows on top",
337: " of each other.",
338: "",
339: " One can also achieve the same thing by the command",
340: "",
341: " set terminal gpic x y",
342: "",
343: " for example, using",
344: "",
345: " .PS 6.0",
346: " copy \"trig.pic\"",
347: " .PE"
348: END_HELP(gpic)
349: #endif /* TERM_HELP */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>