display.c (1514B)
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)){ 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", 0); */ 29 execlp("img", "img", nil); 30 fprint(2, "exec failed: %r\n"); 31 exits("exec"); 32 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 } 57 58 void 59 displayimage(Image *im) 60 { 61 int p[2]; 62 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; 71 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"); 80 81 default: 82 close(p[0]); 83 writeimage(p[1], im, 0); 84 freeimage(im); 85 close(p[1]); 86 break; 87 } 88 }