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