plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

display.c (1514B)


      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)){
     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", 0); */
     29 		execlp("img", "img", nil);
     30 		fprint(2, "exec failed: %r\n");
     31 		exits("exec");
     32 
     33 	default:
     34 		close(p[0]);
     35 		fprint(p[1], "%11s %11d %11d %11d %11d ",
     36 			"k8", pic->minx, pic->miny, pic->maxx, pic->maxy);
     37 		n = (pic->maxx-pic->minx)*(pic->maxy-pic->miny);
     38 		/* release the memory as we hand it off; this could be a big piece of data */
     39 		a = pic->data;
     40 		while(n > 0){
     41 			i = 8192 - (((uintptr)a)&8191);
     42 			if(i > n)
     43 				i = n;
     44 			if(write(p[1], a, i)!=i)
     45 				fprint(2, "write error: %r\n");
     46 		/*	if(i == 8192)	/* page aligned */
     47 		/*		segfree(a, i); */
     48 			n -= i;
     49 			a += i;
     50 		}
     51 		free(pic->data);
     52 		free(pic);
     53 		close(p[1]);
     54 		break;
     55 	}
     56 }
     57 
     58 void
     59 displayimage(Image *im)
     60 {
     61 	int p[2];
     62 
     63 	if(pipe(p) < 0){
     64 		fprint(2, "pipe failed: %r\n");
     65 		return;
     66 	}
     67 	switch(rfork(RFPROC|RFFDG)){
     68 	case -1:
     69 		fprint(2, "fork failed: %r\n");
     70 		return;
     71 
     72 	case 0:
     73 		close(p[1]);
     74 		dup(p[0], 0);
     75 		close(p[0]);
     76 		execlp("img", "img", nil);
     77 	/*	execl("/bin/page", "page", "-w", 0); */
     78 		fprint(2, "exec failed: %r\n");
     79 		exits("exec");
     80 
     81 	default:
     82 		close(p[0]);
     83 		writeimage(p[1], im, 0);
     84 		freeimage(im);
     85 		close(p[1]);
     86 		break;
     87 	}
     88 }