Annotation of OpenXM_contrib/gnuplot/term/hpgl.trm, Revision 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>