1*8ccd4a63SDavid du Colombier #include <u.h> 2*8ccd4a63SDavid du Colombier #include <libc.h> 3*8ccd4a63SDavid du Colombier #include <draw.h> 4*8ccd4a63SDavid du Colombier #include <memdraw.h> 5*8ccd4a63SDavid du Colombier #include <memlayer.h> 6*8ccd4a63SDavid du Colombier 7*8ccd4a63SDavid du Colombier int 8*8ccd4a63SDavid du Colombier memunload(Memimage *src, Rectangle r, uchar *data, int n) 9*8ccd4a63SDavid du Colombier { 10*8ccd4a63SDavid du Colombier Memimage *tmp; 11*8ccd4a63SDavid du Colombier Memlayer *dl; 12*8ccd4a63SDavid du Colombier Rectangle lr; 13*8ccd4a63SDavid du Colombier int dx; 14*8ccd4a63SDavid du Colombier 15*8ccd4a63SDavid du Colombier Top: 16*8ccd4a63SDavid du Colombier dl = src->layer; 17*8ccd4a63SDavid du Colombier if(dl == nil) 18*8ccd4a63SDavid du Colombier return unloadmemimage(src, r, data, n); 19*8ccd4a63SDavid du Colombier 20*8ccd4a63SDavid du Colombier /* 21*8ccd4a63SDavid du Colombier * Convert to screen coordinates. 22*8ccd4a63SDavid du Colombier */ 23*8ccd4a63SDavid du Colombier lr = r; 24*8ccd4a63SDavid du Colombier r.min.x += dl->delta.x; 25*8ccd4a63SDavid du Colombier r.min.y += dl->delta.y; 26*8ccd4a63SDavid du Colombier r.max.x += dl->delta.x; 27*8ccd4a63SDavid du Colombier r.max.y += dl->delta.y; 28*8ccd4a63SDavid du Colombier dx = dl->delta.x&(7/src->depth); 29*8ccd4a63SDavid du Colombier if(dl->clear && dx==0){ 30*8ccd4a63SDavid du Colombier src = dl->screen->image; 31*8ccd4a63SDavid du Colombier goto Top; 32*8ccd4a63SDavid du Colombier } 33*8ccd4a63SDavid du Colombier 34*8ccd4a63SDavid du Colombier /* 35*8ccd4a63SDavid du Colombier * src is an obscured layer or data is unaligned 36*8ccd4a63SDavid du Colombier */ 37*8ccd4a63SDavid du Colombier if(dl->save && dx==0){ 38*8ccd4a63SDavid du Colombier if(dl->refreshfn != nil) 39*8ccd4a63SDavid du Colombier return -1; /* can't unload window if it's not Refbackup */ 40*8ccd4a63SDavid du Colombier if(n > 0) 41*8ccd4a63SDavid du Colombier memlhide(src, r); 42*8ccd4a63SDavid du Colombier n = unloadmemimage(dl->save, lr, data, n); 43*8ccd4a63SDavid du Colombier return n; 44*8ccd4a63SDavid du Colombier } 45*8ccd4a63SDavid du Colombier tmp = allocmemimage(lr, src->chan); 46*8ccd4a63SDavid du Colombier if(tmp == nil) 47*8ccd4a63SDavid du Colombier return -1; 48*8ccd4a63SDavid du Colombier memdraw(tmp, lr, src, lr.min, nil, lr.min, S); 49*8ccd4a63SDavid du Colombier n = unloadmemimage(tmp, lr, data, n); 50*8ccd4a63SDavid du Colombier freememimage(tmp); 51*8ccd4a63SDavid du Colombier return n; 52*8ccd4a63SDavid du Colombier } 53