Annotation of OpenXM_contrib/gnuplot/term/hp500c.trm, Revision 1.1
1.1 ! maekawa 1: /*
! 2: * $Id: hp500c.trm,v 1.17 1998/04/14 00:17:48 drd Exp $
! 3: *
! 4: */
! 5:
! 6: /* GNUPLOT - hp500c.trm */
! 7:
! 8: /*[
! 9: * Copyright 1990 - 1993, 1998
! 10: *
! 11: * Permission to use, copy, and distribute this software and its
! 12: * documentation for any purpose with or without fee is hereby granted,
! 13: * provided that the above copyright notice appear in all copies and
! 14: * that both that copyright notice and this permission notice appear
! 15: * in supporting documentation.
! 16: *
! 17: * Permission to modify the software is granted, but not the right to
! 18: * distribute the complete modified source code. Modifications are to
! 19: * be distributed as patches to the released version. Permission to
! 20: * distribute binaries produced by compiling modified sources is granted,
! 21: * provided you
! 22: * 1. distribute the corresponding source modifications from the
! 23: * released version in the form of a patch file along with the binaries,
! 24: * 2. add special version identification to distinguish your version
! 25: * in addition to the base release version number,
! 26: * 3. provide your name and address as the primary contact for the
! 27: * support of your modified version, and
! 28: * 4. retain our contact information in regard to use of the base
! 29: * software.
! 30: * Permission to distribute the released version of the source code along
! 31: * with corresponding source modifications in the form of a patch file is
! 32: * granted with same provisions 2 through 4 for binary distributions.
! 33: *
! 34: * This software is provided "as is" without express or implied warranty
! 35: * to the extent permitted by applicable law.
! 36: ]*/
! 37:
! 38: /*
! 39: * This file is included by ../term.c.
! 40: *
! 41: * This terminal driver supports:
! 42: * hpdj 500c
! 43: *
! 44: * AUTHORS
! 45: * John Engels -- \
! 46: * Russell Lang ----> HPLJII.trm
! 47: * Maurice Castro -- /
! 48: * UdoHessenauer ----> derived this version from the above one
! 49: *
! 50: * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
! 51: *
! 52: */
! 53:
! 54: /* The following HP Deskjet500c driver uses generic bit mapped graphics
! 55: routines from bitmap.c to build up a bit map in memory. The driver
! 56: interchanges colomns and lines in order to access entire lines
! 57: easily and returns the lines to get bits in the right order :
! 58: (x,y) -> (y,XMAX-1-x). */
! 59: /* This interchange is done by calling b_makebitmap() with reversed
! 60: xmax and ymax, and then setting b_rastermode to TRUE. b_setpixel()
! 61: will then perform the interchange before each pixel is plotted */
! 62: /* by John Engels JENGELS@BNANDP51.BITNET, inspired by the hpljet driver
! 63: of Jyrki Yli-Nokari */
! 64:
! 65: /*
! 66: * adapted to the new terminal layout by Stefan Bodewig (Dec. 1995)
! 67: */
! 68:
! 69: #include "driver.h"
! 70:
! 71: #ifdef TERM_REGISTER
! 72: register_term(hp500c)
! 73: #endif
! 74:
! 75: #ifdef TERM_PROTO
! 76: TERM_PUBLIC void HP500Coptions __PROTO((void));
! 77: TERM_PUBLIC void HP500Cinit __PROTO((void));
! 78: TERM_PUBLIC void HP500Creset __PROTO((void));
! 79: TERM_PUBLIC void HP500Clinetype __PROTO((int linetype));
! 80: TERM_PUBLIC void HP500Cgraphics __PROTO((void));
! 81: TERM_PUBLIC void HP500Ctext __PROTO((void));
! 82: #define HP500Ctext_angle b_text_angle
! 83: #define HP500Cput_text b_put_text
! 84: #define HP500Cmove b_move
! 85: #define HP500Cvector b_vector
! 86: /* default values for term_tbl */
! 87: #define HP500C_75PPI_XMAX (1920/4)
! 88: #define HP500C_75PPI_YMAX (1920/4)
! 89: #define HP500C_75PPI_HCHAR (1920/4/6)
! 90: #define HP500C_75PPI_VCHAR (1920/4/10)
! 91: #define HP500C_75PPI_VTIC 5
! 92: #define HP500C_75PPI_HTIC 5
! 93:
! 94: #define GOT_HP500C_PROTO
! 95: #endif
! 96:
! 97: #ifndef TERM_PROTO_ONLY
! 98: #ifdef TERM_BODY
! 99:
! 100:
! 101: /* We define 4 different print qualities : 300ppi, 150ppi, 100ppi and
! 102: 75ppi. (Pixel size = 1, 2, 3, 4 dots) */
! 103:
! 104: #define HP500C_DPP (hpdj_dpp) /* dots per pixel */
! 105: #define HP500C_PPI (300/HP500C_DPP) /* pixel per inch */
! 106: /* make XMAX and YMAX a multiple of 8 */
! 107: #define HP500C_XMAX (8*(unsigned int)(xsize*1920/HP500C_DPP/8.0+0.9))
! 108: #define HP500C_YMAX (8*(unsigned int)(ysize*1920/HP500C_DPP/8.0+0.9))
! 109:
! 110: /* Courier font with 6 lines per inch */
! 111: #define HP500C_VCHAR (HP500C_PPI/6)
! 112: /* Courier font with 10 caracters per inch */
! 113: #define HP500C_HCHAR (HP500C_PPI/10)
! 114:
! 115:
! 116: /* Save current cursor position */
! 117: #define HP500C_PUSH_CURSOR fputs("\033&f0S",gpoutfile)
! 118: /* Restore cursor position */
! 119: #define HP500C_POP_CURSOR fputs("\033&f1S",gpoutfile)
! 120:
! 121: /* be sure to use courier font with 6lpi and 10cpi */
! 122: #define HP500C_COURIER fputs("\033(0N\033(s0p10.0h12.0v0s0b3T\033&l6D",gpoutfile)
! 123:
! 124:
! 125: static int HPcompress __PROTO((unsigned char *op, unsigned char *oe,
! 126: unsigned char *cp));
! 127: static unsigned char HPcomplement __PROTO((int c));
! 128: static int HPcompress_to_TIFF __PROTO((unsigned char *op, unsigned char *oe,
! 129: unsigned char *cp));
! 130: static int HPnocompress __PROTO((unsigned char *op, unsigned char *oe,
! 131: unsigned char *cp));
! 132:
! 133: static int hpdj_dpp = 4;
! 134: static int HP_COMP_MODE = 0;
! 135:
! 136: /* bm_pattern not appropriate for 300ppi graphics */
! 137: #ifndef GOT_300_PATTERN
! 138: #define GOT_300_PATTERN
! 139: static unsigned int b_300ppi_pattern[] =
! 140: {
! 141: 0xffff, 0x1111,
! 142: 0xffff, 0x3333, 0x0f0f, 0x3f3f, 0x0fff, 0x00ff, 0x33ff
! 143: };
! 144: #endif
! 145:
! 146:
! 147: TERM_PUBLIC void HP500Coptions()
! 148: {
! 149: char opt[6];
! 150:
! 151: #define HPDJCERROR "expecting dots per inch size 75, 100, 150 or 300 and/or compression method"
! 152: while (!END_OF_COMMAND) {
! 153: if (token[c_token].length > 4)
! 154: int_error(HPDJCERROR, c_token);
! 155:
! 156: /* almost_equals() won't accept numbers - use strcmp() instead */
! 157: capture(opt, c_token, c_token, 6);
! 158: if (!strcmp(opt, "75")) {
! 159: hpdj_dpp = 4;
! 160: HP_COMP_MODE = 0;
! 161:
! 162: } else if (!strcmp(opt, "100")) {
! 163: hpdj_dpp = 3;
! 164: HP_COMP_MODE = 0;
! 165: } else if (!strcmp(opt, "150")) {
! 166: hpdj_dpp = 2;
! 167: HP_COMP_MODE = 0;
! 168: } else if (!strcmp(opt, "300")) {
! 169: hpdj_dpp = 1;
! 170: HP_COMP_MODE = 0;
! 171: } else if (!strcmp(opt, "rle")) {
! 172: HP_COMP_MODE = 1;
! 173: } else if (!strcmp(opt, "tiff")) {
! 174: HP_COMP_MODE = 2;
! 175: }
! 176: c_token++;
! 177: }
! 178:
! 179: term->xmax = HP500C_XMAX;
! 180: term->ymax = HP500C_YMAX;
! 181: switch (hpdj_dpp) {
! 182: case 1:
! 183: strcpy(term_options, "300");
! 184: term->v_tic = 15;
! 185: term->h_tic = 15;
! 186: break;
! 187: case 2:
! 188: strcpy(term_options, "150");
! 189: term->v_tic = 8;
! 190: term->h_tic = 8;
! 191: break;
! 192: case 3:
! 193: strcpy(term_options, "100");
! 194: term->v_tic = 6;
! 195: term->h_tic = 6;
! 196: break;
! 197: case 4:
! 198: strcpy(term_options, "75");
! 199: term->v_tic = 5;
! 200: term->h_tic = 5;
! 201: break;
! 202: }
! 203: switch (HP_COMP_MODE) {
! 204: case 0:
! 205: strcat(term_options, " no comp");
! 206: break;
! 207: case 1:
! 208: strcat(term_options, " RLE");
! 209: break;
! 210: case 2:
! 211: strcat(term_options, " TIFF");
! 212: break;
! 213: case 3: /* not implemented yet */
! 214: strcat(term_options, " Delta Row");
! 215: break;
! 216: }
! 217: }
! 218:
! 219: TERM_PUBLIC void HP500Cinit()
! 220: {
! 221: /* HBB 980226: all changes to term-> fields *must* happen here, not
! 222: * in graphics() !*/
! 223: switch (hpdj_dpp) {
! 224: case 1:
! 225: b_charsize(FNT13X25);
! 226: term->v_char = FNT13X25_VCHAR;
! 227: term->h_char = FNT13X25_HCHAR;
! 228: break;
! 229: case 2:
! 230: b_charsize(FNT13X25);
! 231: term->v_char = FNT13X25_VCHAR;
! 232: term->h_char = FNT13X25_HCHAR;
! 233: break;
! 234: case 3:
! 235: b_charsize(FNT9X17);
! 236: term->v_char = FNT9X17_VCHAR;
! 237: term->h_char = FNT9X17_HCHAR;
! 238: break;
! 239: case 4:
! 240: b_charsize(FNT5X9);
! 241: term->v_char = FNT5X9_VCHAR;
! 242: term->h_char = FNT5X9_HCHAR;
! 243: break;
! 244: }
! 245: }
! 246:
! 247: TERM_PUBLIC void HP500Creset()
! 248: {
! 249: #ifdef VMS
! 250: fflush_binary();
! 251: #endif
! 252: }
! 253:
! 254:
! 255:
! 256: /* HP DeskJet 500c routines */
! 257:
! 258: TERM_PUBLIC void HP500Clinetype(linetype)
! 259: int linetype;
! 260: {
! 261: if (linetype < 0)
! 262: linetype = 7;
! 263: else if (linetype >= 8) {
! 264: linetype %= 8;
! 265: }
! 266: switch (linetype) {
! 267: case 0:
! 268: linetype = 6;
! 269: break;
! 270: case 1:
! 271: linetype = 5;
! 272: break;
! 273: case 2:
! 274: linetype = 3;
! 275: break;
! 276: case 3:
! 277: linetype = 2;
! 278: break;
! 279: case 4:
! 280: linetype = 1;
! 281: break;
! 282: case 5:
! 283: linetype = 4;
! 284: break;
! 285: case 6:
! 286: linetype = 7;
! 287: }
! 288: b_setvalue(linetype);
! 289:
! 290: }
! 291:
! 292: /*
! 293: void HP500Cpoint(x,y,value)
! 294: int x;
! 295: int y;
! 296: int value;
! 297: {
! 298: HP500Clinetype(value);
! 299: do_point(x,y,value);
! 300: }
! 301: */
! 302:
! 303: TERM_PUBLIC void HP500Cgraphics()
! 304: {
! 305: /* HBB 980226: moved block of code from here to init() */
! 306: /* rotate plot -90 degrees by reversing XMAX and YMAX and by
! 307: setting b_rastermode to TRUE */
! 308: b_makebitmap(HP500C_YMAX, HP500C_XMAX, 3);
! 309: b_rastermode = TRUE;
! 310: }
! 311:
! 312: /*
! 313: * Run-length encoding for the DeskJet. We have pairs of <count>
! 314: * <what>, where count goes from 0 (meaning one count) to 255
! 315: * this might double the size of the image.
! 316: */
! 317:
! 318: static int HPcompress(op, oe, cp)
! 319: unsigned char *op, *oe, *cp;
! 320: {
! 321: unsigned char *ce = cp;
! 322: while (op < oe) {
! 323: unsigned char prevchar;
! 324: unsigned char count;
! 325:
! 326: prevchar = *op; /* remember char */
! 327: count = 1; /* its read the first time */
! 328:
! 329: while (++op < oe && *op == prevchar && count < 255) {
! 330: /* set op to the next char */
! 331: count++; /* and count it */
! 332: }
! 333: *ce++ = --count; /* were ready, so correct the count */
! 334: *ce++ = prevchar; /* and store <what> */
! 335: }
! 336: *ce = 0; /* just to be safe */
! 337: return ce - cp; /* length of cbufs */
! 338: }
! 339:
! 340: static unsigned char HPcomplement(c)
! 341: int c;
! 342: {
! 343: return (unsigned char) (256 - c);
! 344: }
! 345:
! 346:
! 347: static int HPcompress_to_TIFF(op, oe, cp)
! 348: unsigned char *op; /* original pointer */
! 349: unsigned char *oe; /* end of orig string */
! 350: unsigned char *cp; /* pointer for compressed data */
! 351: {
! 352: unsigned char *countposition;
! 353: unsigned char *ce = cp;
! 354: while (op < oe) {
! 355: unsigned char prevchar;
! 356: unsigned char count;
! 357:
! 358: prevchar = *op; /* gelesenes Zeichen aufbewaren */
! 359: count = 1; /* bisher wurde es einmal gelesen */
! 360:
! 361: while (++op < oe && *op == prevchar && count < 128) {
! 362: count++;
! 363: }
! 364: *ce = HPcomplement(count - 1);
! 365: /* remember count for building blocks of literal bytes */
! 366: countposition = ce++;
! 367: *ce++ = prevchar;
! 368:
! 369: if (count < 2) {
! 370: while (op < oe && (prevchar != *op || *op != *(op + 1))) {
! 371: /* only use rle for at leat 3 equal bytes */
! 372: *ce++ = *op;
! 373: count++;
! 374: prevchar = *op++;
! 375: if (op > oe)
! 376: puts("FATAL op> oe!!\n");
! 377: }
! 378: if (op < oe && prevchar == *op) {
! 379: op--;
! 380: count--;
! 381: ce--;
! 382: }
! 383: *countposition = count - 1;
! 384: }
! 385: }
! 386: return ce - cp;
! 387:
! 388: }
! 389:
! 390: static int HPnocompress(op, oe, cp)
! 391: unsigned char *op;
! 392: unsigned char *oe;
! 393: unsigned char *cp;
! 394: {
! 395: unsigned char *ce = cp;
! 396: while (op < oe)
! 397: *ce++ = *op++;
! 398: return ce - cp;
! 399: }
! 400:
! 401: /* 0 compression raster bitmap dump. Compatible with HP DeskJet 500
! 402: hopefully compatible with other HP Deskjet printers */
! 403:
! 404: TERM_PUBLIC void HP500Ctext()
! 405: {
! 406: register int x, j, row, count = 0;
! 407: unsigned char *obuf, *oe, *cbuf, *ce;
! 408:
! 409: if ((obuf = (unsigned char *) malloc(100 * b_psize)) == 0)
! 410: puts("FATAL!-- couldn't get enough memory for obuf");
! 411: if ((cbuf = (unsigned char *) malloc(400 * b_psize)) == 0)
! 412: puts("FATAL!-- couldn't get enough memory for cbuf");
! 413:
! 414: oe = obuf;
! 415:
! 416: fprintf(gpoutfile, "\
! 417: \033*t%dR\
! 418: \033*r1A\
! 419: \033*b%1dM\
! 420: \033*r%dS\
! 421: \033*r-3U",
! 422: HP500C_PPI,
! 423: HP_COMP_MODE,
! 424: b_ysize);
! 425:
! 426: /* dump bitmap in raster mode */
! 427: for (x = b_xsize - 1; x >= 0; x--) {
! 428: row = (b_ysize / 8) - 1;
! 429: for (j = row; j >= 0; j--) {
! 430: *oe++ = (char) (*((*b_p)[j] + x));
! 431: }
! 432: switch (HP_COMP_MODE) {
! 433: case 2:
! 434: count = HPcompress_to_TIFF(obuf, oe, cbuf);
! 435: break;
! 436: case 1:
! 437: count = HPcompress(obuf, oe, cbuf);
! 438: break;
! 439: case 0:
! 440: count = HPnocompress(obuf, oe, cbuf);
! 441: break;
! 442: }
! 443: fprintf(gpoutfile, "\033*b%dV", count);
! 444: ce = cbuf;
! 445: while (count--)
! 446: fputc(*ce++, gpoutfile);
! 447: oe = obuf;
! 448:
! 449: for (j = row; j >= 0; j--) {
! 450: *oe++ = (char) (*((*b_p)[j + b_psize] + x));
! 451: }
! 452: switch (HP_COMP_MODE) {
! 453: case 2:
! 454: count = HPcompress_to_TIFF(obuf, oe, cbuf);
! 455: break;
! 456: case 1:
! 457: count = HPcompress(obuf, oe, cbuf);
! 458: break;
! 459: case 0:
! 460: count = HPnocompress(obuf, oe, cbuf);
! 461: break;
! 462:
! 463: }
! 464:
! 465: fprintf(gpoutfile, "\033*b%dV", count);
! 466: ce = cbuf;
! 467: while (count--)
! 468: fputc(*ce++, gpoutfile);
! 469: oe = obuf;
! 470:
! 471: for (j = row; j >= 0; j--) {
! 472: *oe++ = (char) (*((*b_p)[j + (2 * b_psize)] + x));
! 473: }
! 474: switch (HP_COMP_MODE) {
! 475: case 2:
! 476: count = HPcompress_to_TIFF(obuf, oe, cbuf);
! 477: break;
! 478: case 1:
! 479: count = HPcompress(obuf, oe, cbuf);
! 480: break;
! 481: case 0:
! 482: count = HPnocompress(obuf, oe, cbuf);
! 483: break;
! 484: }
! 485: fprintf(gpoutfile, "\033*b%dW", count);
! 486: ce = cbuf;
! 487: while (count--)
! 488: fputc(*ce++, gpoutfile);
! 489: oe = obuf;
! 490:
! 491: }
! 492: fputs("\033*rbC", gpoutfile);
! 493: free(cbuf);
! 494: free(obuf);
! 495: b_freebitmap();
! 496:
! 497: #ifndef VMS
! 498: /* most vms spoolers add a formfeed character */
! 499: putc('\f', gpoutfile);
! 500: #endif /* !VMS */
! 501: }
! 502:
! 503: #endif /* TERM_BODY */
! 504:
! 505: #ifdef TERM_TABLE
! 506:
! 507: TERM_TABLE_START(hp500c_driver)
! 508: "hp500c", "HP DeskJet 500c, [75 100 150 300] [rle tiff]",
! 509: HP500C_75PPI_XMAX, HP500C_75PPI_YMAX, HP500C_75PPI_VCHAR,
! 510: HP500C_75PPI_HCHAR, HP500C_75PPI_VTIC, HP500C_75PPI_HTIC, HP500Coptions,
! 511: HP500Cinit, HP500Creset, HP500Ctext, null_scale,
! 512: HP500Cgraphics, HP500Cmove, HP500Cvector, HP500Clinetype,
! 513: HP500Cput_text, HP500Ctext_angle, null_justify_text, do_point,
! 514: do_arrow, set_font_null, 0, TERM_BINARY
! 515: TERM_TABLE_END(hp500c_driver)
! 516:
! 517: #undef LAST_TERM
! 518: #define LAST_TERM hp500c_driver
! 519:
! 520: #endif /* TERM_TABLE */
! 521: #endif /* TERM_PROTO_ONLY */
! 522:
! 523: #ifdef TERM_HELP
! 524: START_HELP(hp500c)
! 525: "1 hp500c",
! 526: "?commands set terminal hp500c",
! 527: "?set terminal hp500c",
! 528: "?set term hp500c",
! 529: "?terminal hp500c",
! 530: "?term hp500c",
! 531: "?hp500c",
! 532: " The `hp500c` terminal driver supports the Hewlett Packard HP DeskJet 500c.",
! 533: " It has options for resolution and compression.",
! 534: "",
! 535: " Syntax:",
! 536: " set terminal hp500c {<res>} {<comp>}",
! 537: "",
! 538: " where `res` can be 75, 100, 150 or 300 dots per inch and `comp` can be \"rle\",",
! 539: " or \"tiff\". Any other inputs are replaced by the defaults, which are 75 dpi",
! 540: " and no compression. Rasterization at the higher resolutions may require a",
! 541: " large amount of memory."
! 542: END_HELP(hp500c)
! 543: #endif /* TERM_HELP */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>