54 lines · 983 B · C
RawDownload
#include <u.h>#include <libc.h>#include <draw.h> intloadimage(Image *i, Rectangle r, uchar *data, int ndata){	long dy;	int n, bpl;	uchar *a;	int chunk; 	chunk = i->display->bufsize - 64; 	if(!rectinrect(r, i->r)){		werrstr("loadimage: bad rectangle");		return -1;	}	bpl = bytesperline(r, i->depth);	n = bpl*Dy(r);	if(n > ndata){		werrstr("loadimage: insufficient data");		return -1;	}	ndata = 0;	while(r.max.y > r.min.y){		dy = r.max.y - r.min.y;		if(dy*bpl > chunk)			dy = chunk/bpl;		if(dy <= 0){			werrstr("loadimage: image too wide for buffer");			return -1;		}		n = dy*bpl;		a = bufimage(i->display, 21+n);		if(a == nil){			werrstr("bufimage failed");			return -1;		}		a[0] = 'y';		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);		memmove(a+21, data, n);		ndata += n;		data += n;		r.min.y += dy;	}	if(flushimage(i->display, 0) < 0)		return -1;	return ndata;}