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