xref: /plan9-contrib/sys/src/cmd/unix/drawterm/libmemlayer/lalloc.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
1*7dd7cddfSDavid du Colombier #include "../lib9.h"
2*7dd7cddfSDavid du Colombier 
3*7dd7cddfSDavid du Colombier #include "../libdraw/draw.h"
4*7dd7cddfSDavid du Colombier #include "../libmemdraw/memdraw.h"
5*7dd7cddfSDavid du Colombier #include "../libmemlayer/memlayer.h"
6*7dd7cddfSDavid du Colombier 
7*7dd7cddfSDavid du Colombier Memimage*
8*7dd7cddfSDavid du Colombier memlalloc(Memscreen *s, Rectangle screenr, Refreshfn refreshfn, void *refreshptr, ulong val)
9*7dd7cddfSDavid du Colombier {
10*7dd7cddfSDavid du Colombier 	Memlayer *l;
11*7dd7cddfSDavid du Colombier 	Memimage *n;
12*7dd7cddfSDavid du Colombier 	static Memimage *paint;
13*7dd7cddfSDavid du Colombier 
14*7dd7cddfSDavid du Colombier 	if(paint == nil){
15*7dd7cddfSDavid du Colombier 		paint = allocmemimage(Rect(0,0,1,1), RGBA32);
16*7dd7cddfSDavid du Colombier 		if(paint == nil)
17*7dd7cddfSDavid du Colombier 			return nil;
18*7dd7cddfSDavid du Colombier 		paint->flags |= Frepl;
19*7dd7cddfSDavid du Colombier 		paint->clipr = Rect(-0x3FFFFFF, -0x3FFFFFF, 0x3FFFFFF, 0x3FFFFFF);
20*7dd7cddfSDavid du Colombier 	}
21*7dd7cddfSDavid du Colombier 
22*7dd7cddfSDavid du Colombier 	n = allocmemimaged(screenr, s->image->chan, s->image->data, s->image->X);
23*7dd7cddfSDavid du Colombier 	if(n == nil)
24*7dd7cddfSDavid du Colombier 		return nil;
25*7dd7cddfSDavid du Colombier 	l = malloc(sizeof(Memlayer));
26*7dd7cddfSDavid du Colombier 	if(l == nil){
27*7dd7cddfSDavid du Colombier 		free(n);
28*7dd7cddfSDavid du Colombier 		return nil;
29*7dd7cddfSDavid du Colombier 	}
30*7dd7cddfSDavid du Colombier 
31*7dd7cddfSDavid du Colombier 	l->screen = s;
32*7dd7cddfSDavid du Colombier 	if(refreshfn)
33*7dd7cddfSDavid du Colombier 		l->save = nil;
34*7dd7cddfSDavid du Colombier 	else{
35*7dd7cddfSDavid du Colombier 		l->save = allocmemimage(screenr, s->image->chan);
36*7dd7cddfSDavid du Colombier 		if(l->save == nil){
37*7dd7cddfSDavid du Colombier 			free(l);
38*7dd7cddfSDavid du Colombier 			free(n);
39*7dd7cddfSDavid du Colombier 			return nil;
40*7dd7cddfSDavid du Colombier 		}
41*7dd7cddfSDavid du Colombier 		/* allocmemimage doesn't initialize memory; this paints save area */
42*7dd7cddfSDavid du Colombier 		if(val != DNofill)
43*7dd7cddfSDavid du Colombier 			memfillcolor(l->save, val);
44*7dd7cddfSDavid du Colombier 	}
45*7dd7cddfSDavid du Colombier 	l->refreshfn = refreshfn;
46*7dd7cddfSDavid du Colombier 	l->refreshptr = nil;	/* don't set it until we're done */
47*7dd7cddfSDavid du Colombier 	l->screenr = screenr;
48*7dd7cddfSDavid du Colombier 	l->delta = Pt(0,0);
49*7dd7cddfSDavid du Colombier 
50*7dd7cddfSDavid du Colombier 	n->data->ref++;
51*7dd7cddfSDavid du Colombier 	n->zero = s->image->zero;
52*7dd7cddfSDavid du Colombier 	n->width = s->image->width;
53*7dd7cddfSDavid du Colombier 	n->layer = l;
54*7dd7cddfSDavid du Colombier 
55*7dd7cddfSDavid du Colombier 	/* start with new window behind all existing ones */
56*7dd7cddfSDavid du Colombier 	l->front = s->rearmost;
57*7dd7cddfSDavid du Colombier 	l->rear = nil;
58*7dd7cddfSDavid du Colombier 	if(s->rearmost)
59*7dd7cddfSDavid du Colombier 		s->rearmost->layer->rear = n;
60*7dd7cddfSDavid du Colombier 	s->rearmost = n;
61*7dd7cddfSDavid du Colombier 	if(s->frontmost == nil)
62*7dd7cddfSDavid du Colombier 		s->frontmost = n;
63*7dd7cddfSDavid du Colombier 	l->clear = 0;
64*7dd7cddfSDavid du Colombier 
65*7dd7cddfSDavid du Colombier 	/* now pull new window to front */
66*7dd7cddfSDavid du Colombier 	memltofront(n);
67*7dd7cddfSDavid du Colombier 	l->refreshptr = refreshptr;
68*7dd7cddfSDavid du Colombier 
69*7dd7cddfSDavid du Colombier 	/*
70*7dd7cddfSDavid du Colombier 	 * paint with requested color; previously exposed areas are already right
71*7dd7cddfSDavid du Colombier 	 * if this window has backing store, but just painting the whole thing is simplest.
72*7dd7cddfSDavid du Colombier 	 */
73*7dd7cddfSDavid du Colombier 	if(val != DNofill){
74*7dd7cddfSDavid du Colombier 		memsetchan(paint, n->chan);
75*7dd7cddfSDavid du Colombier 		memfillcolor(paint, val);
76*7dd7cddfSDavid du Colombier 		memdraw(n, n->r, paint, n->r.min, nil, n->r.min);
77*7dd7cddfSDavid du Colombier 	}
78*7dd7cddfSDavid du Colombier 	return n;
79*7dd7cddfSDavid du Colombier }
80