xref: /plan9/sys/src/cmd/unix/drawterm/libmemlayer/lhide.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
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