summaryrefslogtreecommitdiff
path: root/sys/src/cmd/scat/display.c
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/scat/display.c
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/scat/display.c')
-rwxr-xr-xsys/src/cmd/scat/display.c86
1 files changed, 86 insertions, 0 deletions
diff --git a/sys/src/cmd/scat/display.c b/sys/src/cmd/scat/display.c
new file mode 100755
index 000000000..040f316ab
--- /dev/null
+++ b/sys/src/cmd/scat/display.c
@@ -0,0 +1,86 @@
+#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;
+ }
+}