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 #include "pool.h"
6*37da2899SCharles.Forsyth
7*37da2899SCharles.Forsyth /*
8*37da2899SCharles.Forsyth * Pull i towards top of screen, just behind front
9*37da2899SCharles.Forsyth */
10*37da2899SCharles.Forsyth static
11*37da2899SCharles.Forsyth void
_memltofront(Memimage * i,Memimage * front,int fill)12*37da2899SCharles.Forsyth _memltofront(Memimage *i, Memimage *front, int fill)
13*37da2899SCharles.Forsyth {
14*37da2899SCharles.Forsyth Memlayer *l;
15*37da2899SCharles.Forsyth Memscreen *s;
16*37da2899SCharles.Forsyth Memimage *f, *ff, *rr;
17*37da2899SCharles.Forsyth Rectangle x;
18*37da2899SCharles.Forsyth int overlap;
19*37da2899SCharles.Forsyth
20*37da2899SCharles.Forsyth l = i->layer;
21*37da2899SCharles.Forsyth s = l->screen;
22*37da2899SCharles.Forsyth while(l->front != front){
23*37da2899SCharles.Forsyth f = l->front;
24*37da2899SCharles.Forsyth x = l->screenr;
25*37da2899SCharles.Forsyth overlap = rectclip(&x, f->layer->screenr);
26*37da2899SCharles.Forsyth if(overlap){
27*37da2899SCharles.Forsyth memlhide(f, x);
28*37da2899SCharles.Forsyth f->layer->clear = 0;
29*37da2899SCharles.Forsyth }
30*37da2899SCharles.Forsyth /* swap l and f in screen's list */
31*37da2899SCharles.Forsyth ff = f->layer->front;
32*37da2899SCharles.Forsyth rr = l->rear;
33*37da2899SCharles.Forsyth if(ff == nil)
34*37da2899SCharles.Forsyth s->frontmost = i;
35*37da2899SCharles.Forsyth else
36*37da2899SCharles.Forsyth ff->layer->rear = i;
37*37da2899SCharles.Forsyth if(rr == nil)
38*37da2899SCharles.Forsyth s->rearmost = f;
39*37da2899SCharles.Forsyth else
40*37da2899SCharles.Forsyth rr->layer->front = f;
41*37da2899SCharles.Forsyth l->front = ff;
42*37da2899SCharles.Forsyth l->rear = f;
43*37da2899SCharles.Forsyth f->layer->front = i;
44*37da2899SCharles.Forsyth f->layer->rear = rr;
45*37da2899SCharles.Forsyth if(overlap && fill)
46*37da2899SCharles.Forsyth memlexpose(i, x);
47*37da2899SCharles.Forsyth }
48*37da2899SCharles.Forsyth }
49*37da2899SCharles.Forsyth
50*37da2899SCharles.Forsyth void
_memltofrontfill(Memimage * i,int fill)51*37da2899SCharles.Forsyth _memltofrontfill(Memimage *i, int fill)
52*37da2899SCharles.Forsyth {
53*37da2899SCharles.Forsyth _memltofront(i, nil, fill);
54*37da2899SCharles.Forsyth _memlsetclear(i->layer->screen);
55*37da2899SCharles.Forsyth }
56*37da2899SCharles.Forsyth
57*37da2899SCharles.Forsyth void
memltofront(Memimage * i)58*37da2899SCharles.Forsyth memltofront(Memimage *i)
59*37da2899SCharles.Forsyth {
60*37da2899SCharles.Forsyth _memltofront(i, nil, 1);
61*37da2899SCharles.Forsyth _memlsetclear(i->layer->screen);
62*37da2899SCharles.Forsyth }
63*37da2899SCharles.Forsyth
64*37da2899SCharles.Forsyth void
memltofrontn(Memimage ** ip,int n)65*37da2899SCharles.Forsyth memltofrontn(Memimage **ip, int n)
66*37da2899SCharles.Forsyth {
67*37da2899SCharles.Forsyth Memimage *i, *front;
68*37da2899SCharles.Forsyth Memscreen *s;
69*37da2899SCharles.Forsyth
70*37da2899SCharles.Forsyth if(n == 0)
71*37da2899SCharles.Forsyth return;
72*37da2899SCharles.Forsyth front = nil;
73*37da2899SCharles.Forsyth while(--n >= 0){
74*37da2899SCharles.Forsyth i = *ip++;
75*37da2899SCharles.Forsyth _memltofront(i, front, 1);
76*37da2899SCharles.Forsyth front = i;
77*37da2899SCharles.Forsyth }
78*37da2899SCharles.Forsyth s = front->layer->screen;
79*37da2899SCharles.Forsyth _memlsetclear(s);
80*37da2899SCharles.Forsyth }
81