Blame


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