1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- #include <u.h>
- #include <libc.h>
- #include <bio.h>
- #include <draw.h>
- #include "sky.h"
- void
- displaypic(Picture *pic)
- {
- int p[2];
- int i, n;
- uchar *a;
-
- if(pipe(p) < 0){
- fprint(2, "pipe failed: %r\n");
- return;
- }
- switch(rfork(RFPROC|RFFDG|RFNOTEG|RFNOWAIT)){
- case -1:
- fprint(2, "fork failed: %r\n");
- return;
- case 0:
- close(p[1]);
- dup(p[0], 0);
- close(p[0]);
- execl("/bin/page", "page", "-w", nil);
- fprint(2, "exec failed: %r\n");
- exits("exec");
- default:
- close(p[0]);
- fprint(p[1], "%11s %11d %11d %11d %11d ",
- "k8", pic->minx, pic->miny, pic->maxx, pic->maxy);
- n = (pic->maxx-pic->minx)*(pic->maxy-pic->miny);
- /* release the memory as we hand it off; this could be a big piece of data */
- a = pic->data;
- while(n > 0){
- i = 8192 - (((uintptr)a)&8191);
- if(i > n)
- i = n;
- if(write(p[1], a, i)!=i)
- fprint(2, "write error: %r\n");
- if(i == 8192) /* page aligned */
- segfree(a, i);
- n -= i;
- a += i;
- }
- free(pic->data);
- free(pic);
- close(p[1]);
- break;
- }
- }
- void
- displayimage(Image *im)
- {
- int p[2];
- if(pipe(p) < 0){
- fprint(2, "pipe failed: %r\n");
- return;
- }
- switch(rfork(RFPROC|RFFDG|RFNOTEG|RFNOWAIT)){
- case -1:
- fprint(2, "fork failed: %r\n");
- return;
- case 0:
- close(p[1]);
- dup(p[0], 0);
- close(p[0]);
- execl("/bin/page", "page", "-w", nil);
- fprint(2, "exec failed: %r\n");
- exits("exec");
- default:
- close(p[0]);
- writeimage(p[1], im, 0);
- freeimage(im);
- close(p[1]);
- break;
- }
- }
|