Initial release of Maemo 5 port of gnuplot
[gnuplot] / term / pc.trm
diff --git a/term/pc.trm b/term/pc.trm
new file mode 100644 (file)
index 0000000..6dbb718
--- /dev/null
@@ -0,0 +1,560 @@
+/* Hello, Emacs, this is -*-C-*-
+ * $Id: pc.trm,v 1.23 2006/07/21 02:35:47 sfeam Exp $
+ *
+ */
+
+/* GNUPLOT - pc.trm */
+
+/*[
+ * Copyright 1990 - 1993, 1998, 2004
+ *
+ * Permission to use, copy, and distribute this software and its
+ * documentation for any purpose with or without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.
+ *
+ * Permission to modify the software is granted, but not the right to
+ * distribute the complete modified source code.  Modifications are to
+ * be distributed as patches to the released version.  Permission to
+ * distribute binaries produced by compiling modified sources is granted,
+ * provided you
+ *   1. distribute the corresponding source modifications from the
+ *    released version in the form of a patch file along with the binaries,
+ *   2. add special version identification to distinguish your version
+ *    in addition to the base release version number,
+ *   3. provide your name and address as the primary contact for the
+ *    support of your modified version, and
+ *   4. retain our contact information in regard to use of the base
+ *    software.
+ * Permission to distribute the released version of the source code along
+ * with corresponding source modifications in the form of a patch file is
+ * granted with same provisions 2 through 4 for binary distributions.
+ *
+ * This software is provided "as is" without express or implied warranty
+ * to the extent permitted by applicable law.
+]*/
+
+/*
+ * This file is included by ../term.c.
+ *
+ * This terminal driver supports:
+ *  Under Microsoft C
+ *      cga, egabios, egalib, vgabios, hercules, corona325, att
+ *  Under Turboc C
+ *      cga, ega/vga, vgamono, svga, mcga, hercules, att
+ *  Under Watcom C
+ *      cga, ega/vga, vgamono, svga, mcga, hercules, ???
+ *
+ * AUTHORS
+ *  Colin Kelley, Thomas Williams, William Wilson, Russell Lang
+ *  modified by David J. Liu (liu@csb.yale.edu) for version 3.6
+ *
+ * send your comments or suggestions to (gnuplot-info@lists.sourceforge.net).
+ *
+ * Because only one compiler is used to generate gnuplot.exe
+ * and the type of the single graphics board is auto-detected,
+ * we can combine all these parts into one terminal type: PC
+ * and let the computer take care of the rest.  -- DJL
+ *
+ * Since I don't have MicroSoft C, I assume it would define MSC.
+ * Please correct it if you are using MS C.  Thank you.  -- DJL
+ *
+ */
+
+/*
+ * adapted to the new terminal layout by Stefan Bodewig (Dec. 1995)
+ */
+
+#include "driver.h"
+
+#ifdef TERM_REGISTER
+register_term(dospc)
+#endif
+
+#ifdef TERM_PROTO
+TERM_PUBLIC void PC_text __PROTO((void));
+TERM_PUBLIC void PC_reset __PROTO((void));
+TERM_PUBLIC void PC_init __PROTO((void));
+TERM_PUBLIC void PC_graphics __PROTO((void));
+TERM_PUBLIC void PC_linetype __PROTO((int linetype));
+TERM_PUBLIC void PC_move __PROTO((unsigned int x, unsigned int y));
+TERM_PUBLIC void PC_vector __PROTO((unsigned int x, unsigned int y));
+TERM_PUBLIC void PC_put_text __PROTO((unsigned int x, unsigned int y, const char *str));
+TERM_PUBLIC int PC_text_angle __PROTO((int ang));
+TERM_PUBLIC int PC_justify_text __PROTO((enum JUSTIFY ang));
+
+#define PC_HCHAR FNT5X9_HCHAR
+#define PC_VCHAR FNT5X9_VCHAR
+#define PC_HTIC 5
+#define PC_VTIC 4
+#define PC_XMAX 100            /* These two entries are just place holders. */
+#define PC_YMAX 100            /* The actual values will be found in init.  */
+#endif /* TERM_PROTO */
+
+#ifndef TERM_PROTO_ONLY
+#ifdef TERM_BODY
+
+#ifdef __TURBOC__
+static int huge detect_svga __PROTO((void));
+#endif /* __TURBOC__ */
+
+#include <string.h>
+#include <stdlib.h>
+#ifdef __TURBOC__
+#include <graphics.h>
+#include <conio.h>
+#include <dos.h>
+#endif /* __TURBOC__ */
+#ifdef __WATCOMC__
+# include <conio.h>            /* for getch() */
+# include <graph.h>
+#endif /* WATCOMC */
+#ifdef MSC
+#include "mcega.h"
+#endif /* MSC */
+
+static unsigned int pattern[] ={ 0xffff, 0x0f0f, 0xffff, 0xaaaa, 0x3333, 0x3f3f, 0x0f0f };
+static int vga_color[] ={ 7, 8, 2, 3, 4, 5, 9, 14, 12, 15, 13, 10, 11, 1, 6 };
+
+static int pc_driver, pc_mode;
+static int graphics_on = FALSE, pc_graphics = FALSE;
+static int startx, starty, pc_lastx, pc_lasty, pc_colors;
+static int pc_angle, pc_hjustify, pc_vjustify, pc_text_size, pc_text_dir, pc_corscreen = -1;
+
+
+#ifdef __TURBOC__
+extern int far _Cdecl SVGA_driver_far[];
+#endif /* __TURBOC__ */
+
+#ifdef __WATCOMC__
+enum {
+    HORIZ_DIR, VERT_DIR
+};
+static void
+_settextang(int ang)
+{
+    if (ang == HORIZ_DIR) {
+       _settextorient(1, 0);
+    } else {
+       _settextorient(0, 1);
+    }
+}
+#endif /* WATCOMC */
+
+static int huge
+detect_svga()
+{
+    return 0;                  /* the default mode, just a place holder */
+}
+
+void
+PC_setup()
+{                              /* called from the beginning of main() */
+    int i, t, x, y;
+    char pc_modename[9];
+#ifdef __WATCOMC__
+    struct videoconfig VC;
+#endif /* WATCOMC */
+
+    /* First link all BRI dribers, then detect the display card. */
+    /* If environment PCTRM is set, try initiate the card/mode.  */
+
+    /* special instruction on mode */
+    safe_strncpy(pc_modename, getenv("PCTRM"), 8);
+
+#ifdef __TURBOC__
+    /* Some of this code including BGI drivers are copyright Borland Intl. */
+    registerfarbgidriver(EGAVGA_driver_far);
+    registerfarbgidriver(CGA_driver_far);
+    registerfarbgidriver(Herc_driver_far);
+    registerfarbgidriver(ATT_driver_far);
+    registerfarbgidriver(PC3270_driver_far);
+    pc_driver = DETECT;
+    detectgraph(&pc_driver, &pc_mode);
+    if (graphresult()) {
+       fputs("Unable to initialize graphics.\n", stderr);
+       return;
+    }
+#ifdef BGI_NAME
+/* the highest standard pc_driver value, see graphics.h */
+#define LAST_BGI 10
+/* the last mode of the SVGA.BGI */
+#define LAST_SVGA_MODE 6
+    /* test SVGA if we have VGA */
+    if ((pc_driver == VGA) && (pc_modename[0] == 'S')) {
+       installuserdriver(BGI_NAME, &detect_svga);
+       registerfarbgidriver(SVGA_driver_far);
+       pc_driver = DETECT;
+       initgraph(&pc_driver, &pc_mode, "");
+        /* The following code, which is independent of the actual SVGA.BGI
+        * used, tries to find a mode of width defined in the environment
+        * variable PCTRM */
+       if (pc_driver > LAST_BGI) {     /* success */
+           sscanf(pc_modename, "S%d", &t);
+           switch (t) {
+           case 800:
+               break;          /* S800  */
+           case 1024:
+               break;          /* S1024 */
+           case 1280:
+               break;          /* S1280 */
+           default:
+               t = 640;        /* 640x480 */
+           }
+           for (i = 0; i <= LAST_SVGA_MODE; i++) {
+               setgraphmode(i);
+               if ((getmaxx() + 1 == t) && (getmaxcolor() > 14))
+                   pc_mode = i;
+           }
+           setgraphmode(pc_mode);
+           if (graphresult()) {        /* error, go back to VGA */
+               pc_driver = VGA;
+               pc_mode = 4;
+           }
+       }
+    }                          /* SVGA tested */
+    if (pc_driver <= LAST_BGI)
+#endif /* BGI_NAME */
+       initgraph(&pc_driver, &pc_mode, "");
+    pc_colors = getmaxcolor() + 1;
+    pc_lastx = getmaxx();
+    pc_lasty = getmaxy();
+    restorecrtmode();
+    clrscr();
+#endif /* __TURBOC__ */
+#ifdef __WATCOMC__
+    _getvideoconfig(&VC);
+    if ((pc_driver = VC.adapter) == 0) {
+       fprintf(stderr, "Unable to initialize graphics.\n");
+       return;
+    }
+    switch (pc_driver = VC.adapter) {
+    case _HERCULES:
+       pc_mode = _HERCMONO;
+       break;
+    case _CGA:
+       pc_mode = _HRESBW;
+       break;
+    case _MCGA:
+       pc_mode = _MRES256COLOR;
+       break;
+    case _EGA:
+       pc_mode = (VC.monitor == _MONO ? _ERESCOLOR : _ERESNOCOLOR);
+       break;
+    case _VGA:
+       pc_mode = _VRES16COLOR;
+       break;
+    case _SVGA:
+       if (pc_modename[0] == 'S') {    /* test SVGA resolution */
+           sscanf(pc_modename, "S%d", &t);
+           switch (t) {
+           case 800:
+               pc_mode = _SVRES256COLOR;
+               break;          /* S800  */
+           case 1024:
+               pc_mode = _XRES256COLOR;
+               break;          /* S1024 */
+           case 1280:
+               pc_mode = _XRES256COLOR + 2;
+               break;          /* S1280 */
+               /* Someone help me, who knows, how a newer Watcom calls that */
+           default:
+               t = 640;
+               pc_mode = _VRES256COLOR;        /* 640x480 */
+           }
+           while (_setvideomode(pc_mode) == 0)
+               pc_mode--;
+       }
+       break;
+    default:
+       fputs("Unable to initialize graphics.\n", stderr);
+       return;
+    }
+    _setvideomode(pc_mode);
+    _getvideoconfig(&VC);
+    pc_lastx = VC.numxpixels - 1;
+    pc_lasty = VC.numypixels - 1;
+    pc_colors = VC.numcolors;
+    _setvideomode(_DEFAULTMODE);
+#endif /* WATCOMC */
+    x = pc_lastx + 1;
+    y = pc_lasty + 1;
+    fprintf(stderr, "\tScreen of %d x %d pixels and %d colors.\n",
+           x, y, pc_colors);
+    pc_graphics = TRUE;
+}
+
+TERM_PUBLIC void
+PC_init()
+{
+    char *pathp;
+#ifdef __WATCOMC__
+    struct _fontinfo fi;
+#endif
+
+    if (!pc_graphics) {
+       fputs("Unable to initialize graphics.\n", stderr);
+       term = 0;
+       return;
+    }
+    /* Double the tic/font sizes. */
+    pc_text_size = (pc_lasty > 590) ? 2 : 1;
+    term->h_char = PC_HCHAR;
+    term->v_char = PC_VCHAR;
+    term->h_tic = PC_HTIC * pc_text_size;
+    term->v_tic = PC_VTIC * pc_text_size;
+    term->xmax = pc_lastx + 1;
+    term->ymax = pc_lasty + 1;
+#ifdef __TURBOC__
+    setgraphmode(pc_mode);
+    settextstyle(DEFAULT_FONT, HORIZ_DIR, pc_text_size);
+    settextjustify(pc_hjustify, pc_vjustify);
+    term->h_char = textheight("X");    /* overriding the default */
+    term->v_char = textwidth("X");     /* overriding the default */
+#endif /* __TURBOC__ */
+#ifdef __WATCOMC__
+    _setvideomode(pc_mode);
+    _settextang(HORIZ_DIR);
+    _settextalign(pc_hjustify, pc_vjustify);
+    _setcharsize(pc_text_size * PC_HCHAR, pc_text_size * PC_VCHAR);
+    _getfontinfo(&fi);
+    term->h_char = fi.avgwidth;
+    term->v_char = fi.pixheight * 1.5;
+#endif /* WATCOMC */
+#ifdef MSC
+#endif /* MSC */
+}
+
+TERM_PUBLIC void
+PC_graphics()
+{
+    graphics_on = TRUE;
+#ifdef __TURBOC__
+    setgraphmode(pc_mode);
+#endif /* __TURBOC__ */
+#ifdef __WATCOMC__
+    _setvideomode(pc_mode);
+#endif /* WATCOMC */
+#ifdef MSC
+    if (pc_corscreen == -1)
+       Vmode(18);              /* VGA */
+    else {
+       grinit(corscreen);
+       grandtx();
+    }                          /* corolla */
+#endif /* MSC */
+}
+
+TERM_PUBLIC void
+PC_linetype(int linetype)
+{
+    if (linetype < -2)
+       linetype = LT_BLACK;
+
+    if (pc_colors > 14) {      /* 16 or more colors */
+       if (linetype >= 13)
+           linetype %= 13;
+#ifdef __TURBOC__
+       setcolor(vga_color[linetype + 2]);
+#endif /* __TURBOC__ */
+#ifdef __WATCOMC__
+       _setcolor(vga_color[linetype + 2]);
+#endif /* WATCOMC */
+#ifdef MSC
+#endif /* MSC */
+    } else {                   /* MONO */
+       if (linetype >= 5)
+           linetype %= 5;
+#ifdef __TURBOC__
+       setlinestyle(4, pattern[linetype + 2], 1);
+#endif /* __TURBOC__ */
+#ifdef __WATCOMC__
+       _setlinestyle(pattern[linetype + 2]);
+#endif /* WATCOMC */
+#ifdef MSC
+       if (pc_corscreen != -1)
+           Cor_mask(pattern[linetype + 2]);
+#endif /* MSC */
+    }
+}
+
+TERM_PUBLIC void
+PC_move(unsigned int x, unsigned int y)
+{
+#ifdef __TURBOC__
+    moveto(x, pc_lasty - y);
+#endif /* __TURBOC__ */
+#ifdef __WATCOMC__
+    _moveto(x, pc_lasty - y);
+#endif /* WATCOMC */
+#ifdef MSC
+#endif /* MSC */
+    startx = x;
+    starty = y;
+}
+
+TERM_PUBLIC void
+PC_vector(unsigned int x, unsigned int y)
+{
+#ifdef __TURBOC__
+    lineto(x, pc_lasty - y);
+#endif /* __TURBOC__ */
+#ifdef __WATCOMC__
+    _lineto(x, pc_lasty - y);
+#endif /* WATCOMC */
+#ifdef MSC
+    if (pc_corscreen != -1)
+       Cor_line(startx, COR_YLAST - starty, x, COR_YLAST - y);
+#endif /* MSC */
+    startx = x;
+    starty = y;
+}
+
+TERM_PUBLIC void
+PC_reset()
+{
+    graphics_on = FALSE;
+#ifdef __TURBOC__
+    restorecrtmode();
+    clrscr();
+#endif /* __TURBOC__ */
+#ifdef __WATCOMC__
+    _setvideomode(_DEFAULTMODE);
+#endif /* WATCOMC */
+#ifdef MSC
+    Vmode(3);
+#endif /* MSC */
+}
+
+TERM_PUBLIC void
+PC_text()
+{
+    if (graphics_on) {
+       graphics_on = FALSE;
+       (void) getch();
+#ifdef __TURBOC__
+       restorecrtmode();
+       clrscr();
+#endif /* __TURBOC__ */
+#ifdef __WATCOMC__
+       _setvideomode(_DEFAULTMODE);
+#endif /* WATCOMC */
+#ifdef MSC
+       if (pc_corscreen != -1) {
+           grreset();
+           txonly();
+       }
+       Vmode(3);
+#endif /* MSC */
+    }
+}
+
+TERM_PUBLIC int
+PC_text_angle(int ang)
+{
+    switch (ang) {
+    case 0:
+       pc_text_dir = HORIZ_DIR;
+       break;
+    default:
+    case 1:
+       pc_text_dir = VERT_DIR;
+       break;
+    }
+    return TRUE;
+}
+
+TERM_PUBLIC int
+PC_justify_text(enum JUSTIFY just)
+{
+#if defined(__TURBOC__)
+    switch (just) {
+    case LEFT:
+       pc_hjustify = LEFT_TEXT;
+       pc_vjustify = CENTER_TEXT;
+       break;
+    case CENTRE:
+       pc_hjustify = CENTER_TEXT;
+       pc_vjustify = CENTER_TEXT;
+       break;
+    case RIGHT:
+       pc_hjustify = RIGHT_TEXT;
+       pc_vjustify = CENTER_TEXT;
+       break;
+    }
+    settextjustify(pc_hjustify, pc_vjustify);
+    return 1;
+#elif defined(__WATCOMC__)
+    switch (just) {
+    case LEFT:
+       pc_hjustify = _LEFT;
+       pc_vjustify = _HALF;
+       break;
+    case CENTRE:
+       pc_hjustify = _CENTER;
+       pc_vjustify = _HALF;
+       break;
+    case RIGHT:
+       pc_hjustify = _RIGHT;
+       pc_vjustify = _HALF;
+       break;
+    }
+    _settextalign(pc_hjustify, pc_vjustify);
+    return 1;
+#else
+    return (just == LEFT);
+#endif
+}
+
+TERM_PUBLIC void
+PC_put_text(unsigned int x, unsigned int y, const char *str)
+{
+#ifdef __TURBOC__
+    settextstyle(DEFAULT_FONT, pc_text_dir, pc_text_size);
+    settextjustify(pc_hjustify, pc_vjustify);
+    outtextxy(x, pc_lasty - y, str);
+#endif /* __TURBOC__ */
+#ifdef __WATCOMC__
+    _setcharsize(pc_text_size * PC_VCHAR, pc_text_size * PC_HCHAR);
+    _settextang(pc_text_dir);
+    _settextalign(pc_hjustify, pc_vjustify);
+    _grtext(x, pc_lasty - y, str);
+#endif /* WATCOMC */
+#ifdef MSC
+#endif /* MSC */
+}
+
+#endif /* TERM_BODY */
+
+#ifdef TERM_TABLE
+
+TERM_TABLE_START(dospc_driver)
+    "dospc", "IBM PC/Clone running DOS",
+    PC_XMAX, PC_YMAX, PC_VCHAR, PC_HCHAR,
+    PC_VTIC, PC_HTIC, options_null, PC_init, PC_reset,
+    PC_text, null_scale, PC_graphics, PC_move, PC_vector,
+    PC_linetype, PC_put_text, PC_text_angle,
+    PC_justify_text, line_and_point, do_arrow, set_font_null
+TERM_TABLE_END(dospc_driver)
+
+#undef LAST_TERM
+#define LAST_TERM dospc_driver
+
+#endif /* TERM_TABLE */
+#endif /* TERM_PROTO_ONLY */
+
+#ifdef TERM_HELP
+START_HELP(dospc)
+"1 dospc",
+"?commands set terminal dospc",
+"?set terminal dospc",
+"?set term dospc",
+"?terminal dospc",
+"?term dospc",
+"?dospc",
+" The `dospc` terminal driver supports PCs with arbitrary graphics boards,",
+" which will be automatically detected.  It should be used only if you are",
+" not using the gcc or Zortec C/C++ compilers."
+END_HELP(dospc)
+#endif /* TERM_HELP */