From 0576793565cd06e7eda673302702c39cbadd8e44 Mon Sep 17 00:00:00 2001 From: nick black Date: Sun, 7 Mar 2021 13:53:00 -0500 Subject: [PATCH] sixel: back out Set Raster Attributes (PR #1384) Set Raster Attributes allows us to specify the pixel aspect ratio and the image geometry. Unfortunately, it has the side effect of filling in all unspecified sixels with Color Register 0, which we do not want. --- src/lib/sixel.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/lib/sixel.c b/src/lib/sixel.c index d95906720..daea7eae8 100644 --- a/src/lib/sixel.c +++ b/src/lib/sixel.c @@ -161,11 +161,15 @@ write_rle(FILE* fp, int seenrle, unsigned char crle){ // Emit the sprixel in its entirety, plus enable and disable pixel mode. static int -write_sixel_data(FILE* fp, int leny, int lenx, sixeltable* stab){ +write_sixel_data(FILE* fp, int lenx, sixeltable* stab){ + // DECSDM (sixel scrolling enable) plus enter sixel mode + // FIXME i think we can print DESDM on the first one, and never again fprintf(fp, "\e[?80h\ePq"); // FIXME pixelon // Set Raster Attributes - pan/pad=1 (pixel aspect ratio), Ph=lenx, Pv=leny - fprintf(fp, "\"1;1;%d;%d", lenx, leny); + // using Ph/Pv causes a background to be drawn using color register 0 for all + // unspecified pixels, which we do not want. + //fprintf(fp, "\"1;1;%d;%d", lenx, leny); for(int i = 0 ; i < stab->ctab->colors ; ++i){ const unsigned char* rgb = stab->ctab->table + i * 5; @@ -216,7 +220,7 @@ write_sixel_data(FILE* fp, int leny, int lenx, sixeltable* stab){ // are programmed as a set of registers, which are then referenced by the // stacks. There is also a RLE component, handled in rasterization. // A pixel block is indicated by setting cell_pixels_p(). -int sixel_blit_inner(ncplane* nc, int placey, int placex, int leny, int lenx, +int sixel_blit_inner(ncplane* nc, int placey, int placex, int lenx, sixeltable* stab, unsigned cellpixx){ char* buf = NULL; size_t size = 0; @@ -224,7 +228,7 @@ int sixel_blit_inner(ncplane* nc, int placey, int placex, int leny, int lenx, if(fp == NULL){ return -1; } - if(write_sixel_data(fp, leny, lenx, stab)){ + if(write_sixel_data(fp, lenx, stab)){ fclose(fp); free(buf); return -1; @@ -261,7 +265,7 @@ int sixel_blit(ncplane* nc, int placey, int placex, int linesize, free(stable.data); return -1; } - int r = sixel_blit_inner(nc, placey, placex, leny, lenx, &stable, cellpixx); + int r = sixel_blit_inner(nc, placey, placex, lenx, &stable, cellpixx); free(stable.data); free(ctab); return r;