sixel_blit: correctly set and match colors #200

pull/1379/head
nick black 3 years ago committed by Nick Black
parent b81b1568b1
commit ea7630692a

@ -835,6 +835,13 @@ braille_blit(ncplane* nc, int placey, int placex, int linesize,
return total;
}
static inline void
break_sixel_comps(unsigned char comps[static 3], uint32_t rgba){
comps[0] = ncpixel_r(rgba) * 100 / 255;
comps[1] = ncpixel_g(rgba) * 100 / 255;
comps[2] = ncpixel_b(rgba) * 100 / 255;
}
// Sixel blitter. Sixels are stacks 6 pixels high, and 1 pixel wide. RGB colors
// are programmed as a set of registers, which are then referenced by the
// stacks. There is also a RLE component, handled in rasterization. These can't
@ -870,11 +877,15 @@ sixel_blit(ncplane* nc, int placey, int placex, int linesize,
if(bitsused & (1u << (sy - y))){
continue;
}
unsigned char comps[3];
break_sixel_comps(comps, *rgb);
unsigned thesebits = 1u << (sy - y);
for(int ty = sy + 1 ; ty < dimy && ty < y + 6 ; ++ty){
const uint32_t* trgb = (const uint32_t*)(data + (linesize * ty) + (visx * 4));
if(!ffmpeg_trans_p(ncpixel_a(*trgb))){
if(memcmp(rgb + 1, trgb + 1, 3) == 0){
unsigned char candcomps[3];
break_sixel_comps(candcomps, *trgb);
if(memcmp(comps, candcomps, sizeof(comps)) == 0){
thesebits |= (1u << (ty - y));
}
}
@ -886,8 +897,8 @@ sixel_blit(ncplane* nc, int placey, int placex, int linesize,
// bitstring is added to 63, resulting in [63, 126] aka '?'..'~'
// FIXME grow if necessary
int n = snprintf(sixel + offset, avail - offset,
"%s#%d;2;%d;%d;%d#%d%c", printed ? "$" : "",
colorreg, 100, 100, 100, colorreg, c);
"%s#%d;2;%u;%u;%u#%d%c", printed ? "$" : "",
colorreg, comps[0], comps[1], comps[2], colorreg, c);
if(n < 0){
return -1;
}

Loading…
Cancel
Save