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