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