xref: /plan9/sys/src/cmd/unix/drawterm/libmemlayer/unload.c (revision 14093dc2f1c686bec1bc44cefce44368c26be35a)
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