Blame


1 76193d7c 2003-09-30 devnull #include <u.h>
2 76193d7c 2003-09-30 devnull #include <libc.h>
3 76193d7c 2003-09-30 devnull #include <draw.h>
4 76193d7c 2003-09-30 devnull #include <memdraw.h>
5 76193d7c 2003-09-30 devnull #include <memlayer.h>
6 76193d7c 2003-09-30 devnull
7 76193d7c 2003-09-30 devnull /*
8 76193d7c 2003-09-30 devnull * Place i so i->r.min = log, i->layer->screenr.min == scr.
9 76193d7c 2003-09-30 devnull */
10 76193d7c 2003-09-30 devnull int
11 76193d7c 2003-09-30 devnull memlorigin(Memimage *i, Point log, Point scr)
12 76193d7c 2003-09-30 devnull {
13 76193d7c 2003-09-30 devnull Memlayer *l;
14 76193d7c 2003-09-30 devnull Memscreen *s;
15 76193d7c 2003-09-30 devnull Memimage *t, *shad, *nsave;
16 76193d7c 2003-09-30 devnull Rectangle x, newr, oldr;
17 76193d7c 2003-09-30 devnull Point delta;
18 76193d7c 2003-09-30 devnull int overlap, eqlog, eqscr, wasclear;
19 76193d7c 2003-09-30 devnull
20 76193d7c 2003-09-30 devnull l = i->layer;
21 76193d7c 2003-09-30 devnull s = l->screen;
22 76193d7c 2003-09-30 devnull oldr = l->screenr;
23 76193d7c 2003-09-30 devnull newr = Rect(scr.x, scr.y, scr.x+Dx(oldr), scr.y+Dy(oldr));
24 76193d7c 2003-09-30 devnull eqscr = eqpt(scr, oldr.min);
25 76193d7c 2003-09-30 devnull eqlog = eqpt(log, i->r.min);
26 76193d7c 2003-09-30 devnull if(eqscr && eqlog)
27 76193d7c 2003-09-30 devnull return 0;
28 76193d7c 2003-09-30 devnull nsave = nil;
29 76193d7c 2003-09-30 devnull if(eqlog==0 && l->save!=nil){
30 76193d7c 2003-09-30 devnull nsave = allocmemimage(Rect(log.x, log.y, log.x+Dx(oldr), log.y+Dy(oldr)), i->chan);
31 76193d7c 2003-09-30 devnull if(nsave == nil)
32 76193d7c 2003-09-30 devnull return -1;
33 76193d7c 2003-09-30 devnull }
34 76193d7c 2003-09-30 devnull
35 76193d7c 2003-09-30 devnull /*
36 76193d7c 2003-09-30 devnull * Bring it to front and move logical coordinate system.
37 76193d7c 2003-09-30 devnull */
38 76193d7c 2003-09-30 devnull memltofront(i);
39 76193d7c 2003-09-30 devnull wasclear = l->clear;
40 76193d7c 2003-09-30 devnull if(nsave){
41 76193d7c 2003-09-30 devnull if(!wasclear)
42 76193d7c 2003-09-30 devnull memimagedraw(nsave, nsave->r, l->save, l->save->r.min, nil, Pt(0,0), S);
43 76193d7c 2003-09-30 devnull freememimage(l->save);
44 76193d7c 2003-09-30 devnull l->save = nsave;
45 76193d7c 2003-09-30 devnull }
46 76193d7c 2003-09-30 devnull delta = subpt(log, i->r.min);
47 76193d7c 2003-09-30 devnull i->r = rectaddpt(i->r, delta);
48 76193d7c 2003-09-30 devnull i->clipr = rectaddpt(i->clipr, delta);
49 76193d7c 2003-09-30 devnull l->delta = subpt(l->screenr.min, i->r.min);
50 76193d7c 2003-09-30 devnull if(eqscr)
51 76193d7c 2003-09-30 devnull return 0;
52 76193d7c 2003-09-30 devnull
53 76193d7c 2003-09-30 devnull /*
54 76193d7c 2003-09-30 devnull * To clean up old position, make a shadow window there, don't paint it,
55 76193d7c 2003-09-30 devnull * push it behind this one, and (later) delete it. Because the refresh function
56 76193d7c 2003-09-30 devnull * for this fake window is a no-op, this will cause no graphics action except
57 76193d7c 2003-09-30 devnull * to restore the background and expose the windows previously hidden.
58 76193d7c 2003-09-30 devnull */
59 76193d7c 2003-09-30 devnull shad = memlalloc(s, oldr, memlnorefresh, nil, DNofill);
60 76193d7c 2003-09-30 devnull if(shad == nil)
61 76193d7c 2003-09-30 devnull return -1;
62 76193d7c 2003-09-30 devnull s->frontmost = i;
63 76193d7c 2003-09-30 devnull if(s->rearmost == i)
64 76193d7c 2003-09-30 devnull s->rearmost = shad;
65 76193d7c 2003-09-30 devnull else
66 76193d7c 2003-09-30 devnull l->rear->layer->front = shad;
67 76193d7c 2003-09-30 devnull shad->layer->front = i;
68 76193d7c 2003-09-30 devnull shad->layer->rear = l->rear;
69 76193d7c 2003-09-30 devnull l->rear = shad;
70 76193d7c 2003-09-30 devnull l->front = nil;
71 76193d7c 2003-09-30 devnull shad->layer->clear = 0;
72 76193d7c 2003-09-30 devnull
73 76193d7c 2003-09-30 devnull /*
74 76193d7c 2003-09-30 devnull * Shadow is now holding down the fort at the old position.
75 76193d7c 2003-09-30 devnull * Move the window and hide things obscured by new position.
76 76193d7c 2003-09-30 devnull */
77 76193d7c 2003-09-30 devnull for(t=l->rear->layer->rear; t!=nil; t=t->layer->rear){
78 76193d7c 2003-09-30 devnull x = newr;
79 76193d7c 2003-09-30 devnull overlap = rectclip(&x, t->layer->screenr);
80 76193d7c 2003-09-30 devnull if(overlap){
81 76193d7c 2003-09-30 devnull memlhide(t, x);
82 76193d7c 2003-09-30 devnull t->layer->clear = 0;
83 76193d7c 2003-09-30 devnull }
84 76193d7c 2003-09-30 devnull }
85 76193d7c 2003-09-30 devnull l->screenr = newr;
86 76193d7c 2003-09-30 devnull l->delta = subpt(scr, i->r.min);
87 76193d7c 2003-09-30 devnull l->clear = rectinrect(newr, l->screen->image->clipr);
88 76193d7c 2003-09-30 devnull
89 76193d7c 2003-09-30 devnull /*
90 76193d7c 2003-09-30 devnull * Everything's covered. Copy to new position and delete shadow window.
91 76193d7c 2003-09-30 devnull */
92 76193d7c 2003-09-30 devnull if(wasclear)
93 76193d7c 2003-09-30 devnull memdraw(s->image, newr, s->image, oldr.min, nil, Pt(0,0), S);
94 76193d7c 2003-09-30 devnull else
95 76193d7c 2003-09-30 devnull memlexpose(i, newr);
96 76193d7c 2003-09-30 devnull memldelete(shad);
97 76193d7c 2003-09-30 devnull
98 76193d7c 2003-09-30 devnull return 1;
99 76193d7c 2003-09-30 devnull }
100 76193d7c 2003-09-30 devnull
101 76193d7c 2003-09-30 devnull void
102 76193d7c 2003-09-30 devnull memlnorefresh(Memimage *l, Rectangle r, void *v)
103 76193d7c 2003-09-30 devnull {
104 76193d7c 2003-09-30 devnull USED(l);
105 76193d7c 2003-09-30 devnull USED(r.min.x);
106 76193d7c 2003-09-30 devnull USED(v);
107 76193d7c 2003-09-30 devnull }