/* * $Id: vws.trm,v 1.7 1998/12/14 18:41:49 lhecking Exp $ * */ /* GNUPLOT - vws.trm */ /*[ * Copyright 1990 - 1993, 1998 * * 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 (info-gnuplot@dartmouth.edu). * */ /* * 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 int VWS_scale __PROTO((double xs, double ys)); 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, 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() { extern void replotrequest(); /* in command.c */ 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 int VWS_scale(xs, ys) double xs, ys; { return FALSE; } /****************************************************************************/ 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(x, y) unsigned int x, y; { current_x = (float) (x); current_y = (float) (y); } /****************************************************************************/ TERM_PUBLIC void VWS_vector(x, y) unsigned int x, 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(lt) 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 -1: /* 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 -2: /* 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(x, y, str) unsigned int x, y; 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(ang) int ang; { float degrees; int text_attr = TEXT_ATTR; degrees = 90. * (up = ang); uis$set_text_slope(&vd_id, &text_attr, &text_attr, °rees); return TRUE; } /****************************************************************************/ TERM_PUBLIC int VWS_justify_text(mode) enum JUSTIFY mode; { justify_mode = mode; return TRUE; } /****************************************************************************/ TERM_PUBLIC void VWS_point(x, y, point) unsigned int x, y; int point; { do_point(x, y, point); } /****************************************************************************/ TERM_PUBLIC void VWS_arrow(sx, sy, ex, ey, head) unsigned int sx, sy, ex, 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 */