13e12c5d1SDavid du Colombier #include "mplot.h"
27dd7cddfSDavid du Colombier Image *offscreen;
33e12c5d1SDavid du Colombier /*
43e12c5d1SDavid du Colombier * Clear the window from x0, y0 to x1, y1 (inclusive) to color c
53e12c5d1SDavid du Colombier */
m_clrwin(int x0,int y0,int x1,int y1,int c)63e12c5d1SDavid du Colombier void m_clrwin(int x0, int y0, int x1, int y1, int c){
77dd7cddfSDavid du Colombier draw(offscreen, Rect(x0, y0, x1+1, y1+1), getcolor(c), nil, ZP);
83e12c5d1SDavid du Colombier }
93e12c5d1SDavid du Colombier /*
103e12c5d1SDavid du Colombier * Draw text between pointers p and q with first character centered at x, y.
113e12c5d1SDavid du Colombier * Use color c. Centered if cen is non-zero, right-justified if right is non-zero.
123e12c5d1SDavid du Colombier * Returns the y coordinate for any following line of text.
133e12c5d1SDavid du Colombier */
m_text(int x,int y,char * p,char * q,int c,int cen,int right)143e12c5d1SDavid du Colombier int m_text(int x, int y, char *p, char *q, int c, int cen, int right){
153e12c5d1SDavid du Colombier Point tsize;
163e12c5d1SDavid du Colombier USED(c);
177dd7cddfSDavid du Colombier tsize=stringsize(font, p);
183e12c5d1SDavid du Colombier if(cen) x -= tsize.x/2;
193e12c5d1SDavid du Colombier else if(right) x -= tsize.x;
207dd7cddfSDavid du Colombier stringn(offscreen, Pt(x, y-tsize.y/2), getcolor(c), ZP, font, p, q-p);
213e12c5d1SDavid du Colombier return y+tsize.y;
223e12c5d1SDavid du Colombier }
233e12c5d1SDavid du Colombier /*
243e12c5d1SDavid du Colombier * Draw the vector from x0, y0 to x1, y1 in color c.
253e12c5d1SDavid du Colombier * Clipped by caller
263e12c5d1SDavid du Colombier */
m_vector(int x0,int y0,int x1,int y1,int c)273e12c5d1SDavid du Colombier void m_vector(int x0, int y0, int x1, int y1, int c){
287dd7cddfSDavid du Colombier line(offscreen, Pt(x0, y0), Pt(x1, y1), Endsquare, Endsquare, 0, getcolor(c), ZP);
293e12c5d1SDavid du Colombier }
scanint(char * s,int * n)30219b2ee8SDavid du Colombier char *scanint(char *s, int *n){
31219b2ee8SDavid du Colombier while(*s<'0' || '9'<*s){
32219b2ee8SDavid du Colombier if(*s=='\0'){
33219b2ee8SDavid du Colombier fprint(2, "plot: bad -Wxmin,ymin,xmax,ymax\n");
34219b2ee8SDavid du Colombier exits("bad arg");
35219b2ee8SDavid du Colombier }
36219b2ee8SDavid du Colombier s++;
37219b2ee8SDavid du Colombier }
38219b2ee8SDavid du Colombier *n=0;
39219b2ee8SDavid du Colombier while('0'<=*s && *s<='9'){
40219b2ee8SDavid du Colombier *n=*n*10+*s-'0';
41219b2ee8SDavid du Colombier s++;
42219b2ee8SDavid du Colombier }
43219b2ee8SDavid du Colombier return s;
44219b2ee8SDavid du Colombier }
rdenv(char * name)45219b2ee8SDavid du Colombier char *rdenv(char *name){
46219b2ee8SDavid du Colombier char *v;
47219b2ee8SDavid du Colombier int fd, size;
48219b2ee8SDavid du Colombier fd=open(name, OREAD);
49219b2ee8SDavid du Colombier if(fd<0) return 0;
50219b2ee8SDavid du Colombier size=seek(fd, 0, 2);
51219b2ee8SDavid du Colombier v=malloc(size+1);
52219b2ee8SDavid du Colombier if(v==0){
53219b2ee8SDavid du Colombier fprint(2, "Can't malloc: %r\n");
54219b2ee8SDavid du Colombier exits("no mem");
55219b2ee8SDavid du Colombier }
56219b2ee8SDavid du Colombier seek(fd, 0, 0);
57219b2ee8SDavid du Colombier read(fd, v, size);
58219b2ee8SDavid du Colombier v[size]=0;
59219b2ee8SDavid du Colombier close(fd);
60219b2ee8SDavid du Colombier return v;
61219b2ee8SDavid du Colombier }
623e12c5d1SDavid du Colombier /*
633e12c5d1SDavid du Colombier * Startup initialization
643e12c5d1SDavid du Colombier */
m_initialize(char * s)653e12c5d1SDavid du Colombier void m_initialize(char *s){
663e12c5d1SDavid du Colombier static int first=1;
673e12c5d1SDavid du Colombier int dx, dy;
683e12c5d1SDavid du Colombier USED(s);
693e12c5d1SDavid du Colombier if(first){
70*b2495906SDavid du Colombier if(initdraw(0,0,"plot") < 0)
71*b2495906SDavid du Colombier sysfatal("initdraw: %r");
727dd7cddfSDavid du Colombier einit(Emouse);
737dd7cddfSDavid du Colombier clipminx=mapminx=screen->r.min.x+4;
747dd7cddfSDavid du Colombier clipminy=mapminy=screen->r.min.y+4;
757dd7cddfSDavid du Colombier clipmaxx=mapmaxx=screen->r.max.x-5;
767dd7cddfSDavid du Colombier clipmaxy=mapmaxy=screen->r.max.y-5;
773e12c5d1SDavid du Colombier dx=clipmaxx-clipminx;
783e12c5d1SDavid du Colombier dy=clipmaxy-clipminy;
793e12c5d1SDavid du Colombier if(dx>dy){
803e12c5d1SDavid du Colombier mapminx+=(dx-dy)/2;
813e12c5d1SDavid du Colombier mapmaxx=mapminx+dy;
823e12c5d1SDavid du Colombier }
833e12c5d1SDavid du Colombier else{
843e12c5d1SDavid du Colombier mapminy+=(dy-dx)/2;
853e12c5d1SDavid du Colombier mapmaxy=mapminy+dx;
863e12c5d1SDavid du Colombier }
873e12c5d1SDavid du Colombier first=0;
887dd7cddfSDavid du Colombier offscreen = screen;
893e12c5d1SDavid du Colombier }
903e12c5d1SDavid du Colombier }
913e12c5d1SDavid du Colombier /*
923e12c5d1SDavid du Colombier * Clean up when finished
933e12c5d1SDavid du Colombier */
m_finish(void)943e12c5d1SDavid du Colombier void m_finish(void){
953e12c5d1SDavid du Colombier m_swapbuf();
963e12c5d1SDavid du Colombier }
m_swapbuf(void)973e12c5d1SDavid du Colombier void m_swapbuf(void){
987dd7cddfSDavid du Colombier if(offscreen!=screen)
997dd7cddfSDavid du Colombier draw(screen, offscreen->r, offscreen, nil, offscreen->r.min);
1007dd7cddfSDavid du Colombier flushimage(display, 1);
1013e12c5d1SDavid du Colombier }
m_dblbuf(void)1023e12c5d1SDavid du Colombier void m_dblbuf(void){
1037dd7cddfSDavid du Colombier if(offscreen==screen){
1047dd7cddfSDavid du Colombier offscreen=allocimage(display, insetrect(screen->r, 4), screen->chan, 0, -1);
1053e12c5d1SDavid du Colombier if(offscreen==0){
1063e12c5d1SDavid du Colombier fprintf(stderr, "Can't double buffer\n");
1077dd7cddfSDavid du Colombier offscreen=screen;
1083e12c5d1SDavid du Colombier }
1093e12c5d1SDavid du Colombier }
1103e12c5d1SDavid du Colombier }
1117dd7cddfSDavid du Colombier /* Assume colormap entry because
1127dd7cddfSDavid du Colombier * Use cache to avoid repeated allocation.
1137dd7cddfSDavid du Colombier */
1147dd7cddfSDavid du Colombier struct{
1157dd7cddfSDavid du Colombier int v;
1167dd7cddfSDavid du Colombier Image *i;
1177dd7cddfSDavid du Colombier }icache[32];
1187dd7cddfSDavid du Colombier
1197dd7cddfSDavid du Colombier Image*
getcolor(int v)1207dd7cddfSDavid du Colombier getcolor(int v)
1217dd7cddfSDavid du Colombier {
1227dd7cddfSDavid du Colombier Image *i;
1237dd7cddfSDavid du Colombier int j;
1247dd7cddfSDavid du Colombier
1257dd7cddfSDavid du Colombier for(j=0; j<nelem(icache); j++)
1267dd7cddfSDavid du Colombier if(icache[j].v==v && icache[j].i!=nil)
1277dd7cddfSDavid du Colombier return icache[j].i;
1287dd7cddfSDavid du Colombier
1297dd7cddfSDavid du Colombier i = allocimage(display, Rect(0, 0, 1, 1), RGB24, 1, v);
1307dd7cddfSDavid du Colombier if(i == nil){
1317dd7cddfSDavid du Colombier fprint(2, "plot: can't allocate image for color: %r\n");
1327dd7cddfSDavid du Colombier exits("allocimage");
1337dd7cddfSDavid du Colombier }
1347dd7cddfSDavid du Colombier for(j=0; j<nelem(icache); j++)
1357dd7cddfSDavid du Colombier if(icache[j].i == nil){
1367dd7cddfSDavid du Colombier icache[j].v = v;
1377dd7cddfSDavid du Colombier icache[j].i = i;
1387dd7cddfSDavid du Colombier break;
1397dd7cddfSDavid du Colombier }
1407dd7cddfSDavid du Colombier
1417dd7cddfSDavid du Colombier return i;
1427dd7cddfSDavid du Colombier }
143