Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include <u.h>
#include <libc.h>
#include <draw.h>

int
unloadimage(Image *i, Rectangle r, uchar *data, int ndata)
{
        int bpl, n, ntot, dy;
        uchar *a;
        Display *d;

        if(!rectinrect(r, i->r)){
                werrstr("unloadimage: bad rectangle");
                return -1;
        }
        bpl = bytesperline(r, i->depth);
        if(ndata < bpl*Dy(r)){
                werrstr("unloadimage: buffer too small");
                return -1;
        }

        d = i->display;
        flushimage(d, 0);       /* make sure subsequent flush is for us only */
        ntot = 0;
        while(r.min.y < r.max.y){
                a = bufimage(d, 1+4+4*4);
                if(a == 0){
                        werrstr("unloadimage: %r");
                        return -1;
                }
                dy = 8000/bpl;
                if(dy <= 0){
                        werrstr("unloadimage: image too wide");
                        return -1;
                }
                if(dy > Dy(r))
                        dy = Dy(r);
                a[0] = 'r';
                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);
                if(flushimage(d, 0) < 0)
                        return -1;
                n = read(d->fd, data+ntot, ndata-ntot);
                if(n < 0)
                        return n;
                ntot += n;
                r.min.y += dy;
        }
        return ntot;
}