/* * header for 4107 plot routines */

/*  complements to mike edmonds for initially doing this stuff */

#include <stdio.h>

/*
 *
 * This code supports a Tektronix 4107 graphics display terminal.  
 * Consequently, it will handle most other 41-series
 * terminals with only minor mods.
 *
 * This version modified by Joel Swank
 */

#define MAX_XPIXEL	640	/* Pixels in the display		*/
#define MAX_YPIXEL	480
#define MAX_XADDR	3500	/* Addresses on the display, really 4096 */
#define MAX_YADDR	3133 
#define CXSIZE		8	/* Character width			*/
#define CYSIZE		14	/* Character height			*/
#define CHARW		39	/* Character width			*/
#define CHARH		59	/* Character height			*/
#define BITS		4	/* Number bits needed to encode color 	*/

/*
 * Globalize (most of) these values for the main display code.
 */

extern int xcur, ycur, color;
extern int xlow, ylow;
extern float xmag, ymag;

#define ON	1		/* Mode switches		*/
#define OFF	0
#define ANSI	1
#define TEK	0

/*
 * Convert from pixel number to logical address and back.
 */
#define adrconv(adr,in,out)	( (((adr) * (out)) + ((out) / 2)) / (in) )
#define xpixtoaddr(pix)		adrconv((pix), MAX_XPIXEL, MAX_XADDR)
#define ypixtoaddr(pix)		adrconv((pix), MAX_YPIXEL, MAX_YADDR)
#define xaddrtopix(adr)		adrconv((adr), MAX_XADDR, MAX_XPIXEL)
#define yaddrtopix(adr)		adrconv((adr), MAX_YADDR, MAX_YPIXEL)
/*
 * Switch terminal into various modes.
 */
#define code(sw)		{ fputs("\033%!", stdout); encode(sw); }
#define vector_mode()		  putchar('\035')
#define alpha_mode()		  putchar('\037')
/*
 * Dialog area 
 */
#define daindex(ch,bk,dabk)	{ fputs("\033LI", stdout); encode(ch);\
				  encode(bk); encode(dabk); }
#define davisibility(sw)	{ fputs("\033LV", stdout); encode(sw); }
#define page()			  fputs("\033\014", stdout)
#define	acursor(ind1,ind2)	{ fputs("\033TD", stdout);\
				  encode(ind1); encode(ind2); }
#define enable_dia()		{ fputs("\033KA1",stdout); }
#define disable_dia()		{ fputs("\033KA0",stdout); }
#define dia_lines(num)		{ fputs("\033LL",stdout); encode(num); }
#define dia_buf(num)		{ fputs("\033LB",stdout); encode(num); }
/*
 * Reports : be sure to cancel bypass mode after reading reports
 */

#define report_code()		{ fputs("\033#!0",stdout); }
#define report_dabuf()		{ fputs("\033IQLB",stdout); }
#define report_dalin()		{ fputs("\033IQLL",stdout); }
#define report_aci()		{ fputs("\033IQTD",stdout); }
#define bypass_can()		{ fputs("\012",stdout); }
/*
 * Cancel whatever's going on.
 */
#define cancel()		  fputs("\033KC", stdout)
/*
 * Set color maps.
 */
#define cmode(spec, over, gray) { fputs("\033TM", stdout); \
				  encode(spec); encode(over); encode(gray); }
#define cmap(idx, hue, light, satur) \
				{ fputs("\033TG", stdout); \
				  encode(1); encode(4); encode(idx); \
				  encode(hue); encode(light); encode(satur); }
/*
 * Change line style and color.
 */
#define linestyle(style)	{ fputs("\033MV", stdout); \
				  encode(style); }
#define lineindex(index)	{ fputs("\033ML", stdout); \
				  encode(index); }
/*
 * Build panels.
 */
#define fillpattern(ptrn)	{ fputs("\033MP", stdout); \
				  encode(ptrn); }
#define beginpanel(x,y,border)	{ fputs("\033LP", stdout); \
				  encode_xy(x, y); encode(border); }
#define endpanel()		{ fputs("\033LE", stdout); }
/*
 * Define char sets.
 */
