diff --git a/src/lib/render.c b/src/lib/render.c index 8c6dd017f..850a0c7ec 100644 --- a/src/lib/render.c +++ b/src/lib/render.c @@ -84,7 +84,7 @@ update_render_stats(const struct timespec* time1, const struct timespec* time0, // 256 colors, this is the 16 normal ones, 6x6x6 color cubes, and 32 greys. // it's probably better to sample the darker regions rather than cover so much // chroma, but whatever....FIXME -static int +static inline int prep_optimized_palette(notcurses* nc, FILE* out __attribute__ ((unused))){ if(nc->RGBflag){ return 0; // DirectColor, no need to write palette @@ -136,6 +136,9 @@ reshape_shadow_fb(notcurses* nc){ static ncplane* dig_visible_cell(cell* c, int y, int x, ncplane* p, int falpha, int balpha, bool* damage){ + // once we decide on our glyph, it cannot be changed by anything below, so + // lock in this plane for the actual cell return. + ncplane* glyphplane = NULL; while(p){ // where in the plane this coordinate would be, based off absy/absx. the // true origin is 0,0, so abs=2,2 means coordinate 3,3 would be 1,1, while @@ -151,12 +154,11 @@ dig_visible_cell(cell* c, int y, int x, ncplane* p, int falpha, int balpha, if(vis->gcluster == 0){ vis = &p->defcell; } - bool lockedglyph = false; int nalpha; if(falpha > 0 && (nalpha = cell_get_fg_alpha(vis)) < CELL_ALPHA_TRANS){ if(c->gcluster == 0){ // never write fully trans glyphs, never replace if( (c->gcluster = vis->gcluster) ){ // index copy only - lockedglyph = true; // must return this ncplane for this glyph + glyphplane = p; // must return this ncplane for this glyph c->attrword = vis->attrword; cell_set_fchannel(c, cell_get_fchannel(vis)); // FIXME blend it in falpha -= (CELL_ALPHA_TRANS - nalpha); // FIXME blend it in @@ -175,13 +177,9 @@ dig_visible_cell(cell* c, int y, int x, ncplane* p, int falpha, int balpha, p->damage[poffy] = false; } } - if((falpha > 0 || balpha > 0) && p->z){ // we must go further! - ncplane* cand = dig_visible_cell(c, y, x, p->z, falpha, balpha, damage); - if(!lockedglyph && cand){ - p = cand; - } + if((falpha <= 0 && balpha <= 0) || !p->z){ // done! + return glyphplane ? glyphplane : p; } - return p; } } p = p->z; @@ -513,8 +511,8 @@ notcurses_render_internal(notcurses* nc){ } int notcurses_render(notcurses* nc){ - int ret = 0; struct timespec start, done; + int ret; clock_gettime(CLOCK_MONOTONIC_RAW, &start); pthread_mutex_lock(&nc->lock); pthread_cleanup_push(mutex_unlock, &nc->lock); @@ -523,9 +521,7 @@ int notcurses_render(notcurses* nc){ notcurses_resize(nc, &dimy, &dimx); clock_gettime(CLOCK_MONOTONIC_RAW, &done); update_render_stats(&done, &start, &nc->stats, bytes); - if(bytes < 0){ - ret = -1; - } + ret = bytes >= 0 ? 0 : -1; pthread_cleanup_pop(1); return ret; }