123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- #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;
- }
|