From 81052e344c4c977ffe278368de5baeb22025f9e3 Mon Sep 17 00:00:00 2001 From: nick black Date: Thu, 13 Aug 2020 23:03:52 -0400 Subject: [PATCH] cell_load_direct: shortcut for bytes <= 1 --- src/lib/internal.h | 2 +- src/lib/notcurses.c | 24 +++++++++++++++++------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/lib/internal.h b/src/lib/internal.h index 80df75134..f3fe942bf 100644 --- a/src/lib/internal.h +++ b/src/lib/internal.h @@ -571,8 +571,8 @@ static inline void pool_release(egcpool* pool, cell* c){ if(!cell_simple_p(c)){ egcpool_release(pool, cell_egc_idx(c)); + c->gcluster = 0; // don't subject ourselves to double-release problems } - c->gcluster = 0; // don't subject ourselves to double-release problems } // Duplicate one cell onto another, possibly crossing ncplanes. diff --git a/src/lib/notcurses.c b/src/lib/notcurses.c index 363643e22..d33fd78eb 100644 --- a/src/lib/notcurses.c +++ b/src/lib/notcurses.c @@ -1364,21 +1364,31 @@ cell_load_direct(ncplane* n, cell* c, const char* gcluster, int bytes, int cols) if(bytes < 0 || cols < 0){ return -1; } - if(cols < 2){ - c->channels &= ~CELL_WIDEASIAN_MASK; - }else{ - c->channels |= CELL_WIDEASIAN_MASK; + if(bytes <= 1){ + assert(cols < 2); + cell_release(n, c); + c->channels &= ~(CELL_WIDEASIAN_MASK | CELL_NOBACKGROUND_MASK); + c->gcluster = *gcluster; + return bytes; } // FIXME also shaded blocks! ░ etc. are there combined EGCs involving these? if(strncmp(gcluster, "\xe2\x96\x88", 3)){ c->channels &= ~CELL_NOBACKGROUND_MASK; + if(cols < 2){ + c->channels &= ~CELL_WIDEASIAN_MASK; + }else{ + c->channels |= CELL_WIDEASIAN_MASK; + } }else{ c->channels |= CELL_NOBACKGROUND_MASK; + c->channels &= ~CELL_WIDEASIAN_MASK; } if(bytes <= 4){ - cell_release(n, c); - c->gcluster = 0; - memcpy(&c->gcluster, gcluster, bytes); + if(strcmp(gcluster, (const char*)&c->gcluster)){ + cell_release(n, c); + c->gcluster = 0; + memcpy(&c->gcluster, gcluster, bytes); + } return bytes; } int eoffset = egcpool_stash(&n->pool, gcluster, bytes);