/* prototypes for this file are in sun.trm-proto */ /* GNUPLOT - sun.trm */ /* * Copyright (C) 1990 * * 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 modified code. Modifications are to be distributed * as patches to released version. * * This software is provided "as is" without express or implied warranty. * * This file is included by ../term.c. * * This terminal driver supports: * SUNview windowing system * * AUTHORS * Maurice Castro * * send your comments or suggestions to (pixar!info-gnuplot@sun.com). * */ #include #include #include #include #include #define SUN_XMAX 600 #define SUN_YMAX 512 #define SUN_VCHAR (12) /* default, will be changed */ #define SUN_HCHAR (8) /* default, will be changed */ #define SUN_VTIC (SUN_YMAX/80) #define SUN_HTIC (SUN_XMAX/80) #define MARGIN 5 #define MINWIN 128 static Frame frame; static Canvas canvas; static Pixwin *pw; static struct pixfont *sun_font = NULL; static enum JUSTIFY sun_justify=LEFT; static Notify_value local_notice_destroy(Frame frame, Destroy_status status); /* dotted line generator */ int sun_value = 1; /* this can be used for colour */ int sun_line_mask = 0xffff; /* 16 bit mask for dotted lines */ static int sun_pattern[] = {0xffff, 0x1111, 0xffff, 0x5555, 0x3333, 0x7777, 0x3f3f, 0x0f0f, 0x5f5f}; int sun_mask_count = 0; int sun_lastx, sun_lasty; /* last pixel set - used by sun_line */ int SUN_init(void) { struct termentry *t = &term_tbl[term]; struct pr_subregion bound; frame = window_create(NULL, FRAME, FRAME_LABEL, "Gnuplot", 0); notify_interpose_destroy_func(frame, local_notice_destroy); canvas = window_create(frame, CANVAS, CANVAS_AUTO_EXPAND, TRUE, CANVAS_AUTO_SHRINK, TRUE, CANVAS_MARGIN, MARGIN, 0); notify_do_dispatch(); pw = canvas_pixwin(canvas); window_set(frame, WIN_SHOW, TRUE, 0); /* figure out font and rough size */ sun_font = pf_default(); pf_textbound(&bound, 1, sun_font, "M"); t->v_char = bound.size.y; t->h_char = bound.size.x; return; } int SUN_graphics(void) { term_tbl[term].xmax = (int) window_get(canvas, CANVAS_WIDTH); term_tbl[term].ymax = (int) window_get(canvas, CANVAS_HEIGHT); pw_writebackground(pw, 0, 0, term_tbl[term].xmax, term_tbl[term].ymax, PIX_SRC ); notify_dispatch(); /* do not let the user make the window too small */ if ((term_tbl[term].xmax)=7) linetype %= 7; sun_line_mask = sun_pattern[linetype+2]; sun_mask_count=0; } int SUN_move(int x, int y) { sun_lastx = x; sun_lasty = y; notify_dispatch(); return; } int SUN_vector(int x, int y) { if ( (x>=term_tbl[term].xmax) || (y>=term_tbl[term].ymax) ) return; sun_line(sun_lastx, x, sun_lasty, y); canvas_pixwin(canvas); notify_dispatch(); return; } int SUN_put_text(int x, int y, char *str) { struct pr_subregion bound; if ( (x>=term_tbl[term].xmax) || (y>=term_tbl[term].ymax) ) return; pf_textbound(&bound, strlen(str), sun_font, str); y = term_tbl[term].ymax-1-y + bound.size.y/3; /* vertical centering */ switch(sun_justify) { case LEFT: break; case CENTRE: x -= bound.size.x/2; break; case RIGHT: x -= bound.size.x; break; } pw_text(pw, x, y, PIX_SRC | PIX_DST, 0, str); canvas_pixwin(canvas); notify_dispatch(); return; } int SUN_justify_text(enum JUSTIFY mode) { sun_justify = mode; return (TRUE); } int SUN_reset(void) { term_tbl[term].xmax = SUN_XMAX; term_tbl[term].ymax = SUN_YMAX; window_set(frame, WIN_SHOW, FALSE, 0); return; } int sun_setmaskpixel(int x, int y, int value) { /* dotted line generator */ if ((sun_line_mask>>sun_mask_count)&(int)(1)) { pw_put(pw, x, term_tbl[term].ymax-1-y, sun_value); } sun_mask_count= (sun_mask_count+1) % 16; sun_lastx= x; /* last pixel set with mask */ sun_lasty= y; } int sun_line(int x1, int x2, int y1, int y2) { int runcount; int dx, dy; int xinc, yinc; int xplot, yplot; runcount=0; dx = abs((int)(x1)-(int)(x2)); if (x2>x1) xinc= 1; if (x2==x1) xinc= 0; if (x2y1) yinc= 1; if (y2==y1) yinc= 0; if (y2dy) { /* iterate x */ if ( (sun_line_mask==0xffff) || ((xplot!=sun_lastx) && (yplot!=sun_lasty)) ) sun_setmaskpixel(xplot, yplot, sun_value); while (xplot!=x2) { xplot+=xinc; runcount+=dy; if (runcount>=(dx-runcount)) { yplot+=yinc; runcount-=dx; } sun_setmaskpixel(xplot, yplot, sun_value); } } else { /* iterate y */ if ( (sun_line_mask==0xffff) || ((xplot!=sun_lastx) && (yplot!=sun_lasty)) ) sun_setmaskpixel(xplot, yplot, sun_value); while (yplot!=y2) { yplot+=yinc; runcount+=dx; if (runcount>=(dy-runcount)) { xplot+=xinc; runcount-=dy; } sun_setmaskpixel(xplot, yplot, sun_value); } } } static Notify_value local_notice_destroy(Frame frame, Destroy_status status) { if (status != DESTROY_CHECKING) { SUN_reset(); term_init = FALSE; } return(NOTIFY_DONE); }