xref: /plan9-contrib/sys/src/cmd/scat/display.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1*219b2ee8SDavid du Colombier #include <u.h>
2*219b2ee8SDavid du Colombier #include <libc.h>
3*219b2ee8SDavid du Colombier #include <bio.h>
4*219b2ee8SDavid du Colombier #include <libg.h>
5*219b2ee8SDavid du Colombier #include "sky.h"
6*219b2ee8SDavid du Colombier 
7*219b2ee8SDavid du Colombier void
8*219b2ee8SDavid du Colombier display(Picture *pic)
9*219b2ee8SDavid du Colombier {
10*219b2ee8SDavid du Colombier 	int p[2];
11*219b2ee8SDavid du Colombier 	int i, n;
12*219b2ee8SDavid du Colombier 	uchar *a;
13*219b2ee8SDavid du Colombier 
14*219b2ee8SDavid du Colombier 
15*219b2ee8SDavid du Colombier 	if(pipe(p) < 0){
16*219b2ee8SDavid du Colombier 		fprint(2, "pipe failed: %r\n");
17*219b2ee8SDavid du Colombier 		return;
18*219b2ee8SDavid du Colombier 	}
19*219b2ee8SDavid du Colombier 	switch(rfork(RFPROC|RFFDG|RFNOTEG|RFNOWAIT)){
20*219b2ee8SDavid du Colombier 	case -1:
21*219b2ee8SDavid du Colombier 		fprint(2, "fork failed: %r\n");
22*219b2ee8SDavid du Colombier 		return;
23*219b2ee8SDavid du Colombier 
24*219b2ee8SDavid du Colombier 	case 0:
25*219b2ee8SDavid du Colombier 		close(p[1]);
26*219b2ee8SDavid du Colombier 		dup(p[0], 10);
27*219b2ee8SDavid du Colombier 		close(p[0]);
28*219b2ee8SDavid du Colombier 		execl("/bin/fb/9v", "9v", "/fd/10", 0);
29*219b2ee8SDavid du Colombier 		fprint(2, "exec failed: %r\n");
30*219b2ee8SDavid du Colombier 		exits("exec");
31*219b2ee8SDavid du Colombier 
32*219b2ee8SDavid du Colombier 	default:
33*219b2ee8SDavid du Colombier 		close(p[0]);
34*219b2ee8SDavid du Colombier 		fprint(p[1], "%11d %11d %11d %11d %11d ",
35*219b2ee8SDavid du Colombier 			3, pic->minx, pic->miny, pic->maxx, pic->maxy);
36*219b2ee8SDavid du Colombier 		n = (pic->maxx-pic->minx)*(pic->maxy-pic->miny);
37*219b2ee8SDavid du Colombier 		/* release the memory as we hand it off; this could be a big piece of data */
38*219b2ee8SDavid du Colombier 		a = pic->data;
39*219b2ee8SDavid du Colombier 		while(n > 0){
40*219b2ee8SDavid du Colombier 			i = 8192 - (((int)a)&8191);
41*219b2ee8SDavid du Colombier 			if(i > n)
42*219b2ee8SDavid du Colombier 				i = n;
43*219b2ee8SDavid du Colombier 			if(write(p[1], a, i)!=i)
44*219b2ee8SDavid du Colombier 				fprint(2, "write error: %r\n");
45*219b2ee8SDavid du Colombier 			if(i == 8192)	/* page aligned */
46*219b2ee8SDavid du Colombier 				segfree(a, i);
47*219b2ee8SDavid du Colombier 			n -= i;
48*219b2ee8SDavid du Colombier 			a += i;
49*219b2ee8SDavid du Colombier 		}
50*219b2ee8SDavid du Colombier 		free(pic->data);
51*219b2ee8SDavid du Colombier 		free(pic);
52*219b2ee8SDavid du Colombier 		close(p[1]);
53*219b2ee8SDavid du Colombier 		break;
54*219b2ee8SDavid du Colombier 	}
55*219b2ee8SDavid du Colombier }
56