[BACK]Return to rgip.trm CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gnuplot / term

File: [local] / OpenXM_contrib / gnuplot / term / Attic / rgip.trm (download)

Revision 1.1, Sun Jan 9 17:01:16 2000 UTC (24 years, 4 months ago) by maekawa
Branch: MAIN

Initial revision

/*
 * $Id: rgip.trm,v 1.16 1998/04/14 00:18:06 drd Exp $
 */

/* GNUPLOT - rgip.trm Uniplex graphics metafile */

/*[
 * 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:
 *   RGIP metafile
 *
 * AUTHORS
 *   Hans Olav Eggestad
 *
 * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
 *
 */

/*
 * Original for direct RGIP Metafile output.
 */
/* 
 * Max pixels for X and Y in one window is 10000.
 */
/*
 * adapted to the new terminal layout by Stefan Bodewig (Dec. 1995)
 */

#include "driver.h"

#ifdef TERM_REGISTER
register_term(rgip)
register_term(uniplex)
#endif

#ifdef TERM_PROTO
TERM_PUBLIC void RGIP_init __PROTO((void));
TERM_PUBLIC void RGIP_graphics __PROTO((void));
TERM_PUBLIC void RGIP_text __PROTO((void));
TERM_PUBLIC void RGIP_linetype __PROTO((int lt));
TERM_PUBLIC void RGIP_move __PROTO((unsigned int x, unsigned int y));
TERM_PUBLIC void RGIP_vector __PROTO((unsigned int ux, unsigned int uy));
TERM_PUBLIC int RGIP_text_angle __PROTO((int ang));
TERM_PUBLIC int RGIP_justify_text __PROTO((enum JUSTIFY mode));
TERM_PUBLIC void RGIP_put_text __PROTO((unsigned int x, unsigned int y, char *str));
TERM_PUBLIC void RGIP_reset __PROTO((void));
TERM_PUBLIC void RGIP_do_point __PROTO((unsigned int x, unsigned int y, int number));
TERM_PUBLIC void RGIP_options __PROTO((void));
#define RGIP_X_MAX 10000
#define RGIP_Y_MAX 6700

#define RGIP_FONTSIZE 1
#define RGIP_SC (300)
#define RGIP_XMAX 9900
#define RGIP_YMAX 6600
#define RGIP_HTIC (100)
#define RGIP_VTIC (100)
#define RGIP_VCHAR (RGIP_FONTSIZE*RGIP_SC)
#define RGIP_HCHAR (RGIP_VCHAR*3/7)
#endif /* TERM_PROTO */

#ifndef TERM_PROTO_ONLY
#ifdef TERM_BODY


void RGIP_write_poly __PROTO((void));
static unsigned char *RGIP_cvts __PROTO((unsigned char *str, int *lcnt));
/* static void RGIP_setfont __PROTO((int sz)); */

#include <sys/types.h>
#include <sys/stat.h>

#define RGIPDOTS 0
#define RGIPMARK 1
#define RGIPTEXT 2
#define RGIPLINE 3
#define RGIPPOLY 4
#define RGIP_MAX_POLY 250
static char *RGIP_Obj[6] =
{"DOTS", "MARK", "TEXT", "LINE", "POLY"};

/* 
 * RGIP fontsises range from 1 to 8 
 */

#define RGIP_FACES 3
#define RGIP_FSTYLES 4
#define RGIP_FSIZES 8
#define RGIP_HELVETICA 0
#define RGIP_TIMES 1
#define RGIP_COURIER 2
#define RGIP_LINE_WIDTHS 8	/* future, currently invisible and visible 0
				   and 1 */
#define RGIP_LINE_TYPES 8
#define RGIP_COLORS 16
#define RGIP_POINT_TYPES 8




