1 #include <u.h>
2 #include <libc.h>
3 #include <draw.h>
4 #include <memdraw.h>
5 #include <memlayer.h>
6 
7 void
memldelete(Memimage * i)8 memldelete(Memimage *i)
9 {
10 	Memscreen *s;
11 	Memlayer *l;
12 
13 	l = i->layer;
14 	/* free backing store and disconnect refresh, to make pushback fast */
15 	freememimage(l->save);
16 	l->save = nil;
17 	l->refreshptr = nil;
18 	memltorear(i);
19 
20 	/* window is now the rearmost;  clean up screen structures and deallocate */
21 	s = i->layer->screen;
22 	if(s->fill){
23 		i->clipr = i->r;
24 		memdraw(i, i->r, s->fill, i->r.min, nil, i->r.min, S);
25 	}
26 	if(l->front){
27 		l->front->layer->rear = nil;
28 		s->rearmost = l->front;
29 	}else{
30 		s->frontmost = nil;
31 		s->rearmost = nil;
32 	}
33 	free(l);
34 	freememimage(i);
35 }
36 
37 /*
38  * Just free the data structures, don't do graphics
39  */
40 void
memlfree(Memimage * i)41 memlfree(Memimage *i)
42 {
43 	Memlayer *l;
44 
45 	l = i->layer;
46 	freememimage(l->save);
47 	free(l);
48 	freememimage(i);
49 }
50 
51 void
_memlsetclear(Memscreen * s)52 _memlsetclear(Memscreen *s)
53 {
54 	Memimage *i, *j;
55 	Memlayer *l;
56 
57 	for(i=s->rearmost; i; i=i->layer->front){
58 		l = i->layer;
59 		l->clear = rectinrect(l->screenr, l->screen->image->clipr);
60 		if(l->clear)
61 			for(j=l->front; j; j=j->layer->front)
62 				if(rectXrect(l->screenr, j->layer->screenr)){
63 					l->clear = 0;
64 					break;
65 				}
66 	}
67 }
68