#include <u.h> | |
#include <libc.h> | |
#include <draw.h> | |
int | |
unloadimage(Image *i, Rectangle r, uchar *data, int ndata) | |
{ | |
int bpl, n, ntot, dy; | |
uchar *a; | |
Display *d; | |
if(!rectinrect(r, i->r)){ | |
werrstr("unloadimage: bad rectangle"); | |
return -1; | |
} | |
bpl = bytesperline(r, i->depth); | |
if(ndata < bpl*Dy(r)){ | |
werrstr("unloadimage: buffer too small"); | |
return -1; | |
} | |
d = i->display; | |
flushimage(d, 0); /* make sure subsequent flush is for us only */ | |
ntot = 0; | |
while(r.min.y < r.max.y){ | |
a = bufimage(d, 1+4+4*4); | |
if(a == 0){ | |
werrstr("unloadimage: %r"); | |
return -1; | |
} | |
dy = 8000/bpl; | |
if(dy <= 0){ | |
werrstr("unloadimage: image too wide"); | |
return -1; | |
} | |
if(dy > Dy(r)) | |
dy = Dy(r); | |
a[0] = 'r'; | |
BPLONG(a+1, i->id); | |
BPLONG(a+5, r.min.x); | |
BPLONG(a+9, r.min.y); | |
BPLONG(a+13, r.max.x); | |
BPLONG(a+17, r.min.y+dy); | |
if(flushimage(d, 0) < 0) | |
return -1; | |
n = _drawmsgread(d, data+ntot, ndata-ntot); | |
if(n < 0) | |
return n; | |
ntot += n; | |
r.min.y += dy; | |
} | |
return ntot; | |
} |