Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <draw.h>
4 #include <memdraw.h>
5 #include <memlayer.h>
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 */
17 static
18 void
19 lhideop(Memimage *src, Rectangle screenr, Rectangle clipr, void *etc, int insave)
20 {
21 Rectangle r;
22 Memlayer *l;
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 }
33 void
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 }
43 static
44 void
45 lexposeop(Memimage *dst, Rectangle screenr, Rectangle clipr, void *etc, int insave)
46 {
47 Memlayer *l;
48 Rectangle r;
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 }
61 void
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 }