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