[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.1     ! maekawa     1: /*
        !             2:  * $Id: atarivdi.trm,v 1.7 1998/06/18 14:59:18 ddenholm Exp $
        !             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>