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