xref: /plan9/sys/src/cmd/unix/drawterm/libmemlayer/ltorear.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
1*8ccd4a63SDavid du Colombier #include <u.h>
2*8ccd4a63SDavid du Colombier #include <libc.h>
3*8ccd4a63SDavid du Colombier #include <draw.h>
4*8ccd4a63SDavid du Colombier #include <memdraw.h>
5*8ccd4a63SDavid du Colombier #include <memlayer.h>
67dd7cddfSDavid du Colombier 
77dd7cddfSDavid du Colombier void
_memltorear(Memimage * i,Memimage * rear)87dd7cddfSDavid du Colombier _memltorear(Memimage *i, Memimage *rear)
97dd7cddfSDavid du Colombier {
107dd7cddfSDavid du Colombier 	Memlayer *l;
117dd7cddfSDavid du Colombier 	Memscreen *s;
127dd7cddfSDavid du Colombier 	Memimage *f, *r, *rr;
137dd7cddfSDavid du Colombier 	Rectangle x;
147dd7cddfSDavid du Colombier 	int overlap;
157dd7cddfSDavid du Colombier 
167dd7cddfSDavid du Colombier 	l = i->layer;
177dd7cddfSDavid du Colombier 	s = l->screen;
187dd7cddfSDavid du Colombier 	while(l->rear != rear){
197dd7cddfSDavid du Colombier 		r = l->rear;
207dd7cddfSDavid du Colombier 		x = l->screenr;
217dd7cddfSDavid du Colombier 		overlap = rectclip(&x, r->layer->screenr);
227dd7cddfSDavid du Colombier 		if(overlap){
237dd7cddfSDavid du Colombier 			memlhide(i, x);
247dd7cddfSDavid du Colombier 			l->clear = 0;
257dd7cddfSDavid du Colombier 		}
267dd7cddfSDavid du Colombier 		/* swap l and r in screen's list */
277dd7cddfSDavid du Colombier 		rr = r->layer->rear;
287dd7cddfSDavid du Colombier 		f = l->front;
297dd7cddfSDavid du Colombier 		if(rr == nil)
307dd7cddfSDavid du Colombier 			s->rearmost = i;
317dd7cddfSDavid du Colombier 		else
327dd7cddfSDavid du Colombier 			rr->layer->front = i;
337dd7cddfSDavid du Colombier 		if(f == nil)
347dd7cddfSDavid du Colombier 			s->frontmost = r;
357dd7cddfSDavid du Colombier 		else
367dd7cddfSDavid du Colombier 			f->layer->rear = r;
377dd7cddfSDavid du Colombier 		l->rear = rr;
387dd7cddfSDavid du Colombier 		l->front = r;
397dd7cddfSDavid du Colombier 		r->layer->rear = i;
407dd7cddfSDavid du Colombier 		r->layer->front = f;
417dd7cddfSDavid du Colombier 		if(overlap)
427dd7cddfSDavid du Colombier 			memlexpose(r, x);
437dd7cddfSDavid du Colombier 	}
447dd7cddfSDavid du Colombier }
457dd7cddfSDavid du Colombier 
467dd7cddfSDavid du Colombier void
memltorear(Memimage * i)477dd7cddfSDavid du Colombier memltorear(Memimage *i)
487dd7cddfSDavid du Colombier {
497dd7cddfSDavid du Colombier 	_memltorear(i, nil);
50*8ccd4a63SDavid du Colombier 	_memlsetclear(i->layer->screen);
517dd7cddfSDavid du Colombier }
527dd7cddfSDavid du Colombier 
537dd7cddfSDavid du Colombier void
memltorearn(Memimage ** ip,int n)547dd7cddfSDavid du Colombier memltorearn(Memimage **ip, int n)
557dd7cddfSDavid du Colombier {
567dd7cddfSDavid du Colombier 	Memimage *i, *rear;
577dd7cddfSDavid du Colombier 	Memscreen *s;
587dd7cddfSDavid du Colombier 
597dd7cddfSDavid du Colombier 	if(n == 0)
607dd7cddfSDavid du Colombier 		return;
617dd7cddfSDavid du Colombier 	rear = nil;
627dd7cddfSDavid du Colombier 	while(--n >= 0){
637dd7cddfSDavid du Colombier 		i = *ip++;
647dd7cddfSDavid du Colombier 		_memltorear(i, rear);
657dd7cddfSDavid du Colombier 		rear = i;
667dd7cddfSDavid du Colombier 	}
677dd7cddfSDavid du Colombier 	s = rear->layer->screen;
68*8ccd4a63SDavid du Colombier 	_memlsetclear(s);
697dd7cddfSDavid du Colombier }
70