1 #include <u.h>
2 #include <libc.h>
3 #include <draw.h>
4 #include <memdraw.h>
5 #include <memlayer.h>
6 
7 void
_memltorear(Memimage * i,Memimage * rear)8 _memltorear(Memimage *i, Memimage *rear)
9 {
10 	Memlayer *l;
11 	Memscreen *s;
12 	Memimage *f, *r, *rr;
13 	Rectangle x;
14 	int overlap;
15 
16 	l = i->layer;
17 	s = l->screen;
18 	while(l->rear != rear){
19 		r = l->rear;
20 		x = l->screenr;
21 		overlap = rectclip(&x, r->layer->screenr);
22 		if(overlap){
23 			memlhide(i, x);
24 			l->clear = 0;
25 		}
26 		/* swap l and r in screen's list */
27 		rr = r->layer->rear;
28 		f = l->front;
29 		if(rr == nil)
30 			s->rearmost = i;
31 		else
32 			rr->layer->front = i;
33 		if(f == nil)
34 			s->frontmost = r;
35 		else
36 			f->layer->rear = r;
37 		l->rear = rr;
38 		l->front = r;
39 		r->layer->rear = i;
40 		r->layer->front = f;
41 		if(overlap)
42 			memlexpose(r, x);
43 	}
44 }
45 
46 void
memltorear(Memimage * i)47 memltorear(Memimage *i)
48 {
49 	_memltorear(i, nil);
50 	_memlsetclear(i->layer->screen);
51 }
52 
53 void
memltorearn(Memimage ** ip,int n)54 memltorearn(Memimage **ip, int n)
55 {
56 	Memimage *i, *rear;
57 	Memscreen *s;
58 
59 	if(n == 0)
60 		return;
61 	rear = nil;
62 	while(--n >= 0){
63 		i = *ip++;
64 		_memltorear(i, rear);
65 		rear = i;
66 	}
67 	s = rear->layer->screen;
68 	_memlsetclear(s);
69 }
70