Annotation of OpenXM_contrib/gnuplot/term/hpgl.trm, Revision 1.1.1.1
1.1 maekawa 1: /*
2: * $Id: hpgl.trm,v 1.24 1998/04/14 00:17:49 drd Exp $
3: */
4:
5: /* GNUPLOT - hpgl.trm */
6:
7: /*[
8: * Copyright 1990 - 1993, 1998
9: *
10: * Permission to use, copy, and distribute this software and its
11: * documentation for any purpose with or without fee is hereby granted,
12: * provided that the above copyright notice appear in all copies and
13: * that both that copyright notice and this permission notice appear
14: * in supporting documentation.
15: *
16: * Permission to modify the software is granted, but not the right to
17: * distribute the complete modified source code. Modifications are to
18: * be distributed as patches to the released version. Permission to
19: * distribute binaries produced by compiling modified sources is granted,
20: * provided you
21: * 1. distribute the corresponding source modifications from the
22: * released version in the form of a patch file along with the binaries,
23: * 2. add special version identification to distinguish your version
24: * in addition to the base release version number,
25: * 3. provide your name and address as the primary contact for the
26: * support of your modified version, and
27: * 4. retain our contact information in regard to use of the base
28: * software.
29: * Permission to distribute the released version of the source code along
30: * with corresponding source modifications in the form of a patch file is
31: * granted with same provisions 2 through 4 for binary distributions.
32: *
33: * This software is provided "as is" without express or implied warranty
34: * to the extent permitted by applicable law.
35: ]*/
36:
37: /*
38: * This file is included by ../term.c.
39: *
40: * This terminal driver supports:
41: * hpgl, hp7550, hp7580b, HP Laserjet III
42: * hp7550 has been replaced by "hpgl 8 eject"
43: * hp7580b has been replaced by "hpgl 4"
44: *
45: * AUTHORS
46: * Colin Kelley, Thomas Williams, Russell Lang
47: *
48: * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
49: *
50: */
51:
52: /*
53: *
54: * MODIFIED for expanded HPGL/2 and PCL utilites
55: * Tom Swiler (tom@silica.mse.ufl.edu)
56: * Modified June 1995 Ian MacPhedran to support newterm format
57: * Modified October 1995 Ian MacPhedran to simplify HPGL terminals
58: * Modified January 96 by David Denholm and Emmanuel Bigler for cp850
59: * and iso international character sets
60: */
61: #define HPGL
62: #define PCL
63:
64: #include "driver.h"
65:
66: #ifdef TERM_REGISTER
67: register_term(hpgl)
68: register_term(pcl5)
69: #endif /* TERM_REGISTER */
70:
71: #ifdef TERM_PROTO
72: TERM_PUBLIC void HPGL_options __PROTO((void));
73: TERM_PUBLIC void HPGL2_options __PROTO((void));
74: TERM_PUBLIC void PCL_options __PROTO((void));
75: TERM_PUBLIC void HPGL_init __PROTO((void));
76: /* TERM_PUBLIC void HPGL2_init __PROTO((void)); */
77: TERM_PUBLIC void PCL_init __PROTO((void));
78: TERM_PUBLIC void HPGL_graphics __PROTO((void));
79: TERM_PUBLIC void HPGL2_graphics __PROTO((void));
80: TERM_PUBLIC void PCL_graphics __PROTO((void));
81: TERM_PUBLIC void HPGL_text __PROTO((void));
82: /* TERM_PUBLIC void HPGL2_text __PROTO((void)); */
83: TERM_PUBLIC void PCL_text __PROTO((void));
84: TERM_PUBLIC void HPGL_linetype __PROTO((int linetype));
85: TERM_PUBLIC void HPGL2_linetype __PROTO((int linetype));
86: TERM_PUBLIC void HPGL_put_text __PROTO((unsigned int x, unsigned int y, char *str));
87: TERM_PUBLIC void HPGL2_put_text __PROTO((unsigned int x, unsigned int y, char *str));
88: TERM_PUBLIC void HPGL_move __PROTO((unsigned int x, unsigned int y));
89: TERM_PUBLIC void HPGL_vector __PROTO((unsigned int x, unsigned int y));
90: TERM_PUBLIC void HPGL2_move __PROTO((unsigned int x, unsigned int y));
91: TERM_PUBLIC void HPGL2_vector __PROTO((unsigned int x, unsigned int y));
92: TERM_PUBLIC void HPGL2_encode __PROTO((int d));
93: TERM_PUBLIC int HPGL_text_angle __PROTO((int ang));
94: TERM_PUBLIC int HPGL2_text_angle __PROTO((int ang));
95: TERM_PUBLIC void HPGL_reset __PROTO((void));
96: /* TERM_PUBLIC void HPGL2_reset __PROTO((void)); */
97: TERM_PUBLIC void PCL_reset __PROTO((void));
98: TERM_PUBLIC int HPGL2_justify_text __PROTO((enum JUSTIFY just));
99: #define GOT_HPGL_PROTO
100: #endif /* TERM_PROTO */
101:
102: #ifndef TERM_PROTO_ONLY
103: #ifdef TERM_BODY
104: /*
105: * The maximum plot size, in plotter units:
106: */
107:
108: #define HPGL_PUPI 1016 /* Plotter units per inch */
109:
110: #define HPGL_XMAX_A 10000
111: #define HPGL_YMAX_A 7500
112:
113: #define HPGL_XMAX_B 15200
114: #define HPGL_YMAX_B 10000
115:
116: #define HPGL_XMAX HPGL_XMAX_A
117: #define HPGL_YMAX HPGL_YMAX_A
118:
119: #define PCL_XMAX HPGL_XMAX_A
120: #define PCL_YMAX (HPGL_YMAX_A-60)
121:
122: /*
123: * Tic sizes
124: */
125:
126: #define HPGL_VTIC (HPGL_YMAX/70)
127: #define HPGL_HTIC (HPGL_YMAX/70)
128:
129: #define PCL_VTIC (PCL_YMAX/70)
130: #define PCL_HTIC (PCL_YMAX/70)
131:
132: /*
133: * Font size for HPGL
134: */
135:
136: #define HPGL_VCHAR (HPGL_YMAX/100*32/10) /* 3.2% */
137: #define HPGL_HCHAR (HPGL_XMAX/100*12/10) /* 1.2% */
138:
139: /*
140: * Font size for HPGL/2
141: */
142:
143: #define HPGL2_DEF_POINT 14 /* Height of font */
144:
145: #define HPGL2_DEF_PITCH (3 * 72 / (HPGL2_DEF_POINT * 2))
146: #define HPGL2_VCHAR ((int) HPGL_PUPI * HPGL2_DEF_POINT / 72)
147: #define HPGL2_HCHAR (HPGL2_VCHAR * 2 / 3)
148:
149: /*
150: * Control constants
151: */
152:
153: #define DOWN 0 /* Pen is down */
154: #define UP 1 /* Pen is up */
155: #define UNKNOWN -10 /* Unknown status for lots of things */
156:
157: /*
158: * For Polyline Encoded, either use base 64 or base 32.
159: * Save space with base 64, but get 8-bit characters.
160: */
161:
162: #ifdef NEXT
163: /* unluckily TRUE is defined as ((boolean_t)1) in mach/boolean.h */
164: #define HPGL2_BASE64 1
165: #else
166: #define HPGL2_BASE64 TRUE
167: #endif
168:
169: #if HPGL2_BASE64
170: #define HPGL2_BITS 6
171: #define HPGL2_LOW_OFFS 63
172: #define HPGL2_HIGH_OFFS 191
173: #define HPGL2_MASK 63
174: #else
175: #define HPGL2_BITS 5
176: #define HPGL2_LOW_OFFS 63
177: #define HPGL2_HIGH_OFFS 95
178: #define HPGL2_MASK 31
179: #endif
180:
181: /*
182: * Data structures for options
183: */
184:
185: struct HPGL2_font_str {
186: char *compare, *name;
187: int symbol_set, spacing;
188: double pitch, height;
189: int posture, stroke_weight, typeface;
190: };
191:
192: struct PCL_mode_str {
193: char *compare, *name, *command;
194: int xmax, ymax;
195: };
196:
197: /*
198: * The default font goes first. Although it is the ugliest, the
199: * stick font is probably supported by the most devices, so it
200: * becomes the default.
201: */
202:
203: static struct HPGL2_font_str GPFAR HPGL2_font_table[] =
204: {
205: {"u$nivers", "univers", 277, 1, 0.0, HPGL2_DEF_POINT, 0, 0, 4148},
206: {"s$tick", "stick", 277, 0, HPGL2_DEF_PITCH, 0.0, 0, 0, 48},
207: {"c$g_times", "cg_times", 277, 1, 0.0, HPGL2_DEF_POINT, 0, 0, 4101}
208: };
209:
210: #define HPGL2_FONTS (sizeof(HPGL2_font_table) / sizeof (struct HPGL2_font_str))
211: static struct HPGL2_font_str *HPGL2_font = &HPGL2_font_table[0];
212:
213: /*
214: * The default mode goes first. Landscape style plots are probably the
215: * most compatable with other HPGL devices.
216: */
217:
218: static struct PCL_mode_str GPFAR PCL_mode_table[] =
219: {
220: {"l$andscape", "landscape", "\033&l1O", PCL_XMAX, PCL_YMAX},
221: {"p$ortrait", "portrait", "\033&l0O", PCL_YMAX, PCL_XMAX}
222: };
223:
224: #define PCL_MODES (sizeof(PCL_mode_table) / sizeof (struct PCL_mode_str))
225: static struct PCL_mode_str *PCL_mode = &PCL_mode_table[0];
226:
227: /*
228: * Various line types and widths to distinguish data sets
229: */
230:
231: static char *HPGL2_lt[] = { "", "4,2", "5,2", "6,2", "7,2", "8,2" },
232: *HPGL2_pw[] = { ".15", ".12", ".08" };
233:
234: #define HPGL2_LINETYPES (sizeof(HPGL2_lt) / sizeof(char *))
235: #define HPGL2_PENWIDTHS (sizeof(HPGL2_pw) / sizeof(char *))
236:
237: /* encoding vector for cp850 , characters 128 (0200) -> 255 (0377) */
238:
239: static char hpgl_cp_850[128][4] =
240: {
241:
242: /* 0200 */ "\0164\017",
243: /* 0201 */ "\016O\017",
244: /* 0202 */ "\016E\017",
245: /* 0203 */ "\016@\017",
246: /* 0204 */ "\016L\017",
247: /* 0205 */ "\016H\017",
248: /* 0206 */ "\016T\017",
249: /* 0207 */ "\0165\017",
250:
251: /* 0210 */ "\016A\017",
252: /* 0211 */ "\016M\017",
253: /* 0212 */ "\016I\017",
254: /* 0213 */ "\016]\017",
255: /* 0214 */ "\016Q\017",
256: /* 0215 */ "\016Y\017",
257: /* 0216 */ "\016X\017",
258: /* 0217 */ "\016P\017",
259:
260: /* 0220 */ "\016\134\017",
261: /* 0221 */ "\016W\017",
262: /* 0222 */ "\016S\017",
263: /* 0223 */ "\016B\017",
264: /* 0224 */ "\016N\017",
265: /* 0225 */ "\016J\017",
266: /* 0226 */ "\016C\017",
267: /* 0227 */ "\016K\017",
268:
269: /* 0230 */ "\016o\017",
270: /* 0231 */ "\016Z\017",
271: /* 0232 */ "\016[\017",
272: /* 0233 */ "\016V\017",
273: /* 0234 */ "\016;\017",
274: /* 0235 */ "\016R\017",
275: /* 0236 */ "",
276: /* 0237 */ "\016>\017",
277:
278: /* 0240 */ "\016D\017",
279: /* 0241 */ "\016U\017",
280: /* 0242 */ "\016F\017",
281: /* 0243 */ "\016G\017",
282: /* 0244 */ "\0167\017",
283: /* 0245 */ "\0166\017",
284: /* 0246 */ "\016y\017",
285: /* 0247 */ "\016z\017",
286:
287: /* 0250 */ "\0169\017",
288:
289: /* 0251 */ "",
290: /* 0252 */ "",
291:
292: /* 0253 */ "\016x\017",
293: /* 0254 */ "\016w\017",
294: /* 0255 */ "\0168\017",
295: /* 0256 */ "\016{\017",
296: /* 0257 */ "\016}\017",
297:
298: /* 0260 */ "",
299: /* 0261 */ "",
300: /* 0262 */ "",
301: /* 0263 */ "",
302: /* 0264 */ "",
303:
304: /* 0265 */ "\016`\017",
305: /* 0266 */ "\016\042\017",
306: /* 0267 */ "\016!\017",
307:
308: /* 0270 */ "",
309: /* 0271 */ "",
310: /* 0272 */ "",
311: /* 0273 */ "",
312: /* 0274 */ "",
313:
314: /* 0275 */ "\016?\017",
315: /* 0276 */ "\016<\017",
316:
317: /* 0277 */ "",
318:
319: /* 0300 */ "",
320: /* 0301 */ "",
321: /* 0302 */ "",
322: /* 0303 */ "",
323: /* 0304 */ "",
324: /* 0305 */ "",
325:
326: /* 0306 */ "\016b\017",
327: /* 0307 */ "\016a\017",
328:
329: /* 0310 */ "",
330: /* 0311 */ "",
331: /* 0312 */ "",
332: /* 0313 */ "",
333: /* 0314 */ "",
334: /* 0315 */ "",
335: /* 0316 */ "",
336:
337: /* 0317 */ "\016:\017",
338:
339: /* 0320 */ "\016d\017",
340: /* 0321 */ "\016c\017",
341: /* 0322 */ "\016$\017",
342: /* 0323 */ "\016%\017",
343: /* 0324 */ "\016#\017",
344:
345: /* 0325 */ "",
346:
347: /* 0326 */ "\016e\017",
348: /* 0327 */ "\016&\017",
349:
350: /* 0330 */ "\016'\017",
351:
352: /* 0331 */ "",
353: /* 0332 */ "",
354: /* 0333 */ "",
355: /* 0334 */ "",
356: /* 0335 */ "",
357:
358: /* 0336 */ "\016f\017",
359: /* 0337 */ "",
360:
361: /* 0340 */ "\016g\017",
362: /* 0341 */ "\016^\017",
363: /* 0342 */ "\016_\017",
364: /* 0343 */ "\016h\017",
365: /* 0344 */ "\016j\017",
366: /* 0345 */ "\016i\017",
367: /* 0346 */ "",
368: /* 0347 */ "\016q\017",
369:
370: /* 0350 */ "\016p\017",
371: /* 0351 */ "\016m\017",
372: /* 0352 */ "\016.\017",
373: /* 0353 */ "\016-\017",
374: /* 0354 */ "",
375: /* 0355 */ "",
376: /* 0356 */ "\0160\017",
377: /* 0357 */ "\016(\017",
378:
379: /* 0360 */ "\016v\017",
380: /* 0361 */ "\016~\017",
381: /* 0362 */ "",
382: /* 0363 */ "",
383: /* 0364 */ "",
384: /* 0365 */ "\016=\017",
385: /* 0366 */ "",
386: /* 0367 */ "",
387:
388: /* 0370 */ "\016z\017",
389: /* 0371 */ "\016+\017",
390: /* 0372 */ "",
391: /* 0373 */ "",
392: /* 0374 */ "",
393: /* 0375 */ "",
394: /* 0376 */ "",
395: /* 0377 */ ""
396: };
397:
398:
399: /* encoding vector for iso-8859-1 , characters 128 (0200) -> 255 (0377) */
400:
401: static char hpgl_iso_8859_1[128][4] =
402: {
403:
404: /* 0200 */ "",
405: /* 0201 */ "",
406: /* 0202 */ "",
407: /* 0203 */ "",
408: /* 0204 */ "",
409: /* 0205 */ "",
410: /* 0206 */ "",
411: /* 0207 */ "",
412:
413: /* 0210 */ "",
414: /* 0211 */ "",
415: /* 0212 */ "",
416: /* 0213 */ "",
417: /* 0214 */ "",
418: /* 0215 */ "",
419: /* 0216 */ "",
420: /* 0217 */ "",
421:
422: /* 0220 */ "",
423: /* 0221 */ "\016\017",
424: /* 0222 */ "\016\017",
425: /* 0223 */ "",
426: /* 0224 */ "",
427: /* 0225 */ "",
428: /* 0226 */ "",
429: /* 0227 */ "",
430:
431: /* 0230 */ "",
432: /* 0231 */ "",
433: /* 0232 */ "",
434: /* 0233 */ "",
435: /* 0234 */ "",
436: /* 0235 */ "",
437: /* 0236 */ "",
438: /* 0237 */ "",
439:
440: /* 0240 */ "",
441: /* 0241 */ "\0168\017",
442: /* 0242 */ "\0165\017",
443: /* 0243 */ "\016;\017",
444: /* 0244 */ "\016:\017",
445: /* 0245 */ "\016<\017",
446: /* 0246 */ "\017|\017",
447: /* 0247 */ "\016=\017",
448:
449: /* 0250 */ "\016+\017",
450: /* 0251 */ "",
451: /* 0252 */ "\016y\017",
452: /* 0253 */ "\016{\017",
453: /* 0254 */ "",
454: /* 0255 */ "",
455: /* 0256 */ "",
456: /* 0257 */ "\0160\017",
457:
458: /* 0260 */ "\016z\017",
459: /* 0261 */ "\016~\017",
460: /* 0262 */ "",
461: /* 0263 */ "",
462: /* 0264 */ "",
463: /* 0265 */ "",
464: /* 0266 */ "",
465: /* 0267 */ "",
466:
467: /* 0270 */ "",
468: /* 0271 */ "",
469: /* 0272 */ "\016z\017",
470: /* 0273 */ "\016}\017",
471: /* 0274 */ "\016w\017",
472: /* 0275 */ "\016x\017",
473: /* 0276 */ "",
474: /* 0277 */ "\0169\017",
475:
476: /* 0300 */ "\016!\017",
477: /* 0301 */ "\016`\017",
478: /* 0302 */ "\016\042\017",
479: /* 0303 */ "\016a\017",
480: /* 0304 */ "\016X\017",
481: /* 0305 */ "\016P\017",
482: /* 0306 */ "\016S\017",
483: /* 0307 */ "\0164\017",
484:
485: /* 0310 */ "\016#\017",
486: /* 0311 */ "\016\134\017",
487: /* 0312 */ "\016$\017",
488: /* 0313 */ "\016%\017",
489: /* 0314 */ "\016f\017",
490: /* 0315 */ "\016e\017",
491: /* 0316 */ "\016\046\017",
492: /* 0317 */ "\016'\017",
493:
494: /* 0320 */ "\016c\017",
495: /* 0321 */ "\0166\017",
496: /* 0322 */ "\016h\017",
497: /* 0323 */ "\016g\017",
498: /* 0324 */ "\016_\017",
499: /* 0325 */ "\016i\017",
500: /* 0326 */ "\016Z\017",
501: /* 0327 */ "",
502:
503: /* 0330 */ "\016R\017",
504: /* 0331 */ "\016-\017",
505: /* 0332 */ "\016m\017",
506: /* 0333 */ "\016.\017",
507: /* 0334 */ "\016[\017",
508: /* 0335 */ "",
509: /* 0336 */ "\016p\017",
510: /* 0337 */ "\016^\017",
511:
512: /* 0340 */ "\016H\017",
513: /* 0341 */ "\016D\017",
514: /* 0342 */ "\016@\017",
515: /* 0343 */ "\016b\017",
516: /* 0344 */ "\016L\017",
517: /* 0345 */ "\016T\017",
518: /* 0346 */ "\016W\017",
519: /* 0347 */ "\0165\017",
520:
521: /* 0350 */ "\016I\017",
522: /* 0351 */ "\016E\017",
523: /* 0352 */ "\016A\017",
524: /* 0353 */ "\016M\017",
525: /* 0354 */ "\016Y\017",
526: /* 0355 */ "\016U\017",
527: /* 0356 */ "\016Q\017",
528: /* 0357 */ "\016]\017",
529:
530: /* 0360 */ "\016d\017",
531: /* 0361 */ "\0167\017",
532: /* 0362 */ "\016J\017",
533: /* 0363 */ "\016F\017",
534: /* 0364 */ "\016B\017",
535: /* 0365 */ "\016j\017",
536: /* 0366 */ "\016N\017",
537: /* 0367 */ "",
538:
539: /* 0370 */ "\016V\017",
540: /* 0371 */ "\016K\017",
541: /* 0372 */ "\016G\017",
542: /* 0373 */ "\016C\017",
543: /* 0374 */ "\016O\017",
544: /* 0375 */ "",
545: /* 0376 */ "\016q\017",
546: /* 0377 */ "\016o\017"
547: };
548:
549:
550: /*
551: * Static variables to keep track of where we are, etc.
552: */
553:
554: static int HPGL_ang = 0, HPGL_x = UNKNOWN, HPGL_y = UNKNOWN, HPGL_penstate = UNKNOWN, HPGL_pentype
555: = UNKNOWN, HPGL2_in_pe, HPGL2_lost;
556:
557: /*
558: * The subroutines, grouped by function for different versions.
559: */
560:
561: static int HPGL_numpen, HPGL_eject;
562:
563: TERM_PUBLIC void HPGL_options()
564: {
565: HPGL_numpen = 6; /* default to six pens */
566: HPGL_eject = 0; /* default to no eject */
567:
568: while (!END_OF_COMMAND) {
569: if (almost_equals(c_token, "eje$ct"))
570: HPGL_eject = 1;
571: else if (isanumber(c_token)) {
572: HPGL_numpen = (int) real(&token[c_token].l_val);
573: if (HPGL_numpen <= 0) {
574: HPGL_numpen = 6;
575: int_error("Number of pens must be positive", c_token);
576: }
577: } else
578: int_error("expecting \"eject\" or number of pens", c_token);
579:
580: c_token++;
581: }
582:
583:
584: sprintf(term_options, "%d pens %s", HPGL_numpen,
585: HPGL_eject ? "eject" : "noeject");
586: }
587:
588: TERM_PUBLIC void HPGL2_options()
589: {
590: struct termentry *t = term;
591: int i;
592: double point_size;
593: char tmp_options[MAX_ID_LEN];
594: if (!END_OF_COMMAND) {
595: for (i = 0; i < HPGL2_FONTS &&
596: !almost_equals(c_token, HPGL2_font_table[i].compare); i++);
597: if (i < HPGL2_FONTS) {
598: HPGL2_font = &HPGL2_font_table[i];
599: } else
600: int_error("expecting font: stick, cg_times, or univers", c_token);
601: c_token++;
602: if (!END_OF_COMMAND) {
603: if ((point_size = real(&token[c_token].l_val)) > 0.0) {
604: t->v_char = (int) HPGL_PUPI *point_size / 72;
605: t->h_char = t->v_char * 2 / 3;
606: if (HPGL2_font->spacing)
607: HPGL2_font->height = point_size;
608: else
609: HPGL2_font->pitch = 72 * 3 / (point_size * 2);
610: } else
611: int_error("expecting font point size: real number", c_token);
612: c_token++;
613: }
614: }
615: sprintf(tmp_options, " %s", HPGL2_font->name);
616: strcat(term_options, tmp_options);
617: if (HPGL2_font->spacing) {
618: sprintf(tmp_options, " %f",
619: HPGL2_font->height);
620: strcat(term_options, tmp_options);
621: } else {
622: sprintf(tmp_options, " %f",
623: HPGL2_font->pitch);
624: strcat(term_options, tmp_options);
625: }
626: }
627:
628: TERM_PUBLIC void PCL_options()
629: {
630: int i;
631: if (!END_OF_COMMAND) {
632: for (i = 0; i < PCL_MODES &&
633: !almost_equals(c_token, PCL_mode_table[i].compare); i++);
634: if (i < PCL_MODES)
635: PCL_mode = &PCL_mode_table[i];
636: else
637: int_error("expecting mode: portrait or landscape", c_token);
638: c_token++;
639: }
640: sprintf(term_options, " %s", PCL_mode->name);
641: HPGL2_options();
642: }
643:
644: TERM_PUBLIC void HPGL_init()
645: {
646: }
647:
648: /* void HPGL2_init ()
649: {
650: } */
651:
652: TERM_PUBLIC void PCL_init()
653: {
654: struct termentry *t = term;
655: /*
656: * Reset printer, set to one copy, orientation of user's choice.
657: * Make the change to the new orientation all at once.
658: */
659: fprintf(gpoutfile, "\033E\033&l1X%s\n", PCL_mode->command);
660: t->xmax = PCL_mode->xmax;
661: t->ymax = PCL_mode->ymax;
662: }
663:
664: TERM_PUBLIC void HPGL_graphics()
665: {
666: fputs("\033.Y\n\033.I81;;17:\033.N;19:\033.M500:\n", gpoutfile);
667: /* 1
668: 1. enable eavesdropping
669: */
670: fprintf(gpoutfile,
671: "IN;%s\nSC0,%d,0,%d;\nSR%f,%f;\n",
672: ((encoding == ENCODING_CP_850) || (encoding == ENCODING_ISO_8859_1)) ?
673: "CA7;" : "",
674: HPGL_XMAX, HPGL_YMAX,
675: ((double) (HPGL_HCHAR) * 200 / 3 / HPGL_XMAX),
676: ((double) (HPGL_VCHAR) * 100 / 2 / HPGL_YMAX));
677: /* 1 2 3
678: 1. reset to power-up defaults
679: 2. set SCaling
680: 3. set character size
681: */
682: HPGL_ang = 0;
683: }
684:
685: TERM_PUBLIC void HPGL2_graphics()
686: {
687: /*
688: * IN - Initialize
689: * SP - Select pen
690: * SD - Set default font
691: */
692: fprintf(gpoutfile, "INSP1SD1,%d,2,%d,",
693: HPGL2_font->symbol_set, HPGL2_font->spacing);
694: if (HPGL2_font->spacing)
695: fprintf(gpoutfile, "4,%f,", HPGL2_font->height);
696: else
697: fprintf(gpoutfile, "3,%f,", HPGL2_font->pitch);
698: fprintf(gpoutfile, "5,%d,6,%d,7,%d\n", HPGL2_font->posture,
699: HPGL2_font->stroke_weight, HPGL2_font->typeface);
700: /*
701: * Control variables
702: */
703: HPGL_ang = 0; /* Horizontal */
704: HPGL2_in_pe = FALSE; /* Not in PE command */
705: HPGL2_lost = TRUE; /* Pen position is unknown */
706: HPGL_penstate = UP; /* Pen is up */
707: }
708:
709: TERM_PUBLIC void PCL_graphics()
710: {
711: /*
712: * Enter HPGL/2 graphics mode
713: */
714: fputs("\033%0B", gpoutfile);
715: HPGL2_graphics();
716: }
717:
718: TERM_PUBLIC void HPGL_text()
719: {
720: if (HPGL_eject == 0) {
721: fputs("PUSP0;\033.Z\n\0", gpoutfile);
722: /* 1 2 3
723: 1. pen up
724: 2. park pen
725: 3. disable eavesdropping
726: */
727: } else {
728: fputs("PUSP0;PG;\033.Z\n\0", gpoutfile);
729: /* 1 2 3 4
730: 1. pen up
731: 2. park pen
732: 3. page eject
733: 4. disable eavesdropping
734: */
735: }
736: HPGL_penstate = UP;
737: }
738:
739: #if 0 /* not used */
740: void HPGL2_text()
741: {
742: /*
743: * If in Polyline Encoded command, leave Polyline Encoded command
744: */
745: if (HPGL2_in_pe) {
746: fputs(";\n", gpoutfile);
747: HPGL2_in_pe = 0;
748: }
749: /*
750: * Pen up, park pen
751: */
752: fputs("PUSP0;", gpoutfile);
753: }
754: #endif
755:
756: TERM_PUBLIC void PCL_text()
757: {
758: if (HPGL2_in_pe) {
759: fputs(";\n", gpoutfile);
760: HPGL2_in_pe = 0;
761: }
762: /*
763: * Go into PCL mode and eject the page
764: */
765: fputs("\033%1A\033&l0H\n\0", gpoutfile);
766: }
767:
768: TERM_PUBLIC void HPGL_linetype(linetype)
769: int linetype;
770: {
771: /* allow for set number of pens */
772: linetype = (linetype + 2) % HPGL_numpen + 1;
773: /* only select pen if necessary */
774: if (HPGL_pentype != linetype) {
775: fprintf(gpoutfile, "PU;\nSP%d;\n", linetype);
776: HPGL_pentype = linetype;
777: HPGL_penstate = UP;
778: }
779: }
780:
781: TERM_PUBLIC void HPGL2_linetype(linetype)
782: int linetype;
783: {
784: /*
785: * If in Polyline Encoded command, leave Polyline Encoded command
786: */
787: if (HPGL2_in_pe) {
788: fputs(";\n", gpoutfile);
789: HPGL2_in_pe = 0;
790: }
791: /*
792: * Allow for lots of linetypes
793: */
794: if (linetype >= 0)
795: linetype = linetype % (HPGL2_LINETYPES * HPGL2_PENWIDTHS);
796: if (linetype != HPGL_pentype) {
797: if (linetype >= 0) {
798: fprintf(gpoutfile, "PW%sLT%s",
799: HPGL2_pw[linetype / HPGL2_LINETYPES],
800: HPGL2_lt[linetype % HPGL2_LINETYPES]);
801: } else if (linetype == -2)
802: /*
803: * Borders and tics
804: */
805: fprintf(gpoutfile, "PW.2LT");
806: else if (linetype == -1)
807: /*
808: * Axes and grids
809: */
810: fprintf(gpoutfile, "PW.1LT1,.25");
811: HPGL_pentype = linetype;
812: }
813: }
814:
815: TERM_PUBLIC void HPGL_put_text(x, y, str)
816: unsigned int x, y;
817: char *str;
818: {
819: if (HPGL_ang == 1)
820: HPGL_move(x + HPGL_VCHAR / 4, y);
821: else
822: HPGL_move(x, y - HPGL_VCHAR / 4);
823: if (encoding == ENCODING_CP_850) {
824: unsigned char *s;
825: fputs("LB", gpoutfile);
826: for (s = (unsigned char *) str; *s; ++s)
827: if (*s >= 128 && hpgl_cp_850[*s - 128][0])
828: fputs(hpgl_cp_850[*s - 128], gpoutfile);
829: else
830: putc(*s, gpoutfile);
831: fputs("\003\n", gpoutfile);
832: } else if (encoding == ENCODING_ISO_8859_1) {
833: unsigned char *s;
834: fputs("LB", gpoutfile);
835: for (s = (unsigned char *) str; *s; ++s)
836: if (*s >= 128 && hpgl_iso_8859_1[*s - 128][0])
837: fputs(hpgl_iso_8859_1[*s - 128], gpoutfile);
838: else
839: putc(*s, gpoutfile);
840: fputs("\003\n", gpoutfile);
841: } else
842: fprintf(gpoutfile, "LB%s\003\n", str);
843: }
844:
845: TERM_PUBLIC void HPGL2_put_text(x, y, str)
846: unsigned int x, y;
847: char *str;
848: {
849: struct termentry *t = term;
850: /*
851: * Position the pen
852: */
853: if (HPGL_ang == 1)
854: HPGL2_move(x + t->v_char / 4, y);
855: else
856: HPGL2_move(x, y - t->v_char / 4);
857: /*
858: * If in Polyline Encoded command, leave Polyline Encoded command
859: */
860: if (HPGL2_in_pe) {
861: fputs(";\n", gpoutfile);
862: HPGL2_in_pe = 0;
863: }
864: /*
865: * Print the text string
866: */
867: fprintf(gpoutfile, "LB%s\003\n", str);
868: HPGL2_lost = 1;
869: }
870: /*
871: * Some early HPGL plotters (e.g. HP7220C) require the
872: * Pen Up/Down and Pen (move) Absolute commands to be separate.
873: */
874:
875: TERM_PUBLIC void HPGL_move(x, y)
876: unsigned int x, y;
877: {
878: if (HPGL_x != x || HPGL_y != y) { /* only move if necessary */
879: fprintf(gpoutfile, "PU;PA%d,%d;\n", x, y);
880: HPGL_penstate = UP;
881: HPGL_x = x;
882: HPGL_y = y;
883: }
884: }
885:
886: TERM_PUBLIC void HPGL_vector(x, y)
887: unsigned int x, y;
888: {
889: if (HPGL_penstate != DOWN) {
890: fprintf(gpoutfile, "PD;PA%d,%d;\n", x, y);
891: HPGL_penstate = DOWN;
892: } else
893: fprintf(gpoutfile, "PA%d,%d;\n", x, y);
894: HPGL_x = x;
895: HPGL_y = y;
896: }
897:
898: TERM_PUBLIC void HPGL2_move(x, y)
899: unsigned int x, y;
900: {
901: register int dx, dy;
902: if (HPGL2_in_pe) {
903: dx = x - HPGL_x;
904: dy = y - HPGL_y;
905: fputs("<", gpoutfile);
906: } else {
907: #if HPGL2_BASE64
908: fputs("PE<", gpoutfile);
909: #else
910: fputs("PE7<", gpoutfile);
911: #endif
912: if (HPGL2_lost) {
913: dx = x;
914: dy = y;
915: HPGL2_lost = 0;
916: fputs("=", gpoutfile);
917: } else {
918: dx = x - HPGL_x;
919: dy = y - HPGL_y;
920: }
921: HPGL2_in_pe = 1;
922: }
923: #if HPGL2_EXPLICIT_PD
924: if (HPGL_penstate == DOWN)
925: HPGL_penstate = UP;
926: #endif
927: HPGL2_encode(dx);
928: HPGL2_encode(dy);
929: fputs("\n", gpoutfile);
930: HPGL_x = x;
931: HPGL_y = y;
932: }
933:
934: TERM_PUBLIC void HPGL2_vector(x, y)
935: unsigned int x, y;
936: {
937: register int dx, dy;
938: if (HPGL2_in_pe) {
939: dx = x - HPGL_x;
940: dy = y - HPGL_y;
941: } else {
942: #if HPGL2_BASE64
943: fputs("PE", gpoutfile);
944: #else
945: fputs("PE7", gpoutfile);
946: #endif
947: if (HPGL2_lost) {
948: dx = x;
949: dy = y;
950: HPGL2_lost = 0;
951: fputs("=", gpoutfile);
952: } else {
953: dx = x - HPGL_x;
954: dy = y - HPGL_y;
955: }
956: HPGL2_in_pe = 1;
957: }
958: #if HPGL2_EXPLICIT_PD
959: /*
960: * Put the pen down in the current position,
961: * relative vector of 0,0.
962: */
963: if (HPGL_penstate == UP) {
964: fputc((char) HPGL2_HIGH_OFFS, gpoutfile);
965: fputc((char) HPGL2_HIGH_OFFS, gpoutfile);
966: HPGL_penstate = DOWN;
967: }
968: #endif
969: HPGL2_encode(dx);
970: HPGL2_encode(dy);
971: fputs("\n", gpoutfile);
972: HPGL_x = x;
973: HPGL_y = y;
974: }
975:
976: /*
977: * Routine to encode position in base 32 or base 64 characters
978: */
979:
980: TERM_PUBLIC void HPGL2_encode(d)
981: register int d;
982: {
983: register int c;
984: if ((d <<= 1) < 0)
985: d = 1 - d;
986: do {
987: c = d & HPGL2_MASK;
988: d >>= HPGL2_BITS;
989: if (d > 0)
990: fputc((char) (c + HPGL2_LOW_OFFS), gpoutfile);
991: else
992: fputc((char) (c + HPGL2_HIGH_OFFS), gpoutfile);
993: } while (d > 0);
994: }
995:
996: TERM_PUBLIC int HPGL_text_angle(ang)
997: int ang;
998: {
999: HPGL_ang = ang;
1000: if (ang == 1)
1001: /*
1002: * Vertical
1003: */
1004: fputs("DI0,1;\n", gpoutfile);
1005: else
1006: /*
1007: * Horizontal
1008: */
1009: fputs("DI1,0;\n", gpoutfile);
1010: return TRUE;
1011: }
1012:
1013: TERM_PUBLIC int HPGL2_text_angle(ang)
1014: int ang;
1015: {
1016: /*
1017: * If in Polyline Encoded command, leave Polyline Encoded command
1018: */
1019: if (HPGL2_in_pe) {
1020: fputs(";", gpoutfile);
1021: HPGL2_in_pe = 0;
1022: }
1023: if (ang == 1)
1024: /*
1025: * Vertical
1026: */
1027: fputs("DI0,1", gpoutfile);
1028: else
1029: /*
1030: * Horizontal
1031: */
1032: fputs("DI1,0", gpoutfile);
1033: HPGL_ang = ang;
1034: return TRUE;
1035: }
1036:
1037: TERM_PUBLIC void HPGL_reset()
1038: {
1039: /*
1040: * do nothing
1041: */
1042: }
1043:
1044: #if 0
1045: void HPGL2_reset()
1046: {
1047: /*
1048: * Park the pen
1049: * Advance a page
1050: * End with ";"
1051: */
1052: fputs("SP0PG;\n", gpoutfile);
1053: }
1054:
1055: #endif
1056:
1057: TERM_PUBLIC void PCL_reset()
1058: {
1059: /*
1060: * Return to PCL mode
1061: * Printer reset (conditional eject)
1062: */
1063: fputs("\033%0A\033E\n", gpoutfile);
1064: }
1065:
1066: TERM_PUBLIC int HPGL2_justify_text(just)
1067: enum JUSTIFY just;
1068: {
1069: /*
1070: * If in Polyline Encoded command, leave Polyline Encoded command
1071: */
1072: if (HPGL2_in_pe) {
1073: fputs(";\n", gpoutfile);
1074: HPGL2_in_pe = 0;
1075: }
1076: switch (just) {
1077: case LEFT:
1078: fputs("LO1", gpoutfile);
1079: break;
1080: case CENTRE:
1081: fputs("LO4", gpoutfile);
1082: break;
1083: case RIGHT:
1084: fputs("LO7", gpoutfile);
1085: break;
1086: default:
1087: return 0;
1088: }
1089: return 1;
1090: }
1091:
1092: #endif /* TERM_BODY */
1093:
1094: #ifdef TERM_TABLE
1095: TERM_TABLE_START(hpgl_driver)
1096: "hpgl", "HP7475 and relatives [number of pens] [eject]",
1097: HPGL_XMAX, HPGL_YMAX, HPGL_VCHAR, HPGL_HCHAR,
1098: HPGL_VTIC, HPGL_HTIC, HPGL_options, HPGL_init, HPGL_reset,
1099: HPGL_text, null_scale, HPGL_graphics, HPGL_move, HPGL_vector,
1100: HPGL_linetype, HPGL_put_text, HPGL_text_angle,
1101: null_justify_text, do_point, do_arrow, set_font_null
1102: TERM_TABLE_END(hpgl_driver)
1103:
1104: #undef LAST_TERM
1105: #define LAST_TERM hpgl_driver
1106:
1107: TERM_TABLE_START(pcl5_driver)
1108: "pcl5", "HP LaserJet III [mode] [font] [point]",
1109: PCL_XMAX, PCL_YMAX, HPGL2_VCHAR, HPGL2_HCHAR,
1110: PCL_VTIC, PCL_HTIC, PCL_options, PCL_init, PCL_reset,
1111: PCL_text, null_scale, PCL_graphics, HPGL2_move, HPGL2_vector,
1112: HPGL2_linetype, HPGL2_put_text, HPGL2_text_angle,
1113: HPGL2_justify_text, do_point, do_arrow, set_font_null
1114: TERM_TABLE_END(pcl5_driver)
1115:
1116: #undef LAST_TERM
1117: #define LAST_TERM pcl5_driver
1118: #endif /* TERM_TABLE */
1119:
1120: #endif /* TERM_PROTO_ONLY */
1121:
1122: #ifdef TERM_HELP
1123: START_HELP(hpgl)
1124: "1 hpgl",
1125: "?commands set terminal hpgl",
1126: "?set terminal hpgl",
1127: "?set term hpgl",
1128: "?terminal hpgl",
1129: "?term hpgl",
1130: "?hpgl",
1131: "?commands set terminal pcl5",
1132: "?set terminal pcl5",
1133: "?set term pcl5",
1134: "?terminal pcl5",
1135: "?term pcl5",
1136: "?pcl5",
1137: " The `hpgl` driver produces HPGL output for devices like the HP7475A plotter.",
1138: " There are two options which can be set---the number of pens and \"eject\", which",
1139: " tells the plotter to eject a page when done. The default is to use 6 pens",
1140: " and not to eject the page when done.",
1141: "",
1142: " The international character sets ISO-8859-1 and CP850 are recognized via",
1143: " `set encoding iso_8859_1` or `set encoding cp850` (see `set encoding` for",
1144: " details).",
1145: "",
1146: " Syntax:",
1147: " set terminal hpgl {<number_of_pens>} {eject}",
1148: "",
1149: " The selection",
1150: "",
1151: " set terminal hpgl 8 eject",
1152: "",
1153: " is equivalent to the previous `hp7550` terminal, and the selection",
1154: "",
1155: " set terminal hpgl 4",
1156: "",
1157: " is equivalent to the previous `hp7580b` terminal.",
1158: "",
1159: " The `pcl5` driver supports the Hewlett-Packard Laserjet III. It actually uses",
1160: " HPGL-2, but there is a name conflict among the terminal devices. It has",
1161: " several options",
1162: "",
1163: " Syntax:",
1164: " set terminal pcl5 {<mode>} {<font>} {<fontsize>}",
1165: "",
1166: " where <mode> is `landscape`, or `portrait`, <font> is `stick`, `univers`, or",
1167: " `cg_times`, and <fontsize> is the size in points.",
1168: "",
1169: " With `pcl5` international characters are handled by the printer; you just put",
1170: " the appropriate 8-bit character codes into the text strings. You don't need",
1171: " to bother with `set encoding`.",
1172: "",
1173: " HPGL graphics can be imported by many software packages."
1174: END_HELP(hpgl)
1175: #endif /* TERM_HELP */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>