Artifact ddaeab5ae8394259d5ec567243ebe0a77db23a16c1fa6ccf869276be1b8017e9:
- File
r34.1/plot/term/sun.trm
— part of check-in
[f2fda60abd]
at
2011-09-02 18:13:33
on branch master
— Some historical releases purely for archival purposes
git-svn-id: https://svn.code.sf.net/p/reduce-algebra/code/trunk/historical@1375 2bfe0521-f11c-4a00-b80e-6202646ff360 (user: arthurcnorman@users.sourceforge.net, size: 6234) [annotate] [blame] [check-ins using] [more...]
/* * $Id: sun.trm,v 3.26 92/03/24 22:35:43 woo Exp Locker: woo $ */ /* GNUPLOT - sun.trm */ /* * Copyright (C) 1990, 1991, 1992 * * 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 (info-gnuplot@ames.arc.nasa.gov). * */ #include <suntool/sunview.h> #include <suntool/canvas.h> #include <suntool/scrollbar.h> #include <suntool/panel.h> #include <pixrect/pixrect_hs.h> #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(); extern Notify_error notify_dispatch(); /* dotted line generator */ unsigned int sun_value = 1; /* this can be used for colour */ unsigned int sun_line_mask = 0xffff; /* 16 bit mask for dotted lines */ static unsigned int sun_pattern[] = {0xffff, 0x1111, 0xffff, 0x5555, 0x3333, 0x7777, 0x3f3f, 0x0f0f, 0x5f5f}; int sun_mask_count = 0; unsigned int sun_lastx, sun_lasty; /* last pixel set - used by sun_line */ SUN_init() { 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; } SUN_graphics() { 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)<MINWIN) { window_set(frame, WIN_WIDTH, MINWIN+2*MARGIN+24, 0); notify_dispatch(); SUN_graphics(); } if ((term_tbl[term].ymax) <MINWIN) { window_set(frame, WIN_HEIGHT, MINWIN+2*MARGIN+24, 0); notify_dispatch(); SUN_graphics(); } notify_dispatch(); return; } SUN_text() { notify_dispatch(); return; /* enter text from another window!!! */ } SUN_linetype(linetype) int linetype; { if (linetype>=7) linetype %= 7; sun_line_mask = sun_pattern[linetype+2]; sun_mask_count=0; } SUN_move(x, y) unsigned int x, y; { sun_lastx = x; sun_lasty = y; notify_dispatch(); return; } SUN_vector(x, y) unsigned int x, 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; } SUN_put_text(x,y,str) unsigned int x, 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(mode) enum JUSTIFY mode; { sun_justify = mode; return (TRUE); } SUN_reset() { term_tbl[term].xmax = SUN_XMAX; term_tbl[term].ymax = SUN_YMAX; window_set(frame, WIN_SHOW, FALSE, 0); return; } sun_setmaskpixel(x,y,value) unsigned int x,y,value; { /* dotted line generator */ if ((sun_line_mask>>sun_mask_count)&(unsigned 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; } sun_line(x1,x2,y1,y2) unsigned int x1,x2,y1,y2; { int runcount; int dx,dy; int xinc,yinc; unsigned int xplot,yplot; runcount=0; dx = abs((int)(x1)-(int)(x2)); if (x2>x1) xinc= 1; if (x2==x1) xinc= 0; if (x2<x1) xinc= -1; dy = abs((int)(y1)-(int)(y2)); if (y2>y1) yinc= 1; if (y2==y1) yinc= 0; if (y2<y1) yinc= -1; xplot=x1; yplot=y1; if (dx>dy) { /* 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, status) Frame frame; Destroy_status status; { if (status != DESTROY_CHECKING) { SUN_reset(); term_init = FALSE; } return(NOTIFY_DONE); }