#define rul()			{fputs("\033)0", stdout);fputs("\036", stdout);}
#define supp()			{fputs("\033)3", stdout);fputs("\036", stdout);}
#define ascii()			{fputs("\037", stdout);}
/*
 * Display graphtext.
 */
#define gtback(tind,dind)	{ fputs("\033MB", stdout);\
				  encode(tind); encode(dind); }
#define gtindex(index)		{ fputs("\033MT", stdout); encode(index); }
#define gtprecision(prec)	{ fputs("\033MQ", stdout); encode(prec); }
#define gtsize(wd, hi, sp)	{ fputs("\033MC", stdout); \
				  encode(wd); encode(hi); encode(sp); }
#define gtrotation(angle)	{ fputs("\033MR", stdout); encode(angle); }
#define gamode(mode)		{ fputs("\033MG", stdout); encode(mode); }
#define gtext(str)		{ fputs("\033LT", stdout); \
				  encode(strlen(str)); fputs(str, stdout); }
/*
 * Move and draw commands.
 */
#define mov(x,y)		{ fputs("\033LF", stdout); encode_xy(x, y); }
#define drw(x,y)		{ fputs("\033LG", stdout); encode_xy(x, y); }
/* mov to point on circumfrence and then give circle point on opposite
   side of circle and origonal point     */
#define circle(x,y,x1,y1)	{ fputs("\033UC", stdout);fputs("12+", stdout);\
				  encode_xy(x,y); encode_xy(x1,y1); }

/*
 * Segment definitions
*/
#define beginseg(segno)		{ fputs("\033SO", stdout); encode(segno); }
#define newseg(segno)		{ fputs("\033SE", stdout); encode(segno); }
#define nextseg()		{ fputs("\033SN", stdout); }
#define prevseg()		{ fputs("\033SB", stdout); }
#define endseg()		{ fputs("\033SC", stdout); }
#define delallseg()		{ fputs("\033SK", stdout); encode(-1); }
#define delseg(segno)		{ fputs("\033SK", stdout); encode(segno); }
#define	segpos(segno,x,y)	{ fputs("\033SX", stdout); encode(segno); \
				  encode_xy(x, y); }
#define segrot(segno,angle)	{ fputs("\033SJ", stdout); encode(segno);\
				  encode(1); encode(0);\
				  encode(1);encode(0); \
				  encode(angle); encode(0); }
#define segxform(segno,angle,x,y) { fputs("\033SJ", stdout); encode(segno);\
				  encode(1); encode(0);\
				  encode(1);encode(0); \
				  encode(angle); encode(0);\
				  encode_xy(x, y); }
#define segpivot(x,y)	{ fputs("\033SP", stdout); encode_xy(x, y); }
#define segvis(segno,vis)	{ fputs("\033SV", stdout); encode(segno); \
				encode(vis); }
#define seghilite(segno,vis)	{ fputs("\033SH", stdout); encode(segno); \
				encode(vis); }
/*
 * gin definitions
*/
#define gin(dev,num)		{ fputs("\033IE", stdout); encode(dev);\
				  encode(num); }
#define ginend(dev)		{ fputs("\033ID", stdout); encode(dev); }
#define ginrpt(dev)		{ fputs("\033IP", stdout); encode(dev); }
/*
 * macro definitions
*/
#define defmac(num,str)		{ fputs("\033KD", stdout); encode(num);\
				  encode_str(str); }
#define clrmac(num)		{ fputs("\033KD", stdout); encode(num); }
/*
 * viewport and window commands.
 */
#define vatt(snum,wind,bind)	{ fputs("\033RA", stdout);\
				  encode(snum); encode(wind); encode(bind); }
#define viewport(xl,yl,xr,yr)	{ fputs("\033RV", stdout);\
				  encode_xy(xl,yl); encode_xy(xr,yr); }
#define selview(vnum)		{ fputs("\033RC", stdout); encode(vnum); }
#define window(xl,yl,xr,yr)	{ fputs("\033RW", stdout);\
				  encode_xy(xl,yl); encode_xy(xr,yr); }

/*   misc commands      */

#define bel()			  putchar('\07');
#define set_aci(fi,si)		{ fputs("\033TD", stdout);\
				  encode(fi); encode(si); }
