[pixel] detach old sprite when blitting onto existing plane

pull/1428/head
nick black 4 years ago committed by Nick Black
parent 4f876cf962
commit 53a85871fe

@ -42,6 +42,7 @@ visualize(struct notcurses* nc, struct ncvisual* ncv){
if((n = ncvisual_render(nc, ncv, &vopts)) == NULL){ if((n = ncvisual_render(nc, ncv, &vopts)) == NULL){
ncplane_printf_aligned(stdn, ncplane_dim_y(stdn) / 2 - 1, NCALIGN_CENTER, "not available"); ncplane_printf_aligned(stdn, ncplane_dim_y(stdn) / 2 - 1, NCALIGN_CENTER, "not available");
}else{ }else{
// FIXME shouldn't need this once z-axis is united with bitmap graphics
ncplane_move_below(n, stdn); ncplane_move_below(n, stdn);
if(vopts.blitter == NCBLIT_PIXEL){ if(vopts.blitter == NCBLIT_PIXEL){
DEMO_RENDER(nc); DEMO_RENDER(nc);

@ -107,6 +107,7 @@ int yield_demo(struct notcurses* nc){
tfilled += pfilled; tfilled += pfilled;
if(ncvisual_render(nc, wmv, &vopts) == NULL){ if(ncvisual_render(nc, wmv, &vopts) == NULL){
ncvisual_destroy(wmv); ncvisual_destroy(wmv);
ncplane_destroy(vopts.n);
return -1; return -1;
} }
if(tfilled > threshold_painted){ if(tfilled > threshold_painted){

@ -1105,6 +1105,9 @@ plane_blit_sixel(ncplane* n, const char* s, int bytes, int leny, int lenx,
c->width = lenx; c->width = lenx;
} }
} }
if(n->sprite){
sprixel_hide(n->sprite);
}
n->sprite = spx; n->sprite = spx;
return 0; return 0;
} }

@ -481,7 +481,7 @@ ncplane* ncvisual_render_cells(notcurses* nc, ncvisual* ncv, const struct blitse
return n; return n;
} }
ncplane* ncvisual_render_pixels(tinfo* tcache, ncvisual* ncv, const struct blitset* bset, ncplane* ncvisual_render_pixels(notcurses* nc, ncvisual* ncv, const struct blitset* bset,
int placey, int placex, int begy, int begx, int placey, int placex, int begy, int begx,
ncplane* n, ncscale_e scaling, ncplane* stdn){ ncplane* n, ncscale_e scaling, ncplane* stdn){
int disprows, dispcols; int disprows, dispcols;
@ -493,15 +493,15 @@ ncplane* ncvisual_render_pixels(tinfo* tcache, ncvisual* ncv, const struct blits
if(n == NULL){ // create plane if(n == NULL){ // create plane
if(scaling != NCSCALE_NONE && scaling != NCSCALE_NONE_HIRES){ if(scaling != NCSCALE_NONE && scaling != NCSCALE_NONE_HIRES){
ncplane_dim_yx(stdn, &disprows, &dispcols); ncplane_dim_yx(stdn, &disprows, &dispcols);
dispcols *= tcache->cellpixx; dispcols *= nc->tcache.cellpixx;
disprows *= tcache->cellpixy; disprows *= nc->tcache.cellpixy;
} }
//fprintf(stderr, "PLACING NEW PLANE: %d/%d @ %d/%d\n", disprows, dispcols, placey, placex); //fprintf(stderr, "PLACING NEW PLANE: %d/%d @ %d/%d\n", disprows, dispcols, placey, placex);
struct ncplane_options nopts = { struct ncplane_options nopts = {
.y = placey, .y = placey,
.x = placex, .x = placex,
.rows = disprows / tcache->cellpixy + !!(disprows % tcache->cellpixy), .rows = disprows / nc->tcache.cellpixy + !!(disprows % nc->tcache.cellpixy),
.cols = dispcols / tcache->cellpixx + !!(dispcols % tcache->cellpixx), .cols = dispcols / nc->tcache.cellpixx + !!(dispcols % nc->tcache.cellpixx),
.userptr = NULL, .userptr = NULL,
.name = "rgba", .name = "rgba",
.resizecb = NULL, .resizecb = NULL,
@ -515,21 +515,21 @@ ncplane* ncvisual_render_pixels(tinfo* tcache, ncvisual* ncv, const struct blits
}else{ }else{
if(scaling != NCSCALE_NONE && scaling != NCSCALE_NONE_HIRES){ if(scaling != NCSCALE_NONE && scaling != NCSCALE_NONE_HIRES){
ncplane_dim_yx(n, &disprows, &dispcols); ncplane_dim_yx(n, &disprows, &dispcols);
dispcols *= tcache->cellpixx; dispcols *= nc->tcache.cellpixx;
disprows *= tcache->cellpixy; disprows *= nc->tcache.cellpixy;
dispcols -= (placex * tcache->cellpixx + 1); dispcols -= (placex * nc->tcache.cellpixx + 1);
disprows -= (placey * tcache->cellpixy + 1); disprows -= (placey * nc->tcache.cellpixy + 1);
} }
} }
if(scaling == NCSCALE_SCALE || scaling == NCSCALE_SCALE_HIRES){ if(scaling == NCSCALE_SCALE || scaling == NCSCALE_SCALE_HIRES){
scale_visual(ncv, &disprows, &dispcols); scale_visual(ncv, &disprows, &dispcols);
} }
//fprintf(stderr, "pblit: %dx%d <- %dx%d of %d/%d stride %u @%dx%d %p %u\n", disprows, dispcols, begy, begx, ncv->rows, ncv->cols, ncv->rowstride, placey, placex, ncv->data, ncplane_notcurses(stdn)->tcache.cellpixx); //fprintf(stderr, "pblit: %dx%d <- %dx%d of %d/%d stride %u @%dx%d %p %u\n", disprows, dispcols, begy, begx, ncv->rows, ncv->cols, ncv->rowstride, placey, placex, ncv->data, ncplane_notcurses(stdn)->nc->tcache.cellpixx);
blitterargs bargs; blitterargs bargs;
bargs.pixel.celldimx = ncplane_notcurses(stdn)->tcache.cellpixx; bargs.pixel.celldimx = nc->tcache.cellpixx;
bargs.pixel.celldimy = ncplane_notcurses(stdn)->tcache.cellpixy; bargs.pixel.celldimy = nc->tcache.cellpixy;
bargs.pixel.colorregs = ncplane_notcurses(stdn)->tcache.color_registers; bargs.pixel.colorregs = nc->tcache.color_registers;
bargs.pixel.sprixelid = tcache->sprixelnonce++; bargs.pixel.sprixelid = nc->tcache.sprixelnonce++;
if(ncvisual_blit(ncv, disprows, dispcols, n, bset, if(ncvisual_blit(ncv, disprows, dispcols, n, bset,
begy, begx, disprows, dispcols, &bargs)){ begy, begx, disprows, dispcols, &bargs)){
ncplane_destroy(n); ncplane_destroy(n);
@ -585,7 +585,7 @@ ncplane* ncvisual_render(notcurses* nc, ncvisual* ncv, const struct ncvisual_opt
n, scaling, n, scaling,
vopts && (vopts->flags & NCVISUAL_OPTION_BLEND)); vopts && (vopts->flags & NCVISUAL_OPTION_BLEND));
}else{ }else{
n = ncvisual_render_pixels(&nc->tcache, ncv, bset, placey, placex, begy, begx, n = ncvisual_render_pixels(nc, ncv, bset, placey, placex, begy, begx,
n, scaling, notcurses_stdplane(nc)); n, scaling, notcurses_stdplane(nc));
} }
return n; return n;

Loading…
Cancel
Save