Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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
}