Annotation of OpenXM_contrib/gnuplot/term/djsvga.trm, Revision 1.1
1.1 ! maekawa 1: /*
! 2: * $Id: djsvga.trm,v 1.17 1998/04/14 00:17:36 drd Exp $
! 3: */
! 4:
! 5: /* GNUPLOT - djsvga.trm */
! 6:
! 7: /*[
! 8: * Copyright 1992 - 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: * svga
! 42: *
! 43: * AUTHORS
! 44: * Russell Lang
! 45: * Edzer Pebesma (gnuplot 3.6: new terminal layout, fonts, grx20)
! 46: * Hans-Bernhard Broeker (several improvements)
! 47: *
! 48: * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
! 49: *
! 50: */
! 51:
! 52: /* HBB: A new version, called grx21a was released recently. To
! 53: * tell gnuplot you have it, add '-DGRX21' to your compilation flags.
! 54: * Currently, that only enables the drawing of wide lines. Maybe more
! 55: * to come.
! 56: */
! 57:
! 58: #include "driver.h"
! 59:
! 60: #ifdef TERM_REGISTER
! 61: register_term(djsvga) /* no ; */
! 62: #endif
! 63:
! 64: #ifdef TERM_PROTO
! 65: #define DJSVGA_XMAX 640
! 66: #define DJSVGA_YMAX 480
! 67:
! 68: #define DJSVGA_XLAST (DJSVGA_XMAX - 1)
! 69: #define DJSVGA_YLAST (DJSVGA_YMAX - 1)
! 70:
! 71: #define DJSVGA_VCHAR 16
! 72: #define DJSVGA_HCHAR 8
! 73: #define DJSVGA_VTIC 4
! 74: #define DJSVGA_HTIC 4
! 75:
! 76: TERM_PUBLIC void DJSVGA_init __PROTO((void));
! 77: TERM_PUBLIC void DJSVGA_graphics __PROTO((void));
! 78: TERM_PUBLIC void DJSVGA_text __PROTO((void));
! 79: TERM_PUBLIC void DJSVGA_reset __PROTO((void));
! 80: TERM_PUBLIC void DJSVGA_options __PROTO((void));
! 81: TERM_PUBLIC void DJSVGA_linetype __PROTO((int linetype));
! 82: TERM_PUBLIC void DJSVGA_move __PROTO((unsigned int x, unsigned int y));
! 83: TERM_PUBLIC void DJSVGA_vector __PROTO((unsigned int x, unsigned int y));
! 84: TERM_PUBLIC int DJSVGA_angle __PROTO((int ang));
! 85: TERM_PUBLIC int DJSVGA_justify_text __PROTO((enum JUSTIFY mode));
! 86: TERM_PUBLIC void DJSVGA_put_text __PROTO((unsigned int x, unsigned int y,
! 87: char *str));
! 88: TERM_PUBLIC int DJSVGA_set_font __PROTO((char *fontname));
! 89: TERM_PUBLIC void DJSVGA_suspend __PROTO((void));
! 90: TERM_PUBLIC void DJSVGA_resume __PROTO((void));
! 91: /* clear part of multiplot */
! 92: TERM_PUBLIC void DJSVGA_fillbox __PROTO((int style, unsigned int x1,
! 93: unsigned int y1, unsigned int width,
! 94: unsigned int height));
! 95: TERM_PUBLIC void DJSVGA_linewidth __PROTO((double linewidth));
! 96:
! 97: #define GOT_DJSVGA_PROTO
! 98: #endif /* TERM_PROTO */
! 99:
! 100: #ifndef TERM_PROTO_ONLY
! 101: #ifdef TERM_BODY
! 102:
! 103: /* SVGA driver using DJGPP */
! 104: #if (DJGPP==2)
! 105: # define GRX20
! 106: #endif
! 107: #ifdef GRX20
! 108: /* use grx20.h for DJGPP V1 / GRX V2 combo as well */
! 109: # include <grx20.h>
! 110: #else
! 111: # include <grx.h>
! 112: #endif
! 113: #include <pc.h>
! 114:
! 115: static int dj_startx, dj_starty;
! 116: static int dj_xlast, dj_ylast;
! 117: #define DJNUMCOLOR 15
! 118: /* HBB: Let's just use long for GRX1 as well */
! 119: static long dj_color;
! 120: static long svga256color[DJNUMCOLOR] =
! 121: {7, 8, 2, 3, 4, 5, 9, 14, 12, 15, 13, 10, 11, 1, 6};
! 122: static long dj_colors[DJNUMCOLOR];
! 123: #ifdef GRX20
! 124: /* Save, Restore: for 16 color mode! */
! 125: static void *DJSVGA_colorbuf = NULL;
! 126: #endif
! 127: static GrTextOption DJSVGA_TextOption;
! 128: /* HBB: I think we should use GR_NAMEWIDTH (=16), instead of MAX_ID_LEN,
! 129: * which has nothing to do with GRX at all */
! 130: #ifdef GRX20
! 131: char DJSVGA_fontname[MAX_ID_LEN + 1] = "";
! 132: #else
! 133: char DJSVGA_fontname[MAX_ID_LEN + 1] = "@:pc8x14.fnt"; /* EGA bios font */
! 134: #endif
! 135: static GrContext *DJSVGA_context = 0; /* save screen for suspend/resume */
! 136: static char *dj_textsave = 0; /* for text-screen-saving */
! 137: static int dj_cursorx, dj_cursory;
! 138: static int dj_width, dj_height;
! 139: #ifdef GRX21
! 140: static double dj_linewidth; /* store linewidth assignments here */
! 141: #endif
! 142:
! 143: TERM_PUBLIC void DJSVGA_init()
! 144: {
! 145: int i, on, r, g, b, medium = 170, low = 85;
! 146: GrFont *font = NULL;
! 147:
! 148: #ifdef GRX20
! 149: font = &GrDefaultFont;
! 150: #endif
! 151: /* HBB: save textscreen contents and cursor-position */
! 152: dj_textsave = gp_alloc(ScreenRows() * ScreenCols() * 2, "djsvga term scrbuf");
! 153: ScreenRetrieve(dj_textsave);
! 154: dj_width = ScreenCols();
! 155: dj_height = ScreenRows();
! 156: ScreenGetCursor(&dj_cursory, &dj_cursorx);
! 157: GrSetMode(GR_default_graphics);
! 158: GrSetRGBcolorMode();
! 159: GrResetColors();
! 160: /* Allocate colors */
! 161: for (i = 0; i < DJNUMCOLOR; i++) {
! 162: on = (svga256color[i] & 8) ? 255 : medium;
! 163: r = (svga256color[i] & 4) ? on : 0;
! 164: g = (svga256color[i] & 2) ? on : 0;
! 165: b = (svga256color[i] & 1) ? on : 0;
! 166: if (svga256color[i] == 8)
! 167: r = g = b = low;
! 168: dj_colors[i] = GrAllocColor(r, g, b);
! 169: }
! 170: /* Get the screen size: */
! 171: dj_xlast = GrMaxX();
! 172: term->xmax = dj_xlast + 1;
! 173: dj_ylast = GrMaxY();
! 174: term->ymax = dj_ylast + 1;
! 175: /* if GRX 1.x loads an GRX 2.x save'd file: */
! 176: if (font == NULL && DJSVGA_fontname[0] == '\0')
! 177: sprintf(DJSVGA_fontname, "@:pc8x14.fnt");
! 178:
! 179: if (DJSVGA_fontname[0] != '\0')
! 180: font = GrLoadFont(DJSVGA_fontname);
! 181: if (font == NULL)
! 182: font = GrLoadFont("@:pc8x14.fnt"); /* try EGA bios font */
! 183: if (font == NULL)
! 184: font = GrLoadFont("@:pc8x16.fnt"); /* try VGA bios font */
! 185: /*
! 186: * HBB: There are cases when we reach this point with font still NULL,
! 187: * eg. when the GRXFONT env.variable points to the GRX V1 fonts, but
! 188: * GRX V2 is used for this program: some fonts will *fail* to load in
! 189: * that setup (e.g. cour20b)! So IMHO, there should be some error
! 190: * treatment here..., like int_error("Couldn't load font!");
! 191: */
! 192: DJSVGA_TextOption.txo_font = font;
! 193: DJSVGA_TextOption.txo_direct = GR_TEXT_RIGHT;
! 194: DJSVGA_TextOption.txo_xalign = GR_ALIGN_LEFT;
! 195: DJSVGA_TextOption.txo_yalign = GR_ALIGN_CENTER;
! 196: DJSVGA_TextOption.txo_chrtype = GR_BYTE_TEXT;
! 197: DJSVGA_TextOption.txo_bgcolor.v = GrNOCOLOR;
! 198: #ifndef GRX20
! 199: DJSVGA_TextOption.txo_xmag = 1;
! 200: DJSVGA_TextOption.txo_ymag = 1;
! 201: #endif
! 202: /* HBB: this version should work in all configurations */
! 203: term->v_char = font->h.height;
! 204: term->h_char = font->h.width;
! 205:
! 206: #ifdef GRX20
! 207: if (DJSVGA_colorbuf == NULL)
! 208: DJSVGA_colorbuf = (void *) gp_alloc(GrColorSaveBufferSize(), "djsvga term colorbuf");
! 209: GrSaveColors(DJSVGA_colorbuf);
! 210: #endif
! 211: GrSetMode(GR_default_text);
! 212: ScreenUpdate(dj_textsave);
! 213: ScreenSetCursor(dj_cursory, dj_cursorx);
! 214: }
! 215:
! 216: /*
! 217: * HBB: make these two inline, as they're called by other routines
! 218: * inside this module, and -finline-functions (normally switched
! 219: * on by 'gcc -O3') doesn't work for compiling term.c
! 220: */
! 221: __inline__
! 222: TERM_PUBLIC void DJSVGA_graphics()
! 223: {
! 224: ScreenRetrieve(dj_textsave); /* HBB: save text screen contents */
! 225: ScreenGetCursor(&dj_cursory, &dj_cursorx);
! 226: GrSetMode(GR_default_graphics);
! 227: #ifdef GRX20
! 228: GrRestoreColors(DJSVGA_colorbuf);
! 229: #endif
! 230: }
! 231:
! 232: __inline__
! 233: TERM_PUBLIC void DJSVGA_text()
! 234: {
! 235: (void) getkey();
! 236: GrSetMode(GR_width_height_text, dj_width, dj_height);
! 237: ScreenUpdate(dj_textsave); /* HBB: restore text screen */
! 238: ScreenSetCursor(dj_cursory, dj_cursorx);
! 239: }
! 240:
! 241: TERM_PUBLIC void DJSVGA_reset()
! 242: {
! 243: GrResetColors();
! 244: free(dj_textsave);
! 245: }
! 246:
! 247: TERM_PUBLIC void DJSVGA_options()
! 248: {
! 249: if (!END_OF_COMMAND && isstring(c_token)) {
! 250: quote_str(DJSVGA_fontname, c_token, MAX_ID_LEN);
! 251: c_token++;
! 252: }
! 253: sprintf(term_options, "\"%s\"", DJSVGA_fontname);
! 254: }
! 255:
! 256: TERM_PUBLIC void DJSVGA_linetype(linetype)
! 257: int linetype;
! 258: {
! 259: if (linetype >= 13)
! 260: linetype %= 13;
! 261: /* HBB: set the TextOption color variable right here (faster) */
! 262: DJSVGA_TextOption.txo_fgcolor.v = dj_color = dj_colors[linetype + 2];
! 263: }
! 264:
! 265: TERM_PUBLIC void DJSVGA_move(x, y)
! 266: unsigned int x, y;
! 267: {
! 268: dj_startx = x;
! 269: dj_starty = y;
! 270: }
! 271:
! 272:
! 273: TERM_PUBLIC void DJSVGA_vector(x, y)
! 274: unsigned int x, y;
! 275: {
! 276: #ifdef GRX21
! 277: GrLineOption dj_lineoption =
! 278: {dj_color, dj_linewidth, 0, ""};
! 279:
! 280: GrCustomLine(dj_startx, dj_ylast - dj_starty, x, dj_ylast - y, &dj_lineoption);
! 281: #else
! 282: GrLine(dj_startx, dj_ylast - dj_starty, x, dj_ylast - y, dj_color);
! 283: #endif
! 284: dj_startx = x;
! 285: dj_starty = y;
! 286: }
! 287:
! 288: /*
! 289: * HBB: IMHO, the previous version was seriously flawed. E.g.
! 290: * in the termentry, _justify_text was pointing to the
! 291: * null_justify_text dummy routine, so DJSVGA_justify wasn't
! 292: * ever called at all. I copied the routines from my (now
! 293: * otherwise pointless) own private driver, djgrx.trm, to
! 294: * cure that.
! 295: */
! 296: TERM_PUBLIC int DJSVGA_angle(ang)
! 297: int ang;
! 298: {
! 299: if (ang) {
! 300: DJSVGA_TextOption.txo_direct = GR_TEXT_UP;
! 301: } else {
! 302: DJSVGA_TextOption.txo_direct = GR_TEXT_RIGHT;
! 303: }
! 304: return TRUE;
! 305: }
! 306:
! 307: TERM_PUBLIC int DJSVGA_justify_text(mode)
! 308: enum JUSTIFY mode;
! 309: {
! 310: if (DJSVGA_TextOption.txo_direct == GR_TEXT_RIGHT) {
! 311: DJSVGA_TextOption.txo_yalign = GR_ALIGN_CENTER;
! 312: switch (mode) {
! 313: case LEFT:
! 314: DJSVGA_TextOption.txo_xalign = GR_ALIGN_LEFT;
! 315: break;
! 316: case CENTRE:
! 317: DJSVGA_TextOption.txo_xalign = GR_ALIGN_CENTER;
! 318: break;
! 319: case RIGHT:
! 320: DJSVGA_TextOption.txo_xalign = GR_ALIGN_RIGHT;
! 321: break;
! 322: }
! 323: } else {
! 324: DJSVGA_TextOption.txo_xalign = GR_ALIGN_CENTER;
! 325: switch (mode) {
! 326: case LEFT:
! 327: DJSVGA_TextOption.txo_yalign = GR_ALIGN_BOTTOM;
! 328: break;
! 329: case CENTRE:
! 330: DJSVGA_TextOption.txo_yalign = GR_ALIGN_CENTER;
! 331: break;
! 332: case RIGHT:
! 333: DJSVGA_TextOption.txo_yalign = GR_ALIGN_TOP;
! 334: break;
! 335: }
! 336: }
! 337: return TRUE;
! 338: }
! 339:
! 340: TERM_PUBLIC int DJSVGA_set_font(fontname)
! 341: char *fontname;
! 342: {
! 343: char *cp;
! 344: GrFont *font;
! 345:
! 346: safe_strncpy(DJSVGA_fontname, fontname, sizeof(DJSVGA_fontname));
! 347: cp = strstr(DJSVGA_fontname, ",");
! 348: if (cp != NULL)
! 349: *cp = NUL;
! 350: font = GrLoadFont(DJSVGA_fontname);
! 351: /*HBB: if no font found, do *not* report success! */
! 352: if (font != NULL) {
! 353: GrUnloadFont(DJSVGA_TextOption.txo_font);
! 354: DJSVGA_TextOption.txo_font = font;
! 355: return TRUE;
! 356: } else {
! 357: graph_error("Font not found");
! 358: return FALSE;
! 359: }
! 360: }
! 361:
! 362: TERM_PUBLIC void DJSVGA_put_text(x, y, str)
! 363: unsigned int x, y;
! 364: char *str;
! 365: {
! 366: /* HBB: why isn't font!=NULL ensured elsewhere? Testing it at
! 367: * this point doesn't really make much sense (we're in graphics
! 368: * mode, so we can't even print out a useful error message!) */
! 369: /*if (DJSVGA_TextOption.txo_font != NULL) */
! 370: GrDrawString(str, strlen(str), x, dj_ylast - y, &DJSVGA_TextOption);
! 371: }
! 372:
! 373: TERM_PUBLIC void DJSVGA_suspend()
! 374: {
! 375: DJSVGA_context = GrCreateContext(GrSizeX(), GrSizeY(), 0, 0);
! 376: GrBitBltNC(DJSVGA_context, 0, 0, 0, 0, 0, GrMaxX(), GrMaxY(), GrWRITE);
! 377: DJSVGA_text();
! 378: }
! 379:
! 380: TERM_PUBLIC void DJSVGA_resume()
! 381: {
! 382: DJSVGA_graphics();
! 383: GrBitBltNC(0, 0, 0, DJSVGA_context, 0, 0, GrMaxX(), GrMaxY(), GrWRITE);
! 384: GrDestroyContext(DJSVGA_context);
! 385: }
! 386:
! 387: TERM_PUBLIC void DJSVGA_fillbox(style, left, bottom, width, height)
! 388: int style;
! 389: unsigned int left, bottom, width, height;
! 390: {
! 391: if (style >= 13)
! 392: style %= 13;
! 393: /* HBB: prize question: should it be 'width-1' instead? */
! 394: /* HBB: fill with GRX Color '0', which *should* be black : */
! 395: GrFilledBox(left, dj_ylast - bottom, left + width, dj_ylast - bottom - height, 0);
! 396: }
! 397:
! 398: TERM_PUBLIC void DJSVGA_linewidth(double linewidth)
! 399: {
! 400: #ifdef GRX21
! 401: dj_linewidth = linewidth;
! 402: #endif
! 403: }
! 404:
! 405: #endif /* TERM_BODY */
! 406:
! 407: #ifdef TERM_TABLE
! 408:
! 409: /* HBB: I think \" is more readable than \042. BTW: why is this
! 410: * option 'documented' here, but not in the Help node? */
! 411: TERM_TABLE_START(djsvga_driver)
! 412: "svga", "IBM PC/Clone with Super VGA graphics board [\"fontname\"]",
! 413: DJSVGA_XMAX, DJSVGA_YMAX, DJSVGA_VCHAR, DJSVGA_HCHAR,
! 414: DJSVGA_VTIC, DJSVGA_HTIC,
! 415: DJSVGA_options,
! 416: DJSVGA_init, DJSVGA_reset, DJSVGA_text,
! 417: null_scale, DJSVGA_graphics, DJSVGA_move, DJSVGA_vector,
! 418: DJSVGA_linetype, DJSVGA_put_text,
! 419: DJSVGA_angle, DJSVGA_justify_text,
! 420: do_point, do_arrow, DJSVGA_set_font,
! 421: 0, /* no pointsize() */
! 422: TERM_CAN_MULTIPLOT,
! 423: DJSVGA_suspend, DJSVGA_resume,
! 424: DJSVGA_fillbox, DJSVGA_linewidth
! 425: TERM_TABLE_END(djsvga_driver)
! 426:
! 427: #undef LAST_TERM
! 428: #define LAST_TERM djsvga_driver
! 429:
! 430: #endif /* TERM_TABLE */
! 431: #endif /* TERM_PROTO_ONLY */
! 432:
! 433: /*
! 434: * HBB: I think this documentation should be at least a *bit* longer
! 435: * (E.g., the "fontname" parameter is claimed to be non-existent!)
! 436: */
! 437: /* RCC: Not any more...
! 438: * If you have other ideas about what could be in the help section,
! 439: * please let me know (rccrawford@lanl.gov) --- particularly info
! 440: * about what fonts are permitted, if there is such a list.
! 441: */
! 442: #ifdef TERM_HELP
! 443: START_HELP(svga)
! 444: "1 svga",
! 445: "?commands set terminal svga",
! 446: "?set terminal svga",
! 447: "?set term svga",
! 448: "?terminal svga",
! 449: "?term svga",
! 450: "?svga",
! 451: " The `svga` terminal driver supports PCs with SVGA graphics. It can only be",
! 452: " be used if it is compiled with DJGPP. Its only option is the font.",
! 453: "",
! 454: " Syntax:",
! 455: " set terminal svga {\"<fontname>\"}"
! 456: END_HELP(svga)
! 457: #endif /* TERM_HELP */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>