xref: /plan9/sys/src/cmd/unix/drawterm/libmemlayer/lalloc.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 Memimage*
memlalloc(Memscreen * s,Rectangle screenr,Refreshfn refreshfn,void * refreshptr,ulong val)87dd7cddfSDavid du Colombier memlalloc(Memscreen *s, Rectangle screenr, Refreshfn refreshfn, void *refreshptr, ulong val)
97dd7cddfSDavid du Colombier {
107dd7cddfSDavid du Colombier 	Memlayer *l;
117dd7cddfSDavid du Colombier 	Memimage *n;
127dd7cddfSDavid du Colombier 	static Memimage *paint;
137dd7cddfSDavid du Colombier 
147dd7cddfSDavid du Colombier 	if(paint == nil){
157dd7cddfSDavid du Colombier 		paint = allocmemimage(Rect(0,0,1,1), RGBA32);
167dd7cddfSDavid du Colombier 		if(paint == nil)
177dd7cddfSDavid du Colombier 			return nil;
187dd7cddfSDavid du Colombier 		paint->flags |= Frepl;
197dd7cddfSDavid du Colombier 		paint->clipr = Rect(-0x3FFFFFF, -0x3FFFFFF, 0x3FFFFFF, 0x3FFFFFF);
207dd7cddfSDavid du Colombier 	}
217dd7cddfSDavid du Colombier 
227dd7cddfSDavid du Colombier 	n = allocmemimaged(screenr, s->image->chan, s->image->data, s->image->X);
237dd7cddfSDavid du Colombier 	if(n == nil)
247dd7cddfSDavid du Colombier 		return nil;
257dd7cddfSDavid du Colombier 	l = malloc(sizeof(Memlayer));
267dd7cddfSDavid du Colombier 	if(l == nil){
277dd7cddfSDavid du Colombier 		free(n);
287dd7cddfSDavid du Colombier 		return nil;
297dd7cddfSDavid du Colombier 	}
307dd7cddfSDavid du Colombier 
317dd7cddfSDavid du Colombier 	l->screen = s;
327dd7cddfSDavid du Colombier 	if(refreshfn)
337dd7cddfSDavid du Colombier 		l->save = nil;
347dd7cddfSDavid du Colombier 	else{
357dd7cddfSDavid du Colombier 		l->save = allocmemimage(screenr, s->image->chan);
367dd7cddfSDavid du Colombier 		if(l->save == nil){
377dd7cddfSDavid du Colombier 			free(l);
387dd7cddfSDavid du Colombier 			free(n);
397dd7cddfSDavid du Colombier 			return nil;
407dd7cddfSDavid du Colombier 		}
417dd7cddfSDavid du Colombier 		/* allocmemimage doesn't initialize memory; this paints save area */
427dd7cddfSDavid du Colombier 		if(val != DNofill)
437dd7cddfSDavid du Colombier 			memfillcolor(l->save, val);
447dd7cddfSDavid du Colombier 	}
457dd7cddfSDavid du Colombier 	l->refreshfn = refreshfn;
467dd7cddfSDavid du Colombier 	l->refreshptr = nil;	/* don't set it until we're done */
477dd7cddfSDavid du Colombier 	l->screenr = screenr;
487dd7cddfSDavid du Colombier 	l->delta = Pt(0,0);
497dd7cddfSDavid du Colombier 
507dd7cddfSDavid du Colombier 	n->data->ref++;
517dd7cddfSDavid du Colombier 	n->zero = s->image->zero;
527dd7cddfSDavid du Colombier 	n->width = s->image->width;
537dd7cddfSDavid du Colombier 	n->layer = l;
547dd7cddfSDavid du Colombier 
557dd7cddfSDavid du Colombier 	/* start with new window behind all existing ones */
567dd7cddfSDavid du Colombier 	l->front = s->rearmost;
577dd7cddfSDavid du Colombier 	l->rear = nil;
587dd7cddfSDavid du Colombier 	if(s->rearmost)
597dd7cddfSDavid du Colombier 		s->rearmost->layer->rear = n;
607dd7cddfSDavid du Colombier 	s->rearmost = n;
617dd7cddfSDavid du Colombier 	if(s->frontmost == nil)
627dd7cddfSDavid du Colombier 		s->frontmost = n;
637dd7cddfSDavid du Colombier 	l->clear = 0;
647dd7cddfSDavid du Colombier 
657dd7cddfSDavid du Colombier 	/* now pull new window to front */
66*8ccd4a63SDavid du Colombier 	_memltofrontfill(n, val != DNofill);
677dd7cddfSDavid du Colombier 	l->refreshptr = refreshptr;
687dd7cddfSDavid du Colombier 
697dd7cddfSDavid du Colombier 	/*
707dd7cddfSDavid du Colombier 	 * paint with requested color; previously exposed areas are already right
717dd7cddfSDavid du Colombier 	 * if this window has backing store, but just painting the whole thing is simplest.
727dd7cddfSDavid du Colombier 	 */
737dd7cddfSDavid du Colombier 	if(val != DNofill){
747dd7cddfSDavid du Colombier 		memsetchan(paint, n->chan);
757dd7cddfSDavid du Colombier 		memfillcolor(paint, val);
76*8ccd4a63SDavid du Colombier 		memdraw(n, n->r, paint, n->r.min, nil, n->r.min, S);
777dd7cddfSDavid du Colombier 	}
787dd7cddfSDavid du Colombier 	return n;
797dd7cddfSDavid du Colombier }
80