1 #include "lib9.h"
2 #include "draw.h"
3 #include "memdraw.h"
4 #include "memlayer.h"
5
6 int
memload(Memimage * dst,Rectangle r,uchar * data,int n,int iscompressed)7 memload(Memimage *dst, Rectangle r, uchar *data, int n, int iscompressed)
8 {
9 int (*loadfn)(Memimage*, Rectangle, uchar*, int);
10 Memimage *tmp;
11 Memlayer *dl;
12 Rectangle lr;
13 int dx;
14
15 loadfn = loadmemimage;
16 if(iscompressed)
17 loadfn = cloadmemimage;
18
19 Top:
20 dl = dst->layer;
21 if(dl == nil)
22 return loadfn(dst, r, data, n);
23
24 /*
25 * Convert to screen coordinates.
26 */
27 lr = r;
28 r.min.x += dl->delta.x;
29 r.min.y += dl->delta.y;
30 r.max.x += dl->delta.x;
31 r.max.y += dl->delta.y;
32 dx = dl->delta.x&(7/dst->depth);
33 if(dl->clear && dx==0){
34 dst = dl->screen->image;
35 goto Top;
36 }
37
38 /*
39 * dst is an obscured layer or data is unaligned
40 */
41 if(dl->save && dx==0){
42 n = loadfn(dl->save, lr, data, n);
43 if(n > 0)
44 memlexpose(dst, r);
45 return n;
46 }
47 tmp = allocmemimage(lr, dst->chan);
48 if(tmp == nil)
49 return -1;
50 n = loadfn(tmp, lr, data, n);
51 memdraw(dst, lr, tmp, lr.min, nil, lr.min, S);
52 freememimage(tmp);
53 return n;
54 }
55