68 lines
1.6 KiB
C
68 lines
1.6 KiB
C
#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);
|
|
}
|