8 * Place i so i->r.min = log, i->layer->screenr.min == scr.
11 memlorigin(Memimage *i, Point log, Point scr)
15 Memimage *t, *shad, *nsave;
16 Rectangle x, newr, oldr;
18 int overlap, eqlog, eqscr, wasclear;
23 newr = Rect(scr.x, scr.y, scr.x+Dx(oldr), scr.y+Dy(oldr));
24 eqscr = eqpt(scr, oldr.min);
25 eqlog = eqpt(log, i->r.min);
29 if(eqlog==0 && l->save!=nil){
30 nsave = allocmemimage(Rect(log.x, log.y, log.x+Dx(oldr), log.y+Dy(oldr)), i->chan);
36 * Bring it to front and move logical coordinate system.
42 memimagedraw(nsave, nsave->r, l->save, l->save->r.min, nil, Pt(0,0), S);
43 freememimage(l->save);
46 delta = subpt(log, i->r.min);
47 i->r = rectaddpt(i->r, delta);
48 i->clipr = rectaddpt(i->clipr, delta);
49 l->delta = subpt(l->screenr.min, i->r.min);
54 * To clean up old position, make a shadow window there, don't paint it,
55 * push it behind this one, and (later) delete it. Because the refresh function
56 * for this fake window is a no-op, this will cause no graphics action except
57 * to restore the background and expose the windows previously hidden.
59 shad = memlalloc(s, oldr, memlnorefresh, nil, DNofill);
66 l->rear->layer->front = shad;
67 shad->layer->front = i;
68 shad->layer->rear = l->rear;
71 shad->layer->clear = 0;
74 * Shadow is now holding down the fort at the old position.
75 * Move the window and hide things obscured by new position.
77 for(t=l->rear->layer->rear; t!=nil; t=t->layer->rear){
79 overlap = rectclip(&x, t->layer->screenr);
86 l->delta = subpt(scr, i->r.min);
87 l->clear = rectinrect(newr, l->screen->image->clipr);
90 * Everything's covered. Copy to new position and delete shadow window.
93 memdraw(s->image, newr, s->image, oldr.min, nil, Pt(0,0), S);
102 memlnorefresh(Memimage *l, Rectangle r, void *v)