xref: /plan9/sys/src/cmd/plot/libplot/machdep.c (revision 3e12c5d1bb89fc02707907988834ef147769ddaf)
1*3e12c5d1SDavid du Colombier #include "mplot.h"
2*3e12c5d1SDavid du Colombier Bitmap *offscreen=&screen;
3*3e12c5d1SDavid du Colombier /*
4*3e12c5d1SDavid du Colombier  * Clear the window from x0, y0 to x1, y1 (inclusive) to color c
5*3e12c5d1SDavid du Colombier  */
6*3e12c5d1SDavid du Colombier void m_clrwin(int x0, int y0, int x1, int y1, int c){
7*3e12c5d1SDavid du Colombier 	int y, hgt;
8*3e12c5d1SDavid du Colombier 	x1++;
9*3e12c5d1SDavid du Colombier 	y1++;
10*3e12c5d1SDavid du Colombier 	if(c<=0)
11*3e12c5d1SDavid du Colombier 		bitblt(offscreen, Pt(x0, y0), offscreen, Rect(x0, y0, x1, y1), Zero);
12*3e12c5d1SDavid du Colombier 	else if(c>=(2<<screen.ldepth)-1)
13*3e12c5d1SDavid du Colombier 		bitblt(offscreen, Pt(x0, y0), offscreen, Rect(x0, y0, x1, y1), F);
14*3e12c5d1SDavid du Colombier 	else{
15*3e12c5d1SDavid du Colombier 		segment(offscreen, Pt(x0, y0), Pt(x1, y0), c, S);
16*3e12c5d1SDavid du Colombier 		for(y=y0+1,hgt=1;y<y1;y+=hgt,hgt*=2){
17*3e12c5d1SDavid du Colombier 			if(y+hgt>y1) hgt=y1-y;
18*3e12c5d1SDavid du Colombier 			bitblt(offscreen, Pt(x0, y), offscreen, Rect(x0, y0, x1, y0+hgt), S);
19*3e12c5d1SDavid du Colombier 		}
20*3e12c5d1SDavid du Colombier 	}
21*3e12c5d1SDavid du Colombier }
22*3e12c5d1SDavid du Colombier /*
23*3e12c5d1SDavid du Colombier  * Draw text between pointers p and q with first character centered at x, y.
24*3e12c5d1SDavid du Colombier  * Use color c.  Centered if cen is non-zero, right-justified if right is non-zero.
25*3e12c5d1SDavid du Colombier  * Returns the y coordinate for any following line of text.
26*3e12c5d1SDavid du Colombier  * Bug: color is ignored.
27*3e12c5d1SDavid du Colombier  */
28*3e12c5d1SDavid du Colombier int m_text(int x, int y, char *p, char *q, int c, int cen, int right){
29*3e12c5d1SDavid du Colombier 	Point tsize;
30*3e12c5d1SDavid du Colombier 	USED(c);
31*3e12c5d1SDavid du Colombier 	*q='\0';
32*3e12c5d1SDavid du Colombier 	tsize=strsize(font, p);
33*3e12c5d1SDavid du Colombier 	if(cen) x -= tsize.x/2;
34*3e12c5d1SDavid du Colombier 	else if(right) x -= tsize.x;
35*3e12c5d1SDavid du Colombier 	string(offscreen, Pt(x, y-tsize.y/2), font, p, S|D);
36*3e12c5d1SDavid du Colombier 	return y+tsize.y;
37*3e12c5d1SDavid du Colombier }
38*3e12c5d1SDavid du Colombier /*
39*3e12c5d1SDavid du Colombier  * Draw the vector from x0, y0 to x1, y1 in color c.
40*3e12c5d1SDavid du Colombier  * Clipped by caller
41*3e12c5d1SDavid du Colombier  */
42*3e12c5d1SDavid du Colombier void m_vector(int x0, int y0, int x1, int y1, int c){
43*3e12c5d1SDavid du Colombier 	if(c<0) c=0;
44*3e12c5d1SDavid du Colombier 	if(c>(1<<(1<<screen.ldepth))-1) c=(2<<screen.ldepth)-1;
45*3e12c5d1SDavid du Colombier 	segment(offscreen, Pt(x0, y0), Pt(x1, y1), c, S);
46*3e12c5d1SDavid du Colombier }
47*3e12c5d1SDavid du Colombier /*
48*3e12c5d1SDavid du Colombier  * Startup initialization
49*3e12c5d1SDavid du Colombier  */
50*3e12c5d1SDavid du Colombier void m_initialize(char *s){
51*3e12c5d1SDavid du Colombier 	static int first=1;
52*3e12c5d1SDavid du Colombier 	int dx, dy;
53*3e12c5d1SDavid du Colombier 	USED(s);
54*3e12c5d1SDavid du Colombier 	if(first){
55*3e12c5d1SDavid du Colombier 		binit(0,0,0);
56*3e12c5d1SDavid du Colombier 		clipminx=mapminx=screen.r.min.x+4;
57*3e12c5d1SDavid du Colombier 		clipminy=mapminy=screen.r.min.y+4;
58*3e12c5d1SDavid du Colombier 		clipmaxx=mapmaxx=screen.r.max.x-5;
59*3e12c5d1SDavid du Colombier 		clipmaxy=mapmaxy=screen.r.max.y-5;
60*3e12c5d1SDavid du Colombier 		dx=clipmaxx-clipminx;
61*3e12c5d1SDavid du Colombier 		dy=clipmaxy-clipminy;
62*3e12c5d1SDavid du Colombier 		if(dx>dy){
63*3e12c5d1SDavid du Colombier 			mapminx+=(dx-dy)/2;
64*3e12c5d1SDavid du Colombier 			mapmaxx=mapminx+dy;
65*3e12c5d1SDavid du Colombier 		}
66*3e12c5d1SDavid du Colombier 		else{
67*3e12c5d1SDavid du Colombier 			mapminy+=(dy-dx)/2;
68*3e12c5d1SDavid du Colombier 			mapmaxy=mapminy+dx;
69*3e12c5d1SDavid du Colombier 		}
70*3e12c5d1SDavid du Colombier 		first=0;
71*3e12c5d1SDavid du Colombier 	}
72*3e12c5d1SDavid du Colombier }
73*3e12c5d1SDavid du Colombier /*
74*3e12c5d1SDavid du Colombier  * Clean up when finished
75*3e12c5d1SDavid du Colombier  */
76*3e12c5d1SDavid du Colombier void m_finish(void){
77*3e12c5d1SDavid du Colombier 	m_swapbuf();
78*3e12c5d1SDavid du Colombier }
79*3e12c5d1SDavid du Colombier void m_swapbuf(void){
80*3e12c5d1SDavid du Colombier 	if(offscreen!=&screen)
81*3e12c5d1SDavid du Colombier 		bitblt(&screen, offscreen->r.min, offscreen, offscreen->r, S);
82*3e12c5d1SDavid du Colombier 	bflush();
83*3e12c5d1SDavid du Colombier }
84*3e12c5d1SDavid du Colombier void m_dblbuf(void){
85*3e12c5d1SDavid du Colombier 	if(offscreen==&screen){
86*3e12c5d1SDavid du Colombier 		offscreen=balloc(inset(screen.r, 4), screen.ldepth);
87*3e12c5d1SDavid du Colombier 		if(offscreen==0){
88*3e12c5d1SDavid du Colombier 			fprintf(stderr, "Can't double buffer\n");
89*3e12c5d1SDavid du Colombier 			offscreen=&screen;
90*3e12c5d1SDavid du Colombier 		}
91*3e12c5d1SDavid du Colombier 	}
92*3e12c5d1SDavid du Colombier }
93