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