Annotation of OpenXM_contrib/gnuplot/term/pbm.trm, Revision 1.1
1.1 ! maekawa 1: /*
! 2: * $Id: pbm.trm,v 1.19 1998/06/18 14:59:21 ddenholm Exp $
! 3: *
! 4: */
! 5:
! 6: /* GNUPLOT - pbm.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: * pbm
! 43: *
! 44: * AUTHORS
! 45: * Russell Lang
! 46: *
! 47: * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
! 48: *
! 49: */
! 50:
! 51: /* The following pbmplus drivers use the generic bit mapped graphics
! 52: routines from bitmap.c to build up a bit map in memory. The driver
! 53: interchanges colomns and lines in order to access entire lines
! 54: easily and returns the lines to get bits in the right order :
! 55: (x,y) -> (y,XMAX-1-x). */
! 56: /* This interchange is done by calling b_makebitmap() with reversed
! 57: xmax and ymax, and then setting b_rastermode to TRUE. b_setpixel()
! 58: will then perform the interchange before each pixel is plotted */
! 59: /* See Jef Poskanzer's excellent PBMplus package for more details of
! 60: the Portable BitMap format and for programs to convert PBM files
! 61: to other bitmap formats. */
! 62:
! 63: #include "driver.h"
! 64:
! 65: #ifdef TERM_REGISTER
! 66: register_term(pbm_driver)
! 67: #endif
! 68:
! 69: #ifdef TERM_PROTO
! 70: TERM_PUBLIC void PBMoptions __PROTO((void));
! 71: TERM_PUBLIC void PBMinit __PROTO((void));
! 72: TERM_PUBLIC void PBMreset __PROTO((void));
! 73: TERM_PUBLIC void PBMsetfont __PROTO((void));
! 74: TERM_PUBLIC void PBMgraphics __PROTO((void));
! 75: TERM_PUBLIC void PBMmonotext __PROTO((void));
! 76: TERM_PUBLIC void PBMgraytext __PROTO((void));
! 77: TERM_PUBLIC void PBMcolortext __PROTO((void));
! 78: TERM_PUBLIC void PBMtext __PROTO((void));
! 79: TERM_PUBLIC void PBMlinetype __PROTO((int linetype));
! 80: TERM_PUBLIC void PBMpoint __PROTO((unsigned int x, unsigned int y, int point));
! 81: #endif /* TERM_PROTO */
! 82:
! 83: #ifdef TERM_BODY
! 84:
! 85: /* make XMAX and YMAX a multiple of 8 */
! 86: #define PBM_XMAX (640)
! 87: #define PBM_YMAX (480)
! 88: #define PBM_VCHAR (FNT5X9_VCHAR)
! 89: #define PBM_HCHAR (FNT5X9_VCHAR)
! 90: #define PBM_VTIC FNT5X9_HBITS
! 91: #define PBM_HTIC FNT5X9_HBITS
! 92:
! 93: static int pbm_font = 1; /* small font */
! 94: static int pbm_mode = 0; /* 0:monochrome 1:gray 2:color */
! 95:
! 96: /* 7=black, 0=white */
! 97: static int pgm_gray[] = { 7, 1, 6, 5, 4, 3, 2, 1, 7 }; /* grays */
! 98: /* bit3=!intensify, bit2=!red, bit1=!green, bit0=!blue */
! 99: static int ppm_color[] ={ 15, 8, 3, 5, 6, 2, 4, 1, 11, 13, 14 }; /* colors */
! 100:
! 101: TERM_PUBLIC void PBMoptions()
! 102: {
! 103: pbm_font = 1;
! 104: pbm_mode = 0;
! 105:
! 106: term_options[0] = NUL;
! 107:
! 108: while (!END_OF_COMMAND) {
! 109: if (almost_equals(c_token, "s$mall"))
! 110: pbm_font = 1;
! 111: else if (almost_equals(c_token, "me$dium"))
! 112: pbm_font = 2;
! 113: else if (almost_equals(c_token, "l$arge"))
! 114: pbm_font = 3;
! 115: else if (almost_equals(c_token, "mo$nochrome"))
! 116: pbm_mode = 0;
! 117: else if (almost_equals(c_token, "g$ray"))
! 118: pbm_mode = 1;
! 119: else if (almost_equals(c_token, "c$olor")
! 120: || almost_equals(c_token, "c$olour"))
! 121: pbm_mode = 2;
! 122: else {
! 123: /* reset to default, since term is already set */
! 124: pbm_font = 1;
! 125: pbm_mode = 0;
! 126: int_error("expecting: {small, medium, large} and {monochrome, gray, color}", c_token);
! 127: }
! 128: c_token++;
! 129: }
! 130:
! 131: /* setup options string */
! 132:
! 133: switch (pbm_font) {
! 134: case 1:
! 135: strcat(term_options, "small");
! 136: break;
! 137: case 2:
! 138: strcat(term_options, "medium");
! 139: break;
! 140: case 3:
! 141: strcat(term_options, "large");
! 142: break;
! 143: }
! 144:
! 145: switch (pbm_mode) {
! 146: case 0:
! 147: strcat(term_options, " monochrome");
! 148: break;
! 149: case 1:
! 150: strcat(term_options, " gray");
! 151: break;
! 152: case 2:
! 153: strcat(term_options, " color");
! 154: break;
! 155: }
! 156: }
! 157:
! 158:
! 159: TERM_PUBLIC void PBMinit()
! 160: {
! 161: PBMsetfont(); /* HBB 980226: call it here! */
! 162: }
! 163:
! 164:
! 165: TERM_PUBLIC void PBMreset()
! 166: {
! 167: #ifdef VMS
! 168: fflush_binary();
! 169: #endif /* VMS */
! 170: }
! 171:
! 172:
! 173: TERM_PUBLIC void PBMsetfont()
! 174: {
! 175: switch (pbm_font) {
! 176: case 1:
! 177: b_charsize(FNT5X9);
! 178: term->v_char = FNT5X9_VCHAR;
! 179: term->h_char = FNT5X9_HCHAR;
! 180: term->v_tic = FNT5X9_HBITS;
! 181: term->h_tic = FNT5X9_HBITS;
! 182: break;
! 183: case 2:
! 184: b_charsize(FNT9X17);
! 185: term->v_char = FNT9X17_VCHAR;
! 186: term->h_char = FNT9X17_HCHAR;
! 187: term->v_tic = FNT9X17_HBITS;
! 188: term->h_tic = FNT9X17_HBITS;
! 189: break;
! 190: case 3:
! 191: b_charsize(FNT13X25);
! 192: term->v_char = FNT13X25_VCHAR;
! 193: term->h_char = FNT13X25_HCHAR;
! 194: term->v_tic = FNT13X25_HBITS;
! 195: term->h_tic = FNT13X25_HBITS;
! 196: break;
! 197: }
! 198: }
! 199:
! 200:
! 201: TERM_PUBLIC void PBMgraphics()
! 202: {
! 203: int numplanes = 1;
! 204:
! 205: switch (pbm_mode) {
! 206: case 1:
! 207: numplanes = 3;
! 208: break;
! 209: case 2:
! 210: numplanes = 4;
! 211: break;
! 212: }
! 213:
! 214: /* HBB 980226: this is not the right place to do this: setfont() influences
! 215: * fields of the termtable entry, and therefore must be called by init()
! 216: * already. */
! 217: /* PBMsetfont(); */
! 218: /* rotate plot -90 degrees by reversing XMAX and YMAX and by
! 219: setting b_rastermode to TRUE */
! 220: b_makebitmap((unsigned int) (PBM_YMAX * ysize),
! 221: (unsigned int) (PBM_XMAX * xsize), numplanes);
! 222: b_rastermode = TRUE;
! 223:
! 224: if (pbm_mode != 0)
! 225: b_setlinetype(0); /* solid lines */
! 226: }
! 227:
! 228:
! 229: static void PBMmonotext()
! 230: {
! 231: register int x, j, row;
! 232:
! 233: fputs("P4\n", gpoutfile);
! 234: fprintf(gpoutfile, "%u %u\n", b_ysize, b_xsize);
! 235:
! 236: /* dump bitmap in raster mode */
! 237: for (x = b_xsize - 1; x >= 0; x--) {
! 238: row = (b_ysize / 8) - 1;
! 239: for (j = row; j >= 0; j--) {
! 240: (void) fputc((char) (*((*b_p)[j] + x)), gpoutfile);
! 241: }
! 242: }
! 243:
! 244: b_freebitmap();
! 245: }
! 246:
! 247: static void PBMgraytext()
! 248: {
! 249: register int x, j, row;
! 250: register int i, value;
! 251: int mask, plane1, plane2, plane3;
! 252:
! 253: fprintf(gpoutfile, "\
! 254: P5\n\
! 255: %u %u\n\
! 256: %u\n",
! 257: b_ysize, b_xsize,
! 258: 255);
! 259:
! 260: /* dump bitmap in raster mode */
! 261: for (x = b_xsize - 1; x >= 0; x--) {
! 262: row = (b_ysize / 8) - 1;
! 263: for (j = row; j >= 0; j--) {
! 264: mask = 0x80;
! 265: plane1 = (*((*b_p)[j] + x));
! 266: plane2 = (*((*b_p)[j + b_psize] + x));
! 267: plane3 = (*((*b_p)[j + b_psize + b_psize] + x));
! 268: for (i = 0; i < 8; i++) {
! 269: /* HBB: The values below are set to span the full range
! 270: * from 0 up to 255 in 7 steps: */
! 271: value = 255;
! 272: if (plane1 & mask)
! 273: value -= 36;
! 274: if (plane2 & mask)
! 275: value -= 73;
! 276: if (plane3 & mask)
! 277: value -= 146;
! 278: (void) fputc((char) (value), gpoutfile);
! 279: mask >>= 1;
! 280: }
! 281: }
! 282: }
! 283:
! 284: b_freebitmap();
! 285: }
! 286:
! 287: static void PBMcolortext()
! 288: {
! 289: register int x, j, row;
! 290: register int i;
! 291: int mask, plane1, plane2, plane3, plane4;
! 292: int red, green, blue;
! 293:
! 294: fprintf(gpoutfile, "P6\n\
! 295: %u %u\n\
! 296: %u\n",
! 297: b_ysize, b_xsize,
! 298: 255);
! 299:
! 300: /* dump bitmap in raster mode */
! 301: for (x = b_xsize - 1; x >= 0; x--) {
! 302: row = (b_ysize / 8) - 1;
! 303: for (j = row; j >= 0; j--) {
! 304: mask = 0x80;
! 305: plane1 = (*((*b_p)[j] + x));
! 306: plane2 = (*((*b_p)[j + b_psize] + x));
! 307: plane3 = (*((*b_p)[j + b_psize + b_psize] + x));
! 308: plane4 = (*((*b_p)[j + b_psize + b_psize + b_psize] + x));
! 309: for (i = 0; i < 8; i++) {
! 310: red = (plane3 & mask) ? 1 : 3;
! 311: green = (plane2 & mask) ? 1 : 3;
! 312: blue = (plane1 & mask) ? 1 : 3;
! 313: if (plane4 & mask) {
! 314: red--;
! 315: green--;
! 316: blue--;
! 317: }
! 318: /* HBB: '85' is exactly 255/3, so this spans the full
! 319: * range of colors in three steps: */
! 320: (void) fputc((char) (red * 85), gpoutfile);
! 321: (void) fputc((char) (green * 85), gpoutfile);
! 322: (void) fputc((char) (blue * 85), gpoutfile);
! 323: mask >>= 1;
! 324: }
! 325: }
! 326: }
! 327:
! 328: b_freebitmap();
! 329: }
! 330:
! 331: TERM_PUBLIC void PBMtext()
! 332: {
! 333: switch (pbm_mode) {
! 334: case 0:
! 335: PBMmonotext();
! 336: break;
! 337: case 1:
! 338: PBMgraytext();
! 339: break;
! 340: case 2:
! 341: PBMcolortext();
! 342: break;
! 343: }
! 344: }
! 345:
! 346:
! 347: TERM_PUBLIC void PBMlinetype(linetype)
! 348: int linetype;
! 349: {
! 350: switch (pbm_mode) {
! 351: case 0:
! 352: b_setlinetype(linetype);
! 353: break;
! 354: case 1:
! 355: if (linetype >= 7)
! 356: linetype %= 7;
! 357: b_setvalue(pgm_gray[linetype + 2]);
! 358: break;
! 359: case 2:
! 360: if (linetype >= 9)
! 361: linetype %= 9;
! 362: b_setvalue(ppm_color[linetype + 2]);
! 363: break;
! 364: }
! 365: }
! 366:
! 367: TERM_PUBLIC void PBMpoint(x, y, point)
! 368: unsigned int x, y;
! 369: int point;
! 370: {
! 371: if (pbm_mode == 0)
! 372: line_and_point(x, y, point);
! 373: else
! 374: do_point(x, y, point);
! 375: }
! 376:
! 377: #endif /* TERM_BODY */
! 378:
! 379: #ifdef TERM_TABLE
! 380:
! 381: #define PBMmove b_move
! 382: #define PBMvector b_vector
! 383: #define PBMtext_angle b_text_angle
! 384: #define PBMput_text b_put_text
! 385:
! 386: TERM_TABLE_START(pbm_driver)
! 387: "pbm", "Portable bitmap [small medium large] [monochrome gray color]",
! 388: PBM_XMAX, PBM_YMAX, PBM_VCHAR,
! 389: PBM_HCHAR, PBM_VTIC, PBM_HTIC, PBMoptions,
! 390: PBMinit, PBMreset, PBMtext, null_scale,
! 391: PBMgraphics, PBMmove, PBMvector, PBMlinetype,
! 392: PBMput_text, PBMtext_angle, null_justify_text, PBMpoint,
! 393: do_arrow, set_font_null,
! 394: 0, /* pointsize */
! 395: TERM_CAN_MULTIPLOT | TERM_BINARY
! 396: TERM_TABLE_END(pbm_driver)
! 397:
! 398: #undef LAST_TERM
! 399: #define LAST_TERM pbm_driver
! 400:
! 401: #endif /* TERM_TABLE */
! 402:
! 403:
! 404: #ifdef TERM_HELP
! 405: START_HELP(pbm)
! 406: "1 pbm",
! 407: "?commands set terminal pbm",
! 408: "?set terminal pbm",
! 409: "?set term pbm",
! 410: "?terminal pbm",
! 411: "?term pbm",
! 412: "?pbm",
! 413: " Several options may be set in the `pbm` terminal---the driver for PBMplus.",
! 414: "",
! 415: " Syntax:",
! 416: " set terminal pbm {<fontsize>} {<mode>}",
! 417: "",
! 418: " where <fontsize> is `small`, `medium`, or `large` and <mode> is `monochrome`,",
! 419: " `gray` or `color`. The default plot size is 640 pixels wide and 480 pixels",
! 420: " high; this may be changed by `set size`.",
! 421: "",
! 422: " The output of the `pbm` driver depends upon <mode>: `monochrome` produces a",
! 423: " portable bitmap (one bit per pixel), `gray` a portable graymap (three bits",
! 424: " per pixel) and `color` a portable pixmap (color, four bits per pixel).",
! 425: "",
! 426: " The output of this driver can be used with Jef Poskanzer's excellent PBMPLUS",
! 427: " package, which provides programs to convert the above PBMPLUS formats to GIF,",
! 428: " TIFF, MacPaint, Macintosh PICT, PCX, X11 bitmap and many others. PBMPLUS may",
! 429: " be obtained from ftp.x.org. The relevant files have names that begin with",
! 430: " \"netpbm-1mar1994.p1\"; they reside in /contrib/utilities. The package can",
! 431: " probably also be obtained from one of the many sites that mirrors ftp.x.org.",
! 432: "",
! 433: " Examples:",
! 434: " set terminal pbm small monochrome # defaults",
! 435: " set size 2,2; set terminal pbm color medium"
! 436: END_HELP(pbm)
! 437: #endif /* TERM_HELP */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>