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

int
memunload(Memimage *src, Rectangle r, uchar *data, int n)
{
       Memimage *tmp;
       Memlayer *dl;
       Rectangle lr;
       int dx;

   Top:
       dl = src->layer;
       if(dl == nil)
               return unloadmemimage(src, 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/src->depth);
       if(dl->clear && dx==0){
               src = dl->screen->image;
               goto Top;
       }

       /*
        * src is an obscured layer or data is unaligned
        */
       if(dl->save && dx==0){
               if(dl->refreshfn != nil)
                       return -1;      /* can't unload window if it's not Refbackup */
               if(n > 0)
                       memlhide(src, r);
               n = unloadmemimage(dl->save, lr, data, n);
               return n;
       }
       tmp = allocmemimage(lr, src->chan);
       if(tmp == nil)
               return -1;
       memdraw(tmp, lr, src, lr.min, nil, lr.min, S);
       n = unloadmemimage(tmp, lr, data, n);
       freememimage(tmp);
       return n;
}