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