180ee5cbfSDavid du Colombier #include <u.h>
280ee5cbfSDavid du Colombier #include <libc.h>
380ee5cbfSDavid du Colombier #include <draw.h>
480ee5cbfSDavid du Colombier #include <memdraw.h>
580ee5cbfSDavid du Colombier #include <memlayer.h>
680ee5cbfSDavid du Colombier
780ee5cbfSDavid du Colombier int
memunload(Memimage * src,Rectangle r,uchar * data,int n)880ee5cbfSDavid du Colombier memunload(Memimage *src, Rectangle r, uchar *data, int n)
980ee5cbfSDavid du Colombier {
1080ee5cbfSDavid du Colombier Memimage *tmp;
1180ee5cbfSDavid du Colombier Memlayer *dl;
1280ee5cbfSDavid du Colombier Rectangle lr;
1380ee5cbfSDavid du Colombier int dx;
1480ee5cbfSDavid du Colombier
1580ee5cbfSDavid du Colombier Top:
1680ee5cbfSDavid du Colombier dl = src->layer;
1780ee5cbfSDavid du Colombier if(dl == nil)
1880ee5cbfSDavid du Colombier return unloadmemimage(src, r, data, n);
1980ee5cbfSDavid du Colombier
2080ee5cbfSDavid du Colombier /*
2180ee5cbfSDavid du Colombier * Convert to screen coordinates.
2280ee5cbfSDavid du Colombier */
2380ee5cbfSDavid du Colombier lr = r;
2480ee5cbfSDavid du Colombier r.min.x += dl->delta.x;
2580ee5cbfSDavid du Colombier r.min.y += dl->delta.y;
2680ee5cbfSDavid du Colombier r.max.x += dl->delta.x;
2780ee5cbfSDavid du Colombier r.max.y += dl->delta.y;
2880ee5cbfSDavid du Colombier dx = dl->delta.x&(7/src->depth);
2980ee5cbfSDavid du Colombier if(dl->clear && dx==0){
3080ee5cbfSDavid du Colombier src = dl->screen->image;
3180ee5cbfSDavid du Colombier goto Top;
3280ee5cbfSDavid du Colombier }
3380ee5cbfSDavid du Colombier
3480ee5cbfSDavid du Colombier /*
3580ee5cbfSDavid du Colombier * src is an obscured layer or data is unaligned
3680ee5cbfSDavid du Colombier */
3780ee5cbfSDavid du Colombier if(dl->save && dx==0){
3880ee5cbfSDavid du Colombier if(dl->refreshfn != nil)
3980ee5cbfSDavid du Colombier return -1; /* can't unload window if it's not Refbackup */
4080ee5cbfSDavid du Colombier if(n > 0)
4180ee5cbfSDavid du Colombier memlhide(src, r);
4280ee5cbfSDavid du Colombier n = unloadmemimage(dl->save, lr, data, n);
4380ee5cbfSDavid du Colombier return n;
4480ee5cbfSDavid du Colombier }
4580ee5cbfSDavid du Colombier tmp = allocmemimage(lr, src->chan);
4680ee5cbfSDavid du Colombier if(tmp == nil)
4780ee5cbfSDavid du Colombier return -1;
48*6a9fc400SDavid du Colombier memdraw(tmp, lr, src, lr.min, nil, lr.min, S);
4980ee5cbfSDavid du Colombier n = unloadmemimage(tmp, lr, data, n);
5080ee5cbfSDavid du Colombier freememimage(tmp);
5180ee5cbfSDavid du Colombier return n;
5280ee5cbfSDavid du Colombier }
53