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

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

1.1     ! maekawa     1: /*
        !             2:  * $Id: ai.trm,v 1.18 1998/04/14 00:17:28 drd Exp $
        !             3:  *
        !             4:  */
        !             5:
        !             6: /* GNUPLOT - ai.trm */
        !             7:
        !             8: /*[
        !             9:  * Copyright 1991, 1992, 1993, 1998
        !            10:  *
        !            11:  * Permission to use, copy, and distribute this software and its
        !            12:  * documentation for any purpose with or without fee is hereby granted,
        !            13:  * provided that the above copyright notice appear in all copies and
        !            14:  * that both that copyright notice and this permission notice appear
        !            15:  * in supporting documentation.
        !            16:  *
        !            17:  * Permission to modify the software is granted, but not the right to
        !            18:  * distribute the complete modified source code.  Modifications are to
        !            19:  * be distributed as patches to the released version.  Permission to
        !            20:  * distribute binaries produced by compiling modified sources is granted,
        !            21:  * provided you
        !            22:  *   1. distribute the corresponding source modifications from the
        !            23:  *    released version in the form of a patch file along with the binaries,
        !            24:  *   2. add special version identification to distinguish your version
        !            25:  *    in addition to the base release version number,
        !            26:  *   3. provide your name and address as the primary contact for the
        !            27:  *    support of your modified version, and
        !            28:  *   4. retain our contact information in regard to use of the base
        !            29:  *    software.
        !            30:  * Permission to distribute the released version of the source code along
        !            31:  * with corresponding source modifications in the form of a patch file is
        !            32:  * granted with same provisions 2 through 4 for binary distributions.
        !            33:  *
        !            34:  * This software is provided "as is" without express or implied warranty
        !            35:  * to the extent permitted by applicable law.
        !            36: ]*/
        !            37:
        !            38: /*
        !            39:  * This file is included by ../term.c.
        !            40:  *
        !            41:  * This terminal driver supports:
        !            42:  *     aifm
        !            43:  *
        !            44:  * AUTHORS
        !            45:  *  Ray Ghanbari
        !            46:  *
        !            47:  * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
        !            48:  *
        !            49:  * The 'aifm' driver produces files editable by Adobe Illustrator 3.0
        !            50:  * To change font to Courier and font size to 20pts use
        !            51:  * 'set term aifm "Courier" 20'.
        !            52:  * To switch to color output use
        !            53:  * 'set term aifm color'.
        !            54:  */
        !            55:
        !            56:  /* AIFM driver by Ray Ghanbari, ray@mtl.mit.edu,
        !            57:   *   based on PostScript driver by Russell Lang, rjl@monu1.cc.monash.edu.au */
        !            58:
        !            59: /* Changed to 3.6 terminal format, David C. Schooley, 9/29/95 */
        !            60: /* Improved multiple plot support, David C. Schooley, 6/5/95 */
        !            61: /* Compatiblity with Illustrator 7.0, David C. Schooley, 6/5/95 */
        !            62: /* Font and size support for labels, David C. Schooley, 6/5/95 */
        !            63:
        !            64: #include "driver.h"
        !            65:
        !            66: #ifdef TERM_REGISTER
        !            67: register_term(aifm)
        !            68: #endif
        !            69:
        !            70: #ifdef TERM_PROTO
        !            71: TERM_PUBLIC void AI_init __PROTO((void));
        !            72: TERM_PUBLIC void AI_graphics __PROTO((void));
        !            73: TERM_PUBLIC void AI_text __PROTO((void));
        !            74: TERM_PUBLIC void AI_linetype __PROTO((int linetype));
        !            75: TERM_PUBLIC void AI_move __PROTO((unsigned int x, unsigned int y));
        !            76: TERM_PUBLIC void AI_vector __PROTO((unsigned int x, unsigned int y));
        !            77: TERM_PUBLIC void AI_put_text __PROTO((unsigned int x, unsigned int y, char *str));
        !            78: TERM_PUBLIC int AI_text_angle __PROTO((int ang));
        !            79: TERM_PUBLIC void AI_reset __PROTO((void));
        !            80: TERM_PUBLIC void AI_options __PROTO((void));
        !            81: TERM_PUBLIC int AI_justify_text __PROTO((enum JUSTIFY mode));
        !            82: TERM_PUBLIC void AI_suspend __PROTO(());
        !            83: TERM_PUBLIC void AI_resume __PROTO(());
        !            84: TERM_PUBLIC int AI_set_font __PROTO((char *font));
        !            85:
        !            86: #define AI_XOFF        50              /* page offset in pts */
        !            87: #define AI_YOFF        50
        !            88:
        !            89: #define AI_XMAX 5000
        !            90: #define AI_YMAX 3500
        !            91:
        !            92: #define AI_XLAST (AI_XMAX - 1)
        !            93: #define AI_YLAST (AI_YMAX - 1)
        !            94:
        !            95: #define AI_VTIC (AI_YMAX/80)
        !            96: #define AI_HTIC (AI_YMAX/80)
        !            97:
        !            98: #define AI_SC (10.0)           /* scale is 1pt = 10 units */
        !            99: #define AI_LW (0.5*AI_SC)      /* linewidth = 0.5 pts */
        !           100:
        !           101: #define AI_VCHAR (14*AI_SC)    /* default is 14 point characters */
        !           102: #define AI_HCHAR (14*AI_SC*6/10)
        !           103:
        !           104: #endif
        !           105:
        !           106:
        !           107:
        !           108: #ifndef TERM_PROTO_ONLY
        !           109: #ifdef TERM_BODY
        !           110:
        !           111: /* From version.c */
        !           112: extern char version[];
        !           113: extern char patchlevel[];
        !           114:
        !           115: char ai_font[MAX_ID_LEN + 1] = "Times-Roman";  /* name of font */
        !           116: int ai_fontsize = 14;          /* size of font in pts */
        !           117: char ai_oldfont[MAX_ID_LEN + 1] = "Times-Roman";       /* name of font */
        !           118: int ai_oldfontsize = 14;       /* size of font in pts */
        !           119: TBOOLEAN ai_color = FALSE;
        !           120: TBOOLEAN ai_stroke = FALSE;
        !           121: int ai_page = 0;               /* page count */
        !           122: int ai_path_count = 0;         /* count of lines in path */
        !           123: int ai_ang = 0;                        /* text angle */
        !           124: int ai_subgroup_level = 0;     /* depth of sub-groups */
        !           125: int ai_multiplot_group = 0;    /* group for multiplot */
        !           126: enum JUSTIFY ai_justify = LEFT;        /* text is flush left */
        !           127:
        !           128:
        !           129: TERM_PUBLIC void AI_options()
        !           130: {
        !           131:     if (!END_OF_COMMAND) {
        !           132:        if (almost_equals(c_token, "d$efault")) {
        !           133:            ai_color = FALSE;
        !           134:            strcpy(ai_font, "Times-Roman");
        !           135:            ai_fontsize = 14;
        !           136:            strcpy(ai_oldfont, "Times-Roman");
        !           137:            ai_oldfontsize = 14;
        !           138:            c_token++;
        !           139:        }
        !           140:     }
        !           141:     if (!END_OF_COMMAND) {
        !           142:        if (almost_equals(c_token, "m$onochrome")) {
        !           143:            ai_color = FALSE;
        !           144:            c_token++;
        !           145:        } else if (almost_equals(c_token, "c$olor")
        !           146:                   || almost_equals(c_token, "c$olour")) {
        !           147:            ai_color = TRUE;
        !           148:            c_token++;
        !           149:        }
        !           150:     }
        !           151:     if (!END_OF_COMMAND && isstring(c_token)) {
        !           152:        quote_str(ai_font, c_token, MAX_ID_LEN);
        !           153:        strcpy(ai_oldfont, ai_font);
        !           154:        c_token++;
        !           155:     }
        !           156:     if (!END_OF_COMMAND) {
        !           157:        /* We have font size specified */
        !           158:        struct value a;
        !           159:        ai_fontsize = (int) real(const_express(&a));
        !           160:        ai_oldfontsize = ai_fontsize;
        !           161:        c_token++;
        !           162:        term->v_char = (unsigned int) (ai_fontsize * AI_SC);
        !           163:        term->h_char = (unsigned int) (ai_fontsize * AI_SC * 6 / 10);
        !           164:     }
        !           165:     sprintf(term_options, "%s \"%s\" %d",
        !           166:            ai_color ? "color" : "monochrome", ai_font, ai_fontsize);
        !           167: }
        !           168:
        !           169:
        !           170: TERM_PUBLIC void AI_init()
        !           171: {
        !           172:     ai_page = 0;
        !           173:
        !           174:     fprintf(gpoutfile, "%%!PS-Adobe-2.0 EPSF-1.2\n\
        !           175: %%%%Creator: Adobe Illustrator(TM) 3.2\n\
        !           176: %%%%TrueCreator: gnuplot %s patchlevel %s ai terminal\n\
        !           177: %%%%BoundingBox: %d %d %d %d\n\
        !           178: %%%%Template:\n\
        !           179: %%%%EndComments\n\
        !           180: %%%%EndProlog\n",
        !           181:            version, patchlevel,
        !           182:            AI_XOFF, AI_YOFF,
        !           183:            (int) ((AI_XMAX) / AI_SC + 0.5 + AI_XOFF),
        !           184:            (int) ((AI_YMAX) / AI_SC + 0.5 + AI_YOFF));
        !           185: }
        !           186:
        !           187:
        !           188: TERM_PUBLIC void AI_graphics()
        !           189: {
        !           190:     ai_page++;
        !           191: /*     fprintf(gpoutfile,"%%%%Page: %d %d\n",ai_page,ai_page);*/
        !           192:     fputs("\
        !           193: 0 G\n\
        !           194: 1 j\n\
        !           195: 1 J\n\
        !           196: u\n", gpoutfile);
        !           197:     ai_path_count = 0;
        !           198:     ai_stroke = FALSE;
        !           199: }
        !           200:
        !           201:
        !           202: TERM_PUBLIC void AI_text()
        !           203: {
        !           204:     if (ai_stroke) {
        !           205:        fputs("S\n", gpoutfile);
        !           206:        ai_stroke = FALSE;
        !           207:     }
        !           208:     while (ai_subgroup_level) {
        !           209:        fputs("U\n", gpoutfile);
        !           210:        ai_subgroup_level--;
        !           211:     }
        !           212:     fputs("U\n", gpoutfile);
        !           213:     ai_path_count = 0;
        !           214:     ai_multiplot_group = 0;
        !           215: }
        !           216:
        !           217:
        !           218: TERM_PUBLIC void AI_reset()
        !           219: {
        !           220:     fputs("%%%%Trailer\n", gpoutfile);
        !           221: /*     fprintf(gpoutfile,"%%%%Pages: %d\n",ai_page);*/
        !           222: }
        !           223:
        !           224:
        !           225: TERM_PUBLIC void AI_linetype(linetype)
        !           226: int linetype;
        !           227: {
        !           228:     if (ai_stroke) {
        !           229:        fputs("S\n", gpoutfile);
        !           230:        ai_stroke = FALSE;
        !           231:     }
        !           232:     if (ai_subgroup_level) {
        !           233:        fputs("U\n", gpoutfile);
        !           234:        ai_subgroup_level--;
        !           235:     }
        !           236:     if (linetype == -2 && multiplot) {
        !           237:        /* for each new plot, line_type gets called twice with a value of -2.
        !           238:           It gets called once for the border and again for the tics.
        !           239:           This code will need to be changed if gnuplot's behavior changes.
        !           240:         */
        !           241:        switch (ai_multiplot_group) {
        !           242:        case 0:
        !           243:            fputs("u\n", gpoutfile);
        !           244:            ai_subgroup_level++;
        !           245:            ai_multiplot_group = 1;
        !           246:            break;
        !           247:        case 1:
        !           248:            ai_multiplot_group = 2;
        !           249:            break;
        !           250:        case 2:
        !           251:            ai_multiplot_group = 1;
        !           252:            fputs("U\nu\n", gpoutfile);
        !           253:            break;
        !           254:        }
        !           255:     }
        !           256:     if (linetype == -2 && !multiplot) {
        !           257:        if (ai_multiplot_group) {
        !           258:            fputs("U\n", gpoutfile);
        !           259:            ai_subgroup_level--;
        !           260:            ai_multiplot_group = 0;
        !           261:        }
        !           262:     }
        !           263:     fputs("u\n", gpoutfile);
        !           264:     ai_subgroup_level++;
        !           265:
        !           266:     switch (linetype) {
        !           267:     case -2:
        !           268:        fprintf(gpoutfile, "%.2f w\n", AI_LW / AI_SC * 2.0);
        !           269:        if (ai_color) {
        !           270:            fputs("0 0 0 1 K\n", gpoutfile);
        !           271:        } else {
        !           272:            fputs("[] 0 d\n", gpoutfile);
        !           273:        }
        !           274:        break;
        !           275:
        !           276:     case -1:
        !           277:        fprintf(gpoutfile, "%.2f w\n", AI_LW / AI_SC / 2.0);
        !           278:        if (ai_color) {
        !           279:            fputs("0 0 0 1 K\n", gpoutfile);
        !           280:        } else {
        !           281:            fputs("[1 2] 0 d\n", gpoutfile);
        !           282:        }
        !           283:        break;
        !           284:
        !           285:     case 0:
        !           286:        fprintf(gpoutfile, "%.2f w\n", AI_LW / AI_SC);
        !           287:        if (ai_color) {
        !           288:            fputs("1 0 1 0 K\n", gpoutfile);
        !           289:        } else {
        !           290:            fputs("[] 0 d\n", gpoutfile);
        !           291:        }
        !           292:        break;
        !           293:
        !           294:     case 1:
        !           295:        fprintf(gpoutfile, "%.2f w\n", AI_LW / AI_SC);
        !           296:        if (ai_color) {
        !           297:            fputs("1 1 0 0 K\n", gpoutfile);
        !           298:        } else {
        !           299:            fputs("[4 2] 0 d\n", gpoutfile);
        !           300:        }
        !           301:        break;
        !           302:
        !           303:     case 2:
        !           304:        fprintf(gpoutfile, "%.2f w\n", AI_LW / AI_SC);
        !           305:        if (ai_color) {
        !           306:            fputs("0 1 1 0 K\n", gpoutfile);
        !           307:        } else {
        !           308:            fputs("[2 3] 0 d\n", gpoutfile);
        !           309:        }
        !           310:        break;
        !           311:
        !           312:     case 3:
        !           313:        fprintf(gpoutfile, "%.2f w\n", AI_LW / AI_SC);
        !           314:        if (ai_color) {
        !           315:            fputs("0 1 0 0 K\n", gpoutfile);
        !           316:        } else {
        !           317:            fputs("[1 1.5] 0 d\n", gpoutfile);
        !           318:        }
        !           319:        break;
        !           320:
        !           321:     case 4:
        !           322:        fprintf(gpoutfile, "%f w\n", AI_LW / AI_SC);
        !           323:        if (ai_color) {
        !           324:            fputs("1 0 0 0 K\n", gpoutfile);
        !           325:        } else {
        !           326:            fputs("[5 2 1 2] 0 d\n", gpoutfile);
        !           327:        }
        !           328:        break;
        !           329:
        !           330:     case 5:
        !           331:        fprintf(gpoutfile, "%.2f w\n", AI_LW / AI_SC);
        !           332:        if (ai_color) {
        !           333:            fputs("0 0 1 0 K\n", gpoutfile);
        !           334:        } else {
        !           335:            fputs("[4 3 1 3] 0 d\n", gpoutfile);
        !           336:        }
        !           337:        break;
        !           338:
        !           339:     case 6:
        !           340:        fprintf(gpoutfile, "%.2f w\n", AI_LW / AI_SC);
        !           341:        if (ai_color) {
        !           342:            fputs("0 0 0 1 K\n", gpoutfile);
        !           343:        } else {
        !           344:            fputs("[2 2 2 4] 0 d\n", gpoutfile);
        !           345:        }
        !           346:        break;
        !           347:
        !           348:     case 7:
        !           349:        fprintf(gpoutfile, "%.2f w\n", AI_LW / AI_SC);
        !           350:        if (ai_color) {
        !           351:            fputs("0 0.7 1 0 K\n", gpoutfile);
        !           352:        } else {
        !           353:            fputs("[2 2 2 2 2 4] 0 d\n", gpoutfile);
        !           354:        }
        !           355:        break;
        !           356:
        !           357:     case 8:
        !           358:        fprintf(gpoutfile, "%.2f w\n", AI_LW / AI_SC);
        !           359:        if (ai_color) {
        !           360:            fputs("0.5 0.5 0.5 0 K\n", gpoutfile);
        !           361:        } else {
        !           362:            fputs("[2 2 2 2 2 2 2 4] 0 d\n", gpoutfile);
        !           363:        }
        !           364:        break;
        !           365:     }
        !           366:
        !           367:     ai_path_count = 0;
        !           368: }
        !           369:
        !           370:
        !           371: TERM_PUBLIC void AI_move(x, y)
        !           372: unsigned int x, y;
        !           373: {
        !           374:     if (ai_stroke)
        !           375:        fputs("S\n", gpoutfile);
        !           376:     fprintf(gpoutfile, "%.2f %.2f m\n", x / AI_SC, y / AI_SC);
        !           377:     ai_path_count += 1;
        !           378:     ai_stroke = TRUE;
        !           379: }
        !           380:
        !           381:
        !           382: TERM_PUBLIC void AI_vector(x, y)
        !           383: unsigned int x, y;
        !           384: {
        !           385:     fprintf(gpoutfile, "%.2f %.2f l\n", x / AI_SC, y / AI_SC);
        !           386:     ai_path_count += 1;
        !           387:     ai_stroke = TRUE;
        !           388:     if (ai_path_count >= 400) {
        !           389:        fprintf(gpoutfile, "S\n%.2f %.2f m\n", x / AI_SC, y / AI_SC);
        !           390:        ai_path_count = 0;
        !           391:     }
        !           392: }
        !           393:
        !           394:
        !           395: TERM_PUBLIC void AI_put_text(x, y, str)
        !           396: unsigned int x, y;
        !           397: char *str;
        !           398: {
        !           399:     char ch;
        !           400:     if (ai_stroke) {
        !           401:        fputs("S\n", gpoutfile);
        !           402:        ai_stroke = FALSE;
        !           403:     }
        !           404:     switch (ai_justify) {
        !           405:     case LEFT:
        !           406:        fprintf(gpoutfile, "/_%s %d 0 0 0 z\n", ai_font, ai_fontsize);
        !           407:        break;
        !           408:     case CENTRE:
        !           409:        fprintf(gpoutfile, "/_%s %d 0 0 1 z\n", ai_font, ai_fontsize);
        !           410:        break;
        !           411:     case RIGHT:
        !           412:        fprintf(gpoutfile, "/_%s %d 0 0 2 z\n", ai_font, ai_fontsize);
        !           413:        break;
        !           414:     }
        !           415:     if (ai_ang == 0) {
        !           416:        fprintf(gpoutfile, "[ 1 0 0 1 %.2f %.2f] e\n",
        !           417:                x / AI_SC, y / AI_SC - ai_fontsize / 3.0);
        !           418:     } else {
        !           419:        fprintf(gpoutfile, "[ 0 1 -1 0 %.2f %.2f] e\n",
        !           420:                x / AI_SC - ai_fontsize / 3.0, y / AI_SC);
        !           421:     }
        !           422:
        !           423:     putc('(', gpoutfile);
        !           424:     ch = *str++;
        !           425:     while (ch != '\0') {
        !           426:        if ((ch == '(') || (ch == ')') || (ch == '\\'))
        !           427:            putc('\\', gpoutfile);
        !           428:        putc(ch, gpoutfile);
        !           429:        ch = *str++;
        !           430:     }
        !           431:     fputs(") t\nT\n", gpoutfile);
        !           432:     ai_path_count = 0;
        !           433: }
        !           434:
        !           435: TERM_PUBLIC int AI_text_angle(ang)
        !           436: int ang;
        !           437: {
        !           438:     ai_ang = ang;
        !           439:     return TRUE;
        !           440: }
        !           441:
        !           442: TERM_PUBLIC int AI_justify_text(mode)
        !           443: enum JUSTIFY mode;
        !           444: {
        !           445:     ai_justify = mode;
        !           446:     return TRUE;
        !           447: }
        !           448:
        !           449: TERM_PUBLIC int AI_set_font(font) /* Entry font added by DJL */
        !           450: char *font;
        !           451: {
        !           452:     char name[32];
        !           453:     int size, sep;
        !           454:
        !           455:     if (font && *font) {
        !           456:        sep = strcspn(font, ",");
        !           457:        strncpy(name, font, sep);
        !           458:        name[sep] = '\0';
        !           459:        size = ai_fontsize;
        !           460:        sscanf(&(font[sep + 1]), "%d", &size);
        !           461:        if (*name)
        !           462:            strcpy(ai_font, name);
        !           463:        if (size)
        !           464:            ai_fontsize = size;
        !           465:     } else {
        !           466:        ai_fontsize = ai_oldfontsize;
        !           467:        strcpy(ai_font, ai_oldfont);
        !           468:     }
        !           469:     return TRUE;
        !           470: }
        !           471:
        !           472:
        !           473: TERM_PUBLIC void AI_suspend()
        !           474: {
        !           475: }
        !           476:
        !           477: TERM_PUBLIC void AI_resume()
        !           478: {
        !           479: }
        !           480:
        !           481:
        !           482: #endif
        !           483:
        !           484:
        !           485: #ifdef TERM_TABLE
        !           486:
        !           487: TERM_TABLE_START(aifm_driver)
        !           488:     "aifm", "Adobe Illustrator 3.0 Format",
        !           489:     AI_XMAX, AI_YMAX, AI_VCHAR, AI_HCHAR,
        !           490:     AI_VTIC, AI_HTIC, AI_options, AI_init, AI_reset,
        !           491:     AI_text, null_scale, AI_graphics, AI_move, AI_vector,
        !           492:     AI_linetype, AI_put_text, AI_text_angle,
        !           493:     AI_justify_text, do_point, do_arrow, AI_set_font,
        !           494:     NULL, 0, AI_suspend, AI_resume
        !           495: TERM_TABLE_END(aifm_driver)
        !           496:
        !           497: #undef LAST_TERM
        !           498: #define LAST_TERM aifm_driver
        !           499:
        !           500: #endif /* TERM_TABLE */
        !           501: #endif /* TERM_PROTO_ONLY */
        !           502:
        !           503: #ifdef TERM_HELP
        !           504: START_HELP(aifm)
        !           505: "1 aifm",
        !           506: "?commands set terminal aifm",
        !           507: "?set terminal aifm",
        !           508: "?set term aifm",
        !           509: "?terminal aifm",
        !           510: "?term aifm",
        !           511: "?aifm",
        !           512: " Several options may be set in `aifm`---the Adobe Illustrator 3.0+ driver.",
        !           513: "",
        !           514: " Syntax:",
        !           515: "       set terminal aifm {<color>} {\"<fontname>\"} {<fontsize>}",
        !           516: "",
        !           517: " <color> is either `color` or `monochrome`; \"<fontname>\" is the name of a",
        !           518: " valid PostScript font; <fontsize> is the size of the font in PostScript",
        !           519: " points, before scaling by the `set size` command.  Selecting `default` sets",
        !           520: " all options to their default values: `monochrome`, \"Helvetica\", and 14pt.",
        !           521: "",
        !           522: " Since AI does not really support multiple pages, multiple graphs will be",
        !           523: " drawn directly on top of one another.  However, each graph will be grouped",
        !           524: " individually, making it easy to separate them inside AI (just pick them up",
        !           525: " and move them).",
        !           526: "",
        !           527: " Examples:",
        !           528: "       set term aifm",
        !           529: "       set term aifm 22",
        !           530: "       set size 0.7,1.4; set term aifm color \"Times-Roman\" 14"
        !           531: END_HELP(ai)
        !           532: #endif /* TERM_HELP */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>