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