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