ref: b47c096c8ceb7b96820ec886146a674eb9ad2c7b
dir: /sys/src/libdraw/cloadimage.c/
#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("cloadimage: bad maxy %d", maxy); return -1; } data += 2*12; ndata -= 2*12; m += 2*12; if(nb<=0 || ncblock<nb || nb>ndata){ werrstr("cloadimage: 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; }