| #include <u.h> |
| #include <libc.h> |
| #include <draw.h> |
| #include <memdraw.h> |
| #include <memlayer.h> |
| |
| int |
| memload(Memimage *dst, Rectangle r, uchar *data, int n, int iscompressed) |
| { |
| int (*loadfn)(Memimage*, Rectangle, uchar*, int); |
| Memimage *tmp; |
| Memlayer *dl; |
| Rectangle lr; |
| int dx; |
| |
| loadfn = loadmemimage; |
| if(iscompressed) |
| loadfn = cloadmemimage; |
| |
| Top: |
| dl = dst->layer; |
| if(dl == nil) |
| return loadfn(dst, 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/dst->depth); |
| if(dl->clear && dx==0){ |
| dst = dl->screen->image; |
| goto Top; |
| } |
| |
| /* |
| * dst is an obscured layer or data is unaligned |
| */ |
| if(dl->save && dx==0){ |
| n = loadfn(dl->save, lr, data, n); |
| if(n > 0) |
| memlexpose(dst, r); |
| return n; |
| } |
| tmp = allocmemimage(lr, dst->chan); |
| if(tmp == nil) |
| return -1; |
| n = loadfn(tmp, lr, data, n); |
| memdraw(dst, lr, tmp, lr.min, nil, lr.min, S); |
| freememimage(tmp); |
| return n; |
| } |