From dc118e54f63801df4c7c2c3b8748ae520af8743d Mon Sep 17 00:00:00 2001 From: nick black Date: Sun, 14 Mar 2021 06:25:12 -0400 Subject: [PATCH] blitters: accept new blitterarg union #1389 --- src/lib/blit.c | 30 ++++++++++++++++-------------- src/lib/internal.h | 24 +++++++++++++++++++----- src/lib/kitty.c | 5 +++-- src/lib/sixel.c | 4 ++-- src/lib/terminfo.c | 8 ++++++-- 5 files changed, 46 insertions(+), 25 deletions(-) diff --git a/src/lib/blit.c b/src/lib/blit.c index ad032fbe8..c202040e3 100644 --- a/src/lib/blit.c +++ b/src/lib/blit.c @@ -35,7 +35,7 @@ trilerp(uint32_t c0, uint32_t c1, uint32_t c2){ static inline int tria_blit_ascii(ncplane* nc, int placey, int placex, int linesize, const void* data, int begy, int begx, - int leny, int lenx, unsigned blendcolors){ + int leny, int lenx, const blitterargs* bargs){ //fprintf(stderr, "ASCII %d X %d @ %d X %d (%p) place: %d X %d\n", leny, lenx, begy, begx, data, placey, placex); const int bpp = 32; int dimy, dimx, x, y; @@ -57,7 +57,7 @@ tria_blit_ascii(ncplane* nc, int placey, int placex, int linesize, // effective in that case anyway c->channels = 0; c->stylemask = 0; - if(blendcolors){ + if(bargs->blendcolors){ cell_set_bg_alpha(c, CELL_ALPHA_BLEND); cell_set_fg_alpha(c, CELL_ALPHA_BLEND); } @@ -84,7 +84,7 @@ tria_blit_ascii(ncplane* nc, int placey, int placex, int linesize, static inline int tria_blit(ncplane* nc, int placey, int placex, int linesize, const void* data, int begy, int begx, - int leny, int lenx, unsigned blendcolors){ + int leny, int lenx, const blitterargs* bargs){ //fprintf(stderr, "HALF %d X %d @ %d X %d (%p) place: %d X %d\n", leny, lenx, begy, begx, data, placey, placex); const int bpp = 32; int dimy, dimx, x, y; @@ -110,7 +110,7 @@ tria_blit(ncplane* nc, int placey, int placex, int linesize, // effective in that case anyway c->channels = 0; c->stylemask = 0; - if(blendcolors){ + if(bargs->blendcolors){ cell_set_bg_alpha(c, CELL_ALPHA_BLEND); cell_set_fg_alpha(c, CELL_ALPHA_BLEND); } @@ -418,7 +418,7 @@ qtrans_check(nccell* c, unsigned blendcolors, static inline int quadrant_blit(ncplane* nc, int placey, int placex, int linesize, const void* data, int begy, int begx, - int leny, int lenx, unsigned blendcolors){ + int leny, int lenx, const blitterargs* bargs){ const int bpp = 32; int dimy, dimx, x, y; int total = 0; // number of cells written @@ -450,7 +450,7 @@ quadrant_blit(ncplane* nc, int placey, int placex, int linesize, nccell* c = ncplane_cell_ref_yx(nc, y, x); c->channels = 0; c->stylemask = 0; - const char* egc = qtrans_check(c, blendcolors, rgbbase_tl, rgbbase_tr, rgbbase_bl, rgbbase_br); + const char* egc = qtrans_check(c, bargs->blendcolors, rgbbase_tl, rgbbase_tr, rgbbase_bl, rgbbase_br); if(egc == NULL){ uint32_t tl = 0, tr = 0, bl = 0, br = 0; channel_set_rgb8(&tl, rgbbase_tl[0], rgbbase_tl[1], rgbbase_tl[2]); @@ -464,7 +464,7 @@ quadrant_blit(ncplane* nc, int placey, int placex, int linesize, //fprintf(stderr, "%d/%d %08x/%08x\n", y, x, fg, bg); cell_set_fchannel(c, fg); cell_set_bchannel(c, bg); - if(blendcolors){ + if(bargs->blendcolors){ cell_set_bg_alpha(c, CELL_ALPHA_BLEND); cell_set_fg_alpha(c, CELL_ALPHA_BLEND); } @@ -641,7 +641,7 @@ sex_trans_check(cell* c, const uint32_t rgbas[6], unsigned blendcolors){ static inline int sextant_blit(ncplane* nc, int placey, int placex, int linesize, const void* data, int begy, int begx, - int leny, int lenx, unsigned blendcolors){ + int leny, int lenx, const blitterargs* bargs){ const int bpp = 32; int dimy, dimx, x, y; int total = 0; // number of cells written @@ -675,9 +675,9 @@ sextant_blit(ncplane* nc, int placey, int placex, int linesize, nccell* c = ncplane_cell_ref_yx(nc, y, x); c->channels = 0; c->stylemask = 0; - const char* egc = sex_trans_check(c, rgbas, blendcolors); + const char* egc = sex_trans_check(c, rgbas, bargs->blendcolors); if(egc == NULL){ - egc = sex_solver(rgbas, &c->channels, blendcolors); + egc = sex_solver(rgbas, &c->channels, bargs->blendcolors); cell_set_blitquadrants(c, 1, 1, 1, 1); } //fprintf(stderr, "sex EGC: %s channels: %016lx\n", egc, c->channels); @@ -710,7 +710,7 @@ fold_rgb8(unsigned* restrict r, unsigned* restrict g, unsigned* restrict b, static inline int braille_blit(ncplane* nc, int placey, int placex, int linesize, const void* data, int begy, int begx, - int leny, int lenx, unsigned blendcolors){ + int leny, int lenx, const blitterargs* bargs){ const int bpp = 32; int dimy, dimx, x, y; int total = 0; // number of cells written @@ -795,7 +795,7 @@ braille_blit(ncplane* nc, int placey, int placex, int linesize, // effective in that case anyway c->channels = 0; c->stylemask = 0; - if(blendcolors){ + if(bargs->blendcolors){ cell_set_fg_alpha(c, CELL_ALPHA_BLEND); } // FIXME for now, we just sample, color-wise, and always draw crap. @@ -975,9 +975,11 @@ int ncblit_rgba(const void* data, int linesize, const struct ncvisual_options* v if(bset == NULL){ return -1; } - const bool blend = (vopts->flags & NCVISUAL_OPTION_BLEND); + blitterargs bargs = { + .blendcolors = (vopts->flags & NCVISUAL_OPTION_BLEND), + }; return bset->blit(nc, vopts->y, vopts->x, linesize, data, begy, begx, - leny, lenx, blend); + leny, lenx, &bargs); } ncblitter_e ncvisual_media_defblitter(const notcurses* nc, ncscale_e scale){ diff --git a/src/lib/internal.h b/src/lib/internal.h index 7de7813f0..08d79995b 100644 --- a/src/lib/internal.h +++ b/src/lib/internal.h @@ -294,7 +294,9 @@ typedef struct tinfo { uint32_t bg_collides_default; pthread_mutex_t pixel_query; // only query for pixel support once int color_registers; // sixel color registers (post pixel_query_done) - int sixel_maxx, sixel_maxy; // sixel size maxima (post pixel_query_done) + // FIXME at least xterm caps its "maximum graphics geometry" by the current + // window geometry. i don't want to requery on resize, so these are useless. + //int sixel_maxx, sixel_maxy; // sixel size maxima (post pixel_query_done) bool sixel_supported; // do we support sixel (post pixel_query_done)? bool pixel_query_done; // have we yet performed pixel query? bool sextants; // do we have (good, vetted) Unicode 13 sextant support? @@ -385,9 +387,18 @@ typedef struct notcurses { unsigned stdio_blocking_save; // was stdio blocking at entry? restore on stop. } notcurses; +// cell vs pixel-specific arguments +typedef union { + unsigned blendcolors; // for cells + struct { + int celldimx; // horizontal pixels per cell + int colorregs; // number of color registers + } pixel; // for pixels +} blitterargs; + typedef int (*blitter)(struct ncplane* n, int placey, int placex, int linesize, const void* data, int begy, int begx, - int leny, int lenx, unsigned blendcolors); + int leny, int lenx, const blitterargs* bargs); // a system for rendering RGBA pixels as text glyphs struct blitset { @@ -1203,11 +1214,11 @@ ncdirect_bg_default_p(const struct ncdirect* nc){ int sixel_blit(ncplane* nc, int placey, int placex, int linesize, const void* data, int begy, int begx, - int leny, int lenx, unsigned cellpixx); + int leny, int lenx, const blitterargs* bargs); int kitty_blit(ncplane* nc, int placey, int placex, int linesize, const void* data, int begy, int begx, - int leny, int lenx, unsigned cellpixx); + int leny, int lenx, const blitterargs* bargs); int term_fg_rgb8(bool RGBflag, const char* setaf, int colors, FILE* out, unsigned r, unsigned g, unsigned b); @@ -1218,8 +1229,11 @@ static inline int rgba_blit_dispatch(ncplane* nc, const struct blitset* bset, int placey, int placex, int linesize, const void* data, int begy, int begx, int leny, int lenx, unsigned blendcolors){ + blitterargs bargs = { + .blendcolors = blendcolors, + }; return bset->blit(nc, placey, placex, linesize, data, begy, begx, - leny, lenx, blendcolors); + leny, lenx, &bargs); } static inline const struct blitset* diff --git a/src/lib/kitty.c b/src/lib/kitty.c index a58c3894b..222bbae07 100644 --- a/src/lib/kitty.c +++ b/src/lib/kitty.c @@ -145,11 +145,12 @@ int kitty_blit_inner(ncplane* nc, int placey, int placex, int linesize, int kitty_blit(ncplane* nc, int placey, int placex, int linesize, const void* data, int begy, int begx, - int leny, int lenx, unsigned cellpixx){ + int leny, int lenx, const blitterargs* bargs){ (void)begy; (void)begx; //fprintf(stderr, "s=%d,v=%d\n", lenx, leny); - int r = kitty_blit_inner(nc, placey, placex, linesize, leny, lenx, cellpixx, data); + int r = kitty_blit_inner(nc, placey, placex, linesize, leny, lenx, + bargs->pixel.celldimx, data); if(r < 0){ return -1; } diff --git a/src/lib/sixel.c b/src/lib/sixel.c index 0ef9e5db3..405d87d06 100644 --- a/src/lib/sixel.c +++ b/src/lib/sixel.c @@ -269,7 +269,7 @@ int sixel_blit_inner(ncplane* nc, int placey, int placex, int lenx, int sixel_blit(ncplane* nc, int placey, int placex, int linesize, const void* data, int begy, int begx, - int leny, int lenx, unsigned cellpixx){ + int leny, int lenx, const blitterargs* bargs){ int sixelcount = (lenx - begx) * ((leny - begy + 5) / 6); sixeltable stable = { .data = malloc(MAXCOLORS * sixelcount), @@ -293,7 +293,7 @@ int sixel_blit(ncplane* nc, int placey, int placex, int linesize, free(stable.deets); return -1; } - int r = sixel_blit_inner(nc, placey, placex, lenx, &stable, cellpixx); + int r = sixel_blit_inner(nc, placey, placex, lenx, &stable, bargs->pixel.celldimx); free(stable.data); free(stable.deets); free(stable.table); diff --git a/src/lib/terminfo.c b/src/lib/terminfo.c index fc23ea750..764e1747b 100644 --- a/src/lib/terminfo.c +++ b/src/lib/terminfo.c @@ -286,15 +286,19 @@ query_xtsmgraphics(int fd, const char* seq, int* val, int* val2){ return 0; } -// query for Sixel details (number of color registers and maximum geometry) +// query for Sixel details including the number of color registers and, one day +// perhaps, maximum geometry. xterm binds its return by the current geometry, +// making it useless for a one-time query. static int query_sixel_details(tinfo* ti, int fd){ if(query_xtsmgraphics(fd, "\x1b[?1;1;0S", &ti->color_registers, NULL)){ return -1; } + /* if(query_xtsmgraphics(fd, "\x1b[?2;1;0S", &ti->sixel_maxx, &ti->sixel_maxy)){ return -1; } + */ //fprintf(stderr, "Sixel ColorRegs: %d Max_x: %d Max_y: %d\n", ti->color_registers, ti->sixel_maxx, ti->sixel_maxy); return 0; } @@ -341,7 +345,7 @@ query_sixel(tinfo* ti, int fd){ if(!ti->sixel_supported){ ti->sixel_supported = true; ti->color_registers = 256; // assumed default [shrug] - ti->sixel_maxx = ti->sixel_maxy = 0; +// ti->sixel_maxx = ti->sixel_maxy = 0; } // FIXME else warning? } break;