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