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