[BACK]Return to fig.trm CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gnuplot / term

Annotation of OpenXM_contrib/gnuplot/term/fig.trm, Revision 1.1

1.1     ! maekawa     1: /*
        !             2:  * $Id: fig.trm,v 1.57 1998/06/18 14:59:20 ddenholm Exp $
        !             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",
        !           623:            O_TEXT, FIG_justify, FIG_color, 0, FIG_DEFAULT,
        !           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>