xref: /plan9/sys/src/libmemlayer/unload.c (revision 6a9fc400c33447ef5e1cda7185cb4de2c8e8010e)
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