| #include <u.h> |
| #include <libc.h> |
| #include <draw.h> |
| #include <memdraw.h> |
| #include <memlayer.h> |
| |
| int |
| memunload(Memimage *src, Rectangle r, uchar *data, int n) |
| { |
| Memimage *tmp; |
| Memlayer *dl; |
| Rectangle lr; |
| int dx; |
| |
| Top: |
| dl = src->layer; |
| if(dl == nil) |
| return unloadmemimage(src, r, data, n); |
| |
| /* |
| * Convert to screen coordinates. |
| */ |
| lr = r; |
| r.min.x += dl->delta.x; |
| r.min.y += dl->delta.y; |
| r.max.x += dl->delta.x; |
| r.max.y += dl->delta.y; |
| dx = dl->delta.x&(7/src->depth); |
| if(dl->clear && dx==0){ |
| src = dl->screen->image; |
| goto Top; |
| } |
| |
| /* |
| * src is an obscured layer or data is unaligned |
| */ |
| if(dl->save && dx==0){ |
| if(dl->refreshfn != 0) |
| return -1; /* can't unload window if it's not Refbackup */ |
| if(n > 0) |
| memlhide(src, r); |
| n = unloadmemimage(dl->save, lr, data, n); |
| return n; |
| } |
| tmp = allocmemimage(lr, src->chan); |
| if(tmp == nil) |
| return -1; |
| memdraw(tmp, lr, src, lr.min, nil, lr.min, S); |
| n = unloadmemimage(tmp, lr, data, n); |
| freememimage(tmp); |
| return n; |
| } |