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

Annotation of OpenXM_contrib/gnuplot/term/atarivdi.trm, Revision 1.1.1.2

1.1       maekawa     1: /*
1.1.1.2 ! maekawa     2:  * $Id: atarivdi.trm,v 1.10 1998/12/14 18:38:17 lhecking Exp $
1.1       maekawa     3:  *
                      4:  */
                      5:
                      6: /* GNUPLOT - atari.trm */
                      7:
                      8: /*[
                      9:  * Copyright 1992, 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:  *   Atari Screens working with the normal VDI
                     43:  *     (this should include TT and big screens)
                     44:  *
                     45:  * AUTHORS
                     46:  *  Alexander Lehmann
                     47:  *  HE Koechling
                     48:  *
                     49:  * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
                     50:  *
                     51:  * ATARI-related comments please to alexlehm@iti.informatik.th-darmstadt.de
                     52:  *
                     53:  */
                     54:
                     55: #include "driver.h"
                     56:
                     57: #ifdef TERM_REGISTER
                     58: register_term(vdi)
                     59: #endif
                     60:
                     61: #ifdef TERM_PROTO
                     62:
                     63: /* function-prototypes */
                     64: TERM_PUBLIC void VDI_options(void);
                     65: TERM_PUBLIC void VDI_init(void);
                     66: TERM_PUBLIC void VDI_reset(void);
                     67: TERM_PUBLIC void VDI_graphics(void);
                     68: TERM_PUBLIC void VDI_text(void);
                     69: TERM_PUBLIC void VDI_move(unsigned int x, unsigned int y);
                     70: TERM_PUBLIC void VDI_vector(unsigned int x, unsigned int y);
                     71: TERM_PUBLIC void VDI_linetype(int lt);
                     72: TERM_PUBLIC int VDI_text_angle(int ang);
                     73: TERM_PUBLIC void VDI_put_text(unsigned int x, unsigned int y, char *str);
                     74: TERM_PUBLIC int VDI_justify_text(enum JUSTIFY mode);
                     75: TERM_PUBLIC void VDI_point(unsigned int x, unsigned int y, int number);
                     76:
                     77: /* default to hi-res */
                     78: #define VDI_XMAX 640
                     79: #define VDI_YMAX 400
                     80: #define VDI_VCHAR 16
                     81: #define VDI_HCHAR 8
                     82: #define VDI_HTIC (VDI_XMAX/100)
                     83: #define VDI_VTIC VDI_HTIC
                     84:
                     85: #endif /* TERM_PROTO */
                     86:
                     87: #ifndef TERM_PROTO_ONLY
                     88: #ifdef TERM_BODY
                     89:
                     90: #ifdef __PUREC__
                     91: /* why did they have to change these names ??? */
                     92: # include <aes.h>
                     93: # include <vdi.h>
                     94: # include <tos.h>
                     95: #else /* !__PUREC__ i.e. __GNUC__, maybe others */
                     96: # include <aesbind.h>
                     97: # include <vdibind.h>
                     98: # include <osbind.h>
                     99: #endif
                    100:
                    101: #define VDI_yc(y) (VDI_maxycoord-(y))
                    102: #define VDI_LINETYPES_MAX      11
                    103:
                    104: static int VDI_linetypes[VDI_LINETYPES_MAX] =
                    105: {
                    106:     0xffff, 0x1111,
                    107:     0xffff, 0x5555, 0x3333, 0x7777,
                    108:     0x3f3f, 0x0f0f, 0x5f5f, 0xe4e4, 0x55f5
                    109: };
                    110:
                    111: static int VDI_lt;
                    112: static int vdi_vdi_handle = -1;
                    113: static int VDI_maxycoord;
                    114: static int VDI_rotation;
                    115: static int VDI_numcolors;
                    116: static int pxy[128];           /* Maximum of 64 pixels per v_pline */
                    117: static int pxy_index;
                    118: static int VDI_colors[16];
                    119: static int VDI_savecolors[16][3];
                    120: static int VDI_numpalette;
                    121:
                    122: #define VDI_c_height_default 6 /* well, well ...               */
                    123:
                    124: static int VDI_c_height = VDI_c_height_default;
                    125:
                    126: static void vdi_flush_line(void);
                    127:
                    128: TERM_PUBLIC void VDI_options()
                    129: {
                    130: #define VDIHEXERROR "palette values 3 hex digits, please"
                    131: #define VDIHEIGHTERROR "expecting a character height"
                    132:     char opt[4];
                    133:     int i;
                    134:     char *tok_end;
                    135:
                    136:     term_options[0] = NUL;
                    137:     VDI_c_height = VDI_c_height_default;
                    138:
                    139:     for (i = 0; i < 17; i++) {
                    140:        if (END_OF_COMMAND)
                    141:            break;
                    142:        if (token[c_token].length > 3) {
                    143:            VDI_numpalette = 0;
                    144:            VDI_c_height = VDI_c_height_default;
                    145:            term_options[0] = NUL;
                    146:            int_error(VDIHEXERROR, c_token);
                    147:        }
                    148:        capture(opt, c_token, c_token, 6);
                    149:        if (!i) {
                    150:            VDI_c_height = strtoul(opt, &tok_end, 10);
                    151:            if (*tok_end != NUL) {
                    152:                VDI_numpalette = 0;
                    153:                VDI_c_height = VDI_c_height_default;
                    154:                term_options[0] = NUL;
                    155:                int_error(VDIHEIGHTERROR, c_token);
                    156:            }
                    157:            if (VDI_c_height > 999)
                    158:                VDI_c_height = 999;     /* avoid opt length overflow */
                    159:            sprintf(opt, "%d ", VDI_c_height);
                    160:        } else {
                    161:            VDI_colors[i - 1] = strtoul(opt, &tok_end, 16);
                    162:            if (*tok_end != NUL) {
                    163:                VDI_numpalette = 0;
                    164:                VDI_c_height = VDI_c_height_default;
                    165:                term_options[0] = NUL;
                    166:                int_error(VDIHEXERROR, c_token);
                    167:            }
                    168:            sprintf(opt, "%03X ", VDI_colors[i - 1]);
                    169:        }
                    170:        strcat(term_options, opt);
                    171:        c_token++;
                    172:     }
                    173:     VDI_numpalette = (i == 0 ? 0 : i - 1);
                    174: }
                    175:
                    176: TERM_PUBLIC void VDI_init()
                    177: {
                    178:     int work_in[11];
                    179:     int work_out[57];
                    180:     int i;
                    181:     int hchar, wchar, dummy;
                    182:     int rgb[3];
                    183:     int num_save;
                    184:     char *colors, *tok_end;
                    185:
                    186:     if (VDI_numpalette == 0 && (colors = getenv("GNUCOLORS")) && *colors) {
                    187:        for (i = 0; i < 17; i++) {
                    188:            if (!i) {
                    189:                VDI_c_height = strtoul(colors, &tok_end, 10);
                    190:                if (colors == tok_end) {
                    191:                    i = 0;
                    192:                    VDI_c_height = VDI_c_height_default;
                    193:                    break;
                    194:                }
                    195:            } else {
                    196:                if (*colors == NUL)
                    197:                    break;
                    198:                VDI_colors[i] = strtoul(colors, &tok_end, 16);
                    199:                if (colors == tok_end || (unsigned) VDI_colors[i] > 0xfff) {
                    200:                    i = 0;
                    201:                    break;
                    202:                }
                    203:            }
                    204:            colors = tok_end;
                    205:
                    206:            while (*colors == ' ')
                    207:                colors++;
                    208:        }
                    209:        VDI_numpalette = (i == 0 ? 0 : i - 1);
                    210:     }
                    211:     vdi_vdi_handle = graf_handle(&wchar, &hchar, &dummy, &dummy);
                    212:     if (!vdi_vdi_handle)
                    213:        int_error("Fatal error opening virtual workstation", NO_CARET);
                    214:
                    215:     for (i = 0; i < 10; work_in[i++] = 1);
                    216:     work_in[10] = 2;           /* use raster coordinates */
                    217:     v_opnvwk(work_in, &vdi_vdi_handle, work_out);
                    218:     if (!vdi_vdi_handle)
                    219:        int_error("Fatal error opening virtual workstation", NO_CARET);
                    220:
                    221:     vst_height(vdi_vdi_handle, VDI_c_height, &dummy, &dummy, &wchar, &hchar);
                    222:
                    223:     vs_clip(vdi_vdi_handle, 0, work_in);       /* turn clipping off */
                    224:
                    225:     term->xmax = work_out[0] + 1;
                    226:     term->ymax = work_out[1] + 1;
                    227:     term->h_char = wchar;
                    228:     term->v_char = hchar;      /* hchar stands for height this time */
                    229:     term->h_tic = (work_out[0] + 1) / 100;
                    230:     term->v_tic = term->h_tic;
                    231:
                    232:     VDI_maxycoord = work_out[1];
                    233:     VDI_numcolors = work_out[13];
                    234:     pxy_index = 0;
                    235:
                    236:     for (i = 0; i < VDI_numpalette; i++) {
                    237:        vq_color(vdi_vdi_handle, i, 1, VDI_savecolors[i]);
                    238:
                    239:        rgb[0] = 1000 * (VDI_colors[i] >> 8);
                    240:        rgb[0] /= 15;
                    241:        rgb[1] = 1000 * ((VDI_colors[i] >> 4) & 15);
                    242:        rgb[1] /= 15;
                    243:        rgb[2] = 1000 * (VDI_colors[i] & 15);
                    244:        rgb[2] /= 15;
                    245:        vs_color(vdi_vdi_handle, i, rgb);
                    246:     }
                    247: #ifdef __PUREC__
                    248: /* currently the PureC version runs as .prg and the GCC version runs as .ttp.
                    249:    Let's hope that we soon figure out which way is the best */
                    250:     v_hide_c(vdi_vdi_handle);
                    251: #endif
                    252: }
                    253:
                    254: TERM_PUBLIC void VDI_reset()
                    255: {
                    256:     int i;
                    257:
                    258:     if (vdi_vdi_handle != -1) {
                    259:        for (i = 0; i < VDI_numpalette; i++) {
                    260:            vs_color(vdi_vdi_handle, i, VDI_savecolors[i]);
                    261:        }
                    262: #ifdef __PUREC__
                    263: /* see above */
                    264:        v_show_c(vdi_vdi_handle, 0);
                    265: #endif
                    266:        v_clsvwk(vdi_vdi_handle);
                    267:        vdi_vdi_handle = -1;
                    268:     }
                    269: }
                    270:
                    271: TERM_PUBLIC void VDI_graphics()
                    272: {
                    273:     int pxy[8];
                    274:     MFDB mfdb;
                    275:
                    276:     fflush(stdout);
                    277:     fflush(stderr);
                    278:     Cconws("\033f");           /* turn cursor off */
                    279: /*  apparently v_clrwk doesn't work with overscan. We'll blit the screen clear.
                    280:     v_clrwk( vdi_vdi_handle );
                    281: */
                    282:     mfdb.fd_addr = NULL;       /* NULL means actual screen. So we don't need size etc. */
                    283:
                    284:     pxy[0] = pxy[4] = 0;
                    285:     pxy[1] = pxy[5] = 0;
                    286:     pxy[2] = pxy[6] = term->xmax - 1;
                    287:     pxy[3] = pxy[7] = term->ymax - 1;
                    288:
                    289:     vro_cpyfm(vdi_vdi_handle, ALL_WHITE /*0 */ ,
                    290:              pxy, &mfdb, &mfdb);
                    291:
                    292:     pxy_index = 0;
                    293: }
                    294:
                    295: TERM_PUBLIC void VDI_text()
                    296: {
                    297:     vdi_flush_line();
                    298:     Cnecin();                  /* wait for any char --> enable screen dump */
                    299:     Cconws("\033e");           /* turn cursor on again */
                    300: }
                    301:
                    302: TERM_PUBLIC void VDI_move(unsigned int x, unsigned int y)
                    303: {
                    304:     vdi_flush_line();
                    305:
                    306:     pxy_index = 1;
                    307:     pxy[0] = x;
                    308:     pxy[1] = VDI_yc(y);
                    309: }
                    310:
                    311: TERM_PUBLIC void VDI_vector(unsigned int x, unsigned int y)
                    312: {
                    313:     pxy[2 * pxy_index] = x;
                    314:     pxy[2 * pxy_index + 1] = VDI_yc(y);
                    315:     pxy_index++;
                    316:
                    317:     if (pxy_index == 64) {     /* we're all full */
                    318:        vdi_flush_line();
                    319:     }
                    320: }
                    321:
                    322: TERM_PUBLIC void VDI_linetype(int lt)
                    323: {
                    324:     vdi_flush_line();
                    325:
                    326:     VDI_lt = lt;
                    327: }
                    328:
                    329: TERM_PUBLIC void VDI_put_text(unsigned int x, unsigned int y, char *str)
                    330: {
                    331:     int vchar = term->v_char;
                    332:     int dummy;
                    333:
                    334:     if (!strlen(str))
                    335:        return;
                    336:
                    337:     if (x < 0)
                    338:        x = 0;
                    339:     if (y < 0)
                    340:        y = 0;
                    341:
                    342:     /* align text left and to middle of char height */
                    343:     vst_alignment(vdi_vdi_handle, 0, 5, &dummy, &dummy);
                    344:     vst_rotation(vdi_vdi_handle, (VDI_rotation ? 900 : 0));
                    345:     if (VDI_rotation)
                    346:        v_gtext(vdi_vdi_handle, x - vchar / 2 + 1, VDI_yc(y) - 1, str);
                    347:     else
                    348:        v_gtext(vdi_vdi_handle, x + 1, VDI_yc(y) - vchar / 2 + 1, str);
                    349: }
                    350:
                    351: TERM_PUBLIC int VDI_text_angle(int ang)
                    352: {
                    353:     VDI_rotation = ang;
                    354:
                    355:     return TRUE;
                    356: }
                    357:
                    358: TERM_PUBLIC int VDI_justify_text(enum JUSTIFY mode)
                    359: {
                    360:     return FALSE;
                    361: }
                    362:
                    363: TERM_PUBLIC void VDI_point(unsigned int x, unsigned int y, int number)
                    364: {
                    365:     int old_linetype;
                    366:
                    367:     if (VDI_numcolors == 2) {
                    368:        line_and_point(x, y, number);   /* monochrome */
                    369:     } else {
                    370:        /* we map colors that exceed our limit to dotted lines, but we can't do
                    371:           that with the markers (sortof a generalized line_and_point) */
                    372:        old_linetype = VDI_lt;
                    373:        if (VDI_lt > VDI_numcolors - 2) {
                    374:            /* same color, but no dots */
                    375:            VDI_linetype(VDI_lt % (VDI_numcolors - 2));
                    376:        }
                    377:        do_point(x, y, number);
                    378:        VDI_linetype(old_linetype);
                    379:     }
                    380: }
                    381:
                    382: static void vdi_flush_line()
                    383: {
                    384:     int line_type;
                    385:     int color_index;
                    386:     int i;
                    387:
                    388:     if (pxy_index >= 2) {
                    389:        if (VDI_numcolors == 2) {       /* Monochrome */
                    390:            color_index = 1;
                    391:            line_type = VDI_lt;
                    392:            if (line_type >= 0)
                    393:                line_type %= (VDI_LINETYPES_MAX - 2);
                    394:        } else {                /* Color */
                    395:            if (VDI_lt < 0) {
                    396:                color_index = 1;
                    397:                line_type = VDI_lt;
                    398:            } else {
                    399:                color_index = 2 + VDI_lt % (VDI_numcolors - 2);
                    400:                line_type = (VDI_lt / (VDI_numcolors - 2)) % (VDI_LINETYPES_MAX - 2);
                    401:            }
                    402:        }
                    403:
                    404:        vswr_mode(vdi_vdi_handle, MD_TRANS);
                    405:        vsl_color(vdi_vdi_handle, color_index);
                    406:
                    407:        vsl_type(vdi_vdi_handle, 7);
                    408:        vsl_udsty(vdi_vdi_handle, VDI_linetypes[line_type + 2]);
                    409:
                    410:        v_pline(vdi_vdi_handle, pxy_index, pxy);
                    411:     }
                    412:     if (pxy_index >= 1) {
                    413:        pxy[0] = pxy[2 * (pxy_index - 1)];
                    414:        pxy[1] = pxy[2 * (pxy_index - 1) + 1];
                    415:        pxy_index = 1;
                    416:     }
                    417: }
                    418:
                    419: #endif /* TERM_BODY */
                    420:
                    421: #ifdef TERM_TABLE
                    422:
                    423: TERM_TABLE_START(vdi_driver)
                    424:     "vdi", "Atari VDI-Terminal",
                    425:     VDI_XMAX, VDI_YMAX, VDI_VCHAR, VDI_HCHAR,
                    426:     VDI_VTIC, VDI_HTIC, VDI_options, VDI_init, VDI_reset,
                    427:     VDI_text, null_scale, VDI_graphics, VDI_move, VDI_vector,
                    428:     VDI_linetype, VDI_put_text, VDI_text_angle,
                    429:     VDI_justify_text, VDI_point, do_arrow, set_font_null,
                    430:     0, TERM_CAN_MULTIPLOT, 0, 0
                    431: TERM_TABLE_END(vdi_driver)
                    432:
                    433: #undef LAST_TERM
                    434: #define LAST_TERM vdi_driver
                    435:
                    436: #endif /* TERM_TABLE */
                    437:
                    438: #endif /* TERM_PROTO_ONLY */
                    439:
                    440: #ifdef TERM_HELP
                    441: START_HELP(vdi)
                    442: "1 atari ST (via VDI)",
                    443: "?commands set terminal vdi",
                    444: "?set terminal vdi",
                    445: "?set term vdi",
                    446: "?terminal vdi",
                    447: "?term vdi",
                    448: "?vdi",
                    449: " The `vdi` terminal is the same as the `atari` terminal, except that it sends",
                    450: " output to the screen via the VDI and not into AES-Windows.",
                    451: "",
                    452: " The `vdi` terminal has options to set the character size and the screen",
                    453: " colors.",
                    454: "",
                    455: " Syntax:",
                    456: "       set terminal vdi {<fontsize>} {<col0> <col1> ... <col15.}",
                    457: "",
                    458: " The character size must appear if any colors are to be specified.  Each of",
                    459: " the (up to 16) colors is given as a three-digit hex number, where the digits",
                    460: " represent RED, GREEN and BLUE (in that order).  The range of 0--15 is scaled",
                    461: " to whatever color range the screen actually has.  On a normal ST screen, odd",
                    462: " and even intensities are the same.",
                    463: "",
                    464: " Examples:",
                    465: "       set terminal vdi 4    # use small (6x6) font",
                    466: "       set terminal vdi 6 0  # set monochrome screen to white on black",
                    467: "       set terminal vdi 13 0 fff f00 f0 f ff f0f",
                    468: "                  # set first seven colors to black, white, green, blue,",
                    469: "                  # cyan, purple, and yellow and use large font (8x16).",
                    470: "",
                    471: " Additionally, if an environment variable GNUCOLORS exists, its contents are",
                    472: " interpreted as an options string, but an explicit terminal option takes",
                    473: " precedence."
                    474: END_HELP(vdi)
                    475: #endif /* TERM_HELP */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>