xref: /plan9/sys/src/libdraw/loadimage.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <draw.h>
47dd7cddfSDavid du Colombier 
57dd7cddfSDavid du Colombier int
loadimage(Image * i,Rectangle r,uchar * data,int ndata)67dd7cddfSDavid du Colombier loadimage(Image *i, Rectangle r, uchar *data, int ndata)
77dd7cddfSDavid du Colombier {
87dd7cddfSDavid du Colombier 	long dy;
97dd7cddfSDavid du Colombier 	int n, bpl;
107dd7cddfSDavid du Colombier 	uchar *a;
11*9a747e4fSDavid du Colombier 	int chunk;
12*9a747e4fSDavid du Colombier 
13*9a747e4fSDavid du Colombier 	chunk = i->display->bufsize - 64;
147dd7cddfSDavid du Colombier 
157dd7cddfSDavid du Colombier 	if(!rectinrect(r, i->r)){
167dd7cddfSDavid du Colombier 		werrstr("loadimage: bad rectangle");
177dd7cddfSDavid du Colombier 		return -1;
187dd7cddfSDavid du Colombier 	}
197dd7cddfSDavid du Colombier 	bpl = bytesperline(r, i->depth);
207dd7cddfSDavid du Colombier 	n = bpl*Dy(r);
217dd7cddfSDavid du Colombier 	if(n > ndata){
227dd7cddfSDavid du Colombier 		werrstr("loadimage: insufficient data");
237dd7cddfSDavid du Colombier 		return -1;
247dd7cddfSDavid du Colombier 	}
257dd7cddfSDavid du Colombier 	ndata = 0;
267dd7cddfSDavid du Colombier 	while(r.max.y > r.min.y){
277dd7cddfSDavid du Colombier 		dy = r.max.y - r.min.y;
28*9a747e4fSDavid du Colombier 		if(dy*bpl > chunk)
29*9a747e4fSDavid du Colombier 			dy = chunk/bpl;
307dd7cddfSDavid du Colombier 		if(dy <= 0){
317dd7cddfSDavid du Colombier 			werrstr("loadimage: image too wide for buffer");
327dd7cddfSDavid du Colombier 			return -1;
337dd7cddfSDavid du Colombier 		}
347dd7cddfSDavid du Colombier 		n = dy*bpl;
357dd7cddfSDavid du Colombier 		a = bufimage(i->display, 21+n);
367dd7cddfSDavid du Colombier 		if(a == nil){
377dd7cddfSDavid du Colombier 			werrstr("bufimage failed");
387dd7cddfSDavid du Colombier 			return -1;
397dd7cddfSDavid du Colombier 		}
407dd7cddfSDavid du Colombier 		a[0] = 'y';
417dd7cddfSDavid du Colombier 		BPLONG(a+1, i->id);
427dd7cddfSDavid du Colombier 		BPLONG(a+5, r.min.x);
437dd7cddfSDavid du Colombier 		BPLONG(a+9, r.min.y);
447dd7cddfSDavid du Colombier 		BPLONG(a+13, r.max.x);
457dd7cddfSDavid du Colombier 		BPLONG(a+17, r.min.y+dy);
467dd7cddfSDavid du Colombier 		memmove(a+21, data, n);
477dd7cddfSDavid du Colombier 		ndata += n;
487dd7cddfSDavid du Colombier 		data += n;
497dd7cddfSDavid du Colombier 		r.min.y += dy;
507dd7cddfSDavid du Colombier 	}
517dd7cddfSDavid du Colombier 	if(flushimage(i->display, 0) < 0)
527dd7cddfSDavid du Colombier 		return -1;
537dd7cddfSDavid du Colombier 	return ndata;
547dd7cddfSDavid du Colombier }
55