Artifact ca09b97cd94ee09921016e9946fc07c7d6860beb14f48ce63cd846cf7e0a5c0b:
- File
r34.1/plot/term/imagen.trm
— part of check-in
[f2fda60abd]
at
2011-09-02 18:13:33
on branch master
— Some historical releases purely for archival purposes
git-svn-id: https://svn.code.sf.net/p/reduce-algebra/code/trunk/historical@1375 2bfe0521-f11c-4a00-b80e-6202646ff360 (user: arthurcnorman@users.sourceforge.net, size: 7486) [annotate] [blame] [check-ins using] [more...]
/* * $Id: imagen.trm,v 3.26 92/03/24 22:35:33 woo Exp Locker: woo $ */ /* GNUPLOT - imagen.trm */ /* * Copyright (C) 1990, 1991, 1992 * * 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 (info-gnuplot@ames.arc.nasa.gov). * */ /* * 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 */ static void IMAGEN_putwd(); static void IMAGEN_createfamily(); static void IMAGEN_setfont(); static void IMAGEN_setpos(); static char *IMAGEN_cvts(); IMAGEN_init() { 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); } IMAGEN_graphics() { static BOOLEAN first = TRUE; if (!first) putc(imP_ENDPAGE, outfile); first = FALSE; IMAGEN_move(0, 0); } IMAGEN_text() { } IMAGEN_linetype(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); } IMAGEN_move(x,y) unsigned int x,y; { IMAGEN_posx = x; IMAGEN_posy = y; } IMAGEN_vector(ux,uy) unsigned int ux,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 IMAGEN_setpos(ux, uy) int ux,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 */ } IMAGEN_text_angle(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); } IMAGEN_justify_text(mode) enum JUSTIFY mode; { IMAGEN_justify = mode; return(TRUE); } static char * IMAGEN_cvts(str, width, height) char *str; int *width; int *height; { 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 (strlen(cp1) > 0) { 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); } IMAGEN_put_text(x, y, 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); } IMAGEN_reset() { putc(imP_EOF, outfile); } static void IMAGEN_putwd(w) { putc(w>>8, outfile); putc(w, outfile); } static void IMAGEN_createfamily(c, sz) char *c; int sz; { putc(imP_CREATE_FAMILY_TABLE, outfile); putc(sz, outfile); putc(1, outfile); putc(0, outfile); fputs(c, outfile); putc(0, outfile); } static void IMAGEN_setfont(sz) 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); }