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