From c05b0683ec130d2ea42c8cfb6d570f1b99578f28 Mon Sep 17 00:00:00 2001 From: nick black Date: Tue, 20 Apr 2021 02:21:29 -0400 Subject: [PATCH] [sixel] don't emit $ prior to - #1565 --- src/lib/sixel.c | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/lib/sixel.c b/src/lib/sixel.c index 642a44699..70dae0788 100644 --- a/src/lib/sixel.c +++ b/src/lib/sixel.c @@ -323,10 +323,12 @@ refine_color_table(const uint32_t* data, int linesize, int begy, int begx, // Emit some number of equivalent, subsequent sixels, using sixel RLE. We've // seen the sixel |crle| for |seenrle| columns in a row. |seenrle| must > 0. static int -write_rle(int* printed, int color, FILE* fp, int seenrle, unsigned char crle){ +write_rle(int* printed, int color, FILE* fp, int seenrle, unsigned char crle, + int* needclosure){ if(!*printed){ - fprintf(fp, "#%d", color); + fprintf(fp, "%s#%d", *needclosure ? "$" : "", color); *printed = 1; + *needclosure = 0; } crle += 63; if(seenrle == 1){ @@ -365,11 +367,12 @@ write_sixel_data(FILE* fp, int leny, int lenx, const sixeltable* stab, int* pars } int p = 0; while(p < stab->sixelcount){ + int needclosure = 0; for(int i = 0 ; i < stab->colors ; ++i){ - int printed = 0; int seenrle = 0; // number of repetitions unsigned char crle = 0; // character being repeated int idx = ctable_to_dtable(stab->table + i * CENTSIZE); + int printed = 0; for(int m = p ; m < stab->sixelcount && m < p + lenx ; ++m){ //fprintf(stderr, "%d ", idx * stab->sixelcount + m); //fputc(stab->data[idx * stab->sixelcount + m] + 63, stderr); @@ -377,7 +380,7 @@ write_sixel_data(FILE* fp, int leny, int lenx, const sixeltable* stab, int* pars if(stab->data[idx * stab->sixelcount + m] == crle){ ++seenrle; }else{ - write_rle(&printed, i, fp, seenrle, crle); + write_rle(&printed, i, fp, seenrle, crle, &needclosure); seenrle = 1; crle = stab->data[idx * stab->sixelcount + m]; } @@ -387,17 +390,12 @@ write_sixel_data(FILE* fp, int leny, int lenx, const sixeltable* stab, int* pars } } if(crle){ - write_rle(&printed, i, fp, seenrle, crle); - } - if(i + 1 < stab->colors){ - if(printed){ - fputc('$', fp); - } - }else{ - if(p + lenx < stab->sixelcount){ - fputc('-', fp); - } + write_rle(&printed, i, fp, seenrle, crle, &needclosure); } + needclosure = needclosure | printed; + } + if(p + lenx < stab->sixelcount){ + fputc('-', fp); } p += lenx; }