static int RGIP_orgX;		/* absolute-pixel-ORIgin of graph.      */
static int RGIP_orgY;
static int RGIP_orgx;		/* absolute-pixel-ORIgin of current plot. */
static int RGIP_orgy;
static int RGIP_posx;		/* current drawing position (lines).    */
static int RGIP_posy;
/* static int RGIP_inplot; */
static int RGIP_xmax = RGIP_XMAX;	/* width of graph in pixels.         */
static int RGIP_ymax = RGIP_YMAX;	/* height of graph in pixels.        */
static int RGIP_winx = RGIP_XMAX;	/* width of graph in pixels.         */
static int RGIP_winy = RGIP_YMAX;	/* height of graph in pixels.        */
/* static int RGIP_blofs; */            /* BaseLine OFfSet from bounding box.*/
static int RGIP_angle = 0;	/* 0 for horizontal text, 90 for vertical */
static int RGIP_portrait = 0;	/* 0 for horizontal text, 90 for vertical */
static enum JUSTIFY RGIP_justify = LEFT;	/* left/center/right */
static int RGIP_fface = 2;	/* Times */
static int RGIP_ftype = 1;	/* style roman */
static int RGIP_fontsize = RGIP_FONTSIZE;	/*  */
static int RGIP_tcol = 7;	/* text color */
static int RGIP_lsty = 1;	/* line style */
static int RGIP_lcol = 7;	/* line color */
static int RGIP_lwid = 1;	/* line width */
static int RGIP_fsty = 8;	/* fill style */
static int RGIP_fcol = 8;	/* fill color */
static int RGIP_mcol = 7;	/* marker color */
static int RGIP_msty = 1;	/* marker style */
static int RGIP_msize = 1;	/* marker size */

static int RGIP_win_horiz = 1;
static int RGIP_win_verti = 1;
static int RGIP_plot_nr = 0;

unsigned int RGIP_vecpos;
unsigned int RGIP_xvector[RGIP_MAX_POLY];
unsigned int RGIP_yvector[RGIP_MAX_POLY];
static unsigned char *RGIP_cvts();


TERM_PUBLIC void RGIP_init()
{
    register struct termentry *t = term;

    RGIP_posx = RGIP_posy = 0;

    if (RGIP_portrait) {
	RGIP_orgX = (RGIP_Y_MAX - RGIP_YMAX) / 2;
	RGIP_orgY = (RGIP_X_MAX - RGIP_XMAX) / 2;
	RGIP_xmax = RGIP_winx = (int) (RGIP_YMAX / RGIP_win_horiz);
	RGIP_ymax = RGIP_winy = (int) (RGIP_XMAX / RGIP_win_verti);
    } else {
	RGIP_orgX = (RGIP_X_MAX - RGIP_XMAX) / 2;
	RGIP_orgY = (RGIP_Y_MAX - RGIP_YMAX) / 2;
	RGIP_xmax = RGIP_winx = (int) (RGIP_XMAX / RGIP_win_horiz);
	RGIP_ymax = RGIP_winy = (int) (RGIP_YMAX / RGIP_win_verti);
    }

    t->xmax = (unsigned int) (RGIP_xmax);
    t->ymax = (unsigned int) (RGIP_ymax);

    RGIP_vecpos = 0;
}

TERM_PUBLIC void RGIP_graphics()
{
    static int Gnr = 0;
    struct stat buf;
    unsigned char *p, fn[128];

    int tmpx, tmpy;
    /*    int xoff, yoff; */

    if (RGIP_vecpos) {
	RGIP_write_poly();
    }
    if (!Gnr || RGIP_plot_nr >= (RGIP_win_horiz * RGIP_win_verti)) {
	fstat(fileno(gpoutfile), &buf);
	if (S_ISREG(buf.st_mode)) {
	    if (outstr && (p = (unsigned char *) strchr(outstr, 'X'))) {
                /* substitute X with graphnr */
 		if (!Gnr) {	/* delete the base file */
		    unlink(outstr);	/* should we close it first ? ? ? */
		} else {
		    fputs("%RI_GROUPEND\n", gpoutfile);
		    fclose(gpoutfile);
		}
		*p = NUL;
		sprintf(fn, "%s%1d%s", outstr, ++Gnr, p + 1);
		if ((gpoutfile = fopen(fn, "w")) == (FILE *) NULL) {
		    os_error("cannot reopen file with binary type; output unknown",
			     NO_CARET);
		}
		*p = 'X';	/* put back X */
	    }
	}
	fprintf(gpoutfile, "\
%RGIP_METAFILE: 1.0a\n\
%RI_GROUPSTART\n\
0 0 %d %d SetWindow\n\
100 100 %d %d 10 1 7 1 8 BOX\n",
		(RGIP_portrait) ? RGIP_Y_MAX : RGIP_X_MAX,
		(RGIP_portrait) ? RGIP_X_MAX : RGIP_Y_MAX,
		(RGIP_portrait) ? RGIP_YMAX : RGIP_XMAX,
		(RGIP_portrait) ? RGIP_XMAX : RGIP_YMAX);
	RGIP_plot_nr = 0;
    } else {
	fputs("%RI_GROUPEND\n", gpoutfile);
    }
    fputs("%RI_GROUPSTART\n", gpoutfile);
    RGIP_plot_nr++;
    /* Gnr++; */
    tmpx = RGIP_orgX + ((RGIP_plot_nr - 1) % RGIP_win_horiz) * RGIP_winx;
    tmpy = RGIP_orgY + ((RGIP_win_verti - 1) - (int) ((RGIP_plot_nr - 1) / RGIP_win_horiz)) * RGIP_winy;
    RGIP_orgx = tmpx + (int) ((RGIP_winx - RGIP_xmax) / 2);
    RGIP_orgy = tmpy + (int) ((RGIP_winy - RGIP_ymax) / 2);


    /* RGIP_linetype(-1); */
}

