/* Hello, Emacs, this is -*-C-*-
 * $Id: cgi.trm,v 1.15 2011/08/02 20:40:31 sfeam Exp $
 *
 */

/* GNUPLOT - cgi.trm */

/*[
 * Copyright (C) 1990 - 1993 Ronald Florence
 *
 * 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.h.
 *
 * This terminal driver supports SCO CGI drivers
 *
 * AUTHOR
 *   Ronald Florence <ron@18james.com>
 */

/*
 * adapted to the new terminal layout by Stefan Bodewig (Dec. 1995)
 */

#include "driver.h"

#ifdef TERM_REGISTER
register_term(cgi)
register_term(hcgi)
#endif

#ifdef TERM_PROTO
TERM_PUBLIC void CGI_init __PROTO((void));
TERM_PUBLIC void HCGI_init __PROTO((void));
TERM_PUBLIC void CGI_graphics __PROTO((void));
TERM_PUBLIC void CGI_text __PROTO((void));
TERM_PUBLIC void CGI_reset __PROTO((void));
TERM_PUBLIC void CGI_move __PROTO((unsigned int x, unsigned int y));
TERM_PUBLIC void CGI_vector __PROTO((unsigned int x, unsigned int y));
TERM_PUBLIC void CGI_linetype __PROTO((int linetype));
TERM_PUBLIC void CGI_put_text __PROTO((unsigned int x, unsigned int y, const char *str));
TERM_PUBLIC int CGI_text_angle __PROTO((int ang));
TERM_PUBLIC int CGI_justify_text __PROTO((enum JUSTIFY mode));
TERM_PUBLIC void CGI_point __PROTO((unsigned int x, unsigned int y, int num));
#define CGI_XMAX	32767
#define CGI_YMAX	32767
#define CGI_VTIC	(CGI_YMAX / 75)
#define CGI_HTIC	term->h_tic
#define CGI_VCHAR	term->v_char
#define CGI_HCHAR	term->h_char
#endif

#ifndef TERM_PROTO_ONLY
#ifdef TERM_BODY

#ifdef VGA_MONO
static short rgb[16][3] =
{
    0, 0, 0,			/* Black        */
    1000, 1000, 1000,		/* White        */
    800, 800, 0,		/* Red          */
    0, 600, 0,			/* Green        */
    0, 800, 800,		/* Blue         */
    1000, 1000, 400,		/* Yellow       */
    0, 600, 600,		/* Cyan         */
    600, 600, 600,		/* Magenta      */
    800, 800, 0,		/* Brown        */
    600, 600, 600,		/* Lt. Grey     */
    400, 600, 400,		/* Dark Grey    */
    400, 600, 1000,		/* Lt. Blue     */
    400, 1000, 400,		/* Lt Green     */
    400, 1000, 1000,		/* Lt Cyan      */
    1000, 600, 400,		/* Lt Red       */
    600, 600, 1000		/* Lt Magenta   */
};
#endif

#define CRT		(gout[45] == 0)
#define CGICOLORS	gout[13]
#define CGILINES	gout[6]
#define CGIROTATES	gout[36]
#define CGITEXTALIGN	gout[48]

static short gout[66];
static short cgidev;
static short vect[4];
static short gin[19] =
{
    0,				/* default aspect ratio */
    1,				/* solid line */
    1,				/* line color */
    1,				/* marker type . */
    1,				/* marker color */
    1,				/* graphics text font */
    1,				/* graphics text color */
    0,				/* fill interior style */
    0,				/* fill style index */
    1,				/* fill color index */
    1				/* prompt for paper changes */
};

char *cgidriver, *getenv();


TERM_PUBLIC void
CGI_init()
{
    if (getenv(cgidriver = "CGIDISP") == NULL)
	HCGI_init();
}


TERM_PUBLIC void
HCGI_init()
{
    if (getenv(cgidriver = "CGIPRNT") == NULL)
	int_error(NO_CARET, "no CGI driver");
}


TERM_PUBLIC void
CGI_graphics()
{
    int i, aspect;
    char *s;
    short font_cap[9];

    if ((s = getenv("ASPECT")) != NULL && (aspect = atoi(s)) >= 0 && aspect <= 3)
	gin[0] = aspect;
    for (i = 0; cgidriver[i]; i++)
	gin[11 + i] = cgidriver[i];
    gin[18] = ' ';

    if (v_opnwk(gin, &cgidev, gout) < 0) {
	int_error(NO_CARET, "CGI error %d opening %s", -vq_error(), cgidriver);
    }
    vqt_representation(cgidev, 9, font_cap);
    CGI_VCHAR = font_cap[8] * 3 / 2;
    CGI_HCHAR = font_cap[7];
    CGI_HTIC = CGI_VTIC * ((double) gout[1] / (double) gout[4]) /
	((double) gout[0] / (double) gout[3]);
#ifdef VGA_MONO
    if (CGICOLORS > 2)
	vsc_table(cgidev, 0, CGICOLORS, rgb);
#endif
}


