/* * $Id: ai.trm,v 1.18 1998/04/14 00:17:28 drd Exp $ * */ /* GNUPLOT - ai.trm */ /*[ * Copyright 1991, 1992, 1993, 1998 * * Permission to use, copy, and distribute this software and its * documentation for any purpose with or without fee is hereby granted, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation. * * Permission to modify the software is granted, but not the right to * distribute the complete modified source code. Modifications are to * be distributed as patches to the released version. Permission to * distribute binaries produced by compiling modified sources is granted, * provided you * 1. distribute the corresponding source modifications from the * released version in the form of a patch file along with the binaries, * 2. add special version identification to distinguish your version * in addition to the base release version number, * 3. provide your name and address as the primary contact for the * support of your modified version, and * 4. retain our contact information in regard to use of the base * software. * Permission to distribute the released version of the source code along * with corresponding source modifications in the form of a patch file is * granted with same provisions 2 through 4 for binary distributions. * * This software is provided "as is" without express or implied warranty * to the extent permitted by applicable law. ]*/ /* * This file is included by ../term.c. * * This terminal driver supports: * aifm * * AUTHORS * Ray Ghanbari * * send your comments or suggestions to (info-gnuplot@dartmouth.edu). * * The 'aifm' driver produces files editable by Adobe Illustrator 3.0 * To change font to Courier and font size to 20pts use * 'set term aifm "Courier" 20'. * To switch to color output use * 'set term aifm color'. */ /* AIFM driver by Ray Ghanbari, ray@mtl.mit.edu, * based on PostScript driver by Russell Lang, rjl@monu1.cc.monash.edu.au */ /* Changed to 3.6 terminal format, David C. Schooley, 9/29/95 */ /* Improved multiple plot support, David C. Schooley, 6/5/95 */ /* Compatiblity with Illustrator 7.0, David C. Schooley, 6/5/95 */ /* Font and size support for labels, David C. Schooley, 6/5/95 */ #include "driver.h" #ifdef TERM_REGISTER register_term(aifm) #endif #ifdef TERM_PROTO TERM_PUBLIC void AI_init __PROTO((void)); TERM_PUBLIC void AI_graphics __PROTO((void)); TERM_PUBLIC void AI_text __PROTO((void)); TERM_PUBLIC void AI_linetype __PROTO((int linetype)); TERM_PUBLIC void AI_move __PROTO((unsigned int x, unsigned int y)); TERM_PUBLIC void AI_vector __PROTO((unsigned int x, unsigned int y)); TERM_PUBLIC void AI_put_text __PROTO((unsigned int x, unsigned int y, char *str)); TERM_PUBLIC int AI_text_angle __PROTO((int ang)); TERM_PUBLIC void AI_reset __PROTO((void)); TERM_PUBLIC void AI_options __PROTO((void)); TERM_PUBLIC int AI_justify_text __PROTO((enum JUSTIFY mode)); TERM_PUBLIC void AI_suspend __PROTO(()); TERM_PUBLIC void AI_resume __PROTO(()); TERM_PUBLIC int AI_set_font __PROTO((char *font)); #define AI_XOFF 50 /* page offset in pts */ #define AI_YOFF 50 #define AI_XMAX 5000 #define AI_YMAX 3500 #define AI_XLAST (AI_XMAX - 1) #define AI_YLAST (AI_YMAX - 1) #define AI_VTIC (AI_YMAX/80) #define AI_HTIC (AI_YMAX/80) #define AI_SC (10.0) /* scale is 1pt = 10 units */ #define AI_LW (0.5*AI_SC) /* linewidth = 0.5 pts */ #define AI_VCHAR (14*AI_SC) /* default is 14 point characters */ #define AI_HCHAR (14*AI_SC*6/10) #endif #ifndef TERM_PROTO_ONLY #ifdef TERM_BODY /* From version.c */ extern char version[]; extern char patchlevel[]; char ai_font[MAX_ID_LEN + 1] = "Times-Roman"; /* name of font */ int ai_fontsize = 14; /* size of font in pts */ char ai_oldfont[MAX_ID_LEN + 1] = "Times-Roman"; /* name of font */ int ai_oldfontsize = 14; /* size of font in pts */ TBOOLEAN ai_color = FALSE; TBOOLEAN ai_stroke = FALSE; int ai_page = 0; /* page count */ int ai_path_count = 0; /* count of lines in path */ int ai_ang = 0; /* text angle */ int ai_subgroup_level = 0; /* depth of sub-groups */ int ai_multiplot_group = 0; /* group for multiplot */ enum JUSTIFY ai_justify = LEFT; /* text is flush left */ TERM_PUBLIC void AI_options() { if (!END_OF_COMMAND) { if (almost_equals(c_token, "d$efault")) { ai_color = FALSE; strcpy(ai_font, "Times-Roman"); ai_fontsize = 14; strcpy(ai_oldfont, "Times-Roman"); ai_oldfontsize = 14; c_token++; } } if (!END_OF_COMMAND) { if (almost_equals(c_token, "m$onochrome")) { ai_color = FALSE; c_token++; } else if (almost_equals(c_token, "c$olor") || almost_equals(c_token, "c$olour")) { ai_color = TRUE; c_token++; } } if (!END_OF_COMMAND && isstring(c_token)) { quote_str(ai_font, c_token, MAX_ID_LEN); strcpy(ai_oldfont, ai_font); c_token++; } if (!END_OF_COMMAND) { /* We have font size specified */ struct value a; ai_fontsize = (int) real(const_express(&a)); ai_oldfontsize = ai_fontsize; c_token++; term->v_char = (unsigned int) (ai_fontsize * AI_SC); term->h_char = (unsigned int) (ai_fontsize * AI_SC * 6 / 10); } sprintf(term_options, "%s \"%s\" %d", ai_color ? "color" : "monochrome", ai_font, ai_fontsize); } TERM_PUBLIC void AI_init() { ai_page = 0; fprintf(gpoutfile, "%%!PS-Adobe-2.0 EPSF-1.2\n\ %%%%Creator: Adobe Illustrator(TM) 3.2\n\ %%%%TrueCreator: gnuplot %s patchlevel %s ai terminal\n\ %%%%BoundingBox: %d %d %d %d\n\ %%%%Template:\n\ %%%%EndComments\n\ %%%%EndProlog\n", version, patchlevel, AI_XOFF, AI_YOFF, (int) ((AI_XMAX) / AI_SC + 0.5 + AI_XOFF), (int) ((AI_YMAX) / AI_SC + 0.5 + AI_YOFF)); } TERM_PUBLIC void AI_graphics() { ai_page++; /* fprintf(gpoutfile,"%%%%Page: %d %d\n",ai_page,ai_page);*/ fputs("\ 0 G\n\ 1 j\n\ 1 J\n\ u\n", gpoutfile); ai_path_count = 0; ai_stroke = FALSE; } TERM_PUBLIC void AI_text() { if (ai_stroke) { fputs("S\n", gpoutfile); ai_stroke = FALSE; } while (ai_subgroup_level) { fputs("U\n", gpoutfile); ai_subgroup_level--; } fputs("U\n", gpoutfile); ai_path_count = 0; ai_multiplot_group = 0; } TERM_PUBLIC void AI_reset() { fputs("%%%%Trailer\n", gpoutfile); /* fprintf(gpoutfile,"%%%%Pages: %d\n",ai_page);*/ } TERM_PUBLIC void AI_linetype(linetype) int linetype; { if (ai_stroke) { fputs("S\n", gpoutfile); ai_stroke = FALSE; } if (ai_subgroup_level) { fputs("U\n", gpoutfile); ai_subgroup_level--; } if (linetype == -2 && multiplot) { /* for each new plot, line_type gets called twice with a value of -2. It gets called once for the border and again for the tics. This code will need to be changed if gnuplot's behavior changes. */ switch (ai_multiplot_group) { case 0: fputs("u\n", gpoutfile); ai_subgroup_level++; ai_multiplot_group = 1; break; case 1: ai_multiplot_group = 2; break; case 2: ai_multiplot_group = 1; fputs("U\nu\n", gpoutfile); break; } } if (linetype == -2 && !multiplot) { if (ai_multiplot_group) { fputs("U\n", gpoutfile); ai_subgroup_level--; ai_multiplot_group = 0; } } fputs("u\n", gpoutfile); ai_subgroup_level++; switch (linetype) { case -2: fprintf(gpoutfile, "%.2f w\n", AI_LW / AI_SC * 2.0); if (ai_color) { fputs("0 0 0 1 K\n", gpoutfile); } else { fputs("[] 0 d\n", gpoutfile); } break; case -1: fprintf(gpoutfile, "%.2f w\n", AI_LW / AI_SC / 2.0); if (ai_color) { fputs("0 0 0 1 K\n", gpoutfile); } else { fputs("[1 2] 0 d\n", gpoutfile); } break; case 0: fprintf(gpoutfile, "%.2f w\n", AI_LW / AI_SC); if (ai_color) { fputs("1 0 1 0 K\n", gpoutfile); } else { fputs("[] 0 d\n", gpoutfile); } break; case 1: fprintf(gpoutfile, "%.2f w\n", AI_LW / AI_SC); if (ai_color) { fputs("1 1 0 0 K\n", gpoutfile); } else { fputs("[4 2] 0 d\n", gpoutfile); } break; case 2: fprintf(gpoutfile, "%.2f w\n", AI_LW / AI_SC); if (ai_color) { fputs("0 1 1 0 K\n", gpoutfile); } else { fputs("[2 3] 0 d\n", gpoutfile); } break; case 3: fprintf(gpoutfile, "%.2f w\n", AI_LW / AI_SC); if (ai_color) { fputs("0 1 0 0 K\n", gpoutfile); } else { fputs("[1 1.5] 0 d\n", gpoutfile); } break; case 4: fprintf(gpoutfile, "%f w\n", AI_LW / AI_SC); if (ai_color) { fputs("1 0 0 0 K\n", gpoutfile); } else { fputs("[5 2 1 2] 0 d\n", gpoutfile); } break; case 5: fprintf(gpoutfile, "%.2f w\n", AI_LW / AI_SC); if (ai_color) { fputs("0 0 1 0 K\n", gpoutfile); } else { fputs("[4 3 1 3] 0 d\n", gpoutfile); } break; case 6: fprintf(gpoutfile, "%.2f w\n", AI_LW / AI_SC); if (ai_color) { fputs("0 0 0 1 K\n", gpoutfile); } else { fputs("[2 2 2 4] 0 d\n", gpoutfile); } break; case 7: fprintf(gpoutfile, "%.2f w\n", AI_LW / AI_SC); if (ai_color) { fputs("0 0.7 1 0 K\n", gpoutfile); } else { fputs("[2 2 2 2 2 4] 0 d\n", gpoutfile); } break; case 8: fprintf(gpoutfile, "%.2f w\n", AI_LW / AI_SC); if (ai_color) { fputs("0.5 0.5 0.5 0 K\n", gpoutfile); } else { fputs("[2 2 2 2 2 2 2 4] 0 d\n", gpoutfile); } break; } ai_path_count = 0; } TERM_PUBLIC void AI_move(x, y) unsigned int x, y; { if (ai_stroke) fputs("S\n", gpoutfile); fprintf(gpoutfile, "%.2f %.2f m\n", x / AI_SC, y / AI_SC); ai_path_count += 1; ai_stroke = TRUE; } TERM_PUBLIC void AI_vector(x, y) unsigned int x, y; { fprintf(gpoutfile, "%.2f %.2f l\n", x / AI_SC, y / AI_SC); ai_path_count += 1; ai_stroke = TRUE; if (ai_path_count >= 400) { fprintf(gpoutfile, "S\n%.2f %.2f m\n", x / AI_SC, y / AI_SC); ai_path_count = 0; } } TERM_PUBLIC void AI_put_text(x, y, str) unsigned int x, y; char *str; { char ch; if (ai_stroke) { fputs("S\n", gpoutfile); ai_stroke = FALSE; } switch (ai_justify) { case LEFT: fprintf(gpoutfile, "/_%s %d 0 0 0 z\n", ai_font, ai_fontsize); break; case CENTRE: fprintf(gpoutfile, "/_%s %d 0 0 1 z\n", ai_font, ai_fontsize); break; case RIGHT: fprintf(gpoutfile, "/_%s %d 0 0 2 z\n", ai_font, ai_fontsize); break; } if (ai_ang == 0) { fprintf(gpoutfile, "[ 1 0 0 1 %.2f %.2f] e\n", x / AI_SC, y / AI_SC - ai_fontsize / 3.0); } else { fprintf(gpoutfile, "[ 0 1 -1 0 %.2f %.2f] e\n", x / AI_SC - ai_fontsize / 3.0, y / AI_SC); } putc('(', gpoutfile); ch = *str++; while (ch != '\0') { if ((ch == '(') || (ch == ')') || (ch == '\\')) putc('\\', gpoutfile); putc(ch, gpoutfile); ch = *str++; } fputs(") t\nT\n", gpoutfile); ai_path_count = 0; } TERM_PUBLIC int AI_text_angle(ang) int ang; { ai_ang = ang; return TRUE; } TERM_PUBLIC int AI_justify_text(mode) enum JUSTIFY mode; { ai_justify = mode; return TRUE; } TERM_PUBLIC int AI_set_font(font) /* Entry font added by DJL */ char *font; { char name[32]; int size, sep; if (font && *font) { sep = strcspn(font, ","); strncpy(name, font, sep); name[sep] = '\0'; size = ai_fontsize; sscanf(&(font[sep + 1]), "%d", &size); if (*name) strcpy(ai_font, name); if (size) ai_fontsize = size; } else { ai_fontsize = ai_oldfontsize; strcpy(ai_font, ai_oldfont); } return TRUE; } TERM_PUBLIC void AI_suspend() { } TERM_PUBLIC void AI_resume() { } #endif #ifdef TERM_TABLE TERM_TABLE_START(aifm_driver) "aifm", "Adobe Illustrator 3.0 Format", AI_XMAX, AI_YMAX, AI_VCHAR, AI_HCHAR, AI_VTIC, AI_HTIC, AI_options, AI_init, AI_reset, AI_text, null_scale, AI_graphics, AI_move, AI_vector, AI_linetype, AI_put_text, AI_text_angle, AI_justify_text, do_point, do_arrow, AI_set_font, NULL, 0, AI_suspend, AI_resume TERM_TABLE_END(aifm_driver) #undef LAST_TERM #define LAST_TERM aifm_driver #endif /* TERM_TABLE */ #endif /* TERM_PROTO_ONLY */ #ifdef TERM_HELP START_HELP(aifm) "1 aifm", "?commands set terminal aifm", "?set terminal aifm", "?set term aifm", "?terminal aifm", "?term aifm", "?aifm", " Several options may be set in `aifm`---the Adobe Illustrator 3.0+ driver.", "", " Syntax:", " set terminal aifm {} {\"\"} {}", "", " is either `color` or `monochrome`; \"\" is the name of a", " valid PostScript font; is the size of the font in PostScript", " points, before scaling by the `set size` command. Selecting `default` sets", " all options to their default values: `monochrome`, \"Helvetica\", and 14pt.", "", " Since AI does not really support multiple pages, multiple graphs will be", " drawn directly on top of one another. However, each graph will be grouped", " individually, making it easy to separate them inside AI (just pick them up", " and move them).", "", " Examples:", " set term aifm", " set term aifm 22", " set size 0.7,1.4; set term aifm color \"Times-Roman\" 14" END_HELP(ai) #endif /* TERM_HELP */