1*8ccd4a63SDavid du Colombier #include <u.h>
2*8ccd4a63SDavid du Colombier #include <libc.h>
3*8ccd4a63SDavid du Colombier #include <draw.h>
4*8ccd4a63SDavid du Colombier #include <memdraw.h>
5*8ccd4a63SDavid du Colombier #include <memlayer.h>
67dd7cddfSDavid du Colombier
77dd7cddfSDavid du Colombier /*
87dd7cddfSDavid du Colombier * Hide puts that portion of screenr now on the screen into the window's save area.
97dd7cddfSDavid du Colombier * Expose puts that portion of screenr now in the save area onto the screen.
107dd7cddfSDavid du Colombier *
117dd7cddfSDavid du Colombier * Hide and Expose both require that the layer structures in the screen
127dd7cddfSDavid du Colombier * match the geometry they are being asked to update, that is, they update the
137dd7cddfSDavid du Colombier * save area (hide) or screen (expose) based on what those structures tell them.
147dd7cddfSDavid du Colombier * This means they must be called at the correct time during window shuffles.
157dd7cddfSDavid du Colombier */
167dd7cddfSDavid du Colombier
177dd7cddfSDavid du Colombier static
187dd7cddfSDavid du Colombier void
lhideop(Memimage * src,Rectangle screenr,Rectangle clipr,void * etc,int insave)197dd7cddfSDavid du Colombier lhideop(Memimage *src, Rectangle screenr, Rectangle clipr, void *etc, int insave)
207dd7cddfSDavid du Colombier {
217dd7cddfSDavid du Colombier Rectangle r;
227dd7cddfSDavid du Colombier Memlayer *l;
237dd7cddfSDavid du Colombier
247dd7cddfSDavid du Colombier USED(clipr.min.x);
257dd7cddfSDavid du Colombier USED(insave);
267dd7cddfSDavid du Colombier l = etc;
277dd7cddfSDavid du Colombier if(src != l->save){ /* do nothing if src is already in save area */
287dd7cddfSDavid du Colombier r = rectsubpt(screenr, l->delta);
29*8ccd4a63SDavid du Colombier memdraw(l->save, r, src, screenr.min, nil, screenr.min, S);
307dd7cddfSDavid du Colombier }
317dd7cddfSDavid du Colombier }
327dd7cddfSDavid du Colombier
337dd7cddfSDavid du Colombier void
memlhide(Memimage * i,Rectangle screenr)347dd7cddfSDavid du Colombier memlhide(Memimage *i, Rectangle screenr)
357dd7cddfSDavid du Colombier {
367dd7cddfSDavid du Colombier if(i->layer->save == nil)
377dd7cddfSDavid du Colombier return;
387dd7cddfSDavid du Colombier if(rectclip(&screenr, i->layer->screen->image->r) == 0)
397dd7cddfSDavid du Colombier return;
40*8ccd4a63SDavid du Colombier _memlayerop(lhideop, i, screenr, screenr, i->layer);
417dd7cddfSDavid du Colombier }
427dd7cddfSDavid du Colombier
43*8ccd4a63SDavid du Colombier static
447dd7cddfSDavid du Colombier void
lexposeop(Memimage * dst,Rectangle screenr,Rectangle clipr,void * etc,int insave)457dd7cddfSDavid du Colombier lexposeop(Memimage *dst, Rectangle screenr, Rectangle clipr, void *etc, int insave)
467dd7cddfSDavid du Colombier {
477dd7cddfSDavid du Colombier Memlayer *l;
487dd7cddfSDavid du Colombier Rectangle r;
497dd7cddfSDavid du Colombier
507dd7cddfSDavid du Colombier USED(clipr.min.x);
517dd7cddfSDavid du Colombier if(insave) /* if dst is save area, don't bother */
527dd7cddfSDavid du Colombier return;
537dd7cddfSDavid du Colombier l = etc;
547dd7cddfSDavid du Colombier r = rectsubpt(screenr, l->delta);
557dd7cddfSDavid du Colombier if(l->save)
56*8ccd4a63SDavid du Colombier memdraw(dst, screenr, l->save, r.min, nil, r.min, S);
577dd7cddfSDavid du Colombier else
587dd7cddfSDavid du Colombier l->refreshfn(dst, r, l->refreshptr);
597dd7cddfSDavid du Colombier }
607dd7cddfSDavid du Colombier
617dd7cddfSDavid du Colombier void
memlexpose(Memimage * i,Rectangle screenr)627dd7cddfSDavid du Colombier memlexpose(Memimage *i, Rectangle screenr)
637dd7cddfSDavid du Colombier {
647dd7cddfSDavid du Colombier if(rectclip(&screenr, i->layer->screen->image->r) == 0)
657dd7cddfSDavid du Colombier return;
66*8ccd4a63SDavid du Colombier _memlayerop(lexposeop, i, screenr, screenr, i->layer);
677dd7cddfSDavid du Colombier }
68