--- /dev/null
+/* Hello, Emacs, this is -*-C-*-
+ * $Id: corel.trm,v 1.17 2006/07/21 02:35:45 sfeam Exp $
+ */
+
+/*
+ corel.trm
+
+ A modified ai.trm for CorelDraw import filters
+ by Chris Parks, parks@physics.purdue.edu
+ Import from CorelDraw with the CorelTrace filter
+
+ syntax: set terminal default
+ set terminal mode "fontname" fontsize,xsize,ysize,linewidth
+
+ mode= color or monochrome (default=mono)
+ "fontname"= postscript font name (default="SwitzerlandLight")
+ fontsize = size of font in points (default=22pt)
+ xsize = width of page in inches (default=8.2in)
+ ysize = height of page in inches (default=10in)
+ linewidth = width of lines in points (default=1.2pt)
+
+*/
+
+/*
+ * adapted to the new terminal layout by Stefan Bodewig (Dec. 1995)
+ */
+
+#include "driver.h"
+
+#ifdef TERM_REGISTER
+register_term(corel)
+#endif
+
+#ifdef TERM_PROTO
+TERM_PUBLIC void COREL_options __PROTO((void));
+TERM_PUBLIC void COREL_init __PROTO((void));
+TERM_PUBLIC void COREL_graphics __PROTO((void));
+TERM_PUBLIC void COREL_text __PROTO((void));
+TERM_PUBLIC void COREL_reset __PROTO((void));
+TERM_PUBLIC void COREL_linetype __PROTO((int linetype));
+TERM_PUBLIC void COREL_move __PROTO((unsigned int x, unsigned int y));
+TERM_PUBLIC void COREL_vector __PROTO((unsigned int x, unsigned int y));
+TERM_PUBLIC void COREL_put_text __PROTO((unsigned int x, unsigned int y,
+ const char *str));
+TERM_PUBLIC int COREL_text_angle __PROTO((int ang));
+TERM_PUBLIC int COREL_justify_text __PROTO((enum JUSTIFY mode));
+#define CORELD_XMAX 5960 /* 8.2 inches wide */
+#define CORELD_YMAX 7200 /* 10 inches high */
+#define CORELD_VTIC (CORELD_YMAX/80)
+#define CORELD_HTIC (CORELD_YMAX/80)
+#define CORELD_VCHAR (22*COREL_SC) /* default is 22 point characters */
+#define CORELD_HCHAR (22*COREL_SC*6/10)
+#endif
+
+#ifndef TERM_PROTO_ONLY
+#ifdef TERM_BODY
+
+#define DEFAULT_CORELFONT "SwitzerlandLight"
+
+/* plots for publication should be sans-serif (don't use TimesRoman) */
+static char corel_font[MAX_ID_LEN + 1] = DEFAULT_CORELFONT; /* name of font */
+static int corel_fontsize = 22; /* size of font in pts */
+static TBOOLEAN corel_color = FALSE;
+static TBOOLEAN corel_stroke = FALSE;
+static int corel_path_count = 0; /* count of lines in path */
+static int corel_ang = 0; /* text angle */
+static enum JUSTIFY corel_justify = LEFT; /* text is flush left */
+
+
+/* default mode constants */
+#define CORELD_XOFF 0 /* page offset in pts */
+#define CORELD_YOFF 0
+#define COREL_SC (10.0) /* scale is 1pt = 10 units */
+#define CORELD_LW (1.2*COREL_SC) /* linewidth = 1.2 pts */
+
+static unsigned int corel_xmax = CORELD_XMAX;
+static unsigned int corel_ymax = CORELD_YMAX;
+static float corel_lw = CORELD_LW;
+
+enum COREL_id {COREL_DEFAULT, COREL_MONOCHROME, COREL_COLOR, COREL_OTHER };
+
+static struct gen_table COREL_opts[] =
+{
+ { "def$ault", COREL_DEFAULT},
+ { "mono$chrome", COREL_MONOCHROME },
+ { "color$", COREL_COLOR },
+ { "colour$", COREL_COLOR },
+ { NULL, COREL_OTHER }
+};
+
+TERM_PUBLIC void
+COREL_options()
+{
+ struct value a;
+
+ while (!END_OF_COMMAND) {
+ switch(lookup_table(&COREL_opts[0],c_token)) {
+ case COREL_DEFAULT:
+ corel_color = FALSE;
+ strcpy(corel_font, DEFAULT_CORELFONT);
+ corel_fontsize = 22;
+ corel_lw = CORELD_LW;
+ corel_xmax = CORELD_XMAX;
+ corel_ymax = CORELD_YMAX;
+ c_token++;
+ break;
+ case COREL_MONOCHROME:
+ corel_color = FALSE;
+ c_token++;
+ break;
+ case COREL_COLOR:
+ corel_color = TRUE;
+ c_token++;
+ break;
+ case COREL_OTHER:
+ default:
+ /* font name */
+ if (isstring(c_token)) {
+ quote_str(corel_font, c_token, MAX_ID_LEN);
+ c_token++;
+ } else {
+ /* We have font size specified */
+ corel_fontsize = (int) real(const_express(&a));
+ c_token++;
+ term->v_char = (unsigned int) (corel_fontsize * COREL_SC);
+ term->h_char = (unsigned int) (corel_fontsize * COREL_SC * 6 / 10);
+ }
+ break;
+ }
+ }
+
+ /* FIXME - argh. Stupid syntax alert here */
+ if (!END_OF_COMMAND) {
+ corel_xmax = (unsigned int) (real(const_express(&a)) * 720);
+ c_token++;
+ if (!END_OF_COMMAND) {
+ corel_ymax = (unsigned int) (real(const_express(&a)) * 720);
+ c_token++;
+ }
+ term->xmax = corel_xmax;
+ term->ymax = corel_ymax;
+ term->v_tic = corel_ymax / 80;
+ term->h_tic = corel_ymax / 80;
+ }
+ if (!END_OF_COMMAND) {
+ corel_lw = real(const_express(&a)) * COREL_SC;
+ c_token++;
+ }
+ sprintf(term_options, "%s \"%s\" %d,%0.1f,%0.1f,%0.1f",
+ corel_color ? "color" : "monochrome", corel_font,
+ corel_fontsize, corel_xmax / 720.0, corel_ymax / 720.0,
+ corel_lw / COREL_SC);
+}
+
+TERM_PUBLIC void
+COREL_init()
+{
+ fprintf(gpoutfile, "\
+%%!PS-Adobe-2.0 EPSF-1.2\n\
+%%%%BoundingBox: %d %d %d %d\n\
+%%%%TemplateBox: %d %d %d %d\n\
+%%%%EndComments\n\
+%%%%EndProlog\n\
+%%%%BeginSetup\n%%%%EndSetup\n",
+ CORELD_XOFF, CORELD_YOFF,
+ (int) ((corel_xmax) / COREL_SC + 0.5 + CORELD_XOFF),
+ (int) ((corel_ymax) / COREL_SC + 0.5 + CORELD_YOFF),
+ CORELD_XOFF, CORELD_YOFF,
+ (int) ((corel_xmax) / COREL_SC + 0.5 + CORELD_XOFF),
+ (int) ((corel_ymax) / COREL_SC + 0.5 + CORELD_YOFF));
+}
+
+
+TERM_PUBLIC void
+COREL_graphics()
+{
+ corel_path_count = 0;
+ corel_stroke = FALSE;
+}
+
+
+TERM_PUBLIC void
+COREL_text()
+{
+ if (corel_stroke) {
+ fputs("S\n", gpoutfile);
+ corel_stroke = FALSE;
+ }
+ corel_path_count = 0;
+}
+
+
+TERM_PUBLIC void
+COREL_reset()
+{
+ fputs("%%Trailer\n", gpoutfile);
+}
+
+
+TERM_PUBLIC void
+COREL_linetype(int linetype)
+{
+ if (corel_stroke) {
+ fputs("S\n", gpoutfile);
+ corel_stroke = FALSE;
+ }
+ switch (linetype) {
+ case LT_BLACK:
+ fprintf(gpoutfile, "%.2f w\n", corel_lw / COREL_SC);
+ if (corel_color) {
+ fputs("0 0 0 1 K\n", gpoutfile);
+ } else {
+ fputs("\
+[] 0 d\n\
+0 j\n0 G\n", gpoutfile);
+ }
+ break;
+
+ case LT_AXIS:
+ fprintf(gpoutfile, "%.2f w\n", corel_lw / COREL_SC);
+ if (corel_color) {
+ fputs("0 0 0 1 K\n", gpoutfile);
+ } else {
+ fputs("\
+[1 2] 0 d\n\
+0 j\n0 G\n", gpoutfile);
+ }
+ break;
+
+ case 0:
+ fprintf(gpoutfile, "%.2f w\n", corel_lw / COREL_SC);
+ if (corel_color) {
+ fputs("1 0 1 0 K\n", gpoutfile);
+ } else {
+ fputs("\
+[] 0 d\n\
+2 j\n0 G\n", gpoutfile);
+ }
+ break;
+
+ case 1:
+ fprintf(gpoutfile, "%.2f w\n", corel_lw / COREL_SC);
+ if (corel_color) {
+ fputs("1 1 0 0 K\n", gpoutfile);
+ } else {
+ fputs("\
+[4 2] 0 d\n\
+2 j\n0 G\n", gpoutfile);
+ }
+ break;
+
+ case 2:
+ fprintf(gpoutfile, "%.2f w\n", corel_lw / COREL_SC);
+ if (corel_color) {
+ fputs("0 1 1 0 K\n", gpoutfile);
+ } else {
+ fputs("\
+[2 3] 0 d\n\
+2 j\n0 G\n", gpoutfile);
+ }
+ break;
+
+ case 3:
+ fprintf(gpoutfile, "%.2f w\n", corel_lw / COREL_SC);
+ if (corel_color) {
+ fputs("0 1 0 0 K\n", gpoutfile);
+ } else {
+ fputs("\
+[1 1.5] 0 d\n\
+2 j\n0 G\n", gpoutfile);
+ }
+ break;
+
+ case 4:
+ fprintf(gpoutfile, "%f w\n", corel_lw / COREL_SC);
+ if (corel_color) {
+ fputs("1 0 0 0 K\n", gpoutfile);
+ } else {
+ fputs("\
+[5 2 1 2] 0 d\n\
+2 j\n0 G\n", gpoutfile);
+ }
+ break;
+
+ case 5:
+ fprintf(gpoutfile, "%.2f w\n", corel_lw / COREL_SC);
+ if (corel_color) {
+ fputs("0 0 1 0 K\n", gpoutfile);
+ } else {
+ fputs("\
+[4 3 1 3] 0 d\n\
+2 j\n0 G\n", gpoutfile);
+ }
+ break;
+
+ case 6:
+ fprintf(gpoutfile, "%.2f w\n", corel_lw / COREL_SC);
+ if (corel_color) {
+ fputs("0 0 0 1 K\n", gpoutfile);
+ } else {
+ fputs("\
+[2 2 2 4] 0 d\n\
+2 j\n0 G\n", gpoutfile);
+ }
+ break;
+
+ case 7:
+ fprintf(gpoutfile, "%.2f w\n", corel_lw / COREL_SC);
+ if (corel_color) {
+ fputs("0 0.7 1 0 K\n", gpoutfile);
+ } else {
+ fputs("\
+[2 2 2 2 2 4] 0 d\n\
+2 j\n0 G\n", gpoutfile);
+ }
+ break;
+
+ case 8:
+ fprintf(gpoutfile, "%.2f w\n", corel_lw / COREL_SC);
+ if (corel_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\
+2 j\n0 G\n", gpoutfile);
+ }
+ break;
+ }
+ corel_path_count = 0;
+}
+
+
+TERM_PUBLIC void
+COREL_move(unsigned int x, unsigned int y)
+{
+ if (corel_stroke)
+ fputs("S\n", gpoutfile);
+ fprintf(gpoutfile, "%0.2f %0.2f m\n", x / COREL_SC, y / COREL_SC);
+ corel_path_count += 1;
+ corel_stroke = TRUE;
+}
+
+
+TERM_PUBLIC void
+COREL_vector(unsigned int x, unsigned int y)
+{
+ fprintf(gpoutfile, "%.2f %.2f l\n", x / COREL_SC, y / COREL_SC);
+ corel_path_count += 1;
+ corel_stroke = TRUE;
+ if (corel_path_count >= 400) {
+ fprintf(gpoutfile, "S\n%.2f %.2f m\n", x / COREL_SC, y / COREL_SC);
+ corel_path_count = 0;
+ }
+}
+
+
+TERM_PUBLIC void
+COREL_put_text(unsigned int x, unsigned int y, const char *str)
+{
+ char ch;
+ if (corel_stroke) {
+ fputs("S\n", gpoutfile);
+ corel_stroke = FALSE;
+ }
+ switch (corel_justify) {
+ case LEFT:
+ fprintf(gpoutfile, "/_%s %d %d 0 0 z\n",
+ corel_font, corel_fontsize, corel_fontsize);
+ break;
+ case CENTRE:
+ fprintf(gpoutfile, "/_%s %d %d 0 1 z\n",
+ corel_font, corel_fontsize, corel_fontsize);
+ break;
+ case RIGHT:
+ fprintf(gpoutfile, "/_%s %d %d 0 2 z\n",
+ corel_font, corel_fontsize, corel_fontsize);
+ break;
+ }
+ if (corel_ang == 0) {
+ fprintf(gpoutfile, "[1 0 0 1 %.2f %.2f]e\n0 g\n",
+ x / COREL_SC, y / COREL_SC - corel_fontsize / 3.0);
+ } else {
+ fprintf(gpoutfile, "[0 1 -1 0 %.2f %.2f]e\n0 g\n",
+ x / COREL_SC - corel_fontsize / 3.0, y / COREL_SC);
+ }
+
+ putc('(', gpoutfile);
+ ch = *str++;
+ while (ch != NUL) {
+ if ((ch == '(') || (ch == ')') || (ch == '\\'))
+ putc('\\', gpoutfile);
+ putc(ch, gpoutfile);
+ ch = *str++;
+ }
+ fputs(")t\nT\n", gpoutfile);
+ corel_path_count = 0;
+}
+
+TERM_PUBLIC int
+COREL_text_angle(int ang)
+{
+ corel_ang = ang;
+ return TRUE;
+}
+
+TERM_PUBLIC int
+COREL_justify_text(enum JUSTIFY mode)
+{
+ corel_justify = mode;
+ return TRUE;
+}
+
+#endif /* TERM_BODY */
+
+#ifdef TERM_TABLE
+
+TERM_TABLE_START(corel_driver)
+ "corel", "EPS format for CorelDRAW",
+ CORELD_XMAX, CORELD_YMAX, CORELD_VCHAR, CORELD_HCHAR,
+ CORELD_VTIC, CORELD_HTIC, COREL_options, COREL_init, COREL_reset,
+ COREL_text, null_scale, COREL_graphics, COREL_move, COREL_vector,
+ COREL_linetype, COREL_put_text, COREL_text_angle,
+ COREL_justify_text, do_point, do_arrow, set_font_null
+TERM_TABLE_END(corel_driver)
+
+#undef LAST_TERM
+#define LAST_TERM corel_driver
+
+#endif /* TERM_TABLE */
+#endif /* TERM_PROTO_ONLY */
+
+#ifdef TERM_HELP
+START_HELP(corel)
+"1 corel",
+"?commands set terminal corel",
+"?set terminal corel",
+"?set term corel",
+"?terminal corel",
+"?term corel",
+"?corel",
+" The `corel` terminal driver supports CorelDraw.",
+"",
+" Syntax:",
+" set terminal corel { default",
+" | {monochrome | color",
+" {\"<font>\" {<fontsize> ",
+" {<xsize> <ysize> {<linewidth> }}}}}",
+"",
+" where the fontsize and linewidth are specified in points and the sizes in",
+" inches. The defaults are monochrome, \"SwitzerlandLight\", 22, 8.2, 10 and 1.2."
+END_HELP(corel)
+#endif /* TERM_HELP */