TERM_PUBLIC void RGIP_text()
{
}

TERM_PUBLIC void RGIP_linetype(lt)
int lt;
{
/*    int pen, pattern; */

    if (RGIP_vecpos) {
	RGIP_write_poly();
    }
/*  -2: axis
 *  -1: border
 *   0: arrow
 *   1-7: graph
*/
    if (lt == -2) {
	lt = 1;
	RGIP_lwid = 5;
    } else if (lt == -1) {
	lt = 5;
	RGIP_lwid = 2;
    } else {
	RGIP_lwid = (int) (lt / RGIP_LINE_TYPES);
	if (RGIP_lwid < 1)
	    RGIP_lwid = 1;
	RGIP_lwid *= 2;
	lt = (lt % RGIP_LINE_TYPES) + 1;
    }
    fputs("%RI_GROUPEND\n\
%RI_GROUPSTART\n", gpoutfile);

    /* RGIP_lsty  = (lt == 0 || lt == 2) ? 1 : lt; */

    RGIP_lsty = lt;
}


TERM_PUBLIC void RGIP_move(x, y)
unsigned int x, y;
{
/*
    fputs("%RI_GROUPEND\n", gpoutfile);
    fputs("%RI_GROUPSTART\n", gpoutfile);
*/
    if (RGIP_vecpos) {
	RGIP_write_poly();
    }
    RGIP_xvector[0] = x + RGIP_orgx;
    RGIP_yvector[0] = y + RGIP_orgy;
    RGIP_vecpos = 1;
    /*
       RGIP_posx = x;
       RGIP_posy = y;
     */
}


TERM_PUBLIC void RGIP_vector(ux, uy)
unsigned int ux, uy;
{
    /* store polygon-node */

    RGIP_xvector[RGIP_vecpos] = ux + RGIP_orgx;
    RGIP_yvector[RGIP_vecpos] = uy + RGIP_orgy;
    RGIP_vecpos++;
    if (RGIP_vecpos >= RGIP_MAX_POLY) {
	RGIP_write_poly();
	RGIP_xvector[RGIP_vecpos] = ux + RGIP_orgx;
	RGIP_yvector[RGIP_vecpos] = uy + RGIP_orgy;
	RGIP_vecpos++;
    }
}

void RGIP_write_poly()
{
    register int i;

    putc('[', gpoutfile);
    for (i = 0; i < RGIP_vecpos; i++) {
	if (!(i % 8))
	    putc('\n', gpoutfile);
	fprintf(gpoutfile, " %1d\
 %1d",
		RGIP_xvector[i],
		RGIP_yvector[i]);
    }
    RGIP_vecpos = 0;
    putc(']', gpoutfile);

    fprintf(gpoutfile, " %1d %d %1d %1d %1d %s\n", RGIP_lwid, RGIP_lsty,
	    RGIP_lcol, RGIP_fsty, RGIP_fcol, RGIP_Obj[RGIPPOLY]);

    /*
       RGIP_posx = ux;
       RGIP_posy = uy;
     */
    /* RGIP_move(ux, uy); */
}


TERM_PUBLIC int RGIP_text_angle(ang)
int ang;
{
    if (RGIP_vecpos) {
	RGIP_write_poly();
    }
    if (RGIP_angle != ang) {
	RGIP_angle = ang;	/* record for later use */
    }
    return (TRUE);
}

