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