xref: /inferno-os/libmemlayer/load.c (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
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