xref: /plan9/sys/src/cmd/scat/display.c (revision 74f16c8187aab477889167f2422d0597b1b7d0ff)
1219b2ee8SDavid du Colombier #include <u.h>
2219b2ee8SDavid du Colombier #include <libc.h>
3219b2ee8SDavid du Colombier #include <bio.h>
47dd7cddfSDavid du Colombier #include <draw.h>
5219b2ee8SDavid du Colombier #include "sky.h"
6219b2ee8SDavid du Colombier 
7219b2ee8SDavid du Colombier void
displaypic(Picture * pic)87dd7cddfSDavid du Colombier displaypic(Picture *pic)
9219b2ee8SDavid du Colombier {
10219b2ee8SDavid du Colombier 	int p[2];
11219b2ee8SDavid du Colombier 	int i, n;
12219b2ee8SDavid du Colombier 	uchar *a;
13219b2ee8SDavid du Colombier 
14219b2ee8SDavid du Colombier 
15219b2ee8SDavid du Colombier 	if(pipe(p) < 0){
16219b2ee8SDavid du Colombier 		fprint(2, "pipe failed: %r\n");
17219b2ee8SDavid du Colombier 		return;
18219b2ee8SDavid du Colombier 	}
19219b2ee8SDavid du Colombier 	switch(rfork(RFPROC|RFFDG|RFNOTEG|RFNOWAIT)){
20219b2ee8SDavid du Colombier 	case -1:
21219b2ee8SDavid du Colombier 		fprint(2, "fork failed: %r\n");
22219b2ee8SDavid du Colombier 		return;
23219b2ee8SDavid du Colombier 
24219b2ee8SDavid du Colombier 	case 0:
25219b2ee8SDavid du Colombier 		close(p[1]);
267dd7cddfSDavid du Colombier 		dup(p[0], 0);
27219b2ee8SDavid du Colombier 		close(p[0]);
28f19e7b74SDavid du Colombier 		execl("/bin/page", "page", "-w", nil);
29219b2ee8SDavid du Colombier 		fprint(2, "exec failed: %r\n");
30219b2ee8SDavid du Colombier 		exits("exec");
31219b2ee8SDavid du Colombier 
32219b2ee8SDavid du Colombier 	default:
33219b2ee8SDavid du Colombier 		close(p[0]);
347dd7cddfSDavid du Colombier 		fprint(p[1], "%11s %11d %11d %11d %11d ",
357dd7cddfSDavid du Colombier 			"k8", pic->minx, pic->miny, pic->maxx, pic->maxy);
36219b2ee8SDavid du Colombier 		n = (pic->maxx-pic->minx)*(pic->maxy-pic->miny);
37219b2ee8SDavid du Colombier 		/* release the memory as we hand it off; this could be a big piece of data */
38219b2ee8SDavid du Colombier 		a = pic->data;
39219b2ee8SDavid du Colombier 		while(n > 0){
40*74f16c81SDavid du Colombier 			i = 8192 - (((uintptr)a)&8191);
41219b2ee8SDavid du Colombier 			if(i > n)
42219b2ee8SDavid du Colombier 				i = n;
43219b2ee8SDavid du Colombier 			if(write(p[1], a, i)!=i)
44219b2ee8SDavid du Colombier 				fprint(2, "write error: %r\n");
45219b2ee8SDavid du Colombier 			if(i == 8192)	/* page aligned */
46219b2ee8SDavid du Colombier 				segfree(a, i);
47219b2ee8SDavid du Colombier 			n -= i;
48219b2ee8SDavid du Colombier 			a += i;
49219b2ee8SDavid du Colombier 		}
50219b2ee8SDavid du Colombier 		free(pic->data);
51219b2ee8SDavid du Colombier 		free(pic);
52219b2ee8SDavid du Colombier 		close(p[1]);
53219b2ee8SDavid du Colombier 		break;
54219b2ee8SDavid du Colombier 	}
55219b2ee8SDavid du Colombier }
567dd7cddfSDavid du Colombier 
577dd7cddfSDavid du Colombier void
displayimage(Image * im)587dd7cddfSDavid du Colombier displayimage(Image *im)
597dd7cddfSDavid du Colombier {
607dd7cddfSDavid du Colombier 	int p[2];
617dd7cddfSDavid du Colombier 
627dd7cddfSDavid du Colombier 	if(pipe(p) < 0){
637dd7cddfSDavid du Colombier 		fprint(2, "pipe failed: %r\n");
647dd7cddfSDavid du Colombier 		return;
657dd7cddfSDavid du Colombier 	}
667dd7cddfSDavid du Colombier 	switch(rfork(RFPROC|RFFDG|RFNOTEG|RFNOWAIT)){
677dd7cddfSDavid du Colombier 	case -1:
687dd7cddfSDavid du Colombier 		fprint(2, "fork failed: %r\n");
697dd7cddfSDavid du Colombier 		return;
707dd7cddfSDavid du Colombier 
717dd7cddfSDavid du Colombier 	case 0:
727dd7cddfSDavid du Colombier 		close(p[1]);
737dd7cddfSDavid du Colombier 		dup(p[0], 0);
747dd7cddfSDavid du Colombier 		close(p[0]);
75f19e7b74SDavid du Colombier 		execl("/bin/page", "page", "-w", nil);
767dd7cddfSDavid du Colombier 		fprint(2, "exec failed: %r\n");
777dd7cddfSDavid du Colombier 		exits("exec");
787dd7cddfSDavid du Colombier 
797dd7cddfSDavid du Colombier 	default:
807dd7cddfSDavid du Colombier 		close(p[0]);
817dd7cddfSDavid du Colombier 		writeimage(p[1], im, 0);
827dd7cddfSDavid du Colombier 		freeimage(im);
837dd7cddfSDavid du Colombier 		close(p[1]);
847dd7cddfSDavid du Colombier 		break;
857dd7cddfSDavid du Colombier 	}
867dd7cddfSDavid du Colombier }
87