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