/*
* $Id: imagen.trm,v 1.24 1998/04/14 00:17:51 drd Exp $
*/
/* GNUPLOT - imagen.trm */
/*[
* Copyright 1990 - 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:
* Imagen laser printers
*
* AUTHORS
* Paul E. McKenney, David Kotz
* Rewritten/extended by:
* Hans Olav Eggestad
* send your comments or suggestions to (info-gnuplot@dartmouth.edu).
*
*/
/*
* 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.
*/
/*
* adapted to the new terminal layout by Stefan Bodewig (Dec. 1995)
*/
#include "driver.h"
#ifdef TERM_REGISTER
register_term(imagen)
#endif
#ifdef TERM_PROTO
TERM_PUBLIC void IMAGEN_init __PROTO((void));
TERM_PUBLIC void IMAGEN_graphics __PROTO((void));
TERM_PUBLIC void IMAGEN_options __PROTO((void));
TERM_PUBLIC void IMAGEN_text __PROTO((void));
TERM_PUBLIC void IMAGEN_linetype __PROTO((int lt));
TERM_PUBLIC void IMAGEN_move __PROTO((unsigned int x, unsigned int y));
TERM_PUBLIC void IMAGEN_vector __PROTO((unsigned int ux, unsigned int uy));
TERM_PUBLIC int IMAGEN_text_angle __PROTO((int ang));
TERM_PUBLIC int IMAGEN_justify_text __PROTO((enum JUSTIFY mode));
TERM_PUBLIC void IMAGEN_put_text __PROTO((unsigned int x, unsigned int y, char str[]));
TERM_PUBLIC void IMAGEN_reset __PROTO((void));
#define IMAGEN_PTS_PER_INCH (300)
#define IMAGEN_XMAX (IMAGEN_PTS_PER_INCH * 11) /* 10.0 inches */
#define IMAGEN_YMAX (IMAGEN_PTS_PER_INCH * 78 / 10) /* 7.5 inches */
#define IMAGEN_HTIC (20)
#define IMAGEN_VTIC (20)
#define IMAGEN_VCHAR (IMAGEN_FONTSIZE*5)
#define IMAGEN_HCHAR (IMAGEN_VCHAR/2)
#endif /* TERM_PROTO */
#ifndef TERM_PROTO_ONLY
#ifdef TERM_BODY
static void IM_page __PROTO((void));
static void IMAGEN_draw_path __PROTO((void));
static void IMAGEN_setpos __PROTO((int ux, int uy));
static unsigned char *IMAGEN_cvts __PROTO((unsigned char *str, int *width, int *height));
static void IMAGEN_putwd __PROTO((unsigned int w));
static void IMAGEN_createfamily __PROTO((char *c, int sz));
static void IMAGEN_setfont __PROTO((int sz));
void IMP_set_draw_pattern __PROTO((int pattern, int sz));
void IMAGEN_mapsinit __PROTO((void));
void IMAGEN_createmap __PROTO((int name, unsigned short *map));
/*
#ifndef __malloc_h
#include <malloc.h>
#endif
*/
#include "impcodes.h"
/* default is landscape */
#define IMAGEN_A4_H (IMAGEN_PTS_PER_INCH * 83 / 10)
#define IMAGEN_A4_W (IMAGEN_PTS_PER_INCH * 116 / 10)
/* width in current orientation */
static int IMAGEN_Xmax = IMAGEN_XMAX;
static int IMAGEN_Ymax = IMAGEN_YMAX;
#define IMAGEN_FONTSIZE 12
#define IMAGEN_FONT "cour"
unsigned short IMP_gmap[128];
unsigned char IMP_chmap[256];
static int IMAGEN_page_h = IMAGEN_A4_H;
static int IMAGEN_page_w = IMAGEN_A4_W;
static int IM_win_horiz = 1;
static int IM_win_verti = 1;
static int IM_plot_nr = 0;
static int IMAGEN_fontsize = IMAGEN_FONTSIZE;
static int IMAGEN_familytable[36];
static int IMAGEN_orgX; /* absolute-pixel-ORIgin of graph page. */
static int IMAGEN_orgY;
static int IMAGEN_orgx; /* absolute-pixel-ORIgin of current 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 = IMAGEN_XMAX; /* width of graph in pixels. */
static int IMAGEN_ymax = IMAGEN_YMAX; /* height of graph in pixels. */
static int IMAGEN_winx = IMAGEN_XMAX; /* width of window in pixels. */
static int IMAGEN_winy = IMAGEN_YMAX; /* height of window 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 int IMAGEN_portrait; /* 0 for landscape */
static enum JUSTIFY IMAGEN_justify = LEFT; /* left/center/right */
#define STOREPATH 100
unsigned int IM_xvector[STOREPATH]; /* draw path vector of x values */
unsigned int IM_yvector[STOREPATH]; /* draw path vector of y values */
unsigned int IM_veclen; /* length of allocated path vector */
unsigned int IM_vecpos = 0; /* current pos in vector */
/* char IMPdrpattern[10][10] = { {0}, {30,10,0}, {0}, {10,30,0}, {2,20,0},
{20,10,0}, {30,20,10,20,0}, {30,20,4,10,10,10,4,20,0}, {40,20,0}, {30,15,4,15,0}
};
*/
char IMPdrpattern[10][10] =
{
/* -2 */ {0},
/* -1 */ {1, 8, 0},
/* 0 */ {0},
/* 1 */ {16, 4, 0},
/* 2 */ {3, 8, 0},
/* 3 */ {8, 8, 0},
/* 4 */ {16, 6, 3, 6, 0},
/* 5 */ {16, 6, 8, 6, 0},
/* 6 */ {16, 4, 1, 4, 8, 4, 1, 4, 0},
/* 7 */ {16, 4, 1, 8, 1, 4, 0}
};
TERM_PUBLIC void IMAGEN_init()
{
register struct termentry *t = term;
/* char font[10]; *//* font name */
IMAGEN_posx = IMAGEN_posy = 0;
IMAGEN_orgX = (IMAGEN_page_w - IMAGEN_Xmax) / 2;
IMAGEN_orgY = (IMAGEN_page_h - IMAGEN_Ymax) / 2;
IMAGEN_xmax = IMAGEN_winx = (int) (IMAGEN_Xmax / IM_win_horiz);
IMAGEN_ymax = IMAGEN_winy = (int) (IMAGEN_Ymax / IM_win_verti);
t->xmax = (unsigned int) (IMAGEN_xmax);
t->ymax = (unsigned int) (IMAGEN_ymax);
fputs("@document(language impress, paper a4)", gpoutfile);
if (IMAGEN_portrait) {
putc(imP_SET_ABS_V, gpoutfile);
IMAGEN_putwd(3520);
}
putc(imP_SET_HV_SYSTEM, gpoutfile);
putc(((IMAGEN_portrait ? 3 : 0) << 5) | (3 << 3) | (IMAGEN_portrait ? 0 : 5), gpoutfile);
/* sprintf(font, "cour%02d", IMAGEN_FONTSIZE); */
IMAGEN_mapsinit();
IMAGEN_createmap(1, IMP_gmap);
/* IMAGEN_createfamily(font, IMAGEN_FONTSIZE); */
IMAGEN_setfont(IMAGEN_fontsize);
IMAGEN_text_angle(0);
putc(imP_SET_ABS_H, gpoutfile);
IMAGEN_putwd(0);
putc(imP_SET_ABS_V, gpoutfile);
IMAGEN_putwd(0);
IMAGEN_linetype(-1);
/*
if ((IM_xvector = (unsigned int *) malloc(STOREPATH*sizeof(int))) == NULL) {
fputs("Imagendriver: Unable to allocate memory for draw path\n", stderr);
exit(1);
}
if ((IM_yvector = (unsigned int *) malloc(STOREPATH*sizeof(int))) == NULL) {
fputs("Imagendriver: Unable to allocate memory for draw path\n", stderr);
exit(1);
}
*/
IM_veclen = STOREPATH;
IM_vecpos = 0;
}
static void IM_page()
{
if (IM_vecpos) {
/* fprintf(stderr,"graphics, draw path\n"); */
IMAGEN_draw_path();
}
putc(imP_ENDPAGE, gpoutfile);
}
TERM_PUBLIC void IMAGEN_graphics()
{
int tmpx, tmpy;
/* int xoff, yoff; */
if (IM_vecpos) {
/* fprintf(stderr,"graphics, draw path\n"); */
IMAGEN_draw_path();
}
if (IM_plot_nr >= (IM_win_horiz * IM_win_verti)) {
IM_page();
IM_plot_nr = 0;
}
IM_plot_nr++;
tmpx = IMAGEN_orgX + ((IM_plot_nr - 1) % IM_win_horiz) * IMAGEN_winx;
tmpy = IMAGEN_orgY + ((IM_win_verti - 1) - (int) ((IM_plot_nr - 1) / IM_win_horiz)) * IMAGEN_winy;
IMAGEN_orgx = tmpx + (int) ((IMAGEN_winx - IMAGEN_xmax) / 2);
IMAGEN_orgy = tmpy + (int) ((IMAGEN_winy - IMAGEN_ymax) / 2);
}
TERM_PUBLIC void IMAGEN_options()
{
struct value a;
while (!END_OF_COMMAND) {
if (almost_equals(c_token, "p$ortrait")) {
IMAGEN_portrait = TRUE;
IMAGEN_page_h = IMAGEN_A4_W;
IMAGEN_page_w = IMAGEN_A4_H;
IMAGEN_Xmax = IMAGEN_YMAX;
IMAGEN_Ymax = IMAGEN_XMAX;
c_token++;
} else if (almost_equals(c_token, "l$andscape")) {
IMAGEN_portrait = FALSE;
c_token++;
} else if (equals(c_token, "[")) { /* windows spesified */
c_token++;
/* if (IM_plot_nr>1) */
if (equals(c_token, "]")) {
IM_page();
c_token++;
continue;
}
if (END_OF_COMMAND) {
int_error("no. windows: [horizontal,vertical] expected", c_token);
} else if (!equals(c_token, ",")) {
IM_win_horiz = (int) real(const_express(&a));
}
if (!equals(c_token, ","))
int_error("',' expected", c_token);
c_token++;
if (!equals(c_token, "]")) {
IM_win_verti = (int) real(const_express(&a));
}
if (!equals(c_token, "]"))
int_error("expecting ']'", c_token);
c_token++;
} else {
/* We have font size specified */
IMAGEN_fontsize = (int) real(const_express(&a));
if (IMAGEN_fontsize < 8)
IMAGEN_fontsize = 8;
if (IMAGEN_fontsize > 15)
IMAGEN_fontsize = 15;
}
}
sprintf(term_options, "%d %s [%1d,%1d]", IMAGEN_fontsize, (IMAGEN_portrait) ? "portrait" :
"landscape", IM_win_horiz, IM_win_verti);
}
TERM_PUBLIC void IMAGEN_text()
{
}
#define DRAW_PATTERNS 6
TERM_PUBLIC void IMAGEN_linetype(lt)
int lt;
{
static int lastlinetype = -10;
int pen /*, pattern */ ;
if (IM_vecpos) {
/* fprintf(stderr,"move, draw path\n"); */
IMAGEN_draw_path();
}
/* -2: axis
-1: border
0: arrow
1-7: graph
*/
if (lt == -2) {
pen = 4;
} else {
pen = (int) (lt / 8) * 2;
if (pen <= 0)
pen = 1;
}
lt = (lt % 8) + 2;
if (lastlinetype == lt)
return;
lastlinetype = lt;
putc(imP_SET_PEN, gpoutfile);
putc(pen, gpoutfile);
IMP_set_draw_pattern(lt, pen);
}
TERM_PUBLIC void IMAGEN_move(x, y)
unsigned int x, y;
{
if (IM_vecpos) {
/* fprintf(stderr,"move, draw path\n"); */
IMAGEN_draw_path();
}
IM_xvector[0] = x + IMAGEN_orgx;
IM_yvector[0] = y + IMAGEN_orgy;
/* fprintf(stderr,"Ny vector: startpos: %1d %1d\n",IM_xvector[0],IM_yvector[0]); */
IM_vecpos = 1;
/*
IMAGEN_posx = x;
IMAGEN_posy = y;
*/
}
TERM_PUBLIC void IMAGEN_vector(ux, uy)
unsigned int ux, uy;
{
/* void IMAGEN_draw_path(); */
/* Store path. */
IM_xvector[IM_vecpos] = ux + IMAGEN_orgx;
IM_yvector[IM_vecpos] = uy + IMAGEN_orgy;
/* fprintf(stderr,"Ny node: nr: %1d; %1d %1d\n",IM_vecpos,IM_xvector[IM_vecpos],IM_yvector[IM_vecpos]); */
IM_vecpos++;
if (IM_vecpos >= IM_veclen) {
IMAGEN_draw_path();
IM_xvector[0] = ux + IMAGEN_orgx;
IM_yvector[0] = uy + IMAGEN_orgy;
IM_vecpos = 1;
}
}
static void IMAGEN_draw_path()
{
/* unsigned int pos; */
register int i;
putc(imP_CREATE_PATH, gpoutfile);
IMAGEN_putwd(IM_vecpos);
for (i = 0; i < IM_vecpos; i++) {
/*
IMAGEN_putwd(IM_xvector[i] + IMAGEN_orgx);
IMAGEN_putwd(IM_yvector[i] + IMAGEN_orgy);
*/
IMAGEN_putwd(IM_xvector[i]);
IMAGEN_putwd(IM_yvector[i]);
}
IM_vecpos = 0;
/* Draw path with black pen. */
putc(imP_DRAW_PATH, gpoutfile);
putc(15, gpoutfile);
/* 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, gpoutfile);
IMAGEN_putwd(ux + IMAGEN_orgx);
putc(imP_SET_ABS_V, gpoutfile);
IMAGEN_putwd(uy + IMAGEN_orgy);
putc(imP_SET_BOL, gpoutfile);
if (IMAGEN_angle == 1)
IMAGEN_putwd(uy + IMAGEN_orgx); /* vertical */
else
IMAGEN_putwd(ux + IMAGEN_orgx); /* horizontal */
}
TERM_PUBLIC int IMAGEN_text_angle(ang)
int ang;
{
if (IM_vecpos) {
/* fprintf(stderr,"text_angle, draw path\n"); */
IMAGEN_draw_path();
}
if (IMAGEN_angle != ang) {
IMAGEN_angle = ang; /* record for later use */
putc(imP_SET_ADV_DIRS, gpoutfile);
putc(ang == 0 ? 0 : 7, gpoutfile); /* 0=>horiz : 7=>vert */
}
return (TRUE);
}
TERM_PUBLIC int IMAGEN_justify_text(mode)
enum JUSTIFY mode;
{
if (IM_vecpos) {
/* fprintf(stderr,"justify_text, draw path\n"); */
IMAGEN_draw_path();
}
IMAGEN_justify = mode;
return (TRUE);
}
static unsigned char *IMAGEN_cvts(str, width, height)
unsigned char *str;
int *width;
int *height;
{
unsigned char *cp1;
unsigned char *cp2;
static unsigned 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 = (unsigned char *) gp_alloc(strlen((char *) str), "converted label string");
/* Do the transformations. */
cp1 = str;
cp2 = buf;
h = 1;
maxw = 0;
w = 0;
while (strlen((char *) 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++ = '\n';
/* *cp2++ = imP_CRLF; */
break;
}
/* Fall through to just copy next char out. */
default:
/* *cp2++ = *cp1; */
*cp2++ = IMP_chmap[*cp1];
w++;
break;
}
cp1++;
}
*cp2++ = '\n';
*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);
}
TERM_PUBLIC void IMAGEN_put_text(x, y, str)
unsigned int x, y; /* reference point of string */
char str[]; /* the text */
{
unsigned char *cvstr, *p;
int height;
int width;
int sx, sy;
if (IM_vecpos) {
/* fprintf(stderr,"put_text, draw path\n"); */
IMAGEN_draw_path();
}
cvstr = IMAGEN_cvts((unsigned char *) str, &width, &height);
if (IMAGEN_angle) { /* vertical */
/* x += IMAGEN_hchar; */
x -= width / 2 - IMAGEN_hchar;
/* y -= height/2; */
} else /* horizontal */
y += height / 2 - IMAGEN_hchar;
while ((p = (unsigned char *) strchr((char *) cvstr, '\n'))) {
*p = '\0';
sx = x;
sy = y;
if (IMAGEN_angle)
sx = x - IMAGEN_blofs;
else
sy = y + IMAGEN_blofs;
width = strlen((char *) cvstr) * IMAGEN_wchar;
switch (IMAGEN_justify) {
case LEFT:
break;
case CENTRE:
if (IMAGEN_angle) {
sy = y - width / 2;
} else {
sx = x - width / 2;
}
break;
/*x -= width/2; break; */
case RIGHT:
if (IMAGEN_angle) {
sy = y - width;
} else {
sx = x - width;
}
break;
/* x -= width; break; */
}
IMAGEN_setpos(sx, sy);
fputs((char *) cvstr, gpoutfile);
cvstr = ++p;
if (IMAGEN_angle) { /* vertical */
x += IMAGEN_hchar;
} else {
y -= IMAGEN_hchar;
}
}
}
TERM_PUBLIC void IMAGEN_reset()
{
if (IM_vecpos) {
/* fprintf(stderr,"reset, draw path\n"); */
IMAGEN_draw_path();
}
putc(imP_EOF, gpoutfile);
}
static void IMAGEN_putwd(w)
unsigned int w;
{
/* fprintf(stderr,"%1u\n",w); */
putc(w >> 8, gpoutfile);
putc(w, gpoutfile);
}
static void IMAGEN_createfamily(c, sz)
char *c;
int sz;
{
putc(imP_CREATE_FAMILY_TABLE, gpoutfile);
putc(sz, gpoutfile);
putc(1, gpoutfile);
putc(1, gpoutfile);
/* putc(0, gpoutfile); */
fputs(c, gpoutfile);
putc(0, gpoutfile);
}
static void IMAGEN_setfont(sz)
int sz;
{
char font[20];
if (!IMAGEN_familytable[sz]) {
sprintf(font, "%s%02d", IMAGEN_FONT, sz);
IMAGEN_createfamily(font, sz);
IMAGEN_familytable[sz] = sz;
}
IMAGEN_hchar = sz * 5;
IMAGEN_wchar = IMAGEN_hchar / 2;
IMAGEN_blofs = IMAGEN_hchar / 3;
term->v_char = IMAGEN_hchar;
term->h_char = IMAGEN_wchar;
putc(imP_SET_FAMILY, gpoutfile);
putc(sz, gpoutfile);
putc(imP_SET_SP, gpoutfile);
IMAGEN_putwd(IMAGEN_wchar);
putc(imP_SET_IL, gpoutfile);
IMAGEN_putwd(IMAGEN_hchar);
}
void IMP_set_draw_pattern(pattern, sz)
int pattern, sz;
{
int i /*,j */ ;
putc(imP_SET_DRAW_PATTERN, gpoutfile);
putc(0, gpoutfile);
putc(imP_SET_DRAW_PATTERN, gpoutfile);
/* if ( strlen(IMPdrpattern[pattern]) == 1 ) {
putc(type,gpoutfile);
return;
} */
putc(strlen(IMPdrpattern[pattern]), gpoutfile);
for (i = 0; i < strlen(IMPdrpattern[pattern]); i++) {
IMAGEN_putwd(IMPdrpattern[pattern][i] * sz);
}
}
void IMAGEN_mapsinit()
{
register int i /*, j */ ;
for (i = 32; i < 127; i++) {
IMP_gmap[i] = i;
}
IMP_gmap[1] = 225;
IMP_gmap[2] = 233;
IMP_gmap[3] = 61736;
IMP_gmap[4] = 241;
IMP_gmap[5] = 249;
IMP_gmap[6] = 61864;
IMP_gmap[7] = 162;
IMP_gmap[8] = 163;
IMP_gmap[9] = 164;
IMP_gmap[10] = 165;
IMP_gmap[11] = 167;
IMP_gmap[12] = 171;
IMP_gmap[13] = 182;
IMP_gmap[14] = 61346;
IMP_gmap[15] = 191;
IMP_gmap[16] = 187;
IMP_gmap[17] = 188;
IMP_gmap[18] = 189;
IMP_gmap[19] = 190;
IMP_gmap[20] = 210;
IMP_gmap[21] = 211;
IMP_gmap[22] = 251;
IMP_gmap[23] = 61232;
IMP_gmap[24] = 212;
IMP_gmap[25] = 137;
IMP_gmap[26] = 176;
IMP_gmap[27] = 161;
IMP_gmap[28] = 139;
IMP_gmap[29] = 133;
IMP_gmap[30] = 140;
IMP_gmap[31] = 61249;
IMP_gmap[32] = 8738;
IMP_gmap[34] = 186;
IMP_gmap[36] = 164;
IMP_gmap[39] = 185;
IMP_gmap[127] = 61286;
/* for (i=1;i<127;i++) fprintf(stderr,"%d -> %d\n",i,IMP_gmap[i]); */
for (i = 32; i <= 127; i++) {
IMP_chmap[i] = i;
}
for (i = 128; i <= 255; i++) {
IMP_chmap[i] = 128; /* first map all non printable chars to SPACE */
}
IMP_chmap[161] = 27;
IMP_chmap[162] = 7;
IMP_chmap[163] = 8;
IMP_chmap[164] = 120;
IMP_chmap[165] = 10;
IMP_chmap[166] = 124;
IMP_chmap[167] = 11;
IMP_chmap[168] = 25;
IMP_chmap[169] = 21;
IMP_chmap[170] = 45;
IMP_chmap[171] = 12;
IMP_chmap[172] = 83;
IMP_chmap[173] = 45;
IMP_chmap[174] = 20;
IMP_chmap[175] = 126;
IMP_chmap[176] = 26;
IMP_chmap[177] = 12;
IMP_chmap[178] = 1;
IMP_chmap[179] = 2;
IMP_chmap[180] = 29;
IMP_chmap[181] = 52;
IMP_chmap[182] = 13;
IMP_chmap[183] = 5;
IMP_chmap[184] = 28;
IMP_chmap[185] = 3;
IMP_chmap[186] = 45;
IMP_chmap[187] = 16;
IMP_chmap[188] = 17;
IMP_chmap[189] = 18;
IMP_chmap[190] = 19;
IMP_chmap[191] = 15;
IMP_chmap[192] = 65;
IMP_chmap[193] = 65;
IMP_chmap[194] = 65;
IMP_chmap[195] = 65;
IMP_chmap[196] = 65;
IMP_chmap[197] = 3;
IMP_chmap[198] = 1;
IMP_chmap[199] = 67;
IMP_chmap[200] = 69;
IMP_chmap[201] = 69;
IMP_chmap[202] = 69;
IMP_chmap[203] = 69;
IMP_chmap[204] = 73;
IMP_chmap[205] = 73;
IMP_chmap[206] = 73;
IMP_chmap[207] = 73;
IMP_chmap[208] = 68;
IMP_chmap[209] = 78;
IMP_chmap[210] = 79;
IMP_chmap[211] = 79;
IMP_chmap[212] = 79;
IMP_chmap[213] = 79;
IMP_chmap[214] = 79;
IMP_chmap[215] = 13;
IMP_chmap[216] = 2;
IMP_chmap[217] = 85;
IMP_chmap[218] = 85;
IMP_chmap[219] = 85;
IMP_chmap[220] = 85;
IMP_chmap[221] = 89;
IMP_chmap[222] = 32;
IMP_chmap[223] = 22;
IMP_chmap[224] = 97;
IMP_chmap[225] = 97;
IMP_chmap[226] = 97;
IMP_chmap[227] = 97;
IMP_chmap[228] = 97;
IMP_chmap[229] = 6;
IMP_chmap[230] = 4;
IMP_chmap[231] = 99;
IMP_chmap[232] = 101;
IMP_chmap[233] = 101;
IMP_chmap[234] = 101;
IMP_chmap[235] = 101;
IMP_chmap[236] = 105;
IMP_chmap[237] = 105;
IMP_chmap[238] = 105;
IMP_chmap[239] = 105;
IMP_chmap[240] = 100;
IMP_chmap[241] = 110;
IMP_chmap[242] = 111;
IMP_chmap[243] = 111;
IMP_chmap[244] = 111;
IMP_chmap[245] = 111;
IMP_chmap[246] = 111;
IMP_chmap[247] = 10;
IMP_chmap[248] = 5;
IMP_chmap[249] = 117;
IMP_chmap[250] = 117;
IMP_chmap[251] = 117;
IMP_chmap[252] = 117;
IMP_chmap[253] = 121;
IMP_chmap[254] = 32;
IMP_chmap[255] = 121;
}
void IMAGEN_createmap(name, map)
unsigned short *map;
int name;
{
register int i, j;
unsigned char s[4], *p;
p = s;
*p++ = imP_CREATE_MAP;
*p++ = name;
j = 0;
for (i = 0; i < 127; i++) {
if (map[i])
j++;
}
*p = j;
for (i = 0; i < 3; i++)
putc(s[i], gpoutfile);
s[3] = 1;
for (j = 0; j < 127; j++) {
if (map[j]) {
p = s;
*p++ = j;
*p++ = map[j] >> 8;
*p = map[j] & 255;
for (i = 0; i < 4; i++)
putc(s[i], gpoutfile);
}
}
}
#endif /* TERM_BODY */
#ifdef TERM_TABLE
TERM_TABLE_START(imagen_driver)
"imagen", "Imagen laser printer",
IMAGEN_XMAX, IMAGEN_YMAX, IMAGEN_VCHAR, IMAGEN_HCHAR,
IMAGEN_VTIC, IMAGEN_HTIC, IMAGEN_options, IMAGEN_init, IMAGEN_reset,
IMAGEN_text, null_scale, IMAGEN_graphics, IMAGEN_move,
IMAGEN_vector, IMAGEN_linetype, IMAGEN_put_text, IMAGEN_text_angle,
IMAGEN_justify_text, line_and_point, do_arrow, set_font_null
TERM_TABLE_END(imagen_driver)
#undef LAST_TERM
#define LAST_TERM imagen_driver
#endif /* TERM_TABLE */
#endif /* TERM_PROTO_ONLY */
#ifdef TERM_HELP
START_HELP(imagen)
"1 imagen",
"?commands set terminal imagen",
"?set terminal imagen",
"?set term imagen",
"?terminal imagen",
"?term imagen",
"?imagen",
" The `imagen` terminal driver supports Imagen laser printers. It is capable",
" of placing multiple graphs on a single page.",
"",
" Syntax:",
" set terminal imagen {<fontsize>} {portrait | landscape}",
" {[<horiz>,<vert>]}",
"",
" where `fontsize` defaults to 12 points and the layout defaults to `landscape`.",
" `<horiz>` and `<vert>` are the number of graphs in the horizontal and",
" vertical directions; these default to unity.",
"",
" Example:",
" set terminal imagen portrait [2,3]",
"",
" puts six graphs on the page in three rows of two in portrait orientation."
END_HELP(imagen)
#endif