1/* Hello, Emacs, this is -*-C-*-
2 * $Id: qms.trm,v 1.11 2006/07/07 03:51:23 sfeam Exp $
3 *
4 */
5
6/* GNUPLOT - qms.trm */
7
8/*[
9 * Copyright 1990 - 1993, 1998, 2004
10 *
11 * Permission to use, copy, and distribute this software and its
12 * documentation for any purpose with or without fee is hereby granted,
13 * provided that the above copyright notice appear in all copies and
14 * that both that copyright notice and this permission notice appear
15 * in supporting documentation.
16 *
17 * Permission to modify the software is granted, but not the right to
18 * distribute the complete modified source code.  Modifications are to
19 * be distributed as patches to the released version.  Permission to
20 * distribute binaries produced by compiling modified sources is granted,
21 * provided you
22 *   1. distribute the corresponding source modifications from the
23 *    released version in the form of a patch file along with the binaries,
24 *   2. add special version identification to distinguish your version
25 *    in addition to the base release version number,
26 *   3. provide your name and address as the primary contact for the
27 *    support of your modified version, and
28 *   4. retain our contact information in regard to use of the base
29 *    software.
30 * Permission to distribute the released version of the source code along
31 * with corresponding source modifications in the form of a patch file is
32 * granted with same provisions 2 through 4 for binary distributions.
33 *
34 * This software is provided "as is" without express or implied warranty
35 * to the extent permitted by applicable law.
36]*/
37
38/*
39 * This file is included by ../term.c.
40 *
41 * This terminal driver supports:
42 *  QMS laser printers
43 *
44 * AUTHORS
45 *  Colin Kelley, Thomas Williams, Russell Lang
46 *
47 * send your comments or suggestions to (gnuplot-info@lists.sourceforge.net).
48 *
49 */
50
51/*
52 * adapted to the new terminal layout by Stefan Bodewig (Dec. 1995)
53 */
54
55#include "driver.h"
56
57#ifdef TERM_REGISTER
58register_term(qms)
59#endif
60
61#ifdef TERM_PROTO
62TERM_PUBLIC void QMS_init __PROTO((void));
63TERM_PUBLIC void QMS_graphics __PROTO((void));
64TERM_PUBLIC void QMS_text __PROTO((void));
65TERM_PUBLIC void QMS_linetype __PROTO((int linetype));
66TERM_PUBLIC void QMS_move __PROTO((unsigned int x, unsigned int y));
67TERM_PUBLIC void QMS_vector __PROTO((unsigned int x2, unsigned int y2));
68TERM_PUBLIC void QMS_put_text __PROTO((unsigned int x, unsigned int y, const char str[]));
69TERM_PUBLIC void QMS_reset __PROTO((void));
70
71#define QMS_XMAX 9000
72#define QMS_YMAX 6000
73
74#define QMS_XLAST (QMS_XMAX - 1)
75#define QMS_YLAST (QMS_YMAX - 1)
76
77#define QMS_VCHAR		120
78#define QMS_HCHAR		70
79#define QMS_VTIC		70
80#define QMS_HTIC		70
81#endif /* TERM_PROTO */
82
83#ifndef TERM_PROTO_ONLY
84#ifdef TERM_BODY
85static int qms_line = 0;	/* to remember current line type */
86
87TERM_PUBLIC void
88QMS_init()
89{
90    /* This was just ^IOL, but at Rutgers at least we need some more stuff */
91    fputs("^PY^-\n^IOL\n^ISYNTAX00000^F^IB11000^IJ00000^IT00000\n", gpoutfile);
92    /*     ^ QUIC on    ^set defaults  ^ set botttom,top,left margins
93     *            ^landscape         ^free format
94     */
95
96/* set defaults are: implicit decimal point, units in inches,
97 * numbers left justified, units in 1/1000 inch, do not ignore spaces
98 * margins are in 1/1000 inch units
99 */
100}
101
102
103TERM_PUBLIC void
104QMS_graphics()
105{
106    fputs("^IGV\n", gpoutfile);
107    /*     ^enter graphics vector mode */
108}
109
110
111
112TERM_PUBLIC void
113QMS_text()
114{
115/* added ^-, because ^, after an ^I command doesn't actually print a page */
116/* Did anybody try this code out?  [uhh...-cdk] */
117    fputs("^IGE\n^-^,", gpoutfile);
118    /*     ^exit graphics vector mode
119     *           ^pass terminator
120     *             ^print page
121     */
122}
123
124
125TERM_PUBLIC void
126QMS_linetype(int linetype)
127{
128    static int width[2 + 9] = { 7, 3, 3, 3, 3, 5, 5, 5, 7, 7, 7 };
129    static int type[2 + 9] = { 0, 1, 0, 2, 3, 0, 2, 3, 0, 2, 3 };
130/*
131 * I don't know about Villanova, but on our printer, using ^V without
132 * previously setting up a pattern crashes the microcode.
133 * [nope, doesn't crash here. -cdk]
134 * [it generates a controller error here on dotted lines. - rjl]
135 */
136/* Code to define patterns added by rjl
137 * According to the manual it should work - but it doesn't
138 */
139    qms_line = linetype;
140    if (linetype >= 9)
141	linetype %= 9;
142
143    fprintf(gpoutfile, "^PW%02d\n", width[linetype + 2]);
144/*	                 ^width in dots */
145
146    switch (type[linetype + 2]) {
147    case 1:			/* short dash */
148	fputs("^PV102025^G\n^V1\n", gpoutfile);
149	/* ^PV = define pattern vector, 1 = pattern number,
150	 * 02 = number of pen downs and ups, 025 = .025" length of ups/downs
151	 */
152	break;
153    case 2:			/* medium dash */
154	fputs("^PV202050^G\n^V2\n", gpoutfile);
155	break;
156    case 3:			/* long dash */
157	fputs("^PV302100^G\n^V3\n", gpoutfile);
158	break;
159    default:
160    case 0:
161	fputs("^V0\n", gpoutfile);
162	break;
163    }
164}
165
166
167TERM_PUBLIC void
168QMS_move(unsigned int x, unsigned int y)
169{
170    fprintf(gpoutfile, "^U%05d:%05d\n", 1000 + x, QMS_YLAST + 1000 - y);
171    /*                   ^pen up vector*/
172}
173
174
175TERM_PUBLIC void
176QMS_vector(unsigned int x2, unsigned int y2)
177{
178    fprintf(gpoutfile, "^D%05d:%05d\n", 1000 + x2, QMS_YLAST + 1000 - y2);
179    /*                  ^pen down vector*/
180}
181
182
183TERM_PUBLIC void
184QMS_put_text(unsigned int x, unsigned int y, const char str[])
185{
186    char ch;
187    QMS_move(x, y + QMS_VCHAR / 3);
188    fputs("^IGE\n", gpoutfile);
189    ch = *str++;
190    while (ch != NUL) {
191	if (ch == '^')
192	    putc('^', gpoutfile);
193	putc(ch, gpoutfile);
194	ch = *str++;
195    }
196    fputs("\n^IGV\n", gpoutfile);
197    QMS_linetype(qms_line);	/* restore line type */
198}
199
200
201TERM_PUBLIC void
202QMS_reset()
203{
204    fputs("^PN^-\n", gpoutfile);
205    /*     ^QUIC off */
206}
207
208#endif /* TERM_BODY */
209
210#ifdef TERM_TABLE
211TERM_TABLE_START(qms_driver)
212    "qms", "QMS/QUIC Laser printer (also Talaris 1200 and others)",
213    QMS_XMAX, QMS_YMAX, QMS_VCHAR, QMS_HCHAR,
214    QMS_VTIC, QMS_HTIC, options_null, QMS_init, QMS_reset,
215    QMS_text, null_scale, QMS_graphics, QMS_move, QMS_vector,
216    QMS_linetype, QMS_put_text, null_text_angle,
217    null_justify_text, line_and_point, do_arrow, set_font_null
218TERM_TABLE_END(qms_driver)
219
220#undef LAST_TERM
221#define LAST_TERM qms_driver
222
223#endif /* TERM_TABLE */
224#endif /* TERM_PROTO_ONLY */
225
226#ifdef TERM_HELP
227START_HELP(qms)
228"1 qms",
229"?commands set terminal qms",
230"?set terminal qms",
231"?set term qms",
232"?terminal qms",
233"?term qms",
234"?qms",
235" The `qms` terminal driver supports the QMS/QUIC Laser printer, the Talaris",
236" 1200 and others.  It has no options."
237END_HELP(qms)
238#endif
239