|  | #include <u.h> | 
|  | #include <libc.h> | 
|  | #include <draw.h> | 
|  |  | 
|  | int | 
|  | loadimage(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; | 
|  | } |