19 ldrawop(Memimage *dst, Rectangle screenr, Rectangle clipr, void *etc, int insave)
23 Rectangle oclipr, srcr, r, mr;
27 if(insave && d->dstlayer->save==nil)
30 p0 = addpt(screenr.min, d->deltas);
31 p1 = addpt(screenr.min, d->deltam);
34 r = rectsubpt(screenr, d->dstlayer->delta);
35 clipr = rectsubpt(clipr, d->dstlayer->delta);
39 /* now in logical coordinates */
41 /* clipr may have narrowed what we should draw on, so clip if necessary */
42 if(!rectinrect(r, clipr)){
45 ok = drawclipnorepl(dst, &r, d->src, &p0, d->mask, &p1, &srcr, &mr);
50 memdraw(dst, r, d->src, p0, d->mask, p1, d->op);
54 memdraw(Memimage *dst, Rectangle r, Memimage *src, Point p0, Memimage *mask, Point p1, int op)
57 Rectangle srcr, tr, mr;
64 return; /* too hard, at least for now */
67 if(dst->layer==nil && src->layer==nil){
68 memimagedraw(dst, r, src, p0, mask, p1, op);
72 if(drawclipnorepl(dst, &r, src, &p0, mask, &p1, &srcr, &mr) == 0)
76 * Convert to screen coordinates.
80 r.min.x += dl->delta.x;
81 r.min.y += dl->delta.y;
82 r.max.x += dl->delta.x;
83 r.max.y += dl->delta.y;
86 if(dl!=nil && dl->clear){
90 src = dl->screen->image;
92 dst = dl->screen->image;
100 srcr.min.x += sl->delta.x;
101 srcr.min.y += sl->delta.y;
102 srcr.max.x += sl->delta.x;
103 srcr.max.y += sl->delta.y;
107 * Now everything is in screen coordinates.
108 * mask is an image. dst and src are images or obscured layers.
112 * if dst and src are the same layer, just draw in save area and expose.
114 if(dl!=nil && dst==src){
116 return; /* refresh function makes this case unworkable */
117 if(rectXrect(r, srcr)){
119 if(srcr.min.x < tr.min.x){
120 p1.x += tr.min.x - srcr.min.x;
121 tr.min.x = srcr.min.x;
123 if(srcr.min.y < tr.min.y){
124 p1.y += tr.min.x - srcr.min.x;
125 tr.min.y = srcr.min.y;
127 if(srcr.max.x > tr.max.x)
128 tr.max.x = srcr.max.x;
129 if(srcr.max.y > tr.max.y)
130 tr.max.y = srcr.max.y;
136 memdraw(dl->save, rectsubpt(r, dl->delta), dl->save,
137 subpt(srcr.min, src->layer->delta), mask, p1, op);
144 src = sl->screen->image;
146 r.min.x -= dl->delta.x;
147 r.min.y -= dl->delta.y;
148 r.max.x -= dl->delta.x;
149 r.max.y -= dl->delta.y;
153 /* relatively rare case; use save area */
155 return; /* refresh function makes this case unworkable */
157 /* convert back to logical coordinates */
160 srcr.min.x -= sl->delta.x;
161 srcr.min.y -= sl->delta.y;
162 srcr.max.x -= sl->delta.x;
163 srcr.max.y -= sl->delta.y;
164 src = src->layer->save;
168 * src is now an image. dst may be an image or a clear layer
172 if(dst->layer->clear)
176 * dst is an obscured layer
178 d.deltas = subpt(p0, r.min);
179 d.deltam = subpt(p1, r.min);
184 _memlayerop(ldrawop, dst, r, r, &d);