[ncvgeom] move cellblit geom calculations into ncvisual_geom_inner()

pull/2320/head
nick black 3 years ago committed by nick black
parent ad12fe947e
commit 81d78be211

@ -402,14 +402,60 @@ int ncvisual_geom_inner(const tinfo* ti, const ncvisual* n,
geom->rpixx = *disppixx;
geom->rcellx = *outx / ti->cellpixx + !!(*outx % ti->cellpixx);
geom->rcelly = *outy / ti->cellpixy + !!(*outy % ti->cellpixy);
}else{
if(vopts->pxoffx || vopts->pxoffy){
logerror("pixel offsets cannot be used with cell blitting\n");
return -1;
}else{ // cellblit
int dispcols, disprows;
if(vopts->n == NULL || (vopts->flags & NCVISUAL_OPTION_CHILDPLANE)){ // create plane
if(scaling == NCSCALE_NONE || scaling == NCSCALE_NONE_HIRES){
dispcols = geom->lenx;
disprows = geom->leny;
}else{
if(vopts->n == NULL){
disprows = ti->dimy;
dispcols = ti->dimx;
}else{
ncplane_dim_yx(vopts->n, &disprows, &dispcols);
}
dispcols *= geom->scalex;
disprows *= geom->scaley;
if(scaling == NCSCALE_SCALE || scaling == NCSCALE_SCALE_HIRES){
scale_visual(n, &disprows, &dispcols);
} // else stretch
}
}else{
if(vopts->pxoffx || vopts->pxoffy){
logerror("pixel offsets cannot be used with cell blitting\n");
return -1;
}
if(scaling == NCSCALE_NONE || scaling == NCSCALE_NONE_HIRES){
dispcols = geom->lenx;
disprows = geom->leny;
}else{
ncplane_dim_yx(vopts->n, &disprows, &dispcols);
dispcols *= geom->scalex;
disprows *= geom->scaley;
if(!(vopts->flags & NCVISUAL_OPTION_HORALIGNED)){
dispcols -= *placex;
}
if(!(vopts->flags & NCVISUAL_OPTION_VERALIGNED)){
disprows -= *placey;
}
if(scaling == NCSCALE_SCALE || scaling == NCSCALE_SCALE_HIRES){
scale_visual(n, &disprows, &dispcols);
} // else stretch
}
if(vopts->flags & NCVISUAL_OPTION_HORALIGNED){
*placex = ncplane_halign(vopts->n, *placex, dispcols / geom->scalex);
}
if(vopts->flags & NCVISUAL_OPTION_VERALIGNED){
*placey = ncplane_valign(vopts->n, *placey, disprows / geom->scaley);
}
}
// FIXME rcellx/rcelly!
geom->rcelly = dispcols;
geom->rcellx = disprows;
geom->rpixy = geom->leny;
geom->rpixx = geom->lenx;
}
logdebug("rgeom: %d %d %d %d (%d)\n", geom->rcelly, geom->rcellx, geom->rpixy, geom->rpixx, (*bset)->geom);
logdebug("rgeom: %d %d %d %d (%d on %p)\n", geom->rcelly, geom->rcellx, geom->rpixy, geom->rpixx, (*bset)->geom, vopts->n);
return 0;
}
@ -935,36 +981,20 @@ int ncvisual_resize_noninterpolative(ncvisual* n, int rows, int cols){
// the origin of the source region to draw (in pixels). leny/lenx define the
// geometry of the source region to draw, again in pixels. ncv->pixy and
// ncv->pixx define the source geometry in pixels.
ncplane* ncvisual_render_cells(notcurses* nc, ncvisual* ncv, int scaley, int scalex,
ncplane* ncvisual_render_cells(notcurses* nc, ncvisual* ncv,
const struct blitset* bset,
int placey, int placex, int begy, int begx,
int leny, int lenx, ncplane* n, ncscale_e scaling,
int placey, int placex,
ncvgeom* geom, ncplane* n,
uint64_t flags, uint32_t transcolor){
int disprows, dispcols;
ncplane* createdn = NULL;
//fprintf(stderr, "INPUT N: %p\n", n);
if(n == NULL || (flags & NCVISUAL_OPTION_CHILDPLANE)){ // create plane
if(scaling == NCSCALE_NONE || scaling == NCSCALE_NONE_HIRES){
dispcols = lenx;
disprows = leny;
}else{
if(n == NULL){
ncplane_dim_yx(notcurses_stdplane(nc), &disprows, &dispcols);
}else{
ncplane_dim_yx(n, &disprows, &dispcols);
}
dispcols *= scalex;
disprows *= scaley;
if(scaling == NCSCALE_SCALE || scaling == NCSCALE_SCALE_HIRES){
scale_visual(ncv, &disprows, &dispcols);
} // else stretch
}
//fprintf(stderr, "PLACING NEW PLANE: %d/%d @ %d/%d %d/%d\n", disprows, dispcols, placey, placex, begy, begx);
struct ncplane_options nopts = {
.y = placey,
.x = placex,
.rows = disprows / scaley + !!(disprows % scaley),
.cols = dispcols / scalex + !!(dispcols % scalex),
.rows = geom->rcelly,
.cols = geom->rcellx,
.userptr = NULL,
.name = "cvis",
.resizecb = NULL,
@ -987,42 +1017,18 @@ ncplane* ncvisual_render_cells(notcurses* nc, ncvisual* ncv, int scaley, int sca
createdn = n;
placey = 0;
placex = 0;
}else{
if(scaling == NCSCALE_NONE || scaling == NCSCALE_NONE_HIRES){
dispcols = lenx;
disprows = leny;
}else{
ncplane_dim_yx(n, &disprows, &dispcols);
dispcols *= scalex;
disprows *= scaley;
if(!(flags & NCVISUAL_OPTION_HORALIGNED)){
dispcols -= placex;
}
if(!(flags & NCVISUAL_OPTION_VERALIGNED)){
disprows -= placey;
}
if(scaling == NCSCALE_SCALE || scaling == NCSCALE_SCALE_HIRES){
scale_visual(ncv, &disprows, &dispcols);
} // else stretch
}
if(flags & NCVISUAL_OPTION_HORALIGNED){
placex = ncplane_halign(n, placex, dispcols / scalex);
}
if(flags & NCVISUAL_OPTION_VERALIGNED){
placey = ncplane_valign(n, placey, disprows / scaley);
}
}
//fprintf(stderr, "blit: %dx%d:%d+%d of %d/%d stride %u %p\n", begy, begx, leny, lenx, ncv->pixy, ncv->pixx, ncv->rowstride, ncv->data);
blitterargs bargs;
bargs.transcolor = transcolor;
bargs.begy = begy;
bargs.begx = begx;
bargs.leny = leny;
bargs.lenx = lenx;
bargs.begy = geom->begy;
bargs.begx = geom->begx;
bargs.leny = geom->leny;
bargs.lenx = geom->lenx;
bargs.flags = flags;
bargs.u.cell.placey = placey;
bargs.u.cell.placex = placex;
if(ncvisual_blit_internal(ncv, disprows, dispcols, n, bset, &bargs)){
if(ncvisual_blit_internal(ncv, geom->rpixy, geom->rpixx, n, bset, &bargs)){
ncplane_destroy(createdn);
return NULL;
}
@ -1178,17 +1184,13 @@ ncplane* ncvisual_blit(notcurses* nc, ncvisual* ncv, const struct ncvisual_optio
return NULL;
}
ncplane* n = vopts->n;
ncscale_e scaling = vopts->scaling;
uint32_t transcolor = 0;
if(vopts->flags & NCVISUAL_OPTION_ADDALPHA){
transcolor = 0x1000000ull | vopts->transcolor;
}
if(geom.blitter != NCBLIT_PIXEL){
n = ncvisual_render_cells(nc, ncv, geom.scaley, geom.scalex,
bset, placey, placex,
geom.begy, geom.begx,
geom.leny, geom.lenx, n, scaling,
vopts->flags, transcolor);
n = ncvisual_render_cells(nc, ncv, bset, placey, placex,
&geom, n, vopts->flags, transcolor);
}else{
n = ncvisual_render_pixels(nc, ncv, bset, placey, placex,
&geom, n,

Loading…
Cancel
Save