Annotation of OpenXM_contrib/gnuplot/term/hpljii.trm, Revision 1.1.1.1
1.1 maekawa 1: /*
2: * $Id: hpljii.trm,v 1.20 1998/04/14 00:17:51 drd Exp $
3: *
4: */
5:
6: /* GNUPLOT - hpljii.trm */
7:
8: /*[
9: * Copyright 1990 - 1993, 1998 Thomas Williams, Colin Kelley
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: * hpljii, hpdj
43: *
44: * AUTHORS
45: * John Engels
46: * Russell Lang
47: * Maurice Castro
48: *
49: * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
50: *
51: */
52:
53: /* The following HP laserjet series II driver uses generic bit mapped graphics
54: routines from bitmap.c to build up a bit map in memory. The driver
55: interchanges colomns and lines in order to access entire lines
56: easily and returns the lines to get bits in the right order :
57: (x,y) -> (y,XMAX-1-x). */
58: /* This interchange is done by calling b_makebitmap() with reversed
59: xmax and ymax, and then setting b_rastermode to TRUE. b_setpixel()
60: will then perform the interchange before each pixel is plotted */
61: /* by John Engels JENGELS@BNANDP51.BITNET, inspired by the hpljet driver
62: of Jyrki Yli-Nokari */
63:
64: /*
65: * adapted to the new terminal layout by Stefan Bodewig (Dec. 1995)
66: */
67:
68: #include "driver.h"
69:
70: #ifdef TERM_REGISTER
71: register_term(hpljii)
72: register_term(hpdj)
73: #endif
74:
75: #ifdef TERM_PROTO
76: TERM_PUBLIC void HPLJIIoptions __PROTO((void));
77: TERM_PUBLIC void HPLJIIinit __PROTO((void));
78: TERM_PUBLIC void HPLJIIgraphics __PROTO((void));
79: TERM_PUBLIC void HPLJIItext __PROTO((void));
80: TERM_PUBLIC void HPLJIIlinetype __PROTO((int linetype));
81: TERM_PUBLIC void HPLJIIput_text __PROTO((unsigned int x, unsigned int y, char *str));
82: TERM_PUBLIC void HPLJIIreset __PROTO((void));
83: #define HPLJIImove b_move
84: #define HPLJIIvector b_vector
85: #define HPLJIItext_angle b_text_angle
86: TERM_PUBLIC void HPDJgraphics __PROTO((void));
87: TERM_PUBLIC void HPDJtext __PROTO((void));
88: #define HPDJtext_angle b_text_angle
89: #define HPDJput_text b_put_text
90: /* default values for term_tbl */
91: #define HPLJII_75PPI_XMAX (1920/4)
92: #define HPLJII_75PPI_YMAX (1920/4)
93: #define HPLJII_75PPI_HCHAR (1920/4/6)
94: #define HPLJII_75PPI_VCHAR (1920/4/10)
95: #define HPLJII_75PPI_VTIC 5
96: #define HPLJII_75PPI_HTIC 5
97: #endif
98:
99: #ifndef TERM_PROTO_ONLY
100: #ifdef TERM_BODY
101:
102: /* We define 4 different print qualities : 300ppi, 150ppi, 100ppi and
103: 75ppi. (Pixel size = 1, 2, 3, 4 dots) */
104:
105: #define HPLJII_DPP (hplj_dpp) /* dots per pixel */
106: #define HPLJII_PPI (300/HPLJII_DPP) /* pixel per inch */
107: /* make XMAX and YMAX a multiple of 8 */
108: #define HPLJII_XMAX (8*(unsigned int)(xsize*1920/HPLJII_DPP/8.0+0.9))
109: #define HPLJII_YMAX (8*(unsigned int)(ysize*1920/HPLJII_DPP/8.0+0.9))
110:
111: /* Courier font with 6 lines per inch */
112: #define HPLJII_VCHAR (HPLJII_PPI/6)
113: /* Courier font with 10 caracters per inch */
114: #define HPLJII_HCHAR (HPLJII_PPI/10)
115: /* Save current cursor position */
116: #define HPLJII_PUSH_CURSOR fputs("\033&f0S",gpoutfile)
117: /* Restore cursor position */
118: #define HPLJII_POP_CURSOR fputs("\033&f1S",gpoutfile)
119: /* be sure to use courier font with 6lpi and 10cpi */
120: #define HPLJII_COURIER fputs("\033(0N\033(s0p10.0h12.0v0s0b3T\033&l6D",gpoutfile)
121:
122:
123: void HPLJIIputc __PROTO((unsigned int x, unsigned int y, char c, int ang));
124: static int hplj_dpp = 4;
125: /* bm_pattern not appropriate for 300ppi graphics */
126: #ifndef GOT_300_PATTERN
127: # define GOT_300_PATTERN
128: static unsigned int b_300ppi_pattern[] =
129: {
130: 0xffff, 0x1111, 0xffff, 0x3333,
131: 0x0f0f, 0x3f3f, 0x0fff, 0x00ff, 0x33ff
132: };
133: #endif
134:
135: TERM_PUBLIC void HPLJIIoptions()
136: {
137: char opt[4];
138: int parse_error = 0;
139:
140: if (END_OF_COMMAND) {
141: term_options[0] = NUL;
142: } else {
143: if (token[c_token].length > 3) {
144: parse_error = 1; /* see below */
145: } else {
146: /* almost_equals() won't accept numbers - use strcmp() instead */
147: capture(opt, c_token, c_token, 4);
148: if (!strcmp(opt, "75")) {
149: hplj_dpp = 4;
150: } else if (!strcmp(opt, "100")) {
151: hplj_dpp = 3;
152: } else if (!strcmp(opt, "150")) {
153: hplj_dpp = 2;
154: } else if (!strcmp(opt, "300")) {
155: hplj_dpp = 1;
156: } else {
157: /* error, but set dpi anyway, since term it already set */
158: parse_error = 1;
159: }
160: c_token++;
161: }
162: }
163:
164: term->xmax = HPLJII_XMAX;
165: term->ymax = HPLJII_YMAX;
166: switch (hplj_dpp) {
167: case 1:
168: strcpy(term_options, "300");
169: term->v_tic = 15;
170: term->h_tic = 15;
171: break;
172: case 2:
173: strcpy(term_options, "150");
174: term->v_tic = 8;
175: term->h_tic = 8;
176: break;
177: case 3:
178: strcpy(term_options, "100");
179: term->v_tic = 6;
180: term->h_tic = 6;
181: break;
182: case 4:
183: strcpy(term_options, "75");
184: term->v_tic = 5;
185: term->h_tic = 5;
186: break;
187: }
188:
189: if (parse_error)
190: int_error("expecting dots per inch size 75, 100, 150 or 300",
191: c_token);
192: }
193:
194:
195: TERM_PUBLIC void HPLJIIinit()
196: {
197: term->v_char = HPLJII_VCHAR;
198: term->h_char = HPLJII_HCHAR;
199: }
200:
201:
202: TERM_PUBLIC void HPLJIIgraphics()
203: {
204: HPLJII_COURIER;
205: HPLJII_PUSH_CURSOR;
206: /* rotate plot -90 degrees by reversing XMAX and YMAX and by
207: setting b_rastermode to TRUE */
208: b_makebitmap(HPLJII_YMAX, HPLJII_XMAX, 1);
209: b_rastermode = TRUE;
210: }
211:
212:
213: /* HPLJIItext by rjl - no compression */
214: TERM_PUBLIC void HPLJIItext()
215: {
216: register int x, j, row;
217:
218: fprintf(gpoutfile, "\033*t%dR", HPLJII_PPI);
219: HPLJII_POP_CURSOR;
220: fputs("\033*r1A", gpoutfile);
221:
222: /* dump bitmap in raster mode */
223: for (x = b_xsize - 1; x >= 0; x--) {
224: row = (b_ysize / 8) - 1;
225: fprintf(gpoutfile, "\033*b0m%dW", b_ysize / 8);
226: for (j = row; j >= 0; j--) {
227: (void) fputc((char) (*((*b_p)[j] + x)), gpoutfile);
228: }
229: }
230: fputs("\033*rB", gpoutfile);
231:
232: b_freebitmap();
233:
234: #ifndef VMS
235: /* most vms spoolers add a formfeed character */
236: putc('\f', gpoutfile);
237: #endif /* !VMS */
238: }
239:
240:
241:
242: TERM_PUBLIC void HPLJIIlinetype(linetype)
243: int linetype;
244: {
245:
246: if (hplj_dpp == 1) {
247: if (linetype >= 7)
248: linetype %= 7;
249: /* b_pattern not appropriate for 300ppi graphics */
250: b_linemask = b_300ppi_pattern[linetype + 2];
251: b_maskcount = 0;
252: } else {
253: b_setlinetype(linetype);
254: }
255: }
256:
257: TERM_PUBLIC void HPLJIIput_text(x, y, str)
258: unsigned int x, y;
259: char *str;
260: {
261: switch (b_angle) {
262: case 0:
263: y -= HPLJII_VCHAR / 5;
264: HPLJII_POP_CURSOR;
265: HPLJII_PUSH_CURSOR;
266: /* (0,0) is the upper left point of the paper */
267: fprintf(gpoutfile, "\033*p%+dx%+dY", x * HPLJII_DPP
268: ,(HPLJII_YMAX - y - 1) * HPLJII_DPP);
269: fputs(str, gpoutfile);
270: /* for (; *str; ++str, x += HPLJII_HCHAR)
271: HPLJIIputc (x, y, *str, b_angle);*/
272: break;
273: case 1:
274: y += (HPLJII_HCHAR - 2 * HPLJII_VCHAR) / 2;
275: y += (HPLJII_VCHAR + HPLJII_HCHAR) * strlen(str) / 2;
276: for (; *str; ++str, y -= HPLJII_VCHAR)
277: HPLJIIputc(x, y, *str, b_angle);
278: break;
279: }
280: }
281:
282: #ifdef PROTOTYPES
283: void HPLJIIputc(unsigned int x, unsigned int y, char c, int ang)
284: #else
285: void HPLJIIputc(x, y, c, ang)
286: unsigned int x, y;
287: int ang;
288: char c;
289: #endif
290: {
291: HPLJII_POP_CURSOR;
292: HPLJII_PUSH_CURSOR;
293: /* (0,0) is the upper left point of the paper */
294: fprintf(gpoutfile, "\033*p%+dx%+dY", x * HPLJII_DPP
295: ,(HPLJII_YMAX - y - 1) * HPLJII_DPP);
296: fputc(c, gpoutfile);
297: }
298:
299:
300: TERM_PUBLIC void HPLJIIreset()
301: {
302: #ifdef VMS
303: fflush_binary();
304: #endif /* VMS */
305: }
306:
307:
308: /* HP DeskJet routines */
309: TERM_PUBLIC void HPDJgraphics()
310: {
311: switch (hplj_dpp) {
312: case 1:
313: b_charsize(FNT13X25);
314: term->v_char = FNT13X25_VCHAR;
315: term->h_char = FNT13X25_HCHAR;
316: break;
317: case 2:
318: b_charsize(FNT13X25);
319: term->v_char = FNT13X25_VCHAR;
320: term->h_char = FNT13X25_HCHAR;
321: break;
322: case 3:
323: b_charsize(FNT9X17);
324: term->v_char = FNT9X17_VCHAR;
325: term->h_char = FNT9X17_HCHAR;
326: break;
327: case 4:
328: b_charsize(FNT5X9);
329: term->v_char = FNT5X9_VCHAR;
330: term->h_char = FNT5X9_HCHAR;
331: break;
332: }
333: /* rotate plot -90 degrees by reversing XMAX and YMAX and by
334: setting b_rastermode to TRUE */
335: b_makebitmap(HPLJII_YMAX, HPLJII_XMAX, 1);
336: b_rastermode = TRUE;
337: }
338:
339:
340: /* 0 compression raster bitmap dump. Compatible with HP DeskJet 500
341: hopefully compatible with other HP Deskjet printers */
342: TERM_PUBLIC void HPDJtext()
343: {
344: register int x, j, row;
345:
346: fprintf(gpoutfile, "\
347: \033*b0M\
348: \033*t%dR\
349: \033*r1A",
350: HPLJII_PPI);
351:
352: /* dump bitmap in raster mode */
353: for (x = b_xsize - 1; x >= 0; x--) {
354: row = (b_ysize / 8) - 1;
355: fprintf(gpoutfile, "\033*b%dW", b_ysize / 8);
356: for (j = row; j >= 0; j--) {
357: (void) fputc((char) (*((*b_p)[j] + x)), gpoutfile);
358: }
359: }
360: fputs("\033*rbC", gpoutfile);
361:
362: b_freebitmap();
363:
364: #ifndef VMS /* most vms spoolers add a formfeed character */
365: putc('\f', gpoutfile);
366: #endif /* !VMS */
367: }
368:
369: #endif
370:
371: #ifdef TERM_TABLE
372:
373: TERM_TABLE_START(hpljii_driver)
374: "hpljii", "HP Laserjet series II, [75 100 150 300]",
375: HPLJII_75PPI_XMAX, HPLJII_75PPI_YMAX, HPLJII_75PPI_VCHAR,
376: HPLJII_75PPI_HCHAR, HPLJII_75PPI_VTIC, HPLJII_75PPI_HTIC, HPLJIIoptions,
377: HPLJIIinit, HPLJIIreset, HPLJIItext, null_scale,
378: HPLJIIgraphics, HPLJIImove, HPLJIIvector, HPLJIIlinetype,
379: HPLJIIput_text, HPLJIItext_angle, null_justify_text, line_and_point,
380: do_arrow, set_font_null, 0, TERM_BINARY
381: TERM_TABLE_END(hpljii_driver)
382:
383: #undef LAST_TERM
384: #define LAST_TERM hpljii_driver
385:
386: TERM_TABLE_START(hpdj_driver)
387: "hpdj", "HP DeskJet 500, [75 100 150 300]",
388: HPLJII_75PPI_XMAX, HPLJII_75PPI_YMAX, HPLJII_75PPI_VCHAR,
389: HPLJII_75PPI_HCHAR, HPLJII_75PPI_VTIC, HPLJII_75PPI_HTIC, HPLJIIoptions,
390: HPLJIIinit, HPLJIIreset, HPDJtext, null_scale,
391: HPDJgraphics, HPLJIImove, HPLJIIvector, HPLJIIlinetype,
392: HPDJput_text, HPDJtext_angle, null_justify_text, line_and_point,
393: do_arrow, set_font_null, 0, TERM_BINARY
394: TERM_TABLE_END(hpdj_driver)
395:
396: #undef LAST_TERM
397: #define LAST_TERM hpdj_driver
398:
399: #endif
400: #endif
401:
402: #ifdef TERM_HELP
403: START_HELP(hpljii)
404: "1 hpljii",
405: "?commands set terminal hpljii",
406: "?set terminal hpljii",
407: "?set term hpljii",
408: "?terminal hpljii",
409: "?term hpljii",
410: "?hpljii",
411: "?commands set terminal hpdj",
412: "?set terminal hpdj",
413: "?set term hpdj",
414: "?terminal hpdj",
415: "?term hpdj",
416: "?hpdj",
417: " The `hpljii` terminal driver supports the HP Laserjet Series II printer. The",
418: " `hpdj` driver supports the HP DeskJet 500 printer. These drivers allow a",
419: " choice of resolutions.",
420: "",
421: " Syntax:",
422: " set terminal hpljii | hpdj {<res>}",
423: "",
424: " where `res` may be 75, 100, 150 or 300 dots per inch; the default is 75.",
425: " Rasterization at the higher resolutions may require a large amount of memory.",
426: "",
427: " The `hp500c` terminal is similar to `hpdj`; `hp500c` additionally supports",
428: " color and compression."
429: END_HELP(hpljii)
430: #endif /* TERM_HELP */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>