xref: /plan9/sys/src/libdraw/unloadimage.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
1*7dd7cddfSDavid du Colombier #include <u.h>
2*7dd7cddfSDavid du Colombier #include <libc.h>
3*7dd7cddfSDavid du Colombier #include <draw.h>
4*7dd7cddfSDavid du Colombier 
5*7dd7cddfSDavid du Colombier int
unloadimage(Image * i,Rectangle r,uchar * data,int ndata)6*7dd7cddfSDavid du Colombier unloadimage(Image *i, Rectangle r, uchar *data, int ndata)
7*7dd7cddfSDavid du Colombier {
8*7dd7cddfSDavid du Colombier 	int bpl, n, ntot, dy;
9*7dd7cddfSDavid du Colombier 	uchar *a;
10*7dd7cddfSDavid du Colombier 	Display *d;
11*7dd7cddfSDavid du Colombier 
12*7dd7cddfSDavid du Colombier 	if(!rectinrect(r, i->r)){
13*7dd7cddfSDavid du Colombier 		werrstr("unloadimage: bad rectangle");
14*7dd7cddfSDavid du Colombier 		return -1;
15*7dd7cddfSDavid du Colombier 	}
16*7dd7cddfSDavid du Colombier 	bpl = bytesperline(r, i->depth);
17*7dd7cddfSDavid du Colombier 	if(ndata < bpl*Dy(r)){
18*7dd7cddfSDavid du Colombier 		werrstr("unloadimage: buffer too small");
19*7dd7cddfSDavid du Colombier 		return -1;
20*7dd7cddfSDavid du Colombier 	}
21*7dd7cddfSDavid du Colombier 
22*7dd7cddfSDavid du Colombier 	d = i->display;
23*7dd7cddfSDavid du Colombier 	flushimage(d, 0);	/* make sure subsequent flush is for us only */
24*7dd7cddfSDavid du Colombier 	ntot = 0;
25*7dd7cddfSDavid du Colombier 	while(r.min.y < r.max.y){
26*7dd7cddfSDavid du Colombier 		a = bufimage(d, 1+4+4*4);
27*7dd7cddfSDavid du Colombier 		if(a == 0){
28*7dd7cddfSDavid du Colombier 			werrstr("unloadimage: %r");
29*7dd7cddfSDavid du Colombier 			return -1;
30*7dd7cddfSDavid du Colombier 		}
31*7dd7cddfSDavid du Colombier 		dy = 8000/bpl;
32*7dd7cddfSDavid du Colombier 		if(dy <= 0){
33*7dd7cddfSDavid du Colombier 			werrstr("unloadimage: image too wide");
34*7dd7cddfSDavid du Colombier 			return -1;
35*7dd7cddfSDavid du Colombier 		}
36*7dd7cddfSDavid du Colombier 		if(dy > Dy(r))
37*7dd7cddfSDavid du Colombier 			dy = Dy(r);
38*7dd7cddfSDavid du Colombier 		a[0] = 'r';
39*7dd7cddfSDavid du Colombier 		BPLONG(a+1, i->id);
40*7dd7cddfSDavid du Colombier 		BPLONG(a+5, r.min.x);
41*7dd7cddfSDavid du Colombier 		BPLONG(a+9, r.min.y);
42*7dd7cddfSDavid du Colombier 		BPLONG(a+13, r.max.x);
43*7dd7cddfSDavid du Colombier 		BPLONG(a+17, r.min.y+dy);
44*7dd7cddfSDavid du Colombier 		if(flushimage(d, 0) < 0)
45*7dd7cddfSDavid du Colombier 			return -1;
46*7dd7cddfSDavid du Colombier 		n = read(d->fd, data+ntot, ndata-ntot);
47*7dd7cddfSDavid du Colombier 		if(n < 0)
48*7dd7cddfSDavid du Colombier 			return n;
49*7dd7cddfSDavid du Colombier 		ntot += n;
50*7dd7cddfSDavid du Colombier 		r.min.y += dy;
51*7dd7cddfSDavid du Colombier 	}
52*7dd7cddfSDavid du Colombier 	return ntot;
53*7dd7cddfSDavid du Colombier }
54