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