Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <draw.h>
5 int
6 loadimage(Image *i, Rectangle r, uchar *data, int ndata)
7 {
8 long dy;
9 int n, bpl;
10 uchar *a;
11 int chunk;
13 chunk = i->display->bufsize - 64;
15 if(!rectinrect(r, i->r)){
16 werrstr("loadimage: bad rectangle");
17 return -1;
18 }
19 bpl = bytesperline(r, i->depth);
20 n = bpl*Dy(r);
21 if(n > ndata){
22 werrstr("loadimage: insufficient data");
23 return -1;
24 }
25 ndata = 0;
26 while(r.max.y > r.min.y){
27 dy = r.max.y - r.min.y;
28 if(dy*bpl > chunk)
29 dy = chunk/bpl;
30 if(dy <= 0){
31 werrstr("loadimage: image too wide for buffer");
32 return -1;
33 }
34 n = dy*bpl;
35 a = bufimage(i->display, 21+n);
36 if(a == nil){
37 werrstr("bufimage failed");
38 return -1;
39 }
40 a[0] = 'y';
41 BPLONG(a+1, i->id);
42 BPLONG(a+5, r.min.x);
43 BPLONG(a+9, r.min.y);
44 BPLONG(a+13, r.max.x);
45 BPLONG(a+17, r.min.y+dy);
46 memmove(a+21, data, n);
47 ndata += n;
48 data += n;
49 r.min.y += dy;
50 }
51 if(flushimage(i->display, 0) < 0)
52 return -1;
53 return ndata;
54 }