TERM_PUBLIC void
CGI_text()
{
    if (CRT) {
	short ptin[2];
	char strin[2];

	ptin[0] = 0;
	ptin[1] = 0;
	vrq_string(cgidev, 1, 0, ptin, strin);
    }
    v_clswk(cgidev);
}


TERM_PUBLIC void
CGI_reset()
{
}


TERM_PUBLIC void
CGI_move(unsigned int x, unsigned int y)
{
    vect[0] = x;
    vect[1] = y;
}

TERM_PUBLIC void
CGI_vector(unsigned int x, unsigned int y)
{
    vect[2] = x;
    vect[3] = y;
    v_pline(cgidev, 2, vect);
    vect[0] = x;
    vect[1] = y;
}


TERM_PUBLIC void
CGI_linetype(int linetype)
{
    short lcolor;

    if (CGICOLORS > 2) {
	lcolor = (linetype + 2) % CGICOLORS + 1;
	vsl_color(cgidev, lcolor);
	vsm_color(cgidev, lcolor);
    }
    vsl_type(cgidev, (linetype < 1) ? 1 : (linetype % CGILINES) + 1);
}


TERM_PUBLIC void
CGI_put_text(unsigned int x, unsigned int y, const char *str)
{
    v_gtext(cgidev, (short) x, (short) y, str);
}


TERM_PUBLIC int
CGI_text_angle(int ang)
{
    if (!CGIROTATES)
	return FALSE;
    /* angles are 1/10 degree ccw */
    vst_rotation(cgidev, (ang) ? 900 : 0);
    return TRUE;
}


TERM_PUBLIC int
CGI_justify_text(enum JUSTIFY mode)
{
    short hor_in, hor_out, vert_out;

    if (!CGITEXTALIGN)
	return FALSE;

    switch (mode) {
    case LEFT:
	hor_in = 0;
	break;
    case CENTRE:
	hor_in = 1;
	break;
    case RIGHT:
	hor_in = 2;
	break;
    }
    vst_alignment(cgidev, hor_in, 1, &hor_out, &vert_out);
    return TRUE;
}


#define POINT_TYPES 6

TERM_PUBLIC void
CGI_point(unsigned int x, unsigned y, int num)
{
    short point[2];
    static short cgimarker[POINT_TYPES] = { 1, 2, 6, 4, 5, 3 };
    /* .  +  <> [] X  * */
    if (num < 0) {
	CGI_move(x, y);
	CGI_vector(x, y);
    } else {
	vsm_type(cgidev, cgimarker[num % POINT_TYPES]);
	point[0] = x;
	point[1] = y;
	v_pmarker(cgidev, 1, point);
    }
}

#endif /* TERM_BODY */

#ifdef TERM_TABLE

TERM_TABLE_START(cgi_driver)
    "cgi", "SCO CGI drivers (requires CGIDISP or CGIPRNT env variable)",
    CGI_XMAX, CGI_YMAX, 0, 0,
    CGI_VTIC, 0, options_null, CGI_init, CGI_reset,
    CGI_text, null_scale, CGI_graphics, CGI_move, CGI_vector,
    CGI_linetype, CGI_put_text, CGI_text_angle,
    CGI_justify_text, CGI_point, do_arrow, set_font_null
TERM_TABLE_END(cgi_driver)

#undef LAST_TERM
#define LAST_TERM cgi_driver

TERM_TABLE_START(hcgi_driver)
    "hcgi", "SCO CGI drivers (hardcopy, requires CGIPRNT env variable)",
    CGI_XMAX, CGI_YMAX, 0, 0,
    CGI_VTIC, 0, options_null, HCGI_init, CGI_reset,
    CGI_text, null_scale, CGI_graphics, CGI_move, CGI_vector,
    CGI_linetype, CGI_put_text, CGI_text_angle,
    CGI_justify_text, CGI_point, do_arrow, set_font_null
TERM_TABLE_END(hcgi_driver)

#undef LAST_TERM
#define LAST_TERM hcgi_driver

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

#ifdef TERM_HELP
START_HELP(cgi)
"1 cgi",
"?commands set terminal cgi",
"?set terminal cgi",
"?set term cgi",
"?terminal cgi",
"?term cgi",
"?cgi",
"?commands set terminal hcgi",
"?set terminal hcgi",
"?set term hcgi",
"?terminal hcgi",
"?term hcgi",
"?hcgi",
" The `cgi` and `hcgi` terminal drivers support SCO CGI drivers.  `hcgi` is for",
" printers; the environment variable CGIPRNT must be set.  `cgi` may be used",
" for either a display or hardcopy; the environment variable CGIDISP is checked,",
" first, then CGIPRNT.  These terminals have no options."
END_HELP(cgi)
#endif
