Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include <draw.h>
5 #include "sky.h"
7 void
8 displaypic(Picture *pic)
9 {
10 int p[2];
11 int i, n;
12 uchar *a;
15 if(pipe(p) < 0){
16 fprint(2, "pipe failed: %r\n");
17 return;
18 }
19 switch(rfork(RFPROC|RFFDG)){
20 case -1:
21 fprint(2, "fork failed: %r\n");
22 return;
24 case 0:
25 close(p[1]);
26 dup(p[0], 0);
27 close(p[0]);
28 /* execl("/bin/page", "page", "-w", 0); */
29 execlp("img", "img", nil);
30 fprint(2, "exec failed: %r\n");
31 exits("exec");
33 default:
34 close(p[0]);
35 fprint(p[1], "%11s %11d %11d %11d %11d ",
36 "k8", pic->minx, pic->miny, pic->maxx, pic->maxy);
37 n = (pic->maxx-pic->minx)*(pic->maxy-pic->miny);
38 /* release the memory as we hand it off; this could be a big piece of data */
39 a = pic->data;
40 while(n > 0){
41 i = 8192 - (((uintptr)a)&8191);
42 if(i > n)
43 i = n;
44 if(write(p[1], a, i)!=i)
45 fprint(2, "write error: %r\n");
46 /* if(i == 8192) /* page aligned */
47 /* segfree(a, i); */
48 n -= i;
49 a += i;
50 }
51 free(pic->data);
52 free(pic);
53 close(p[1]);
54 break;
55 }
56 }
58 void
59 displayimage(Image *im)
60 {
61 int p[2];
63 if(pipe(p) < 0){
64 fprint(2, "pipe failed: %r\n");
65 return;
66 }
67 switch(rfork(RFPROC|RFFDG)){
68 case -1:
69 fprint(2, "fork failed: %r\n");
70 return;
72 case 0:
73 close(p[1]);
74 dup(p[0], 0);
75 close(p[0]);
76 execlp("img", "img", nil);
77 /* execl("/bin/page", "page", "-w", 0); */
78 fprint(2, "exec failed: %r\n");
79 exits("exec");
81 default:
82 close(p[0]);
83 writeimage(p[1], im, 0);
84 freeimage(im);
85 close(p[1]);
86 break;
87 }
88 }