Blob


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