]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/scat/display.c
cc: use 7 octal digits for 21 bit runes
[plan9front.git] / sys / src / cmd / scat / display.c
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 }