/* prototypes for this file are in imagen.trm-proto */ /* GNUPLOT - imagen.trm */ /* * Copyright (C) 1990 * * 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 modified code. Modifications are to be distributed * as patches to released version. * * This software is provided "as is" without express or implied warranty. * * This file is included by ../term.c. * * This terminal driver supports: * Imagen laser printers * * AUTHORS * Paul E. McKenney, David Kotz * * send your comments or suggestions to (pixar!info-gnuplot@sun.com). * */ /* * Original for direct Imagen output (but retaining many of the * LaTeX extensions) by Paul E. McKenney, 1989. * Further modified by David Kotz to fit into gnuplot 2.0. * Information Science and Technology Division, SRI International, * 333 Ravenswood Ave, Menlo Park, CA 94025. * Mail to mckenney@sri.com. */ #include "imPcodes.h" #define IMAGEN_PTS_PER_INCH (300) #define IMAGEN_XMAX (IMAGEN_PTS_PER_INCH * 10) /* 10.0 inches */ #define IMAGEN_YMAX (IMAGEN_PTS_PER_INCH * 75 / 10) /* 7.5 inches */ #define IMAGEN_FONTSIZE 12 #define IMAGEN_HTIC (20) #define IMAGEN_VTIC (20) #define IMAGEN_VCHAR (IMAGEN_FONTSIZE*5) #define IMAGEN_HCHAR (IMAGEN_VCHAR/2) static int IMAGEN_orgx; /* absolute-pixel-ORIgin of graph. */ static int IMAGEN_orgy; static int IMAGEN_posx; /* current drawing position (lines). */ static int IMAGEN_posy; static int IMAGEN_inplot; static int IMAGEN_xmax; /* width of graph in pixels. */ static int IMAGEN_ymax; /* height of graph in pixels. */ static int IMAGEN_hchar; /* Height of CHAR in current font. */ static int IMAGEN_wchar; /* Width of CHAR in current font. */ static int IMAGEN_blofs; /* BaseLine OFfSet from bounding box. */ static int IMAGEN_angle = -1; /* 0 for horizontal text, 1 for vertical */ static enum JUSTIFY IMAGEN_justify = LEFT; /* left/center/right */ static IMAGEN_seq_pos; /* position in sequence */ int IMAGEN_init(void) { char font[10]; /* font name */ IMAGEN_posx = IMAGEN_posy = 0; IMAGEN_orgx = (11.0 * IMAGEN_PTS_PER_INCH - IMAGEN_XMAX) / 2; IMAGEN_orgy = (8.5 * IMAGEN_PTS_PER_INCH - IMAGEN_YMAX)/ 2; fputs("@document(language impress)", outfile); putc(imP_SET_HV_SYSTEM, outfile); putc((3<<3)|5, outfile); sprintf(font, "cour%02d", IMAGEN_FONTSIZE); IMAGEN_createfamily(font, IMAGEN_FONTSIZE); IMAGEN_setfont(IMAGEN_FONTSIZE); IMAGEN_text_angle(0); putc(imP_SET_ABS_H, outfile); IMAGEN_putwd(0); putc(imP_SET_ABS_V, outfile); IMAGEN_putwd(0); IMAGEN_linetype(-1); } int IMAGEN_graphics(void) { static BOOLEAN first = TRUE; if (!first) putc(imP_ENDPAGE, outfile); first = FALSE; IMAGEN_move(0, 0); } int IMAGEN_text(void) { } int IMAGEN_linetype(int linetype) { static int lastlinetype = -10; if (linetype < 0) linetype = -linetype; else linetype *= 2; if (lastlinetype == linetype) return; lastlinetype = linetype; /* now >= 0 */ putc(imP_SET_PEN, outfile); putc(linetype, outfile); } int IMAGEN_move(int x, int y) { IMAGEN_posx = x; IMAGEN_posy = y; } int IMAGEN_vector(int ux, int uy) { /* Create path. */ putc(imP_CREATE_PATH, outfile); IMAGEN_putwd(2); IMAGEN_putwd(IMAGEN_posx + IMAGEN_orgx); IMAGEN_putwd(IMAGEN_posy + IMAGEN_orgy); IMAGEN_putwd(ux + IMAGEN_orgx); IMAGEN_putwd(uy + IMAGEN_orgy); /* Draw path with black pen. */ putc(imP_DRAW_PATH, outfile); putc(15, outfile); /* Set current position to end of line. */ IMAGEN_move(ux, uy); } static void int IMAGEN_setpos(int ux, int uy) { /* Set x and y position (for text), also set beginning-of-line. */ putc(imP_SET_ABS_H, outfile); IMAGEN_putwd(ux + IMAGEN_orgx); putc(imP_SET_ABS_V, outfile); IMAGEN_putwd(uy + IMAGEN_orgy); putc(imP_SET_BOL, outfile); if (IMAGEN_angle == 1) IMAGEN_putwd(uy + IMAGEN_orgx); /* vertical */ else IMAGEN_putwd(ux + IMAGEN_orgx); /* horizontal */ } int IMAGEN_text_angle(int angle) { if (IMAGEN_angle != angle) { IMAGEN_angle = angle; /* record for later use */ putc(imP_SET_ADV_DIRS, outfile); putc(angle == 0 ? 0 : 7, outfile); /* 0=>horiz : 7=>vert */ } return(TRUE); } int IMAGEN_justify_text(enum JUSTIFY mode) { IMAGEN_justify = mode; return(TRUE); } static char * int IMAGEN_cvts(?2, ?2, ?2) { char *cp1; char *cp2; static char *buf = NULL; int h; int maxw; int w; /* Free up old buffer, if there is one, get a new one. Since */ /* all transformations shorten the string, get a buffer that is */ /* the same size as the input string. */ if (buf != NULL) (void) free(buf); buf = (char *) alloc(strlen(str), "converted label string"); /* Do the transformations. */ cp1 = str; cp2 = buf; h = 1; maxw = 0; w = 0; while (*cp1 != NULL) { switch (*cp1) { case ' ' : /* Space character. */ *cp2++ = imP_SP; w++; break; case '\\' : /* Escape sequence. */ if (*++cp1 == '\\') { /* Begin new line. */ h++; if (w > maxw) maxw = w; w = 0; *cp2++ = imP_CRLF; break; } /* Fall through to just copy next char out. */ default : *cp2++ = *cp1; w++; break; } cp1++; } *cp2 = '\0'; if (w > maxw) maxw = w; if (height != NULL) *height = IMAGEN_angle ? IMAGEN_wchar * maxw : IMAGEN_hchar * h; if (width != NULL) *width = IMAGEN_angle ? IMAGEN_hchar * h : IMAGEN_wchar * maxw; return (buf); } int IMAGEN_put_text(int x, int y, char *str) { /* int x, y; reference point of string */ /* char *str; the text */ char *cvstr; int height; int width; cvstr = IMAGEN_cvts(str, &width, &height); switch (IMAGEN_justify) { case LEFT: break; case CENTRE: x -= width/2; break; case RIGHT: x -= width; break; } if (IMAGEN_angle) { /* vertical */ x += IMAGEN_hchar; y -= height/2; } else /* horizontal */ y += height/2 - IMAGEN_hchar; IMAGEN_setpos(x, y + IMAGEN_blofs); fputs(cvstr, outfile); } int IMAGEN_reset(void) { putc(imP_EOF, outfile); } static void int IMAGEN_putwd(w) { putc(w>>8, outfile); putc(w, outfile); } static void int IMAGEN_createfamily(?2, ?2) { putc(imP_CREATE_FAMILY_TABLE, outfile); putc(sz, outfile); putc(1, outfile); putc(0, outfile); fputs(c, outfile); putc(0, outfile); } static void int IMAGEN_setfont(int sz) { IMAGEN_hchar = sz * 5; IMAGEN_wchar = IMAGEN_hchar / 2; IMAGEN_blofs = IMAGEN_hchar / 3; putc(imP_SET_FAMILY, outfile); putc(sz, outfile); putc(imP_SET_SP, outfile); IMAGEN_putwd(IMAGEN_wchar); putc(imP_SET_IL, outfile); IMAGEN_putwd(IMAGEN_hchar); }