xref: /plan9/sys/src/cmd/scat/display.c (revision 74f16c8187aab477889167f2422d0597b1b7d0ff)
1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include <draw.h>
5 #include "sky.h"
6 
7 void
displaypic(Picture * pic)8 displaypic(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], 0);
27 		close(p[0]);
28 		execl("/bin/page", "page", "-w", nil);
29 		fprint(2, "exec failed: %r\n");
30 		exits("exec");
31 
32 	default:
33 		close(p[0]);
34 		fprint(p[1], "%11s %11d %11d %11d %11d ",
35 			"k8", 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 - (((uintptr)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 
57 void
displayimage(Image * im)58 displayimage(Image *im)
59 {
60 	int p[2];
61 
62 	if(pipe(p) < 0){
63 		fprint(2, "pipe failed: %r\n");
64 		return;
65 	}
66 	switch(rfork(RFPROC|RFFDG|RFNOTEG|RFNOWAIT)){
67 	case -1:
68 		fprint(2, "fork failed: %r\n");
69 		return;
70 
71 	case 0:
72 		close(p[1]);
73 		dup(p[0], 0);
74 		close(p[0]);
75 		execl("/bin/page", "page", "-w", nil);
76 		fprint(2, "exec failed: %r\n");
77 		exits("exec");
78 
79 	default:
80 		close(p[0]);
81 		writeimage(p[1], im, 0);
82 		freeimage(im);
83 		close(p[1]);
84 		break;
85 	}
86 }
87