| #include <u.h> |
| #include <libc.h> |
| #include <draw.h> |
| |
| int |
| cloadimage(Image *i, Rectangle r, uchar *data, int ndata) |
| { |
| int m, nb, miny, maxy, ncblock; |
| uchar *a; |
| |
| if(!rectinrect(r, i->r)){ |
| werrstr("cloadimage: bad rectangle"); |
| return -1; |
| } |
| |
| miny = r.min.y; |
| m = 0; |
| ncblock = _compblocksize(r, i->depth); |
| while(miny != r.max.y){ |
| maxy = atoi((char*)data+0*12); |
| nb = atoi((char*)data+1*12); |
| if(maxy<=miny || r.max.y<maxy){ |
| werrstr("creadimage: bad maxy %d", maxy); |
| return -1; |
| } |
| data += 2*12; |
| ndata -= 2*12; |
| m += 2*12; |
| if(nb<=0 || ncblock<nb || nb>ndata){ |
| werrstr("creadimage: bad count %d", nb); |
| return -1; |
| } |
| a = bufimage(i->display, 21+nb); |
| if(a == nil) |
| return -1; |
| a[0] = 'Y'; |
| BPLONG(a+1, i->id); |
| BPLONG(a+5, r.min.x); |
| BPLONG(a+9, miny); |
| BPLONG(a+13, r.max.x); |
| BPLONG(a+17, maxy); |
| memmove(a+21, data, nb); |
| miny = maxy; |
| data += nb; |
| ndata += nb; |
| m += nb; |
| } |
| return m; |
| } |