implement notcurses_render() using ncpile_render() #1135

This commit is contained in:
nick black 2020-11-25 14:22:43 -05:00 committed by Nick Black
parent 8f7fa9da44
commit 7a21574798

View File

@ -904,6 +904,9 @@ notcurses_rasterize_inner(notcurses* nc, const struct crender* rvec, FILE* out){
//fprintf(stderr, "damageidx: %ld\n", damageidx); //fprintf(stderr, "damageidx: %ld\n", damageidx);
} }
} }
if(fflush(out)){
return -1;
}
return nc->rstate.mstrsize; return nc->rstate.mstrsize;
} }
@ -913,7 +916,7 @@ raster_and_write(notcurses* nc, const struct crender* rvec, FILE* out){
if(notcurses_rasterize_inner(nc, rvec, out) < 0){ if(notcurses_rasterize_inner(nc, rvec, out) < 0){
return -1; return -1;
} }
int ret = fflush(out); int ret = 0;
//fflush(nc->ttyfp); //fflush(nc->ttyfp);
if(blocking_write(fileno(nc->ttyfp), nc->rstate.mstream, nc->rstate.mstrsize)){ if(blocking_write(fileno(nc->ttyfp), nc->rstate.mstream, nc->rstate.mstrsize)){
ret = -1; ret = -1;
@ -1036,42 +1039,52 @@ int notcurses_render_to_file(notcurses* nc, FILE* fp){
// down the z-buffer, looking at intersections with ncplanes. This implies // down the z-buffer, looking at intersections with ncplanes. This implies
// locking down the EGC, the attributes, and the channels for each cell. // locking down the EGC, the attributes, and the channels for each cell.
static int static int
notcurses_render_internal(notcurses* nc, struct crender* rvec){ ncpile_render_internal(ncplane* n, struct crender* rvec, int leny, int lenx,
ncplane* p = ncplane_pile(nc->stdplane)->top; int absy, int absx){
ncplane* p = ncplane_pile(n)->top;
while(p){ while(p){
paint(p, rvec, nc->stdplane->leny, nc->stdplane->lenx, paint(p, rvec, leny, lenx, absy, absx);
nc->stdplane->absy, nc->stdplane->absx);
p = p->below; p = p->below;
} }
return 0; return 0;
} }
int notcurses_render(notcurses* nc){ int ncpile_render(ncplane* n){
struct timespec start, rasterdone; struct timespec start, rasterdone;
clock_gettime(CLOCK_MONOTONIC, &start); clock_gettime(CLOCK_MONOTONIC, &start);
int dimy, dimx; int dimy, dimx;
notcurses_resize(nc, &dimy, &dimx); notcurses_resize(ncplane_notcurses(n), &dimy, &dimx);
int bytes = -1; int bytes = -1;
const size_t crenderlen = sizeof(struct crender) * nc->stdplane->leny * nc->stdplane->lenx; const size_t crenderlen = sizeof(struct crender) * dimy * dimx;
struct crender* crender = malloc(crenderlen); struct crender* crender = malloc(crenderlen);
init_rvec(crender, crenderlen / sizeof(struct crender)); init_rvec(crender, crenderlen / sizeof(struct crender));
if(notcurses_render_internal(nc, crender) == 0){ if(ncpile_render_internal(n, crender, dimy, dimx,
notcurses_stdplane(ncplane_notcurses(n))->absy,
notcurses_stdplane(ncplane_notcurses(n))->absx) == 0){
clock_gettime(CLOCK_MONOTONIC, &rasterdone); clock_gettime(CLOCK_MONOTONIC, &rasterdone);
update_render_stats(&rasterdone, &start, &nc->stats); update_render_stats(&rasterdone, &start, &ncplane_notcurses(n)->stats);
postpaint(nc->lastframe, dimy, dimx, crender, &nc->pool); // FIXME extract and move to ncpile_rasterize
bytes = notcurses_rasterize(nc, crender, nc->rstate.mstreamfp); postpaint(ncplane_notcurses(n)->lastframe, dimy, dimx, crender,
&ncplane_notcurses(n)->pool);
bytes = notcurses_rasterize(ncplane_notcurses(n), crender,
ncplane_notcurses(n)->rstate.mstreamfp);
} }
update_render_bytes(&nc->stats, bytes); // accepts -1 as an indication of failure
update_render_bytes(&ncplane_notcurses(n)->stats, bytes);
free(crender); free(crender);
if(bytes < 0){ if(bytes < 0){
return -1; return -1;
} }
struct timespec writedone; struct timespec writedone;
clock_gettime(CLOCK_MONOTONIC, &writedone); clock_gettime(CLOCK_MONOTONIC, &writedone);
update_write_stats(&writedone, &rasterdone, &nc->stats); update_write_stats(&writedone, &rasterdone, &ncplane_notcurses(n)->stats);
return 0; return 0;
} }
int notcurses_render(notcurses* nc){
return ncpile_render(notcurses_stdplane(nc));
}
// for now, we just run the top half of notcurses_render(), and copy out the // for now, we just run the top half of notcurses_render(), and copy out the
// memstream from within rstate. we want to allocate our own here, and return // memstream from within rstate. we want to allocate our own here, and return
// it, to avoid the copy, but we need feed the params through to do so FIXME. // it, to avoid the copy, but we need feed the params through to do so FIXME.
@ -1081,10 +1094,10 @@ int notcurses_render_to_buffer(notcurses* nc, char** buf, size_t* buflen){
int dimy, dimx; int dimy, dimx;
notcurses_resize(nc, &dimy, &dimx); notcurses_resize(nc, &dimy, &dimx);
int bytes = -1; int bytes = -1;
const size_t crenderlen = sizeof(struct crender) * nc->stdplane->leny * nc->stdplane->lenx; const size_t crenderlen = sizeof(struct crender) * dimy * dimx;
struct crender* crender = malloc(crenderlen); struct crender* crender = malloc(crenderlen);
init_rvec(crender, crenderlen / sizeof(struct crender)); init_rvec(crender, crenderlen / sizeof(struct crender));
if(notcurses_render_internal(nc, crender) == 0){ if(ncpile_render_internal(nc->stdplane, crender, dimy, dimx, nc->stdplane->absy, nc->stdplane->absx) == 0){
clock_gettime(CLOCK_MONOTONIC, &rasterdone); clock_gettime(CLOCK_MONOTONIC, &rasterdone);
update_render_stats(&rasterdone, &start, &nc->stats); update_render_stats(&rasterdone, &start, &nc->stats);
postpaint(nc->lastframe, dimy, dimx, crender, &nc->pool); postpaint(nc->lastframe, dimy, dimx, crender, &nc->pool);