blitters: accept new blitterarg union #1389

pull/1414/head
nick black 3 years ago
parent 679f4fb47a
commit dc118e54f6
No known key found for this signature in database
GPG Key ID: 5F43400C21CBFACC

@ -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){

@ -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*

@ -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;
}

@ -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);

@ -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;

Loading…
Cancel
Save