ref: e51c4bc6e493a9cd0d9e9d7f1d24c57ae77bab65
dir: /sys/src/cmd/scat/display.c/
#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; } }