[BACK]Return to hpgl.trm CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gnuplot / term

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>