🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: net.math.stat
Article #88

Sun device driver for S.

#88
From: mikem
Date: Tue, 16 Apr 1985 23:41
505 lines
13659 bytes
Here is the S device driver for Sun workstations.  I'm sorry it took me
so long to post this, but there was a bug to fix before it could go out.
Please note, that I am not the author of this software and I won't
listen to complaints (or praise!) or problems with it. Please use it if
you can.

Mike Meyer

(----------------------------CUT----------------------------)
#!/bin/sh
echo 'Start of SUNDRIVER, part 01 of 01:'
echo 'x - DO.THIS'
sed 's/^X//' > DO.THIS << '/'
Xdefine(`SUNBW',`-100')
Xdefine(`SUNCOLOR',`-101')
/
echo 'x - README'
sed 's/^X//' > README << '/'
XAdd the contents of  DO.THIS  to $I/device.m  .  Otherwise it should work.
/
echo 'x - Smakefile'
sed 's/^X//' > Smakefile << '/'
Xall: sun dev.sun 
X
Xsun: interface.o sun.x
X	$(F77) $(LDFLAGS) $(STRIP) -o x/sun interface.o sun.x $(LIBR)
X	/bin/rm -f x/csun > /dev/null 2>&1
X	/bin/ln x/sun x/csun
X	@touch sun
X	@echo sun loaded
Xinterface.C: ; echo "INCLUDE(u/cinter)CINTER(sun)" >interface.C
X
Xdev.sun: sun.o
X	$(F77) $(LDFLAGS) $(STRIP) -o x/dev.sun $L/device.z sun.o $(GRZLIB) -lc
Xore -lsunwindow -lpixrect
X	@touch dev.sun
X	@echo sun driver loaded
/
echo 'x - sun.C'
sed 's/^X//' > sun.C << '/'
X#include <usercore.h>
X#include <sunwindow/window_hs.h>
XINCLUDE(device)
X
X#define am(i)		bgrp_[i-1]
X#define FOREVER		2147483647
X
Xfloat F77_SUB(bgrp)[200];
Xfloat aspect;
Xfloat char_width = 0.02, char_height = 0.02;
Xstruct vwsurf vws, *surface = &vws;
Xstruct rect r;
Xint ask = 1;
Xint color = 0;
Xint colorpos = SCR_WEST;
Xint nseg = 1;
Xint cg1dd();
Xint cgpixwindd();
X
XF77_SUB(pbegnz)(par, n)
Xfloat par[];
Xlong *n;
X{
X	int i;
X	char *av[4];
X	char *getenv(), *gfx, *me;
X	float zero = 0, one = 1;
X
X	if(*n >= 1)
X		ask = par[0];
X	if(*n >= 2)
X		color = par[1];
X	if(*n >= 3)
X		colorpos = par[2] < 0 ? colorpos : par[2];
X
X	/* find the surface on which to do the graphics */
X	i = 0;
X	av[i++] = "";
X	if(color) {
X		av[i++] = "-d";
X		av[i++] = "/dev/cgone0";
X	}
X	av[i++] = 0;
X	if(get_view_surface(&vws, av))
X		FATAL(Cannot initialize sun device driver);
X
X	/* don't blanket a tty subwindow */
X	gfx = getenv("WINDOW_GFX");
X	me = getenv("WINDOW_ME");
X	if(gfx && me && strcmp(gfx, me) == 0)
X		surface->flags = VWSURF_NEWFLG;
X
X	/* prepare for output */
X	if(initialize_core(BUFFERED, SYNCHRONOUS, TWOD))
X		FATAL(Cannot initialize SunCore)
X	if(initialize_view_surface(surface, FALSE))
X		FATAL(Cannot initialize view surface);
X	if(select_view_surface(surface))
X		FATAL(Cannot select view surface);
X	win_getsize(surface->windowfd, &r);
X	aspect = (float)r.r_height / (float)r.r_width;
X	set_ndc_space_2(1.0, aspect);
X	set_viewport_2(0.0, 1.0, 0.0, aspect);
X	set_window(0.0, 1.0, 0.0, 1.0);
X
X	/* prepare for input */
X	initialize_device(LOCATOR, 1);
X	set_echo_surface(LOCATOR, 1, surface);
X	set_echo(LOCATOR, 1, 1);	/* pointing finger cursor */
X	for(i = 1; i <= 3; i++) {
X		initialize_device(BUTTON, i);
X		set_echo_surface(BUTTON, i, surface);
X	}
X
X	/* fill the amodes array */
X	fill_am();
X
X	/* open segment and initialize character primitive static attributes */
X	create_retained_segment(nseg = 1);
X	set_charprecision(`CHARACTER');
X	set_charsize(char_width, char_height);
X	set_font(STICK);
X
X	/* establish the relative positions of the b&w and color monitors */
X	if(color && colorscreen(surface->windowfd))
X		WARNING(Cannot extend cursor domain to color screen);
X}
X
XF77_SUB(zlinsz)(x, y, n)
Xfloat x[], y[];
Xlong *n;
X{
X	if(*n <= 0)
X		return;
X	move_abs_2(x[0], y[0]);
X	polyline_abs_2(&x[1], &y[1], (int)*n - 1);
X}
X
XF77_SUB(zpntsz)(x, y, n)
Xfloat x[], y[];
Xlong *n;
X{
X	char buf[2];
X	int i, s;
X
X	if(*n <= 0)
X		return;
X	polymarker_abs_2(x, y, (int)*n);
X}
X
XF77_SUB(zpolyz)(x, y, n)
Xfloat x[], y[];
Xlong *n;
X{
X	if(*n <= 0)
X		return;
X	polygon_abs_2(x, y, (int)*n);
X	move_abs_2(x[0], y[0]);
X	polyline_abs_2(&x[1], &y[1], (int)*n - 1);
X	polyline_abs_2(&x[0], &y[0], 1);
X}
X
XF77_SUB(zsegsz)(x1, y1, x2, y2, n)
Xfloat x1[], y1[], x2[], y2[];
Xlong *n;
X{
X	int i;
X
X	for(i = 0; i < *n; i++) {
X		move_abs_2(*x1++, *y1++);
X		line_abs_2(*x2++, *y2++);
X	}
X}
X
XF77_SUB(ztextz)(x, y, string, nch, adj, lch)
Xchar *string;
Xfloat *x, *y, *adj;
Xlong *nch, lch;
X{
X	float dx, dy, nx, ny;
X	float vxmin, vxmax, vymin, vymax;
X	float wxmin, wxmax, wymin, wymax;
X	char *buf, *malloc();
X
X	buf = malloc(*nch + 1);
X	if(buf == (char *)0)
X		FATAL(Cannot allocate memory for ztextz)
X	strncpy(buf, string, *nch);
X	buf[*nch]='\0';
X
X	/*
X	 * To keep a constant aspect ratio for characters, we
X	 * first find the desired string position in NDC space,
X	 * then open a new segment with world coords which match
X	 * NDC space.  This string is plotted, and the remembered
X	 * previous viewport and window are restored in another
X	 * retained segment.
X	 */
X	map_world_to_ndc_2(*x, *y, &nx, &ny);
X	inquire_viewport_2(&vxmin, &vxmax, &vymin, &vymax);
X	inquire_window(&wxmin, &wxmax, &wymin, &wymax);
X	close_retained_segment(nseg);
X	set_charsize(am(18)*char_width*0.5, am(18)*char_height*0.5);
X	set_viewport_2(0.0, 1.0, 0.0, aspect);
X	set_window(0.0, 1.0, 0.0, aspect);
X	create_retained_segment(++nseg);
X	inquire_text_extent_2(buf, &dx, &dy);
X	move_abs_2(nx - *adj * dx, ny - *adj * dy);
X	text(buf);
X	close_retained_segment(nseg);
X	set_viewport_2(vxmin, vxmax, vymin, vymax);
X	set_window(wxmin, wxmax, wymin, wymax);
X	create_retained_segment(++nseg);
X	free(buf);
X}
X
XF77_SUB(zejecz)()
X{
X	if(ask) {
X		fprintf(stderr, "GO? ");
X		while(getchar() != '\n') ;	/* ignore reply */
X	}
X	delete_all_retained_segments();
X	create_retained_segment(nseg = 1);
X}
X
X
XF77_SUB(zflshz)() { }
X
XF77_SUB(zintrz)() { }
X
XF77_SUB(zwrapz)()
X{
X	delete_all_retained_segments();
X	deselect_view_surface(surface);
X	terminate_view_surface(surface);
X	terminate_device(LOCATOR, 1);
X	terminate_core();
X}
X
XF77_SUB(zrdpnz)(x, y, n, nmax)
Xfloat x[], y[];
Xlong *n, *nmax;
X{
X	int but, i;
X	float xin, yin;
X
X	for(i = 0; i < *nmax; i++) {
X		/* set_locator_2(1, xin, yin); */
X		but = 0;
X		while(but == 0)
X			await_any_button_get_locator_2(FOREVER, 1, &but, &xin, 
X&yin);
X		if(but != 1)
X			break;
X		map_ndc_to_world_2(xin, yin, x++, y++);
X		fprintf(stderr, "\07");
X	}
X	*n = i;
X}
X
XF77_SUB(amdiff)(x, n) /* look for important parameter changes */
Xfloat x[];
Xlong *n;
X{
X	static int styles[] = {SOLID, DOTTED, DASHED, DOTDASHED};
X	static int nstyles = (sizeof(styles) / sizeof(*styles));
X	int i, which, istyle;
X	float value, fracx, fracy;
X	double sin(), cos(), dvalue;
X	int do_window = 0;
X
X	for(i = 0; i < *n; i += 2) {
X		which = x[i];
X		value = x[i + 1];
X		am(which) = value;
X		switch(which) {
X
X		case 8:
X			istyle = (int)(value - 1) % nstyles;
X			set_linestyle(styles[istyle]);
X			break;
X
X		case 9:
X			set_linewidth(value - 1);
X			break;
X
X		case 10:
X			set_line_index((int)value);
X			set_fill_index((int)value);
X			set_text_index((int)value);
X			break;
X
X		case 14:
X			dvalue = value * DEG2RD;
X			set_charpath_2(cos(dvalue), sin(dvalue));
X			dvalue += PI/2;
X			set_charup_2(cos(dvalue), sin(dvalue));
X			break;
X
X		case 15:
X			set_marker_symbol((char)value);
X			break;
X
X		case 40: /* plot in figure */
X		case 41:
X		case 42:
X		case 43:
X		case 44: /* figure on device */
X		case 45:
X		case 46:
X		case 47:
X		case 61: /* user coords */
X		case 62:
X		case 63:
X		case 64:
X		case 65: /* flag for clipping */
X			do_window = 1;
X			break;
X		}
X	}
X
X	if(!do_window)
X		return;
X
X	/* close current segment to change viewport and window */
X	close_retained_segment(nseg);
X	if(do_window && am(65) > 0) {
X		set_viewport_2(am(44), am(45), aspect*am(46), aspect*am(47));
X		fracx = (am(62)-am(61)) / (am(41)-am(40));
X		fracy = (am(64)-am(63)) / (am(43)-am(42));
X		set_window(
X			am(61) - am(40)*fracx,
X			am(62) + (1 - am(41))*fracx,
X			am(63) - am(42)*fracy,
X			am(64) + (1 - am(43))*fracy);
X	}
X	if(do_window && am(65) <= 0) {
X		fracx = am(45) - am(44);
X		fracy = am(47) - am(46);
X		set_viewport_2(
X			am(44) + am(40)*fracx,
X			am(44) + am(41)*fracx,
X			(am(46) + am(42)*fracy)*aspect,
X			(am(46) + am(43)*fracy)*aspect);
X		set_window(am(61), am(62), am(63), am(64));
X	}
X	create_retained_segment(++nseg);
X}
X
X
X
Xcolorscreen(color_fd)
Xint color_fd;
X{
X	int color_num, bw_fd, bw_num, i;
X	int color_neighbors[SCR_POSITIONS], bw_neighbors[SCR_POSITIONS];
X
X	/*
X	(void) signal(SIGWINCH, winch_catcher);
X	strcpy(color.scr_fbname, "/dev/cgone0");
X	colorpr = pr_open("/dev/cgone0");
X	pr_getcolormap(colorpr, 0, 256, red, green, blue);
X	color.scr_foreground.red = red[255];
X	color.scr_foreground.green = green[255];
X	color.scr_foreground.blue = blue[255];
X	color.scr_background.red = red[0];
X	color.scr_background.green = green[0];
X	color.scr_background.blue = blue[0];
X	color_fd = win_screennew(&color);
X	*/
X	color_num = win_fdtonumber(color_fd);
X	bw_fd = open("/dev/win0", 0);
X	if(bw_fd < 0)
X		return(1);
X	bw_num = win_fdtonumber(bw_fd);
X	for(i = 0; i < SCR_POSITIONS; i++)
X		color_neighbors[i] = bw_neighbors[i] = -1;
X	bw_neighbors[colorpos] = color_num;
X	color_neighbors[(2+colorpos)%4] = bw_num;
X	win_setscreenpositions(color_fd, color_neighbors);
X	win_setscreenpositions(bw_fd, bw_neighbors);
X	close(bw_fd);
X	return(0);
X}
X
Xfill_am()
X{
X	double drw, drh, px, py, c1em, dev_width, dev_height;
X	int i;
X
X	for(i = 1; i <= 130; i++)
X		am(i) = 0;
X
X	/* device specific paramaters */
X	am(20) = char_width * r.r_width;	/* char width in rasters */
X	am(21) = char_height * r.r_height;	/* char height in rasters */
X	am(22) = 0;  am(23) = r.r_width - 1;	/* x limits in rasters */
X	am(24) = 0;  am(25) = r.r_height - 1;	/* y limits in rasters */
X	am(26) = 0;  am(27) = 0;		/* char addressing offset */
X	am(28) = am(29) = color ? 0.016 : 0.0125;/* raster size in inches */
X	am(30) = color ? SUNCOLOR : SUNBW;	/* device code number (< 0)) */
X	am(31) = 1;				/* allow char rotation */
X	am(1) = 1;				/* allow char size change */
X
X	/* fixed parameters, mainly from defltz.r */
X	am(8) = 1;	am(9) = 1;	am(10) = 1;	am(11) = 1;
X	am(15) = 42;	am(17) = 3;	am(18) = 1;	am(45) = 1;
X	am(47) = 1;	am(49) = 1;	am(54) = 1;	am(57) = 5;
X	am(58) = 5;	am(59) = 7;	am(60) = 126;	am(62) = 1;
X	am(64) = 1;	am(66) = 0.02;	am(79) = -1;	am(80) = 1;
X	am(81) = 1;	am(82) = 1;	am(83) = 1;	am(85) = 0.2;
X	am(89) = 1;	am(91) = 1;	am(93) = 1;	am(94) = 1;
X	am(97) = 109;	am(100) = 0.5;	am(101) = -1;	am(102) = 115;
X	am(103) = 32;	am(105) = 1;	am(106) = 5;	am(107) = 115;
X	am(108) = 32;	am(110) = 1;	am(111) = 5;	am(112) = 3;
X	am(113) = 1;	am(119) = 111;	am(122) = 109;	am(130) = 0.001;
X
X	/* dependencies, mainly from zzpltz.r, zscalz.r and zcsizz.r */
X	drw = am(23) - am(22);
X	drh = am(25) - am(24);
X	am(70) = am(28);
X	am(71) = am(29);
X	am(74) = am(20) * am(28);
X	am(75) = am(21) * am(29);
X	c1em = max(am(74), am(75));
X	am(50) = am(51) = am(52) = am(53) = 7 * c1em;
X	am(123) = am(98) = drw * am(28);
X	am(124) = am(99) = drh * am(29);
X	am(40) = 7 * c1em / am(98);
X	am(41) = 1 - am(40);
X	am(42) = 7 * c1em / am(99);
X	am(43) = 1 - am(42);
X	px = am(41) - am(40);
X	py = am(43) - am(42);
X	am(76) = am(55) = am(98) * px;
X	am(77) = am(56) = am(99) * py;
X	am(32) = am(22) + am(40) * drw;
X	am(33) = am(22) + am(41) * drw;
X	am(34) = am(24) + am(42) * drh;
X	am(35) = am(24) + am(43) * drh;
X	am(36) = am(32);
X	am(37) = px * drw;
X	am(38) = am(34);
X	am(39) = py * drh;
X	am(67) = am(74) / am(76);
X	am(68) = am(75) / am(77);
X	am(72) = c1em / am(76);
X	am(73) = c1em / am(77);
X	am(84) = c1em / min(am(98),am(99));
X}
X
XF77_SUB(wclosz)(){}
XF77_SUB(wcopyz)(){}
XF77_SUB(wdiffz)(){}
XF77_SUB(wejecz)(){}
XF77_SUB(winitz)(){}
XF77_SUB(wlinsz)(){}
XF77_SUB(wpntsz)(){}
XF77_SUB(wpolyz)(){}
XF77_SUB(wsegsz)(){}
XF77_SUB(wtextz)(){}
XF77_SUB(wupdtz)(){}
XF77_SUB(wwrapz)(){}
X/*F77_MAIN (){}*/
/
echo 'x - sun.i'
sed 's/^X//' > sun.i << '/'
XFUNCTION sun(
X	ask	/REAL,1,0./
X	color	/LGL,1,streq(TEXT(FNAME),TSTRING(csun))/
X	pos	/INT,1,-1/
X	)
X
XSTRUCTURE(parms/REAL,3/, cpos)
XSTATIC(POINTER getds)
X
Xparms[1] = ask
Xif(color)
X	parms[2] = 1
Xelse
X	parms[2] = 0
Xparms[3] = pos
X#if(!MISSING(pos)) {
X	#P(cpos) = getds(TSTRING(Color.Monitor),0)
X	#if(P(cpos) != NULL) {
X		#COERCE(cpos/INT/)
X		#parms[3] = mod(cpos[1],4)
X	#}
X#}
X
XDEVICE_DRIVER(sun)
X
XRETURN(parms)
XEND
/
echo 'Part 01 of SUNDRIVER complete.'
exit

-- 

Mike Meyer --  Phone +1 (608) 262-1157 (Leave messages at 262-2598)

ARPA:  mikem@Statistics  <==>	mikem@Wisc-Stat.ARPA
UUCP:  ...!{allegra,ihnp4,seismo,ucbvax,pyr_chi,heurikon}!uwvax!uwstat!mikem
Technical Details
Message-ID: <242@uwstat.UUCP>
Path: arc1-ca.pugleaf.net!utzoo!watmath!clyde!burl!ulysses!mhuxr!mhuxt!houxm!whuxl!whuxlm!harpo!decvax!genrad!panda!talcott!harvard!seismo!uwvax!uwstat!mikem

Show Full Headers
Complete Article Headers
Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP
Posting-Version: version B 2.10.2 9/18/84; site uwstat.UUCP
Path: arc1-ca.pugleaf.net!utzoo!watmath!clyde!burl!ulysses!mhuxr!mhuxt!houxm!whuxl!whuxlm!harpo!decvax!genrad!panda!talcott!harvard!seismo!uwvax!uwstat!mikem
From: mikem@uwstat.UUCP
Newsgroups: net.math.stat
Subject: Sun device driver for S.
Message-ID: <242@uwstat.UUCP>
Date: Tue, 16-Apr-85 18:41:27 EST
Article-I.D.: uwstat.242
Posted: Tue Apr 16 18:41:27 1985
Date-Received: Fri, 19-Apr-85 01:10:21 EST
Distribution: net
Organization: U of Wisconsin Statistics
Lines: 505