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