software cursor was not removed from screen when loadimage was used to fill on screen image content. this patch adds hwdraw() calls to cloadmemimage and loadmemimage that are used to remove the softcursor from the screen if the dst image overlaps the position of the softcursor. hwdraw() is abused as a hook into screen.c to remove a potential softcursor. Notes: doesn't work as advertised. Reference: /n/sources/patch/sorry/softcurs-pixel-dropping Date: Fri Mar 11 18:29:22 CET 2011 Signed-off-by: cinap_lenrek@gmx.de Reviewed-by: geoff --- /sys/src/9/pc/screen.c Fri Mar 11 18:22:59 2011 +++ /sys/src/9/pc/screen.c Fri Mar 11 18:22:56 2011 @@ -360,34 +360,25 @@ Memimage *dst, *src, *mask; int m; - if(hwaccel == 0) - return 0; - scr = &vgascreen[0]; if((dst=par->dst) == nil || dst->data == nil) return 0; if((src=par->src) == nil || src->data == nil) - return 0; + src = nil; if((mask=par->mask) == nil || mask->data == nil) - return 0; - + mask = nil; if(scr->cur == &swcursor){ - /* - * always calling swcursorhide here doesn't cure - * leaving cursor tracks nor failing to refresh menus - * with the latest libmemdraw/draw.c. - */ if(dst->data->bdata == gscreendata.bdata) swcursoravoid(par->r); - if(src->data->bdata == gscreendata.bdata) + if(src && src->data->bdata == gscreendata.bdata) swcursoravoid(par->sr); - if(mask->data->bdata == gscreendata.bdata) + if(mask && mask->data->bdata == gscreendata.bdata) swcursoravoid(par->mr); } - - if(dst->data->bdata != gscreendata.bdata) + if(hwaccel == 0) + return 0; + if(dst->data->bdata != gscreendata.bdata || src == nil || mask == nil) return 0; - if(scr->fill==nil && scr->scroll==nil) return 0; --- /sys/src/libmemdraw/cload.c Fri Mar 11 18:23:04 2011 +++ /sys/src/libmemdraw/cload.c Fri Mar 11 18:23:01 2011 @@ -8,9 +8,16 @@ { int y, bpl, c, cnt, offs; uchar mem[NMEM], *memp, *omemp, *emem, *linep, *elinep, *u, *eu; + Memdrawparam par; if(!rectinrect(r, i->r)) return -1; + + memset(&par, 0, sizeof par); + par.dst = i; + par.r = r; + hwdraw(&par); + bpl = bytesperline(r, i->depth); u = data; eu = data+ndata; --- /sys/src/libmemdraw/load.c Fri Mar 11 18:23:08 2011 +++ /sys/src/libmemdraw/load.c Fri Mar 11 18:23:06 2011 @@ -7,10 +7,17 @@ loadmemimage(Memimage *i, Rectangle r, uchar *data, int ndata) { int y, l, lpart, rpart, mx, m, mr; + Memdrawparam par; uchar *q; if(!rectinrect(r, i->r)) return -1; + + memset(&par, 0, sizeof par); + par.dst = i; + par.r = r; + hwdraw(&par); + l = bytesperline(r, i->depth); if(ndata < l*Dy(r)) return -1;