TERM_PUBLIC int RGIP_justify_text(mode)
enum JUSTIFY mode;
{
    if (RGIP_vecpos) {
	RGIP_write_poly();
    }
    RGIP_justify = mode;
    return (TRUE);
}

static unsigned char *RGIP_cvts(str, lcnt)
unsigned char *str;
int *lcnt;			/* lines */
{
    unsigned char *cp1;
    unsigned char *cp2;
    static unsigned char *buf = NULL;
    int lc = 1;

    lc = 1;
    /* 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(str), "converted label string");

    /* Do the transformations. */

    cp1 = str;
    cp2 = buf;
    while (strlen(cp1) > 0) {
	switch (*cp1) {
	case '\\':		/* Escape sequence. */
	    if (*++cp1 == '\\') {
		/* Begin new line. */
		*cp2++ = '\n';
		lc++;
		break;
	    }
	case '(':
	    *cp2++ = '\\';
	    *cp2++ = '(';
	    break;
	case ')':
	    *cp2++ = '\\';
	    *cp2++ = ')';
	    break;
	    /* Fall through to just copy next char out. */

	default:
	    *cp2++ = *cp1;
	    break;
	}
	cp1++;
    }

    *cp2++ = '\n';
    *cp2 = NUL;
    *lcnt = lc;
    return (buf);
}

TERM_PUBLIC void RGIP_put_text(x, y, str)
unsigned int x, y;		/* reference point of string */
char *str;			/* the text */
{
    register struct termentry *t = term;
    unsigned char *cvstr, *p;
    int xlines;			/* lines */

    if (RGIP_vecpos) {
	RGIP_write_poly();
    }
    cvstr = RGIP_cvts(str, &xlines);

    x += RGIP_orgx,
	y += RGIP_orgy;

    if (!RGIP_angle) {		/* horisontal */
	y += (int) (t->v_char) * (xlines - 2) / 2;
	/* y += (t->v_char)*xlines; */
	y += (int) (t->v_char) / 4;
    } else {
	x -= (int) (t->v_char) * (xlines - 2) / 2;
	x -= (int) (t->v_char) / 4;
    }

    while ((p = (unsigned char *) strchr(cvstr, '\n'))) {
	*p = '\0';
	if (strlen(cvstr))
	    fprintf(gpoutfile, "%1d %1d %1d  %1d (%s) %1d %1d %1d %1d %s\n",
		    x, y, RGIP_justify, RGIP_angle * 90, cvstr, RGIP_fface,
		    RGIP_ftype, RGIP_fontsize, RGIP_tcol, RGIP_Obj[RGIPTEXT]);
	cvstr = ++p;
	if (RGIP_angle) {	/* vertical */
	    x += (t->v_char);
	} else {
	    y -= (t->v_char);
	}
    }
}


TERM_PUBLIC void RGIP_reset()
{
    if (RGIP_vecpos) {
	RGIP_write_poly();
    }
    fputs("%RI_GROUPEND\n", gpoutfile);
    /* fputs("%RI_GROUPEND\n", gpoutfile); */
}

/* static void
RGIP_setfont(sz)
    int sz;
{
    RGIP_fontsize = (int) (sz);
    if ( RGIP_fontsize < 1 ) RGIP_fontsize = 1;
    term->v_char = (unsigned int)(RGIP_fontsize*RGIP_SC);
    term->h_char = (unsigned int)(RGIP_fontsize*RGIP_SC*3/7);
}
*/

TERM_PUBLIC void RGIP_do_point(x, y, number)
unsigned int x, y;
int number;
{

    x += RGIP_orgx,
	y += RGIP_orgy;

    if (number < 0) {		/* do dot */
	fprintf(gpoutfile, "%1d %1d %1d %s\n",
		x, y, RGIP_mcol, RGIP_Obj[RGIPDOTS]);
	return;
    }
    RGIP_msty = (number % RGIP_POINT_TYPES) + 1;
    RGIP_msize = ((int) (number / RGIP_POINT_TYPES)) + 1;

    fprintf(gpoutfile, "%1d %1d %1d %1d %1d %s\n",
	    x, y, RGIP_msize, RGIP_msty, RGIP_mcol, RGIP_Obj[RGIPMARK]);
}

