diff options
author | rsc <devnull@localhost> | 2006-06-25 18:58:06 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2006-06-25 18:58:06 +0000 |
commit | 324891a5579d6f504201a6107369c64dab245a98 (patch) | |
tree | 3069429c14484b100d86dd5a3b1013565bf5db6c /src/libmemlayer/load.c | |
parent | 9361131304f39db29b1bec59d881e585035ec93c (diff) | |
download | plan9port-324891a5579d6f504201a6107369c64dab245a98.tar.gz plan9port-324891a5579d6f504201a6107369c64dab245a98.tar.bz2 plan9port-324891a5579d6f504201a6107369c64dab245a98.zip |
separate out
Diffstat (limited to 'src/libmemlayer/load.c')
-rw-r--r-- | src/libmemlayer/load.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/src/libmemlayer/load.c b/src/libmemlayer/load.c new file mode 100644 index 00000000..d211564b --- /dev/null +++ b/src/libmemlayer/load.c @@ -0,0 +1,55 @@ +#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; +} |