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