Annotation of OpenXM_contrib/gnuplot/term/sun.trm, Revision 1.1
1.1 ! maekawa 1: /*
! 2: * $Id: sun.trm,v 1.15 1998/04/14 00:18:07 drd Exp $
! 3: *
! 4: */
! 5:
! 6: /* GNUPLOT - sun.trm */
! 7:
! 8: /*[
! 9: * Copyright 1990 - 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: * SUNview windowing system
! 43: *
! 44: * AUTHORS
! 45: * Maurice Castro
! 46: *
! 47: * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
! 48: *
! 49: */
! 50: /*
! 51: * adapted to the new terminal layout by Stefan Bodewig (Dec. 1995)
! 52: */
! 53:
! 54: #include "driver.h"
! 55:
! 56: #ifdef TERM_REGISTER
! 57: register_term(sun)
! 58: #endif
! 59:
! 60: #ifdef TERM_PROTO
! 61: TERM_PUBLIC void SUN_init __PROTO((void));
! 62: TERM_PUBLIC void SUN_graphics __PROTO((void));
! 63: TERM_PUBLIC void SUN_text __PROTO((void));
! 64: TERM_PUBLIC void SUN_linetype __PROTO((int linetype));
! 65: TERM_PUBLIC void SUN_move __PROTO((unsigned int x, unsigned int y));
! 66: TERM_PUBLIC void SUN_vector __PROTO((unsigned int x, unsigned int y));
! 67: TERM_PUBLIC void SUN_put_text __PROTO((unsigned int x, unsigned int y, char *str));
! 68: TERM_PUBLIC int SUN_justify_text __PROTO((enum JUSTIFY mode));
! 69: TERM_PUBLIC void SUN_reset __PROTO((void));
! 70: #define SUN_XMAX 600
! 71: #define SUN_YMAX 512
! 72:
! 73: #define SUN_VCHAR (12) /* default, will be changed */
! 74: #define SUN_HCHAR (8) /* default, will be changed */
! 75: #define SUN_VTIC (SUN_YMAX/80)
! 76: #define SUN_HTIC (SUN_XMAX/80)
! 77: #endif /* TERM_PROTO */
! 78:
! 79: #ifndef TERM_PROTO_ONLY
! 80: #ifdef TERM_BODY
! 81: #include <suntool/sunview.h>
! 82: #include <suntool/canvas.h>
! 83: #include <suntool/scrollbar.h>
! 84: #include <suntool/panel.h>
! 85: #include <pixrect/pixrect_hs.h>
! 86:
! 87: void sun_setmaskpixel __PROTO((unsigned int x, unsigned int y, unsigned int value));
! 88: void sun_line __PROTO((unsigned int x1, unsigned int x2, unsigned int y1, unsigned int y2));
! 89: static Notify_value local_notice_destroy __PROTO((Frame frame, Destroy_status status));
! 90:
! 91: #define MARGIN 5
! 92: #define MINWIN 128
! 93:
! 94: static Frame frame;
! 95: static Canvas canvas;
! 96: static Pixwin *pw;
! 97: static struct pixfont *sun_font = NULL;
! 98:
! 99: static enum JUSTIFY sun_justify = LEFT;
! 100:
! 101: static Notify_value local_notice_destroy();
! 102:
! 103: extern Notify_error notify_dispatch();
! 104:
! 105: /* dotted line generator */
! 106: unsigned int sun_value = 1; /* this can be used for colour */
! 107: unsigned int sun_line_mask = 0xffff; /* 16 bit mask for dotted lines */
! 108: static unsigned int sun_pattern[] =
! 109: {0xffff, 0x1111,
! 110: 0xffff, 0x5555, 0x3333, 0x7777, 0x3f3f, 0x0f0f, 0x5f5f};
! 111: int sun_mask_count = 0;
! 112: unsigned int sun_lastx, sun_lasty; /* last pixel set - used by sun_line */
! 113:
! 114:
! 115: TERM_PUBLIC void SUN_init()
! 116: {
! 117: struct termentry *t = term;
! 118: struct pr_subregion bound;
! 119:
! 120: frame = window_create(NULL, FRAME,
! 121: FRAME_LABEL, "Gnuplot",
! 122: 0);
! 123: notify_interpose_destroy_func(frame, local_notice_destroy);
! 124: canvas = window_create(frame, CANVAS,
! 125: CANVAS_AUTO_EXPAND, TRUE,
! 126: CANVAS_AUTO_SHRINK, TRUE,
! 127: CANVAS_MARGIN, MARGIN,
! 128: 0);
! 129: notify_do_dispatch();
! 130: pw = canvas_pixwin(canvas);
! 131: window_set(frame, WIN_SHOW, TRUE, 0);
! 132:
! 133: /* figure out font and rough size */
! 134: sun_font = pf_default();
! 135: pf_textbound(&bound, 1, sun_font, "M");
! 136: t->v_char = bound.size.y;
! 137: t->h_char = bound.size.x;
! 138:
! 139: return;
! 140: }
! 141:
! 142: TERM_PUBLIC void SUN_graphics()
! 143: {
! 144: term->xmax = (int) window_get(canvas, CANVAS_WIDTH);
! 145: term->ymax = (int) window_get(canvas, CANVAS_HEIGHT);
! 146: pw_writebackground(pw, 0, 0, term->xmax, term->ymax, PIX_SRC);
! 147: notify_dispatch();
! 148: /* do not let the user make the window too small */
! 149: if ((term->xmax) < MINWIN) {
! 150: window_set(frame,
! 151: WIN_WIDTH, MINWIN + 2 * MARGIN + 24,
! 152: 0);
! 153: notify_dispatch();
! 154: SUN_graphics();
! 155: }
! 156: if ((term->ymax) < MINWIN) {
! 157: window_set(frame,
! 158: WIN_HEIGHT, MINWIN + 2 * MARGIN + 24,
! 159: 0);
! 160: notify_dispatch();
! 161: SUN_graphics();
! 162: }
! 163: notify_dispatch();
! 164: return;
! 165: }
! 166:
! 167: TERM_PUBLIC void SUN_text()
! 168: {
! 169: notify_dispatch();
! 170: return; /* enter text from another window!!! */
! 171: }
! 172:
! 173: TERM_PUBLIC void SUN_linetype(linetype)
! 174: int linetype;
! 175: {
! 176: if (linetype >= 7)
! 177: linetype %= 7;
! 178: sun_line_mask = sun_pattern[linetype + 2];
! 179: sun_mask_count = 0;
! 180: }
! 181:
! 182:
! 183: TERM_PUBLIC void SUN_move(x, y)
! 184: unsigned int x, y;
! 185: {
! 186: sun_lastx = x;
! 187: sun_lasty = y;
! 188: notify_dispatch();
! 189: return;
! 190: }
! 191:
! 192: TERM_PUBLIC void SUN_vector(x, y)
! 193: unsigned int x, y;
! 194: {
! 195: if ((x >= term->xmax) || (y >= term->ymax))
! 196: return;
! 197: sun_line(sun_lastx, x, sun_lasty, y);
! 198: canvas_pixwin(canvas);
! 199: notify_dispatch();
! 200: return;
! 201: }
! 202:
! 203: TERM_PUBLIC void SUN_put_text(x, y, str)
! 204: unsigned int x, y;
! 205: char *str;
! 206: {
! 207: struct pr_subregion bound;
! 208:
! 209: if ((x >= term->xmax) || (y >= term->ymax))
! 210: return;
! 211:
! 212: pf_textbound(&bound, strlen(str), sun_font, str);
! 213: y = term->ymax - 1 - y + bound.size.y / 3; /* vertical centering */
! 214:
! 215: switch (sun_justify) {
! 216: case LEFT:
! 217: break;
! 218: case CENTRE:
! 219: x -= bound.size.x / 2;
! 220: break;
! 221: case RIGHT:
! 222: x -= bound.size.x;
! 223: break;
! 224: }
! 225: pw_text(pw, x, y, PIX_SRC | PIX_DST, 0, str);
! 226: canvas_pixwin(canvas);
! 227: notify_dispatch();
! 228: return;
! 229: }
! 230:
! 231:
! 232: TERM_PUBLIC int SUN_justify_text(mode)
! 233: enum JUSTIFY mode;
! 234: {
! 235: sun_justify = mode;
! 236: return (TRUE);
! 237: }
! 238:
! 239:
! 240:
! 241:
! 242: TERM_PUBLIC void SUN_reset()
! 243: {
! 244:
! 245: term->xmax = SUN_XMAX;
! 246: term->ymax = SUN_YMAX;
! 247: window_set(frame, WIN_SHOW, FALSE, 0);
! 248: return;
! 249: }
! 250:
! 251:
! 252:
! 253: void sun_setmaskpixel(x, y, value)
! 254: unsigned int x, y, value;
! 255: {
! 256: /* dotted line generator */
! 257: if ((sun_line_mask >> sun_mask_count) & (unsigned int) (1)) {
! 258: pw_put(pw, x, term->ymax - 1 - y, sun_value);
! 259: }
! 260: sun_mask_count = (sun_mask_count + 1) % 16;
! 261: sun_lastx = x; /* last pixel set with mask */
! 262: sun_lasty = y;
! 263: }
! 264:
! 265:
! 266:
! 267:
! 268: void sun_line(x1, x2, y1, y2)
! 269: unsigned int x1, x2, y1, y2;
! 270: {
! 271: int runcount;
! 272: int dx, dy;
! 273: int xinc, yinc;
! 274: unsigned int xplot, yplot;
! 275:
! 276: runcount = 0;
! 277: dx = ABS((int) (x1) - (int) (x2));
! 278: if (x2 > x1)
! 279: xinc = 1;
! 280: if (x2 == x1)
! 281: xinc = 0;
! 282: if (x2 < x1)
! 283: xinc = -1;
! 284: dy = ABS((int) (y1) - (int) (y2));
! 285: if (y2 > y1)
! 286: yinc = 1;
! 287: if (y2 == y1)
! 288: yinc = 0;
! 289: if (y2 < y1)
! 290: yinc = -1;
! 291: xplot = x1;
! 292: yplot = y1;
! 293: if (dx > dy) {
! 294: /* iterate x */
! 295: if ((sun_line_mask == 0xffff) ||
! 296: ((xplot != sun_lastx) && (yplot != sun_lasty)))
! 297: sun_setmaskpixel(xplot, yplot, sun_value);
! 298: while (xplot != x2) {
! 299: xplot += xinc;
! 300: runcount += dy;
! 301: if (runcount >= (dx - runcount)) {
! 302: yplot += yinc;
! 303: runcount -= dx;
! 304: }
! 305: sun_setmaskpixel(xplot, yplot, sun_value);
! 306: }
! 307: } else {
! 308: /* iterate y */
! 309: if ((sun_line_mask == 0xffff) ||
! 310: ((xplot != sun_lastx) && (yplot != sun_lasty)))
! 311: sun_setmaskpixel(xplot, yplot, sun_value);
! 312: while (yplot != y2) {
! 313: yplot += yinc;
! 314: runcount += dx;
! 315: if (runcount >= (dy - runcount)) {
! 316: xplot += xinc;
! 317: runcount -= dy;
! 318: }
! 319: sun_setmaskpixel(xplot, yplot, sun_value);
! 320: }
! 321: }
! 322: }
! 323:
! 324:
! 325: static Notify_value local_notice_destroy(frame, status)
! 326: Frame frame;
! 327: Destroy_status status;
! 328: {
! 329: if (status != DESTROY_CHECKING) {
! 330: SUN_reset();
! 331: /* extern TBOOLEAN term_init is gone; is it sufficient just */
! 332: /* to comment it out? -lh */
! 333: /* term_init = FALSE; */
! 334: }
! 335: return (NOTIFY_DONE);
! 336: }
! 337:
! 338: #endif /* TERM_BODY */
! 339:
! 340: #ifdef TERM_TABLE
! 341:
! 342: TERM_TABLE_START(sun_driver)
! 343: "sun", "SunView window system",
! 344: SUN_XMAX, SUN_YMAX, SUN_VCHAR, SUN_HCHAR,
! 345: SUN_VTIC, SUN_HTIC, options_null, SUN_init, SUN_reset,
! 346: SUN_text, null_scale, SUN_graphics, SUN_move, SUN_vector,
! 347: SUN_linetype, SUN_put_text, null_text_angle,
! 348: SUN_justify_text, line_and_point, do_arrow, set_font_null
! 349: TERM_TABLE_END(sun_driver)
! 350:
! 351: #undef LAST_TERM
! 352: #define LAST_TERM sun_driver
! 353:
! 354: #endif /* TERM_TABLE */
! 355: #endif /* TERM_PROTO_ONLY */
! 356:
! 357: #ifdef TERM_HELP
! 358: START_HELP(sun)
! 359: "1 sun",
! 360: "?commands set terminal sun",
! 361: "?set terminal sun",
! 362: "?set term sun",
! 363: "?terminal sun",
! 364: "?term sun",
! 365: "?sun",
! 366: " The `sun` terminal driver supports the SunView window system. It has no",
! 367: " options."
! 368: END_HELP(sun)
! 369: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>