1 #include <u.h> 2 #include <libc.h> 3 #include <bio.h> 4 #include <draw.h> 5 #include "sky.h" 6 7 void 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 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