53 lines · 1015 B · C
RawDownload
#include <u.h>#include <libc.h>#include <draw.h> intunloadimage(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 = i->display->bufsize/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;}