18ccd4a63SDavid du Colombier #include <u.h>
28ccd4a63SDavid du Colombier #include <libc.h>
38ccd4a63SDavid du Colombier #include <draw.h>
48ccd4a63SDavid du Colombier #include <memdraw.h>
58ccd4a63SDavid du Colombier #include <memlayer.h>
68ccd4a63SDavid du Colombier
78ccd4a63SDavid du Colombier int
memunload(Memimage * src,Rectangle r,uchar * data,int n)88ccd4a63SDavid du Colombier memunload(Memimage *src, Rectangle r, uchar *data, int n)
98ccd4a63SDavid du Colombier {
108ccd4a63SDavid du Colombier Memimage *tmp;
118ccd4a63SDavid du Colombier Memlayer *dl;
128ccd4a63SDavid du Colombier Rectangle lr;
138ccd4a63SDavid du Colombier int dx;
148ccd4a63SDavid du Colombier
158ccd4a63SDavid du Colombier Top:
168ccd4a63SDavid du Colombier dl = src->layer;
178ccd4a63SDavid du Colombier if(dl == nil)
188ccd4a63SDavid du Colombier return unloadmemimage(src, r, data, n);
198ccd4a63SDavid du Colombier
208ccd4a63SDavid du Colombier /*
218ccd4a63SDavid du Colombier * Convert to screen coordinates.
228ccd4a63SDavid du Colombier */
238ccd4a63SDavid du Colombier lr = r;
248ccd4a63SDavid du Colombier r.min.x += dl->delta.x;
258ccd4a63SDavid du Colombier r.min.y += dl->delta.y;
268ccd4a63SDavid du Colombier r.max.x += dl->delta.x;
278ccd4a63SDavid du Colombier r.max.y += dl->delta.y;
288ccd4a63SDavid du Colombier dx = dl->delta.x&(7/src->depth);
298ccd4a63SDavid du Colombier if(dl->clear && dx==0){
308ccd4a63SDavid du Colombier src = dl->screen->image;
318ccd4a63SDavid du Colombier goto Top;
328ccd4a63SDavid du Colombier }
338ccd4a63SDavid du Colombier
348ccd4a63SDavid du Colombier /*
358ccd4a63SDavid du Colombier * src is an obscured layer or data is unaligned
368ccd4a63SDavid du Colombier */
378ccd4a63SDavid du Colombier if(dl->save && dx==0){
38*14093dc2SDavid du Colombier if(dl->refreshfn != 0)
398ccd4a63SDavid du Colombier return -1; /* can't unload window if it's not Refbackup */
408ccd4a63SDavid du Colombier if(n > 0)
418ccd4a63SDavid du Colombier memlhide(src, r);
428ccd4a63SDavid du Colombier n = unloadmemimage(dl->save, lr, data, n);
438ccd4a63SDavid du Colombier return n;
448ccd4a63SDavid du Colombier }
458ccd4a63SDavid du Colombier tmp = allocmemimage(lr, src->chan);
468ccd4a63SDavid du Colombier if(tmp == nil)
478ccd4a63SDavid du Colombier return -1;
488ccd4a63SDavid du Colombier memdraw(tmp, lr, src, lr.min, nil, lr.min, S);
498ccd4a63SDavid du Colombier n = unloadmemimage(tmp, lr, data, n);
508ccd4a63SDavid du Colombier freememimage(tmp);
518ccd4a63SDavid du Colombier return n;
528ccd4a63SDavid du Colombier }
53