/* Hello, Emacs, this is -*-C-*-
 * $Id: qms.trm,v 1.12 2006/07/21 02:35:48 sfeam Exp $
 *
 */

/* GNUPLOT - qms.trm */

/*[
 * Copyright 1990 - 1993, 1998, 2004
 *
 * 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:
 *  QMS laser printers
 *
 * AUTHORS
 *  Colin Kelley, Thomas Williams, Russell Lang
 *
 * send your comments or suggestions to (gnuplot-info@lists.sourceforge.net).
 *
 */

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

#include "driver.h"

#ifdef TERM_REGISTER
register_term(qms)
#endif

#ifdef TERM_PROTO
TERM_PUBLIC void QMS_init __PROTO((void));
TERM_PUBLIC void QMS_graphics __PROTO((void));
TERM_PUBLIC void QMS_text __PROTO((void));
TERM_PUBLIC void QMS_linetype __PROTO((int linetype));
TERM_PUBLIC void QMS_move __PROTO((unsigned int x, unsigned int y));
TERM_PUBLIC void QMS_vector __PROTO((unsigned int x2, unsigned int y2));
TERM_PUBLIC void QMS_put_text __PROTO((unsigned int x, unsigned int y, const char str[]));
TERM_PUBLIC void QMS_reset __PROTO((void));

#define QMS_XMAX 9000
#define QMS_YMAX 6000

#define QMS_XLAST (QMS_XMAX - 1)
#define QMS_YLAST (QMS_YMAX - 1)

#define QMS_VCHAR		120
#define QMS_HCHAR		70
#define QMS_VTIC		70
#define QMS_HTIC		70
#endif /* TERM_PROTO */

#ifndef TERM_PROTO_ONLY
#ifdef TERM_BODY
static int qms_line = 0;	/* to remember current line type */

TERM_PUBLIC void
QMS_init()
{
    /* This was just ^IOL, but at Rutgers at least we need some more stuff */
    fputs("^PY^-\n^IOL\n^ISYNTAX00000^F^IB11000^IJ00000^IT00000\n", gpoutfile);
    /*     ^ QUIC on    ^set defaults  ^ set botttom,top,left margins
     *            ^landscape         ^free format
     */

/* set defaults are: implicit decimal point, units in inches,
 * numbers left justified, units in 1/1000 inch, do not ignore spaces
 * margins are in 1/1000 inch units
 */
}


TERM_PUBLIC void
QMS_graphics()
{
    fputs("^IGV\n", gpoutfile);
    /*     ^enter graphics vector mode */
}



TERM_PUBLIC void
QMS_text()
{
/* added ^-, because ^, after an ^I command doesn't actually print a page */
/* Did anybody try this code out?  [uhh...-cdk] */
    fputs("^IGE\n^-^,", gpoutfile);
    /*     ^exit graphics vector mode
     *           ^pass terminator
     *             ^print page
     */
}


TERM_PUBLIC void
QMS_linetype(int linetype)
{
    static int width[2 + 9] = { 7, 3, 3, 3, 3, 5, 5, 5, 7, 7, 7 };
    static int type[2 + 9] = { 0, 1, 0, 2, 3, 0, 2, 3, 0, 2, 3 };
/*
 * I don't know about Villanova, but on our printer, using ^V without
 * previously setting up a pattern crashes the microcode.
 * [nope, doesn't crash here. -cdk]
 * [it generates a controller error here on dotted lines. - rjl]
 */
/* Code to define patterns added by rjl
 * According to the manual it should work - but it doesn't
 */
    qms_line = linetype;
    if (linetype >= 9)
	linetype %= 9;

    fprintf(gpoutfile, "^PW%02d\n", width[linetype + 2]);
/*	                 ^width in dots */

    switch (type[linetype + 2]) {
    case 1:			/* short dash */
	fputs("^PV102025^G\n^V1\n", gpoutfile);
	/* ^PV = define pattern vector, 1 = pattern number,
	 * 02 = number of pen downs and ups, 025 = .025" length of ups/downs
	 */
	break;
    case 2:			/* medium dash */
	fputs("^PV202050^G\n^V2\n", gpoutfile);
	break;
    case 3:			/* long dash */
	fputs("^PV302100^G\n^V3\n", gpoutfile);
	break;
    default:
    case 0:
	fputs("^V0\n", gpoutfile);
	break;
    }
}


TERM_PUBLIC void
QMS_move(unsigned int x, unsigned int y)
{
    fprintf(gpoutfile, "^U%05d:%05d\n", 1000 + x, QMS_YLAST + 1000 - y);
    /*                   ^pen up vector*/
}


TERM_PUBLIC void
QMS_vector(unsigned int x2, unsigned int y2)
{
    fprintf(gpoutfile, "^D%05d:%05d\n", 1000 + x2, QMS_YLAST + 1000 - y2);
    /*                  ^pen down vector*/
}


TERM_PUBLIC void
QMS_put_text(unsigned int x, unsigned int y, const char str[])
{
    char ch;
    QMS_move(x, y + QMS_VCHAR / 3);
    fputs("^IGE\n", gpoutfile);
    ch = *str++;
    while (ch != NUL) {
	if (ch == '^')
	    putc('^', gpoutfile);
	putc(ch, gpoutfile);
	ch = *str++;
    }
    fputs("\n^IGV\n", gpoutfile);
    QMS_linetype(qms_line);	/* restore line type */
}


TERM_PUBLIC void
QMS_reset()
{
    fputs("^PN^-\n", gpoutfile);
    /*     ^QUIC off */
}

#endif /* TERM_BODY */

#ifdef TERM_TABLE
TERM_TABLE_START(qms_driver)
    "qms", "QMS/QUIC Laser printer (also Talaris 1200 and others)",
    QMS_XMAX, QMS_YMAX, QMS_VCHAR, QMS_HCHAR,
    QMS_VTIC, QMS_HTIC, options_null, QMS_init, QMS_reset,
    QMS_text, null_scale, QMS_graphics, QMS_move, QMS_vector,
    QMS_linetype, QMS_put_text, null_text_angle,
    null_justify_text, line_and_point, do_arrow, set_font_null
TERM_TABLE_END(qms_driver)

#undef LAST_TERM
#define LAST_TERM qms_driver

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

#ifdef TERM_HELP
START_HELP(qms)
"1 qms",
"?commands set terminal qms",
"?set terminal qms",
"?set term qms",
"?terminal qms",
"?term qms",
"?qms",
" The `qms` terminal driver supports the QMS/QUIC Laser printer, the Talaris",
" 1200 and others.  It has no options."
END_HELP(qms)
#endif