TERM_PUBLIC void RGIP_options()
{
    struct value a;

    while (!END_OF_COMMAND) {
	if (almost_equals(c_token, "p$ortrait")) {
	    RGIP_portrait = TRUE;
	    c_token++;
	} else if (almost_equals(c_token, "l$andscape")) {
	    RGIP_portrait = FALSE;
	    c_token++;
	} else if (equals(c_token, "[")) {	/* windows spesified */
	    c_token++;
	    /* if (RGIP_plot_nr>1) */
	    if (equals(c_token, "]")) {
		/* RGIP_page(); */
		c_token++;
		continue;
	    }
	    if (END_OF_COMMAND) {
		int_error("no. windows: [horizontal,vertical] expected", c_token);
	    } else if (!equals(c_token, ",")) {
		RGIP_win_horiz = (int) real(const_express(&a));
	    }
	    if (!equals(c_token, ","))
		int_error("',' expected", c_token);
	    c_token++;
	    if (!equals(c_token, "]")) {
		RGIP_win_verti = (int) real(const_express(&a));
	    }
	    if (!equals(c_token, "]"))
		int_error("expecting ']'", c_token);
	    c_token++;
	} else {
	    /* We have font size specified */
	    RGIP_fontsize = (int) real(const_express(&a));
	    if (RGIP_fontsize < 1)
		RGIP_fontsize = 1;
	    term->v_char = (unsigned int) (RGIP_fontsize * RGIP_SC);
	    term->h_char = (unsigned int) (RGIP_fontsize * RGIP_SC * 3 / 7);
	}
    }
    sprintf(term_options, "%s %d [%1d,%1d]",
	    (RGIP_portrait) ? "portrait" : "landscape",
	    RGIP_fontsize, RGIP_win_horiz, RGIP_win_verti);
}

#endif /* TERM_BODY */

#ifdef TERM_TABLE

TERM_TABLE_START(rgip_driver)
    "rgip", "RGIP metafile (Uniplex). Option: fontsize (1-8)",
    RGIP_XMAX, RGIP_YMAX, RGIP_VCHAR, RGIP_HCHAR,
    RGIP_VTIC, RGIP_HTIC, RGIP_options, RGIP_init, RGIP_reset,
    RGIP_text, null_scale, RGIP_graphics, RGIP_move,
    RGIP_vector, RGIP_linetype, RGIP_put_text, RGIP_text_angle,
    RGIP_justify_text, RGIP_do_point, do_arrow, set_font_null
TERM_TABLE_END(rgip_driver)

#undef LAST_TERM
#define LAST_TERM rgip_driver

TERM_TABLE_START(uniplex_driver)
    "uniplex", "RGIP metafile (Uniplex). Option: fontsize (1-8) (Same as rgip)",
    RGIP_XMAX, RGIP_YMAX, RGIP_VCHAR, RGIP_HCHAR,
    RGIP_VTIC, RGIP_HTIC, RGIP_options, RGIP_init, RGIP_reset,
    RGIP_text, null_scale, RGIP_graphics, RGIP_move,
    RGIP_vector, RGIP_linetype, RGIP_put_text, RGIP_text_angle,
    RGIP_justify_text, RGIP_do_point, do_arrow, set_font_null
TERM_TABLE_END(uniplex_driver)

#undef LAST_TERM
#define LAST_TERM uniplex_driver

#endif /* TERM_TABLE */
#endif /* TERM_PROTO_ONLY */

#ifdef TERM_HELP
START_HELP(rgip)
"1 rgip",
"?commands set terminal rgip",
"?set terminal rgip",
"?set term rgip",
"?terminal rgip",
"?term rgip",
"?rgip",
"?commands set terminal uniplex",
"?set terminal uniplex",
"?set term uniplex",
"?terminal uniplex",
"?term uniplex",
"?uniplex",
" The `rgip` and `uniplex` terminal drivers support RGIP metafiles.  They can",
" combine several graphs on a single page, but only one page is allowed in a",
" given output file.",
"",
" Syntax:",
"       set terminal rgip | uniplex {portrait | landscape}",
"                                   {[<horiz>,<vert>]} {<fontsize>}",
"",
" permissible values for the font size are in the range 1--8, with the default",
" being 1.  The default layout is landscape.  Graphs are placed on the page in",
" a `horiz`x`vert` grid, which defaults to [1,1].",
"",
" Example:",
"       set terminal uniplex portrait [2,3]",
"",
" puts six graphs on a page in three rows of two in portrait orientation."
END_HELP(rgip)
#endif /* TERM_HELP */