Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

#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);
}