Annotation of OpenXM_contrib/gnuplot/term/fig.trm, Revision 1.1.1.2
1.1 maekawa 1: /*
1.1.1.2 ! maekawa 2: * $Id: fig.trm,v 1.10.2.1 1999/08/22 18:52:28 lhecking Exp $
1.1 maekawa 3: */
4:
5: /* GNUPLOT - fig.trm */
6:
7: /*[
8: * Copyright 1990 - 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: * This terminal driver supports:
41: * Fig graphics language
42: *
43: * AUTHORS
44: * Micah Beck, David Kotz
45: *
46: * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
47: *
48: */
49:
50: /*
51: * Original for Fig code output by Micah Beck, 1989
52: * Department of Computer Science, Cornell University
53: * Updated by David Kotz for gnuplot 2.0
54: * More efficient output by Ian Dall
55: * Updated to FIG 2.1 (with color) format by Vivek Khera
56: * Updated to FIG 3.1 (higher resolution) format by Ian MacPhedran, Jan 1995
57: * Updated to conform to newterm format Ian MacPhedran, Apr 1995
58: * Point-count option joachim.selinger@ins.uni-stuttgart.de (JFS) Feb 9 1996
59: * More options (portrait/landscape, metric/inches, size, fontsize, thickness)
60: * plus symbols and depth/thickness by bernlohr@eu1.mpi-hd.mpg.de (KB) Aug 15 1996
61: */
62:
63: #include "driver.h"
64:
65: #ifdef TERM_REGISTER
66: register_term(fig)
67: #endif /* TERM_REGISTER */
68:
69: #ifdef TERM_PROTO
70: TERM_PUBLIC void FIG_options __PROTO((void));
71: TERM_PUBLIC void FIG_init __PROTO((void));
72: TERM_PUBLIC void FIG_graphics __PROTO((void));
73: TERM_PUBLIC void FIG_text __PROTO((void));
74: TERM_PUBLIC void FIG_linetype __PROTO((int linetype));
75: TERM_PUBLIC void FIG_move __PROTO((unsigned int x, unsigned int y));
76: TERM_PUBLIC void FIG_vector __PROTO((unsigned int ux, unsigned int uy));
77: TERM_PUBLIC void FIG_arrow __PROTO((unsigned int sx, unsigned int sy, unsigned int ex, unsigned int ey, TBOOLEAN head));
78: TERM_PUBLIC void FIG_put_text __PROTO((unsigned int x, unsigned int y, char *str));
79: TERM_PUBLIC int FIG_justify_text __PROTO((enum JUSTIFY mode));
80: TERM_PUBLIC int FIG_text_angle __PROTO((int ang));
81: TERM_PUBLIC void FIG_pointsize __PROTO((double arg_pointsize));
82: TERM_PUBLIC void FIG_linewidth __PROTO((double linewidth));
83: TERM_PUBLIC void FIG_reset __PROTO((void));
84: TERM_PUBLIC void FIG_lpoint __PROTO((unsigned int x, unsigned int y, int number));
85:
86: #define GOT_FIG_PROTO
87: #endif /* TERM_PROTO */
88:
89: #ifndef TERM_PROTO_ONLY
90: #ifdef TERM_BODY
91:
92: #include "object.h" /* modified from the XFig distribution */
93: #define FIG_DEFAULT DEFAULT
94: #define FIG_ROMAN_FONT (0) /* actually, the default font */
95:
96: #ifndef FIG_RES
97: /* This is now 1200 per inch */
98: #define FIG_RES (1200)
99: #endif
100:
101: #define FIG_COORD_SYS 2
102: #define FIG_ORIENT (FIG_portrait?"Portrait":"Landscape")
103: /* Could be "Portrait" */
104: #define FIG_JUST "Center"
105: /* Could be "Flush Left" */
106: #define FIG_UNIT (FIG_inches?"Inches":"Metric")
107: /* Could be "Inches" */
108:
109: #define FIG_MAGIC "#FIG 3.1"
110: #define FIG_HTIC (5*FIG_RES/80)
111: #define FIG_VTIC (5*FIG_RES/80)
112: #define FIG_FONT_S (10) /* size in points */
113: #define FIG_MAX_POINTS 99999L /* almost infinite ;-) */
114:
115: #define FIG_to_pixel_v(s) ((s)*FIG_RES/72*3/4) /* height of font in pixels */
116: /* This is fudged to enlarge the drawing area, but gives fairly good results */
117: #define FIG_to_pixel_h(s) (FIG_to_pixel_v(s)*6/10) /* this is a guess at the width */
118:
119: #define FIG_VCHAR FIG_to_pixel_v(FIG_FONT_S) /* just for default, */
120: #define FIG_HCHAR FIG_to_pixel_h(FIG_FONT_S) /* not really used */
121:
122: enum FIG_poly_stat {
123: FIG_poly_new, FIG_poly_part
124: };
125:
126: static int FIG_posx;
127: static int FIG_posy;
128: static long FIG_poly_vec_cnt;
129: static int FIG_depth = 10;
130: static int FIG_linedepth = 10;
131: static int FIG_thickness = 1;
132: static int FIG_default_thickness = 1;
133: static double FIG_current_pointsize = 1.;
134: static double FIG_current_linewidth = 1.;
135:
136: /* Maximum number of points per POLYLINE.
137: Default 1000 (hardcoded in help section as well) */
138: static int FIG_poly_vec_max = 999; /* JFS */
139:
140: static enum FIG_poly_stat FIG_polyvec_stat;
141:
142: /* 5 inches wide by 3 inches high */
143: #define FIG_XMAX (5 * FIG_RES)
144: #define FIG_YMAX (3 * FIG_RES)
145:
146: #define FIG_XOFF (FIG_RES/4)
147: #define FIG_YOFF (FIG_RES/4)
148:
149:
150: #define BFIG_HTIC (7*FIG_RES/80)
151: #define BFIG_VTIC (7*FIG_RES/80)
152: #define BFIG_FONT_S (16) /* size in points */
153: #define BFIG_VCHAR FIG_to_pixel_v(BFIG_FONT_S) /* height in pixels of font */
154: #define BFIG_HCHAR FIG_to_pixel_h(BFIG_FONT_S) /* this is a guess at the width */
155:
156: static F_point *FIG_points = NULL; /* Array for the collection of points for
157: POLYLINE, allocated on demand. */
158: static F_line FIG_line;
159:
160: /* 8 inches wide by 5 inches high */
161: #define BFIG_XMAX (8 * FIG_RES)
162: #define BFIG_YMAX (5 * FIG_RES)
163:
164: #define BFIG_XOFF (FIG_RES/2)
165: #define BFIG_YOFF (FIG_RES/2)
166:
167:
168: static int FIG_type; /* negative types use real lines */
169: static float FIG_spacing; /* length of dash or dot spacing */
170: static int FIG_justify; /* Fig justification T_*_JUSTIFIED */
171: static float FIG_angle; /* Fig text angle 0=horiz, Pi/2=vert */
172: static int FIG_use_color = FALSE; /* do we use color or not? */
173: static int FIG_is_big = FALSE; /* big plot ? */
174: static int FIG_color = DEFAULT; /* which color to use */
175: static int FIG_xoff = FIG_XOFF;
176: static int FIG_yoff = FIG_YOFF;
177: static int FIG_font_s = FIG_FONT_S;
178: static int FIG_portrait = FALSE;
179: static int FIG_inches = FALSE;
180:
181: static void FIG_poly_clean __PROTO((enum FIG_poly_stat fig_stat));
182:
183:
184: #define FIG_POINT_TYPES POINT_TYPES /* we use the same points */
185:
186:
187: static void FIG_poly_clean(fig_stat)
188: enum FIG_poly_stat fig_stat;
189: {
190: int i, j;
191: if (fig_stat == FIG_poly_part) {
192: fprintf(gpoutfile, "%d %d %d %d %d %d %d %d %d %9.3f %d %d %d %d %d %ld\n\t",
193: O_POLYLINE, FIG_line.type, FIG_line.style, FIG_line.thickness,
194: FIG_line.pen_color, FIG_line.fill_color, FIG_line.depth,
195: FIG_line.pen_style, FIG_line.fill_style, FIG_line.style_val,
196: FIG_line.join_style, FIG_line.cap_style, FIG_line.radius,
197: 0, 0, FIG_poly_vec_cnt);
198:
199: j = 0;
200: for (i = 0; i < FIG_poly_vec_cnt; i++) {
201: fprintf(gpoutfile, " %d %d", FIG_points[i].x, FIG_points[i].y);
202: if (j++ > 4 && i != FIG_poly_vec_cnt - 1) {
203: fputs("\n\t", gpoutfile);
204: j = 0; /* JFS */
205: }
206: }
207: if (j != 0) {
208: putc('\n', gpoutfile);
209: }
210: /* Give the memory back to the system because we are done with this
211: * polyline. Make sure FIG_points contains NULL afterwards!
212: */
213: free(FIG_points);
214: FIG_points = NULL;
215: }
216: FIG_polyvec_stat = FIG_poly_new;
217: }
218:
219: TERM_PUBLIC void FIG_options()
220: {
221: static char *options_list = /* sun cc does not concat strings */
222: "expecting monochrome, color, small, big, portrait, landscape,\n\
223: \t inches, metric, size <number> <number>, fontsize <number>,\n\
224: \t thickness <numer>, depth <number> or pointsmax <number>";
225:
226: int parse_error = FALSE;
227: long temp_max;
228: struct value a;
229: unsigned int tmax_t;
230: double xsize_t, ysize_t;
231:
232: FIG_use_color = FALSE; /* default */
233: FIG_is_big = FALSE; /* default */
234: FIG_portrait = FALSE;
235: FIG_font_s = 0;
236: FIG_default_thickness = 1;
237: xsize_t = ysize_t = 0.;
238: #if METRIC
239: FIG_inches = FALSE;
240: #else
241: FIG_inches = TRUE;
242: #endif
243: while (!END_OF_COMMAND) {
244: if (almost_equals(c_token, "mo$nochrome")) {
245: FIG_use_color = FALSE;
246: c_token++;
247: } else if (almost_equals(c_token, "c$olor")
248: || almost_equals(c_token, "c$olour")) {
249: FIG_use_color = TRUE;
250: c_token++;
251: } else if (almost_equals(c_token, "sm$all")) {
252: FIG_is_big = FALSE;
253: c_token++;
254: } else if (almost_equals(c_token, "b$ig")) {
255: FIG_is_big = TRUE;
256: c_token++;
257: } else if (almost_equals(c_token, "in$ches")) { /* KB */
258: FIG_inches = TRUE;
259: c_token++;
260: } else if (almost_equals(c_token, "me$tric")) { /* KB */
261: FIG_inches = FALSE;
262: c_token++;
263: } else if (almost_equals(c_token, "por$trait")) { /* KB */
264: /* KB: Would have preferred "p$ortrait" but that would */
265: /* collide with "p$ointsmax" below. */
266: FIG_portrait = TRUE;
267: c_token++;
268: } else if (almost_equals(c_token, "l$andscape")) { /* KB */
269: FIG_portrait = FALSE;
270: c_token++;
271: } else if (almost_equals(c_token, "si$ze")) { /* KB */
272: c_token++;
273: if (END_OF_COMMAND) {
274: int_error("size: 2 numbers expected", c_token);
275: } else {
276: xsize_t = real(const_express(&a));
277: if (END_OF_COMMAND) {
278: int_error("size: 2 numbers expected", c_token);
279: xsize_t = 0.;
280: } else {
281: ysize_t = real(const_express(&a));
282: }
283: if (xsize_t < 2. || ysize_t < 2. || xsize_t > 99. || ysize_t > 99.) {
284: if (xsize_t != 0. || ysize_t != 0.)
285: int_error("size: out of range", c_token);
286: xsize_t = ysize_t = 0.;
287: }
288: }
289: } else if (almost_equals(c_token, "f$ontsize")) { /* KB */
290: c_token++;
291: if (END_OF_COMMAND) {
292: int_error("fontsize: number expected", c_token);
293: } else {
294: FIG_font_s = (int) real(const_express(&a));
295: if (FIG_font_s < 5 || FIG_font_s > 36) {
296: int_error("fontsize out of range", c_token - 1);
297: FIG_font_s = 0;
298: }
299: }
300: } else if (almost_equals(c_token, "t$hickness")) { /* KB */
301: c_token++;
302: if (END_OF_COMMAND) {
303: int_error("thickness: number expected", c_token);
304: } else {
305: FIG_default_thickness = (int) real(const_express(&a));
306: if (FIG_default_thickness < 1 || FIG_default_thickness > 10) {
307: int_error("thickness out of range", c_token - 1);
308: FIG_default_thickness = 1;
309: }
310: }
311: } else if (almost_equals(c_token, "d$epth")) { /* KB */
312: c_token++;
313: if (END_OF_COMMAND) {
314: int_error("depth: number expected", c_token);
315: } else {
316: FIG_depth = (int) real(const_express(&a));
317: if (FIG_depth < 0 || FIG_depth > 99) {
318: int_error("depth out of range", c_token - 1);
319: FIG_depth = 10;
320: }
321: FIG_linedepth = FIG_depth;
322: }
323: } else if (almost_equals(c_token, "poi$ntsmax")) { /* JFS */
324: /* Skip the word and then expect the number ! */
325: c_token++;
326: if (END_OF_COMMAND) {
327: int_error("max. points per polyline: number expected", c_token);
328: } else {
329: temp_max = (long) real(const_express(&a));
330: /* Now check the range for the number */
331: if ((temp_max > 1) && (temp_max < (FIG_MAX_POINTS + 2))) {
332: /* OK. subtract one to the right number! See other numbers... */
333: FIG_poly_vec_max = temp_max - 1;
334: } else {
335: char t[128];
336:
337: sprintf(t, "pointsmax: number out of range (2,%ld)",
338: (FIG_MAX_POINTS + 1));
339: int_error(t, c_token);
340: }
341: }
342: } else {
343: parse_error = TRUE;
344: int_error(options_list, c_token);
345: }
346: }
347:
348: sprintf(term_options, "%s %s %s %d %s %s %s %d %s %d %s %d",
349: FIG_use_color ? "color" : "monochrome",
350: FIG_is_big ? "big" : "small",
351: "pointsmax",
352: FIG_poly_vec_max + 1,
353: FIG_portrait ? "portrait" : "landscape",
354: FIG_inches ? "inches" : "metric",
355: "fontsize", (FIG_font_s > 0 ? FIG_font_s :
356: (FIG_is_big ? BFIG_FONT_S : FIG_FONT_S)),
357: "thickness", FIG_default_thickness, "depth", FIG_depth); /* JFS, KB */
358: if (xsize_t > 0. && ysize_t > 0.) {
359: if (xsize_t - (int) xsize_t == 0. && ysize_t - (int) ysize_t == 0.)
360: sprintf(term_options + strlen(term_options),
361: " size %d %d", (int) xsize_t, (int) ysize_t);
362: else
363: sprintf(term_options + strlen(term_options),
364: " size %f %f", xsize_t, ysize_t);
365: }
366: if (!FIG_is_big) {
367: if (FIG_font_s == 0) /* KB */
368: FIG_font_s = FIG_FONT_S;
369: term->xmax = FIG_XMAX;
370: term->ymax = FIG_YMAX;
371: term->v_tic = FIG_VTIC;
372: term->h_tic = FIG_HTIC;
373: FIG_xoff = FIG_XOFF;
374: FIG_yoff = FIG_YOFF;
375: } else {
376: if (FIG_font_s == 0) /* KB */
377: FIG_font_s = BFIG_FONT_S;
378: term->xmax = BFIG_XMAX;
379: term->ymax = BFIG_YMAX;
380: term->v_tic = BFIG_VTIC;
381: term->h_tic = BFIG_HTIC;
382: FIG_xoff = BFIG_XOFF;
383: FIG_yoff = BFIG_YOFF;
384: }
385: if (FIG_portrait) { /* KB */
386: tmax_t = term->xmax;
387: term->xmax = term->ymax;
388: term->ymax = tmax_t;
389: }
390: if (xsize_t > 0. && ysize_t > 0.) {
391: if (FIG_inches) {
392: term->xmax = (unsigned int) (xsize_t * FIG_RES);
393: term->ymax = (unsigned int) (ysize_t * FIG_RES);
394: } else {
395: term->xmax = (unsigned int) (xsize_t / 2.54 * FIG_RES);
396: term->ymax = (unsigned int) (ysize_t / 2.54 * FIG_RES);
397: }
398: }
399: term->v_char = FIG_to_pixel_v(FIG_font_s);
400: term->h_char = FIG_to_pixel_h(FIG_font_s);
401: FIG_thickness = FIG_default_thickness;
402: if (parse_error) { /* JFS, KB */
403: int_error(options_list, c_token);
404: }
405: }
406:
407: TERM_PUBLIC void FIG_init()
408: {
409: FIG_posx = FIG_posy = 0;
410: FIG_polyvec_stat = FIG_poly_new;
411: FIG_linetype(-1);
412: FIG_justify_text(LEFT);
413: FIG_text_angle(0);
414:
415: FIG_line.tagged = FIG_DEFAULT;
416: FIG_line.distrib = FIG_DEFAULT;
417: FIG_line.type = T_POLYLINE;
418: FIG_line.style = 0;
419: FIG_line.thickness = FIG_thickness;
420: FIG_line.fill_style = -1;
421: FIG_line.depth = FIG_linedepth;
422: FIG_line.pen_style = 0;
423: FIG_line.for_arrow = NULL;
424: FIG_line.back_arrow = NULL;
425: FIG_line.cap_style = 0;
426: FIG_line.join_style = 0;
427: FIG_line.style_val = 0.0;
428: FIG_line.radius = 0;
429: FIG_line.pic = NULL;
430: FIG_line.next = NULL;
431:
432: fprintf(gpoutfile, "\
433: %s\n\
434: %s\n%s\n%s\n%d %d\n",
435: FIG_MAGIC,
436: FIG_ORIENT, FIG_JUST,
437: FIG_UNIT, FIG_RES, FIG_COORD_SYS);
438: }
439:
440:
441: TERM_PUBLIC void FIG_graphics()
442: {
443: FIG_posx = FIG_posy = 0;
444: FIG_polyvec_stat = FIG_poly_new;
445: /* there is no way to have separate pictures in a FIG file */
446: }
447:
448:
449: TERM_PUBLIC void FIG_text()
450: {
451: /* there is no way to have separate pictures in a FIG file */
452: FIG_poly_clean(FIG_polyvec_stat);
453: FIG_posx = FIG_posy = 0;
454: fflush(gpoutfile);
455: }
456:
457:
458: /* Line types for FIG work like this:
459: * for monochrome:
460: * -2 : solid (border)
461: * -1 : dotted 4 (axes)
462: * 0 : solid (first curve)
463: * 1 : dotted 3
464: * 2 : dashed 3
465: * 3 : dotted 6
466: * 4 : dashed 6
467: * ... ...
468: * for color, cycle through colors. once colors are used up, repeat colors
469: * but start using dashed lines of different dash length. don't use white
470: * as a color.
471: */
472:
473: TERM_PUBLIC void FIG_linetype(linetype)
474: int linetype; /* expect linetype >= -2 */
475: {
476: int last_FIG_type = FIG_type;
477: int last_FIG_spacing = FIG_spacing;
478: int last_FIG_color = FIG_color;
479: int last_FIG_depth = FIG_linedepth;
480: int last_FIG_thickness = FIG_thickness;
481:
482: FIG_linedepth = FIG_depth;
483: FIG_thickness = FIG_current_linewidth * FIG_default_thickness;
484: if (FIG_thickness < 1)
485: FIG_thickness = 1;
486: FIG_color = DEFAULT;
487:
488: if (linetype < -2)
489: linetype = -2;
490:
491: switch (linetype) {
492: case 0:
493: case -2:{
494: FIG_type = SOLID_LINE;
495: FIG_spacing = 0.0;
496: if (FIG_use_color)
497: FIG_color = BLACK;
498: break;
499: }
500: case -1:{
501: FIG_type = DOTTED_LINE;
502: FIG_spacing = 4.0; /* gap */
503: if (FIG_use_color)
504: FIG_color = BLACK;
505: break;
506: }
507: default:{
508: /* now linetype >= 1 *//* shouldn't be negative anyway */
509: FIG_linedepth = FIG_depth + linetype / 1000;
510: linetype %= 1000;
511: /* Thickness of lines is either included in the linetype */
512: /* (in Fig units) or the default is scaled with the */
513: /* current 'linewidth'. */
514: if ((FIG_thickness = linetype / 100) == 0)
515: FIG_thickness = FIG_current_linewidth * FIG_default_thickness;
516: if (FIG_thickness < 1) /* Less than 1 would be invisible */
517: FIG_thickness = 1;
518: linetype %= 100;
519: if (FIG_use_color) {
520: FIG_type = (linetype >= WHITE); /* dashed line */
521: FIG_color = linetype % WHITE;
522: FIG_spacing = (linetype / WHITE) * 3;
523: } else { /* monochrome */
524: FIG_type = linetype % 2 + 1; /* dotted, dashed, ... */
525: FIG_spacing = (linetype + 1) / 2 * 3;
526: }
527: break;
528: }
529: }
530: if (FIG_type != last_FIG_type || FIG_spacing != last_FIG_spacing ||
531: FIG_color != last_FIG_color || FIG_linedepth != last_FIG_depth ||
532: FIG_thickness != last_FIG_thickness)
533: FIG_poly_clean(FIG_polyvec_stat);
534: }
535:
536: TERM_PUBLIC void FIG_move(x, y)
537: unsigned int x, y;
538: {
539: int last_FIG_posx = FIG_posx;
540: int last_FIG_posy = FIG_posy;
541: FIG_posx = x;
542: FIG_posy = y;
543: if (FIG_posx != last_FIG_posx || FIG_posy != last_FIG_posy)
544: FIG_poly_clean(FIG_polyvec_stat);
545: }
546:
547:
548: TERM_PUBLIC void FIG_vector(ux, uy)
549: unsigned int ux, uy;
550: {
551: int x = ux, y = uy;
552:
553: if (FIG_polyvec_stat != FIG_poly_part) {
554: FIG_line.pen_color = FIG_color;
555: FIG_line.fill_color = FIG_color;
556: FIG_line.style = FIG_type;
557: FIG_line.style_val = FIG_spacing;
558: FIG_line.depth = FIG_linedepth;
559: FIG_line.thickness = FIG_thickness;
560: FIG_poly_vec_cnt = 0;
561: /* allocate memory for the first point */
562: FIG_points = (F_point *) gp_realloc(FIG_points, sizeof(F_point), "FIG_points"); /* JFS */
563: FIG_points[FIG_poly_vec_cnt].x = FIG_xoff + FIG_posx;
564: FIG_points[FIG_poly_vec_cnt].y = term->ymax
565: + FIG_yoff - FIG_posy;
566:
567: FIG_poly_vec_cnt = 1;
568: FIG_polyvec_stat = FIG_poly_part;
569: }
570: /* allocate memory for the next point */
571: FIG_points = (F_point *) gp_realloc(FIG_points, (FIG_poly_vec_cnt + 1) *
572: sizeof(F_point), "FIG_points"); /* JFS */
573: FIG_points[FIG_poly_vec_cnt].x = FIG_xoff + x;
574: FIG_points[FIG_poly_vec_cnt].y = term->ymax + FIG_yoff - y;
575:
576: FIG_poly_vec_cnt++;
577: if (FIG_poly_vec_cnt > FIG_poly_vec_max)
578: FIG_poly_clean(FIG_polyvec_stat);
579:
580: FIG_posx = x;
581: FIG_posy = y;
582: }
583:
584:
585: TERM_PUBLIC void FIG_arrow(sx, sy, ex, ey, head)
586: unsigned int sx, sy; /* start coord */
587: unsigned int ex, ey; /* end coord */
588: TBOOLEAN head;
589: {
590: FIG_poly_clean(FIG_polyvec_stat);
591: fprintf(gpoutfile, "%d %d %d %d %d %d %d %d %d %9.3f %d %d %d %d %d %d\n",
592: O_POLYLINE, FIG_line.type, FIG_line.style, FIG_line.thickness,
593: FIG_line.pen_color, FIG_line.fill_color, FIG_line.depth,
594: FIG_line.pen_style, FIG_line.fill_style, FIG_line.style_val,
595: FIG_line.join_style, FIG_line.cap_style, FIG_line.radius,
596: head ? 1 : 0, 0, 2);
597:
598: /* arrow line */
599: if (head)
600: fprintf(gpoutfile, "%d %d %.3f %.3f %.3f\n",
601: 0, 0, 1.0,
602: (double) (term->h_tic / 2 + 1),
603: (double) term->h_tic);
604: fprintf(gpoutfile, "%d %d %d %d\n",
605: FIG_xoff + sx, FIG_yoff + term->ymax - sy,
606: FIG_yoff + ex, FIG_yoff + term->ymax - ey);
607:
608: FIG_posx = ex;
609: FIG_posy = ey;
610: }
611:
612:
613: TERM_PUBLIC void FIG_put_text(x, y, str)
614: unsigned int x, y;
615: char *str;
616: {
617: if (strlen(str) == 0)
618: return;
619: FIG_poly_clean(FIG_polyvec_stat);
620: y -= term->v_char / 2; /* assuming vertical center justified */
621:
622: fprintf(gpoutfile, "%d %d %d %d %d %d %6.3f %6.3f %d %6.3f %6.3f %d %d %s\\001\n",
1.1.1.2 ! maekawa 623: OBJ_TEXT, FIG_justify, FIG_color, 0, FIG_DEFAULT,
1.1 maekawa 624: FIG_ROMAN_FONT, (float) FIG_font_s,
625: FIG_angle, SPECIAL_TEXT, (float) term->v_char,
626: (float) term->h_char * strlen(str),
627: FIG_xoff + x, term->ymax + FIG_yoff - y, str);
628: }
629:
630: TERM_PUBLIC int FIG_justify_text(mode)
631: enum JUSTIFY mode;
632: {
633: switch (mode) {
634: case LEFT:
635: FIG_justify = T_LEFT_JUSTIFIED;
636: break;
637: case CENTRE:
638: FIG_justify = T_CENTER_JUSTIFIED;
639: break;
640: case RIGHT:
641: FIG_justify = T_RIGHT_JUSTIFIED;
642: break;
643: /* shouldn't happen */
644: default:
645: FIG_justify = T_LEFT_JUSTIFIED;
646: return (FALSE);
647: break;
648: }
649: return (TRUE);
650: }
651:
652: TERM_PUBLIC int FIG_text_angle(ang)
653: int ang;
654: {
655: if (ang)
656: FIG_angle = Pi / 2.0; /* vertical is pi/2 radians */
657: else
658: FIG_angle = 0.0; /* horizontal */
659: return (TRUE);
660: }
661:
662: TERM_PUBLIC void FIG_lpoint(x, y, number)
663: unsigned int x, y;
664: int number;
665: {
666: FIG_type = 0; /* Solid lines for marker outline */
667: if (number % 100 >= 49 && number % 100 < 99) { /* circles, squares, triangles */
668: int r, d, h, xpc, ypc;
669: int line_color, fill_color, fill_style;
670: int cnum, tnum, color, depth;
671:
672: FIG_poly_clean(FIG_polyvec_stat);
673: depth = FIG_linedepth - 1; /* Above error bars */
674: if (number > 1000)
675: depth = FIG_depth + number / 1000 - 1;
676: number %= 1000;
677: if (depth < 0)
678: depth = 0;
679: if (number < 100)
680: color = FIG_color;
681: else if (FIG_use_color)
682: color = number / 100 - 1;
683: else if (number / 100 >= WHITE)
684: color = WHITE;
685: else
686: color = DEFAULT;
687: number %= 100;
688: cnum = (number + 1) % 10;
689: tnum = (number - 49) / 10;
690: if (cnum < 5)
691: line_color = (FIG_use_color ? BLACK : DEFAULT);
692: else
693: line_color = FIG_color;
694: fill_color = color;
695: if (cnum == 0 || cnum == 5)
696: fill_style = -1;
697: else
698: fill_style = (cnum % 5) * 5;
699:
700: xpc = FIG_xoff + x;
701: ypc = term->ymax + FIG_yoff - y;
702:
703: if (tnum == 0) { /* circle */
704: r = FIG_current_pointsize * term->v_char / 4 + 1;
705: fprintf(gpoutfile,
706: "1 3 %d %d %d %d %d %d %d %6.3f 1 0.000 %d %d %d %d %d %d %d %d\n",
707: FIG_type, FIG_thickness, line_color,
708: fill_color, depth, 0, fill_style, FIG_spacing,
709: xpc, ypc, r, r, xpc, ypc, xpc, ypc - r);
710: } else {
711: fprintf(gpoutfile, "2 3 %d %d %d %d %d %d %d %6.3f 0 0 0 0 0 ",
712: FIG_type, FIG_thickness, line_color,
713: fill_color, depth, 0, fill_style, FIG_spacing);
714:
715: if (tnum == 1) { /* square */
716: d = FIG_current_pointsize * term->v_char / 4 + 1;
717: fprintf(gpoutfile, "5\n\t%d %d %d %d %d %d %d %d %d %d\n",
718: xpc - d, ypc - d, xpc - d, ypc + d, xpc + d, ypc + d, xpc + d, ypc - d,
719: xpc - d, ypc - d);
720: } else if (tnum == 2) { /* diamond */
721: d = FIG_current_pointsize * term->v_char / 3 + 1;
722: fprintf(gpoutfile, "5\n\t%d %d %d %d %d %d %d %d %d %d\n",
723: xpc - d, ypc, xpc, ypc + d, xpc + d, ypc, xpc, ypc - d, xpc - d, ypc);
724: } else if (tnum == 3) { /* triangle up */
725: d = FIG_current_pointsize * term->v_char / 3 + 1;
726: h = d * 4 / 7; /* About d times one 3rd of sqrt(3) */
727: fprintf(gpoutfile, "4\n\t%d %d %d %d %d %d %d %d\n",
728: xpc - d, ypc + h, xpc, ypc - 2 * h, xpc + d, ypc + h, xpc - d, ypc + h);
729: } else if (tnum == 4) { /* triangle down */
730: d = FIG_current_pointsize * term->v_char / 3 + 1;
731: h = d * 4 / 7;
732: fprintf(gpoutfile, "4\n\t%d %d %d %d %d %d %d %d\n",
733: xpc - d, ypc - h, xpc, ypc + 2 * h, xpc + d, ypc - h, xpc - d, ypc - h);
734: }
735: }
736: } else
737: do_point(x, y, number);
738: }
739:
740: TERM_PUBLIC void FIG_pointsize(arg_pointsize)
741: double arg_pointsize;
742: {
743: FIG_current_pointsize = arg_pointsize;
744: /* Bug-fix by hkeller@gwdg.de and K.B.: set pointsize for do_point() */
745: do_pointsize(arg_pointsize * FIG_font_s / (double) FIG_FONT_S);
746: }
747:
748: TERM_PUBLIC void FIG_linewidth(linewidth)
749: double linewidth;
750: {
751: FIG_current_linewidth = linewidth;
752: }
753:
754: TERM_PUBLIC void FIG_reset()
755: {
756: FIG_poly_clean(FIG_polyvec_stat);
757: FIG_posx = FIG_posy = 0;
758: fflush(gpoutfile);
759: }
760:
761: #endif /* TERM_BODY */
762:
763: #ifdef TERM_TABLE
764:
765: TERM_TABLE_START(fig_driver)
766: "fig", "FIG 3.1 graphics language: X graphics editor",
767: FIG_XMAX, FIG_YMAX, FIG_VCHAR, FIG_HCHAR,
768: FIG_VTIC, FIG_HTIC, FIG_options, FIG_init, FIG_reset,
769: FIG_text, null_scale, FIG_graphics, FIG_move, FIG_vector,
770: FIG_linetype, FIG_put_text, FIG_text_angle, FIG_justify_text,
771: FIG_lpoint, FIG_arrow, set_font_null, FIG_pointsize,
772: 0 /*flags */ , 0 /*suspend */ , 0 /*resume */ , 0 /*fillbox */ ,
773: FIG_linewidth
774: TERM_TABLE_END(fig_driver)
775:
776: #undef LAST_TERM
777: #define LAST_TERM fig_driver
778: #endif /* TERM_TABLE */
779: #endif /* TERM_PROTO_ONLY */
780:
781: #ifdef TERM_HELP
782: START_HELP(fig)
783: "1 fig",
784: "?commands set terminal fig",
785: "?set terminal fig",
786: "?set term fig",
787: "?terminal fig",
788: "?term fig",
789: "?fig",
790: " The `fig` terminal device generates output in the Fig graphics language.",
791: "",
792: " Syntax:",
793: " set terminal fig {monochrome | color} {small | big}",
794: " {pointsmax <max_points>}",
795: " {landscape | portrait}",
796: " {metric | inches}",
797: " {fontsize <fsize>}",
798: " {size <xsize> <ysize>}",
799: " {thickness <units>}",
800: " {depth <layer>}",
801: "",
802: " `monochrome` and `color` determine whether the picture is black-and-white or",
803: " `color`. `small` and `big` produce a 5x3 or 8x5 inch graph in the default",
804: " `landscape` mode and 3x5 or 5x8 inches in `portrait` mode. <max_points>",
805: " sets the maximum number of points per polyline. Default units for editing",
806: " with \"xfig\" may be `metric` or `inches`. `fontsize` sets the size of the",
807: " text font to <fsize> points. `size` sets (overrides) the size of the drawing",
808: " area to <xsize>*<ysize> in units of inches or centimeters depending on the",
809: " `inches` or `metric` setting in effect. `depth` sets the default depth layer",
810: " for all lines and text. The default depth is 10 to leave room for adding",
811: " material with \"xfig\" on top of the plot.",
812: "",
813: " `thickness` sets the default line thickness, which is 1 if not specified.",
814: " Overriding the thickness can be achieved by adding a multiple of 100 to the",
815: " to the `linetype` value for a `plot` command. In a similar way the `depth`",
816: " of plot elements (with respect to the default depth) can be controlled by",
817: " adding a multiple of 1000 to <linetype>. The depth is then <layer> +",
818: " <linetype>/1000 and the thickness is (<linetype>%1000)/100 or, if that is",
819: " zero, the default line thickness.",
820: "",
821: " Additional point-plot symbols are also available with the `fig` driver. The",
822: " symbols can be used through `pointtype` values % 100 above 50, with different",
823: " fill intensities controlled by <pointtype> % 5 and outlines in black (for",
824: " <pointtype> % 10 < 5) or in the current color. Available symbols are",
825: " 50 - 59: circles",
826: " 60 - 69: squares",
827: " 70 - 79: diamonds",
828: " 80 - 89: upwards triangles",
829: " 90 - 99: downwards triangles",
830: " The size of these symbols is linked to the font size. The depth of symbols",
831: " is by default one less than the depth for lines to achieve nice error bars.",
832: " If <pointtype> is above 1000, the depth is <layer> + <pointtype>/1000-1. If",
833: " <pointtype>%1000 is above 100, the fill color is (<pointtype>%1000)/100-1.",
834: "",
835: " Available fill colors are (from 1 to 9): black, blue, green, cyan, red,",
836: " magenta, yellow, white and dark blue (in monochrome mode: black for 1 to 6",
837: " and white for 7 to 9).",
838: "",
839: " See `plot with` for details of <linetype> and <pointtype>.",
840: "",
841: " The `big` option is a substitute for the `bfig` terminal in earlier versions,",
842: " which is no longer supported.",
843: "",
844: " Examples:",
845: " set terminal fig monochrome small pointsmax 1000 # defaults",
846: "",
847: " plot 'file.dat' with points linetype 102 pointtype 759",
848: " would produce circles with a blue outline of width 1 and yellow fill color.",
849: "",
850: " plot 'file.dat' using 1:2:3 with err linetype 1 pointtype 554",
851: " would produce errorbars with black lines and circles filled red. These",
852: " circles are one layer above the lines (at depth 9 by default).",
853: "",
854: " To plot the error bars on top of the circles use",
855: " plot 'file.dat' using 1:2:3 with err linetype 1 pointtype 2554"
856: END_HELP(fig)
857: #endif /* TERM_HELP */
858:
859:
860:
861:
862: #if 0
863:
864: /* I hope this is enough to stop compilers looking in here
865: * (I think that anything inside #if 0 is still strictly
866: * required to be valid C, rather than just any old junk
867: * like this.)
868: */
869:
870: /*
871: * FIG : Facility for Interactive Generation of figures
872: * Copyright (c) 1985 by Supoj Sutanthavibul
873: * Parts Copyright (c) 1994 by Brian V. Smith
874: * Parts Copyright (c) 1991 by Paul King
875: *
876: * The X Consortium, and any party obtaining a copy of these files from
877: * the X Consortium, directly or indirectly, is granted, free of charge, a
878: * full and unrestricted irrevocable, world-wide, paid up, royalty-free,
879: * nonexclusive right and license to deal in this software and
880: * documentation files (the "Software"), including without limitation the
881: * rights to use, copy, modify, merge, publish, distribute, sublicense,
882: * and/or sell copies of the Software, and to permit persons who receive
883: * copies from any such party to do so, with the only requirement being
884: * that this copyright notice remain intact. This license includes without
885: * limitation a license to do the foregoing actions under any patents of
886: * the party supplying this software to the X Consortium.
887: */
888:
889: /*
890: The only difference from version 3.0 to version 3.1 is that the position
891: of the "magnet" has been shifted by 14 Fig units.
892: In the 2.1 and older versions of xfig the grid was in multiples of 5 Fig
893: units, but they were on intervals 4, 9, 14, 19, etc.
894: When version 3.0 was created, coordinates were simply multiplied by the
895: ratio of the resolutions (1200/80 = 15) so values like 4 became 60 instead
896: of 74 ((4+1)*15 - 1).
897:
898: This means that figures converted from 2.1 and older files are offset by
899: 14 Fig units but new objects entered with version 3.0 are correct.
900:
901: In version 3.1 the magnet grid is at intervals 0, 75, 150, etc instead of
902: -1, 74, 149, etc.
903: Figures from 2.1 and older are correctly converted now and a warning is popped
904: up when you read in a version 3.0 file that says you may have to offset the
905: figure when you load it, using the x and y offsets in the file panel.
906:
907: --------------------------------------------------------------------------------
908: Description of the Fig Format Follows
909: --------------------------------------------------------------------------------
910:
911: (1) The very first line is a comment line containing the name and version:
912: #FIG 3.1
913:
914: The character # at the first column of a line indicates that the line
915: is a comment line which will be ignored.
916:
917: (2) The first non-comment line consists of two numbers and two strings:
918:
919: int fig_resolution (Fig units/inch)
920: string orientation ("Landscape" or "Portrait")
921: string justification ("Center" or "Flush Left")
922: string units ("Metric" or "Inches")
923: int coordinate_system (1: origin is the lower left corner (NOT USED)
924: 2: upper left)
925:
926: Fig_resolution is the resolution of the figure in the file.
927: Xfig will always write the file with a resolution of 1200ppi so it
928: will scale the figure upon reading it in if its resolution is different
929: from 1200ppi. Pixels are assumed to be square.
930:
931: Xfig will read the orientation string and change the canvas to match
932: either the Landscape or Portrait mode of the figure file.
933:
934: The units specification is self-explanatory.
935:
936: The coordinate_system variable is ignored - the origin is ALWAYS the
937: upper-left corner.
938:
939: ** Coordinates are given in "fig_resolution" units.
940: ** Line thicknesses are given in 1/80 of an inch ("display units"). The
941: minimum line thickness is 0 (no line is drawn) and the maximum is 500.
942: ** dash-lengths/dot-gaps are given in 1/80 of an inch.
943:
944:
945: (3) The rest of the file contains various objects. An object can be one
946: of six classes (or types).
947:
948: 0) Color pseudo-object.
949: 1) Arc.
950: 2) Ellipse which is a generalization of circle.
951: 3) Polyline which includes polygon and box.
952: 4) Spline which includes closed/open control/interpolated spline.
953: 5) Text.
954: 6) Compound object which is composed of one or more objects.
955:
956: In the following elaboration on object formats, every value of Fig
957: output are separated by blank characters or new line ('\n'). The
958: value of the unused parameters will be -1.
959:
960: Some fields are described as "enumeration type" or "bit vector"; the
961: values which these fields can take are defined in the header file object.h.
962: The pen_style field is unused.
963: These values may be defined in some future version of Fig.
964:
965: The two color fields (pen and fill; pen only, for texts) are
966: defined as follows:
967:
968: -1 = Default
969: 0 = Black
970: 1 = Blue
971: 2 = Green
972: 3 = Cyan
973: 4 = Red
974: 5 = Magenta
975: 6 = Yellow
976: 7 = White
977: 8-11 = four shades of blue (dark to lighter)
978: 12-14 = three shades of green (dark to lighter)
979: 15-17 = three shades of cyan (dark to lighter)
980: 18-20 = three shades of red (dark to lighter)
981: 21-23 = three shades of magenta (dark to lighter)
982: 24-26 = three shades of brown (dark to lighter)
983: 27-30 = four shades of pink (dark to lighter)
984: 31 = Gold
985:
986: values from 32 to 543 (512 total) are user colors and
987: are defined in color pseudo-objects (type 0)
988:
989: For WHITE color, the area fill field is defined as follows:
990:
991: -1 = not filled
992: 0 = black
993: ... values from 1 to 19 are shades of grey, from darker to lighter
994: 20 = white
995: 21-40 not used
996: 41-56 see patterns for colors, below
997:
998: For BLACK or DEFAULT color, the area fill field is defined as follows:
999:
1000: -1 = not filled
1001: 0 = white
1002: ... values from 1 to 19 are shades of grey, from lighter to darker
1003: 20 = black
1004: 21-40 not used
1005: 41-56 see patterns for colors, below
1006:
1007: For all other colors, the area fill field is defined as follows:
1008:
1009: -1 = not filled
1010: 0 = black
1011: ... values from 1 to 19 are "shades" of the color, from darker to lighter.
1012: A shade is defined as the color mixed with black
1013: 20 = full saturation of the color
1014: ... values from 21 to 39 are "tints" of the color from the color to white.
1015: A tint is defined as the color mixed with white
1016: 40 = white
1017: 41 = 30 degree left diagonal pattern
1018: 42 = 30 degree right diagonal pattern
1019: 43 = 30 degree crosshatch
1020: 44 = 45 degree left diagonal pattern
1021: 45 = 45 degree right diagonal pattern
1022: 46 = 45 degree crosshatch
1023: 47 = bricks
1024: 48 = circles
1025: 49 = horizontal lines
1026: 50 = vertical lines
1027: 51 = crosshatch
1028: 52 = fish scales
1029: 53 = small fish scales
1030: 54 = octagons
1031: 55 = horizontal "tire treads"
1032: 56 = vertical "tire treads"
1033:
1034: The depth field is defined as follows:
1035:
1036: 0 ... 999 where larger value means object is deeper than (under)
1037: objects with smaller depth
1038:
1039: The line_style field is defined as follows:
1040:
1041: -1 = Default
1042: 0 = Solid
1043: 1 = Dashed
1044: 2 = Dotted
1045:
1046: The style_val field is defined as the length, in 1/80 inches, of the on/off
1047: dashes for dashed lines, and the distance between the dots, in 1/80 inches,
1048: for dotted lines.
1049:
1050: The join_style field is defined FOR LINES only as follows:
1051:
1052: 0 = Miter (the default in xfig 2.1 and earlier)
1053: 1 = Bevel
1054: 2 = Round
1055:
1056: The cap_style field is defined FOR LINES, OPEN SPLINES and ARCS only as follows:
1057:
1058: 0 = Butt (the default in xfig 2.1 and earlier)
1059: 1 = Round
1060: 2 = Projecting
1061:
1062: The arrow_type field is defined for LINES, ARCS and OPEN SPLINES
1063: only as follows:
1064:
1065: 0 = Stick-type (the default in xfig 2.1 and earlier)
1066: 1 = Closed triangle:
1067: |\
1068: | \
1069: | \
1070: | /
1071: | /
1072: |/
1073: 2 = Closed with "indented" butt:
1074: |\
1075: \ \
1076: \ \
1077: \ \
1078: / /
1079: / /
1080: / /
1081: |/
1082: 3 = Closed with "pointed" butt:
1083: |\
1084: / \
1085: / \
1086: / \
1087: \ /
1088: \ /
1089: \ /
1090: |/
1091:
1092: The arrow_style field is defined for LINES, ARCS and OPEN SPLINES
1093: only as follows:
1094:
1095: 0 = Hollow (actually filled with white)
1096: 1 = Filled with pen_color
1097:
1098: (3.0) OBJECT DEFINITION:
1099:
1100: (3.1) Color Pseudo-objects (user-defined colors)
1101: This is used to define arbitrary colors beyond the 32 standard colors.
1102: The color objects must be defined before any other Fig objects.
1103:
1104: First line:
1105: type name (brief description)
1106: ---- ---- -------------------
1107: int object_code (always 0)
1108: int color_number (color number, from 32-543 (512 total))
1109: hex string rgb values (hexadecimal string describing red,
1110: green and blue values (e.g. #330099) )
1111:
1112: (3.2) ARC
1113:
1114: First line:
1115: type name (brief description)
1116: ---- ---- -------------------
1117: int object_code (always 5)
1118: int sub_type (0: pie-wedge (closed)
1119: 1: open ended arc)
1120: int line_style (enumeration type)
1121: int line_thickness (1/80 inch)
1122: int pen_color (enumeration type, pen color)
1123: int fill_color (enumeration type, fill color)
1124: int depth (enumeration type)
1125: int pen_style (pen style, not used)
1126: int area_fill (enumeration type, -1 = no fill)
1127: float style_val (1/80 inch)
1128: int cap_style (enumeration type)
1129: int direction (0: clockwise, 1: counterclockwise)
1130: int forward_arrow (0: no forward arrow, 1: on)
1131: int backward_arrow (0: no forward arrow, 1: on)
1132: float center_x, center_y (center of the arc)
1133: int x1, y1 (Fig units, the 1st point the user entered)
1134: int x2, y2 (Fig units, the 2nd point)
1135: int x3, y3 (Fig units, the last point)
1136:
1137: Forward arrow line (Optional; absent if forward_arrow is 0):
1138: type name (brief description)
1139: ---- ---- -------------------
1140: int arrow_type (enumeration type)
1141: int arrow_style (enumeration type)
1142: float arrow_thickness (1/80 inch)
1143: float arrow_width (Fig units)
1144: float arrow_height (Fig units)
1145:
1146: Backward arrow line (Optional; absent if backward_arrow is 0):
1147: type name (brief description)
1148: ---- ---- -------------------
1149: int arrow_type (enumeration type)
1150: int arrow_style (enumeration type)
1151: float arrow_thickness (1/80 inch)
1152: float arrow_width (Fig units)
1153: float arrow_height (Fig units)
1154:
1155: (3.3) COMPOUND
1156:
1157: A line with object code 6 signifies the start of a compound.
1158: There are four more numbers on this line which indicate the
1159: upper right corner and the lower left corner of the bounding
1160: box of this compound. A line with object code -6 signifies
1161: the end of the compound. Compound may be nested.
1162:
1163: First line:
1164: type name (brief description)
1165: ---- ---- -------------------
1166: int object_code (always 6)
1167: int upperright_corner_x (Fig units)
1168: int upperright_corner_y (Fig units)
1169: int lowerleft_corner_x (Fig units)
1170: int lowerleft_corner_y (Fig units)
1171:
1172: Subsequent lines:
1173: objects
1174: .
1175: .
1176:
1177: Last line:
1178: -6
1179:
1180: (3.4) ELLIPSE
1181:
1182: First line:
1183: type name (brief description)
1184: ---- ---- -------------------
1185: int object_code (always 1)
1186: int sub_type (1: ellipse defined by radiuses
1187: 2: ellipse defined by diameters
1188: 3: circle defined by radius
1189: 4: circle defined by diameter)
1190: int line_style (enumeration type)
1191: int thickness (1/80 inch)
1192: int pen_color (enumeration type, pen color)
1193: int fill_color (enumeration type, fill color)
1194: int depth (enumeration type)
1195: int pen_style (pen style, not used)
1196: int area_fill (enumeration type, -1 = no fill)
1197: float style_val (1/80 inch)
1198: int direction (always 1)
1199: float angle (radians, the angle of the x-axis)
1200: int center_x, center_y (Fig units)
1201: int radius_x, radius_y (Fig units)
1202: int start_x, start_y (Fig units; the 1st point entered)
1203: int end_x, end_y (Fig units; the last point entered)
1204:
1205: (3.5) POLYLINE
1206:
1207: First line:
1208: type name (brief description)
1209: ---- ---- -------------------
1210: int object_code (always 2)
1211: int sub_type (1: polyline
1212: 2: box
1213: 3: polygon
1214: 4: arc-box)
1215: 5: imported-picture bounding-box)
1216: int line_style (enumeration type)
1217: int thickness (1/80 inch)
1218: int pen_color (enumeration type, pen color)
1219: int fill_color (enumeration type, fill color)
1220: int depth (enumeration type)
1221: int pen_style (pen style, not used)
1222: int area_fill (enumeration type, -1 = no fill)
1223: float style_val (1/80 inch)
1224: int join_style (enumeration type)
1225: int cap_style (enumeration type, only used for POLYLINE)
1226: int radius (1/80 inch, radius of arc-boxes)
1227: int forward_arrow (0: off, 1: on)
1228: int backward_arrow (0: off, 1: on)
1229: int npoints (number of points in line)
1230:
1231: Forward arrow line: same as ARC object
1232:
1233: Backward arrow line: same as ARC object
1234:
1235: Points line:
1236: type name (brief description)
1237: ---- ---- -------------------
1238: int x1, y1 (Fig units)
1239: int x2, y2 (Fig units)
1240: .
1241: .
1242: int xnpoints ynpoints (this will be the same as the 1st
1243: point for polygon and box)
1244:
1245: PIC line:
1246: type name (brief description)
1247: ---- ---- -------------------
1248: boolean flipped orientation = normal (0) or flipped (1)
1249: char file[] name of picture file to import
1250:
1251: (3.6) SPLINE
1252:
1253: First line:
1254: type name (brief description)
1255: ---- ---- -------------------
1256: int object_code (always 3)
1257: int sub_type (0: open spline
1258: 1: closed spline
1259: 2: open interpolated spline
1260: 3: closed interpolated spline)
1261: int line_style (See the end of this section)
1262: int thickness (1/80 inch)
1263: int pen_color (enumeration type, pen color)
1264: int fill_color (enumeration type, fill color)
1265: int depth (enumeration type)
1266: int pen_style (pen style, not used)
1267: int area_fill (enumeration type, -1 = no fill)
1268: float style_val (1/80 inch)
1269: int cap_style (enumeration type, only used for open splines)
1270: int forward_arrow (0: off, 1: on)
1271: int backward_arrow (0: off, 1: on)
1272: int npoints (number of control points in spline)
1273:
1274: Forward arrow line: same as ARC object
1275:
1276: Backward arrow line: same as ARC object
1277:
1278: Points line: same as POLYLINE object
1279:
1280: Control points line (absent if sub_type is 0 or 1):
1281: Control points of interpolated spline. There are two control
1282: points for each knots. A section i, of the spline is drawn
1283: using Bezier cubic with the following four points:
1284: (x ,y ), (rx ,ry ), (lx , ly ), (x , y ).
1285: i i i i i+1 i+1 i+1 i+1
1286: For closed interpolated spline the last pair of control points,
1287: (lxnpoints,lynpoints) and (rxnpoints,rynpoints) (which can be ignored),
1288: are the same as (lx1,ly1) and (rx1,ry1) respectively.
1289:
1290: type name (brief description)
1291: ---- ---- -------------------
1292: float lx1, ly1 (Fig units)
1293: float rx1, ry1 (Fig units)
1294: float lx2, ly2 (Fig units)
1295: float rx2, ry2 (Fig units)
1296: .
1297: .
1298: float lxnpoints, lynpoints (Fig units)
1299: float rxnpoints, rynpoints (Fig units)
1300:
1301: (3.7) TEXT
1302: type name (brief description)
1303: ---- ---- -------------------
1304: int object (always 4)
1305: int sub_type (0: Left justified
1306: 1: Center justified
1307: 2: Right justified)
1308: int color (enumeration type)
1309: int depth (enumeration type)
1310: int pen_style (enumeration , not used)
1311: int font (enumeration type)
1312: float font_size (font size in points)
1313: float angle (radians, the angle of the text)
1314: int font_flags (bit vector)
1315: float height (Fig units)
1316: float length (Fig units)
1317: int x, y (Fig units, coordinate of the origin
1318: of the string. If sub_type = 0, it is
1319: the lower left corner of the string.
1320: If sub_type = 1, it is the lower
1321: center. Otherwise it is the lower
1322: right corner of the string.)
1323: char string[] (ASCII characters; starts after a blank
1324: character following the last number and
1325: ends before the sequence '\001'. This
1326: sequence is not part of the string.
1327: Characters above octal 177 are
1328: represented by \xxx where xxx is the
1329: octal value. This permits Fig files to
1330: be edited with 7-bit editors and sent
1331: by e-mail without data loss.
1332: Note that the string may contain '\n'.)
1333:
1334: The font_flags field is defined as follows:
1335:
1336: Bit Description
1337:
1338: 0 Rigid text (text doesn't scale when scaling compound objects)
1339: 1 Special text (for LaTeX)
1340: 2 PostScript font (otherwise LaTeX font is used)
1341: 3 Hidden text
1342:
1343: The font field is defined as follows:
1344:
1345: For font_flags bit 2 = 0 (LaTeX fonts):
1346:
1347: 0 Default font
1348: 1 Roman
1349: 2 Bold
1350: 3 Italic
1351: 4 Sans Serif
1352: 5 Typewriter
1353:
1354: For font_flags bit 3 = 1 (PostScript fonts):
1355:
1356: -1 Default font
1357: 0 Times Roman
1358: 1 Times Italic
1359: 2 Times Bold
1360: 3 Times Bold Italic
1361: 4 AvantGarde Book
1362: 5 AvantGarde Book Oblique
1363: 6 AvantGarde Demi
1364: 7 AvantGarde Demi Oblique
1365: 8 Bookman Light
1366: 9 Bookman Light Italic
1367: 10 Bookman Demi
1368: 11 Bookman Demi Italic
1369: 12 Courier
1370: 13 Courier Oblique
1371: 14 Courier Bold
1372: 15 Courier Bold Oblique
1373: 16 Helvetica
1374: 17 Helvetica Oblique
1375: 18 Helvetica Bold
1376: 19 Helvetica Bold Oblique
1377: 20 Helvetica Narrow
1378: 21 Helvetica Narrow Oblique
1379: 22 Helvetica Narrow Bold
1380: 23 Helvetica Narrow Bold Oblique
1381: 24 New Century Schoolbook Roman
1382: 25 New Century Schoolbook Italic
1383: 26 New Century Schoolbook Bold
1384: 27 New Century Schoolbook Bold Italic
1385: 28 Palatino Roman
1386: 29 Palatino Italic
1387: 30 Palatino Bold
1388: 31 Palatino Bold Italic
1389: 32 Symbol
1390: 33 Zapf Chancery Medium Italic
1391: 34 Zapf Dingbats
1392: */
1393:
1394: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>