1 #include <u.h>
2 #include <libc.h>
3 #include <draw.h>
4 #include <memdraw.h>
5 #include <memlayer.h>
6 
7 /*
8  * Hide puts that portion of screenr now on the screen into the window's save area.
9  * Expose puts that portion of screenr now in the save area onto the screen.
10  *
11  * Hide and Expose both require that the layer structures in the screen
12  * match the geometry they are being asked to update, that is, they update the
13  * save area (hide) or screen (expose) based on what those structures tell them.
14  * This means they must be called at the correct time during window shuffles.
15  */
16 
17 static
18 void
lhideop(Memimage * src,Rectangle screenr,Rectangle clipr,void * etc,int insave)19 lhideop(Memimage *src, Rectangle screenr, Rectangle clipr, void *etc, int insave)
20 {
21 	Rectangle r;
22 	Memlayer *l;
23 
24 	USED(clipr.min.x);
25 	USED(insave);
26 	l = etc;
27 	if(src != l->save){	/* do nothing if src is already in save area */
28 		r = rectsubpt(screenr, l->delta);
29 		memdraw(l->save, r, src, screenr.min, nil, screenr.min, S);
30 	}
31 }
32 
33 void
memlhide(Memimage * i,Rectangle screenr)34 memlhide(Memimage *i, Rectangle screenr)
35 {
36 	if(i->layer->save == nil)
37 		return;
38 	if(rectclip(&screenr, i->layer->screen->image->r) == 0)
39 		return;
40 	_memlayerop(lhideop, i, screenr, screenr, i->layer);
41 }
42 
43 static
44 void
lexposeop(Memimage * dst,Rectangle screenr,Rectangle clipr,void * etc,int insave)45 lexposeop(Memimage *dst, Rectangle screenr, Rectangle clipr, void *etc, int insave)
46 {
47 	Memlayer *l;
48 	Rectangle r;
49 
50 	USED(clipr.min.x);
51 	if(insave)	/* if dst is save area, don't bother */
52 		return;
53 	l = etc;
54 	r = rectsubpt(screenr, l->delta);
55 	if(l->save)
56 		memdraw(dst, screenr, l->save, r.min, nil, r.min, S);
57 	else
58 		l->refreshfn(dst, r, l->refreshptr);
59 }
60 
61 void
memlexpose(Memimage * i,Rectangle screenr)62 memlexpose(Memimage *i, Rectangle screenr)
63 {
64 	if(rectclip(&screenr, i->layer->screen->image->r) == 0)
65 		return;
66 	_memlayerop(lexposeop, i, screenr, screenr, i->layer);
67 }
68