X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=term%2Fvws.trm;fp=term%2Fvws.trm;h=a07188307161d5d4eee1f52d0f800c0ce63d03d2;hb=39ec1247a71f61152a4a7f502a30f06a3896c5da;hp=0000000000000000000000000000000000000000;hpb=06be459be4f5f6a7c6ff878e84f355fb2575caa8;p=gnuplot diff --git a/term/vws.trm b/term/vws.trm new file mode 100644 index 0000000..a071883 --- /dev/null +++ b/term/vws.trm @@ -0,0 +1,494 @@ +/* Hello, Emacs, this is -*-C-*- + * $Id: vws.trm,v 1.18 2006/07/21 02:35:48 sfeam Exp $ + * + */ + +/* GNUPLOT - vws.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: + * IRIS terminals + * + * AUTHORS + * Walter Speth + * BITNET: SPETH@DBNPIB5 + * + * send your comments or suggestions to (gnuplot-info@lists.sourceforge.net). + * + */ +/* + * adapted to the new terminal layout by Stefan Bodewig (Dec. 1995) + * adapted to VAX VMS 4.7, VAX C 2.4 and activated the INTENSITY and COLOR + * monitor features (Lucas P. Hart, June 1997) + */ + +#include "driver.h" + +#ifdef TERM_REGISTER +register_term(vws) +#endif + +#ifdef TERM_PROTO +TERM_PUBLIC void VWS_init __PROTO((void)); +TERM_PUBLIC void VWS_reset __PROTO((void)); +TERM_PUBLIC void VWS_graphics __PROTO((void)); +TERM_PUBLIC void VWS_text __PROTO((void)); +TERM_PUBLIC void VWS_move __PROTO((unsigned int x, unsigned int y)); +TERM_PUBLIC void VWS_vector __PROTO((unsigned int x, unsigned int y)); +TERM_PUBLIC void VWS_linetype __PROTO((int lt)); +TERM_PUBLIC void VWS_put_text __PROTO((unsigned int x, unsigned int y, const char *str)); +TERM_PUBLIC int VWS_text_angle __PROTO((int ang)); +TERM_PUBLIC int VWS_justify_text __PROTO((enum JUSTIFY mode)); +TERM_PUBLIC void VWS_point __PROTO((unsigned int x, unsigned int y, int point)); +TERM_PUBLIC void VWS_arrow __PROTO((unsigned int sx, unsigned int sy, + unsigned int ex, unsigned int ey, int head)); + +#define VWS_XMAX 1024 +#define VWS_YMAX 780 /* VAXstation 2000 is 864 */ +#define VWS_VCHAR 25 +#define VWS_HCHAR 15 +#define VWS_VTIC 10 +#define VWS_HTIC 10 +#endif /* TERM_PROTO */ + +#ifndef TERM_PROTO_ONLY +#ifdef TERM_BODY +void VWS_resize_ast __PROTO((void)); + +#include +/* */ +#include + +#include +#include + +#define DEFAULT_ATTR 0 +#define OVER_ATTR 1 +#define ERAS_ATTR 2 +#define BIS_ATTR 3 +#define COLOR_ATTR 4 +#define TEXT_ATTR 5 +#define LINE_ATTR 6 +#define BACK_ATTR 7 + +float current_x, current_y; + +int vd_id, wd_id; +int vcm_id, ws_type; + +static $DESCRIPTOR(ws_devname, "SYS$WORKSTATION"); +static $DESCRIPTOR(vd_title, "gnuplot"); + +static float x0, y0, xsiz, ysiz, wc_xmin_new, wc_ymin_new, wc_xmax_new, wc_ymax_new, wc_xmin, +wc_ymin, wc_xmax, wc_ymax, vd_width, vd_height; + +void +VWS_resize_ast() +{ + uis$resize_window(&vd_id, &wd_id, &x0, &y0, &xsiz, &ysiz, + &wc_xmin, &wc_ymin, &wc_xmax, &wc_ymax); + replotrequest(); +} + +/****************************************************************************/ +TERM_PUBLIC void +VWS_init() +{ + int i; + int cattr; + $DESCRIPTOR(a_font, "DTABER0003WK00PG0001UZZZZ02A000"); + const int i0 = 0, i1 = 1, i2 = 2, i3 = 3, i4 = 4, i5 = 5, i6 = 6, i7 = 7, i8 = 8; + const float p0 = 0.0, p1 = 0.1, p2 = 0.2, p3 = 0.3, p4 = 0.4; + const float p5 = 0.5, p6 = 0.6, p7 = 0.7, p8 = 0.8, p9 = 0.9; + const int n1 = 0xFFFFFFFF; + const int uis$c_mode_over = UIS$C_MODE_OVER; + const int uis$c_mode_eras = UIS$C_MODE_ERAS; + const int uis$c_mode_bis = UIS$C_MODE_BIS; + const float vws_hchar = (float) VWS_HCHAR; + const float vws_vchar = (float) VWS_VCHAR; + const int default_attr = DEFAULT_ATTR; + const int over_attr = OVER_ATTR; + const int eras_attr = ERAS_ATTR; + const int bis_attr = BIS_ATTR; + const int color_attr = COLOR_ATTR; + const int text_attr = TEXT_ATTR; + const int line_attr = LINE_ATTR; + const int back_attr = BACK_ATTR; + +/* lph: the similar notation may lead to some confusion + * attributes are grouped in "attribute block" data structures + * which are referenced by block number + * attribute block 0 contains default attribute settings + * + * To customize settings, a function will read the source + * attribute block, set the particular attribute, and + * write to the destination attribute block. + * Both the block number and attribute are integers, so it + * is easy to confuse an attribute and an attribute blcok + */ + +/* lph: Color map corresponding to an example in + * MicroVMS Graphics Progamming Guide (V3.0) */ + + const float r_map[8] = { 0.40, 0.50, 0.50, 0.00, 0.25, 0.90, 0.80, 0.35 }; + const float g_map[8] = { 0.30, 0.50, 0.25, 0.70, 0.25, 0.50, 0.30, 0.65 }; + const float b_map[8] = { 0.00, 0.50, 0.50, 0.30, 0.90, 0.00, 0.00, 0.95 }; + +/* the array format is easier to customize */ + + vd_width = 14; + vd_height = 10; /* aspect sqrt(2) as DIN A paper */ + + wc_xmin = 0.0; + wc_ymin = 0.0; + wc_xmax = (float) VWS_XMAX; + wc_ymax = (float) VWS_YMAX; + + vcm_id = uis$create_color_map(&i8); + + vd_id = uis$create_display(&wc_xmin, &wc_ymin, &wc_xmax, &wc_ymax, + &vd_width, &vd_height, &vcm_id); + uis$get_hw_color_info(&ws_devname, &ws_type); + +/* lph: ws's color table for monochrome */ +/* by default, color table index 0 is backgound, and 1 is foregound */ +/* a color {index into the color table} is assigned to the active line */ +/* in VWS_linetype */ + + if (ws_type == UIS$C_DEV_MONO) { + uis$set_color(&vd_id, &i0, &p5, &p5, &p5); + uis$set_color(&vd_id, &i1, &p0, &p0, &p0); + uis$set_color(&vd_id, &i2, &p0, &p0, &p0); + uis$set_color(&vd_id, &i3, &p0, &p0, &p0); + uis$set_color(&vd_id, &i4, &p0, &p0, &p0); + uis$set_color(&vd_id, &i5, &p0, &p0, &p0); + uis$set_color(&vd_id, &i6, &p0, &p0, &p0); + uis$set_color(&vd_id, &i7, &p0, &p0, &p0); + } else if (ws_type == UIS$C_DEV_INTENSITY) { + /* Intensity scale, untested */ + uis$set_color(&vd_id, &i2, &p2, &p2, &p2); + uis$set_color(&vd_id, &i3, &p3, &p3, &p3); + uis$set_color(&vd_id, &i4, &p4, &p4, &p4); + uis$set_color(&vd_id, &i5, &p5, &p5, &p5); + uis$set_color(&vd_id, &i6, &p6, &p6, &p6); + uis$set_color(&vd_id, &i7, &p7, &p7, &p7); + } + /* ws: perhaps better for color terms (which I do not have) */ + + else if (ws_type == UIS$C_DEV_COLOR) { +/* */ + uis$set_color(&vd_id, &i0, &p0, &p0, &p0); + uis$set_color(&vd_id, &i1, &p9, &p0, &p0); + uis$set_color(&vd_id, &i2, &p0, &p9, &p0); + uis$set_color(&vd_id, &i3, &p9, &p9, &p0); + uis$set_color(&vd_id, &i4, &p0, &p0, &p9); + uis$set_color(&vd_id, &i5, &p9, &p0, &p9); + uis$set_color(&vd_id, &i6, &p0, &p9, &p9); + uis$set_color(&vd_id, &i7, &p9, &p9, &p9); + /* + * lph: Another way to set up the color table is to use arrays, + * which simplifies customizing the appearance. + * + uis$set_colors(&vd_id, &i0, &i8, &r_map, &g_map, &b_map); + */ + } + uis$disable_display_list(&vd_id); + + wd_id = uis$create_window(&vd_id, &ws_devname, &vd_title, + &wc_xmin, &wc_ymin, &wc_xmax, &wc_ymax, + &vd_width, &vd_height); + + uis$set_resize_ast(&vd_id, &wd_id, &VWS_resize_ast, &i0, + &x0, &y0, &xsiz, &ysiz, + &wc_xmin_new, &wc_ymin_new, &wc_xmax_new, &wc_ymax_new); +/* + * lph: This sets up three different attribute blocks, each having a different + * mode, but they are never utilized and it is not clear when they might + * be of use. + * The attribute blocks used for writing are line_attr, text_attr. + * + uis$set_writing_mode(&vd_id, &default_attr, &over_attr, &uis$c_mode_over); + uis$set_writing_mode(&vd_id, &default_attr, &eras_attr, &uis$c_mode_eras); + uis$set_writing_mode(&vd_id, &default_attr, &bis_attr, &uis$c_mode_bis); + */ + +/* lph: this was commented out; it changes the COLOR_ATTR BLOCK and + * the following BLOCKS + * +if (ws_type >= UIS$C_DEV_INTENSITY) { + for (i=0; i<8; i++) { + cattr = COLOR_ATTR+i; + uis$set_writing_index(&vd_id, &default_attr, &cattr, &i); + } + } + * + */ + +/* lph: default value for the background index into the virtual color + * table is 0, and the back_attr block is never used + * + uis$set_background_index(&vd_id, &default_attr, &back_attr, &i0); + * + * the rest look OK, setting up the two attribute blocks + */ + uis$set_writing_mode(&vd_id, &default_attr, &text_attr, &uis$c_mode_over); + uis$set_font(&vd_id, &text_attr, &text_attr, &a_font); + uis$set_char_size(&vd_id, &text_attr, &text_attr, &i0, &vws_hchar, &vws_vchar); + uis$set_line_style(&vd_id, &line_attr, &line_attr, &n1); +} + +/****************************************************************************/ + +TERM_PUBLIC void +VWS_reset() +{ + uis$delete_display(&vd_id); +} + +/****************************************************************************/ +TERM_PUBLIC void +VWS_graphics() +{ + uis$erase(&vd_id, &wc_xmin, &wc_ymin, &wc_xmax, &wc_ymax); +} + +/****************************************************************************/ +TERM_PUBLIC void +VWS_text() +{ +} + +/****************************************************************************/ +TERM_PUBLIC void +VWS_move(unsigned int x, unsigned int y) +{ + current_x = (float) (x); + current_y = (float) (y); +} + +/****************************************************************************/ +TERM_PUBLIC void +VWS_vector(unsigned int x, unsigned int y) +{ + int col; + int line_attr = LINE_ATTR; + float fx, fy; + fx = (float) x; + fy = (float) y; + + uis$line(&vd_id, &line_attr, ¤t_x, ¤t_y, &fx, &fy); + VWS_move(x, y); +} + +/****************************************************************************/ +TERM_PUBLIC void +VWS_linetype(int lt) +{ + const int n1 = 0xFFFFFFFF; + /* indices into the color map */ + const int i[8] = {0, 1, 2, 3, 4, 5, 6, 7}; + const float p15 = 2.0, p20 = 3.0, p10 = 1.0; + long int lstyle[9] = + {0xffffffff, + 0Xff00ff00, + 0xffffff00, + 0xffff0000, + 0xf0f0f0f0, + 0Xfff0fff0, + 0xf000f000, + 0xa5a5a5af, + 0xf00f00f0 + }; + int line_attr = LINE_ATTR; + /* use multiplier of normal line width; default is width in pixels */ + const int uis$c_width_world = UIS$C_WIDTH_WORLD; + + if (lt < 0) { + switch (lt) { + case LT_AXIS: /* used for axis */ + uis$set_line_style(&vd_id, &line_attr, &line_attr, &n1); + uis$set_line_width(&vd_id, &line_attr, &line_attr, &p15, + &uis$c_width_world); + if (ws_type >= UIS$C_DEV_INTENSITY) { + uis$set_writing_index(&vd_id, &line_attr, &line_attr, &i[1]); + } + break; + case LT_BLACK: /* the borders */ + uis$set_line_style(&vd_id, &line_attr, &line_attr, &n1); + uis$set_line_width(&vd_id, &line_attr, &line_attr, &p20, + &uis$c_width_world); + if (ws_type >= UIS$C_DEV_INTENSITY) { + uis$set_writing_index(&vd_id, &line_attr, &line_attr, &i[1]); + } + break; + default: /* else a thick line ? */ + uis$set_line_style(&vd_id, &line_attr, &line_attr, &n1); + uis$set_line_width(&vd_id, &line_attr, &line_attr, &p20, + &uis$c_width_world); + if (ws_type >= UIS$C_DEV_INTENSITY) { + uis$set_writing_index(&vd_id, &line_attr, &line_attr, + &i[1 + ((-lt) % 7)]); + } + break; + } + } else { +/* assign the color index (excluding the background index, 0*/ + if (ws_type >= UIS$C_DEV_INTENSITY) { + uis$set_writing_index(&vd_id, &line_attr, &line_attr, &i[1 + lt % 7]); + } +/* assign the line style + uis$set_line_style(&vd_id,&line_attr,&line_attr,&lstyle[lt % 8]); + * ws: makes part of curve disappear on my workstation + * lph: also observed w/ VS2000 and 4 plane graphics coprocesssor; line + * types change appropriately, but has problems as pixels/line segment + * decreases. Better with full screen display and "set samples" smaller + * but start out with only solid lines + */ + uis$set_line_style(&vd_id, &line_attr, &line_attr, &n1); + + uis$set_line_width(&vd_id, &line_attr, &line_attr, &p10, + &uis$c_width_world); + } +} + +/****************************************************************************/ +static int justify_mode = CENTRE, up; + +TERM_PUBLIC void +VWS_put_text(unsigned int x, unsigned int y, const char *str) +{ + float fx, fy, thih, twid; + int text_attr = TEXT_ATTR; + + /* uis$text parameter is descriptor string not character string */ + + struct dsc$descriptor_s textline = + {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, ""}; + + + textline.dsc$a_pointer = str; + textline.dsc$w_length = strlen(textline.dsc$a_pointer); + uis$measure_text(&vd_id, &text_attr, &textline, &twid, &thih); + fx = (float) x; + fy = (float) y; + + switch (justify_mode) { + case LEFT: + fy += thih / 2.; + break; + case RIGHT: + fy += thih / 2.; + fx -= twid; + break; + + case CENTRE: + fy += thih / 2.; + fx -= twid / 2; + break; + }; + + uis$text(&vd_id, &text_attr, &textline, &fx, &fy); + /* write to Example Viewport window */ + + +} +/****************************************************************************/ +TERM_PUBLIC int +VWS_text_angle(int ang) +{ + float degrees; + int text_attr = TEXT_ATTR; + up = (ang ? 1 : 0); + degrees = 90. * up; + uis$set_text_slope(&vd_id, &text_attr, &text_attr, °rees); + return TRUE; +} +/****************************************************************************/ +TERM_PUBLIC int +VWS_justify_text(enum JUSTIFY mode) +{ + justify_mode = mode; + return TRUE; +} +/****************************************************************************/ +TERM_PUBLIC void +VWS_point(unsigned int x, unsigned int y, int point) +{ + do_point(x, y, point); +} + +/****************************************************************************/ +TERM_PUBLIC void +VWS_arrow( + unsigned int sx, unsigned int sy, + unsigned int ex, unsigned int ey, + int head) +{ + do_arrow(sx, sy, ex, ey, head); +} + +#endif /* TERM_BODY */ + +#ifdef TERM_TABLE + +TERM_TABLE_START(vws_driver) + "VWS", "VAX Windowing System (UIS)", + VWS_XMAX, VWS_YMAX, VWS_VCHAR, VWS_HCHAR, + VWS_VTIC, VWS_HTIC, options_null, VWS_init, VWS_reset, + VWS_text, null_scale, VWS_graphics, VWS_move, VWS_vector, + VWS_linetype, VWS_put_text, VWS_text_angle, + VWS_justify_text, do_point, do_arrow, set_font_null +TERM_TABLE_END(vws_driver) + +#undef LAST_TERM +#define LAST_TERM vws_driver + +#endif /* TERM_TABLE */ +#endif /* TERM_PROTO_ONLY */ + +#ifdef TERM_HELP +START_HELP(VWS) +"1 VWS", +"?commands set terminal VWS", +"?set terminal VWS", +"?set term VWS", +"?terminal VWS", +"?term VWS", +"?VWS", +" The `VWS` terminal driver supports the VAX Windowing System. It has", +" no options. It will sense the display type (monochrome, gray scale,", +" or color.) All line styles are plotted as solid lines." +END_HELP(VWS) +#endif /* TERM_HELP */