|  | #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 = _displayrddraw(d, data+ntot, ndata-ntot); | 
|  | if(n < 0) | 
|  | return n; | 
|  | ntot += n; | 
|  | r.min.y += dy; | 
|  | } | 
|  | return ntot; | 
|  | } |