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