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

int
memload(Memimage *dst, Rectangle r, uchar *data, int n, int iscompressed)
{
       int (*loadfn)(Memimage*, Rectangle, uchar*, int);
       Memimage *tmp;
       Memlayer *dl;
       Rectangle lr;
       int dx;

       loadfn = loadmemimage;
       if(iscompressed)
               loadfn = cloadmemimage;

   Top:
       dl = dst->layer;
       if(dl == nil)
               return loadfn(dst, r, data, n);

       /*
        * Convert to screen coordinates.
        */
       lr = r;
       r.min.x += dl->delta.x;
       r.min.y += dl->delta.y;
       r.max.x += dl->delta.x;
       r.max.y += dl->delta.y;
       dx = dl->delta.x&(7/dst->depth);
       if(dl->clear && dx==0){
               dst = dl->screen->image;
               goto Top;
       }

       /*
        * dst is an obscured layer or data is unaligned
        */
       if(dl->save && dx==0){
               n = loadfn(dl->save, lr, data, n);
               if(n > 0)
                       memlexpose(dst, r);
               return n;
       }
       tmp = allocmemimage(lr, dst->chan);
       if(tmp == nil)
               return -1;
       n = loadfn(tmp, lr, data, n);
       memdraw(dst, lr, tmp, lr.min, nil, lr.min, S);
       freememimage(tmp);
       return n;
}