|  | #include <u.h> | 
|  | #include <libc.h> | 
|  | #include <draw.h> | 
|  | #include <memdraw.h> | 
|  | #include <memlayer.h> | 
|  |  | 
|  | /* | 
|  | * Hide puts that portion of screenr now on the screen into the window's save area. | 
|  | * Expose puts that portion of screenr now in the save area onto the screen. | 
|  | * | 
|  | * Hide and Expose both require that the layer structures in the screen | 
|  | * match the geometry they are being asked to update, that is, they update the | 
|  | * save area (hide) or screen (expose) based on what those structures tell them. | 
|  | * This means they must be called at the correct time during window shuffles. | 
|  | */ | 
|  |  | 
|  | static | 
|  | void | 
|  | lhideop(Memimage *src, Rectangle screenr, Rectangle clipr, void *etc, int insave) | 
|  | { | 
|  | Rectangle r; | 
|  | Memlayer *l; | 
|  |  | 
|  | USED(clipr.min.x); | 
|  | USED(insave); | 
|  | l = etc; | 
|  | if(src != l->save){	/* do nothing if src is already in save area */ | 
|  | r = rectsubpt(screenr, l->delta); | 
|  | memdraw(l->save, r, src, screenr.min, nil, screenr.min, S); | 
|  | } | 
|  | } | 
|  |  | 
|  | void | 
|  | memlhide(Memimage *i, Rectangle screenr) | 
|  | { | 
|  | if(i->layer->save == nil) | 
|  | return; | 
|  | if(rectclip(&screenr, i->layer->screen->image->r) == 0) | 
|  | return; | 
|  | _memlayerop(lhideop, i, screenr, screenr, i->layer); | 
|  | } | 
|  |  | 
|  | static | 
|  | void | 
|  | lexposeop(Memimage *dst, Rectangle screenr, Rectangle clipr, void *etc, int insave) | 
|  | { | 
|  | Memlayer *l; | 
|  | Rectangle r; | 
|  |  | 
|  | USED(clipr.min.x); | 
|  | if(insave)	/* if dst is save area, don't bother */ | 
|  | return; | 
|  | l = etc; | 
|  | r = rectsubpt(screenr, l->delta); | 
|  | if(l->save) | 
|  | memdraw(dst, screenr, l->save, r.min, nil, r.min, S); | 
|  | else | 
|  | l->refreshfn(dst, r, l->refreshptr); | 
|  | } | 
|  |  | 
|  | void | 
|  | memlexpose(Memimage *i, Rectangle screenr) | 
|  | { | 
|  | if(rectclip(&screenr, i->layer->screen->image->r) == 0) | 
|  | return; | 
|  | _memlayerop(lexposeop, i, screenr, screenr, i->layer); | 
|  | } |