/*
 * $Id: qms.trm,v 1.6 1995/12/20 21:48:10 drd Exp $
 *
 */

/* GNUPLOT - qms.trm */
/*
 * Copyright (C) 1990 - 1993   
 *
 * 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:
 *  QMS laser printers
 *
 * AUTHORS
 *  Colin Kelley, Thomas Williams, Russell Lang
 * 
 * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
 * 
 */
/*
 * adapted to the new terminal layout by Stefan Bodewig (Dec. 1995)
 */

#ifndef GOT_DRIVER_H
#include "driver.h"
#endif

#ifdef TERM_REGISTER
register_term(qms)
#endif

#ifdef TERM_PROTO
TERM_PUBLIC void QMS_init __P((void));
TERM_PUBLIC void QMS_graphics __P((void));
TERM_PUBLIC void QMS_text __P((void));
TERM_PUBLIC void QMS_linetype __P((int linetype));
TERM_PUBLIC void QMS_move __P((unsigned int x, unsigned int y));
TERM_PUBLIC void QMS_vector __P((unsigned int x2, unsigned int y2));
TERM_PUBLIC void QMS_put_text __P((unsigned int x, unsigned int y, char str[]));
TERM_PUBLIC void QMS_reset __P((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
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 */
  fprintf(outfile,"^PY^-\n^IOL\n^ISYNTAX00000^F^IB11000^IJ00000^IT00000\n");
/*                 ^ 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()
{
	fprintf(outfile,"^IGV\n");
/*	                 ^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] */
	fprintf(outfile,"^IGE\n^-^,");
/*	                 ^exit graphics vector mode
	                       ^pass terminator
	                         ^print page  */
}


TERM_PUBLIC void QMS_linetype(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(outfile,"^PW%02d\n",width[linetype+2]); 
/*	                 ^width in dots */
	switch (type[linetype+2]) {
		case 1 :	/* short dash */
			fprintf(outfile,"^PV102025^G\n^V1\n");
/* ^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 */
			fprintf(outfile,"^PV202050^G\n^V2\n");
			break;
		case 3 :	/* long dash */
			fprintf(outfile,"^PV302100^G\n^V3\n");
			break;
		default:
		case 0 :
			fprintf(outfile,"^V0\n");
			break;
	}
}


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


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


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


TERM_PUBLIC void QMS_reset()
{
	fprintf(outfile,"^PN^-\n");
/*	                 ^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 */

/*
 * NAME: qms
 *
 * OPTIONS: none
 *
 * SUPPORTS: QMS/QUIC Laser printer (also Talaris 1200 and others)
 *
 * Further Info: none. Who was Talaris? 
 *
 */