diff --git a/src/lib/sixel.c b/src/lib/sixel.c index 74a76551d..a38a3e34a 100644 --- a/src/lib/sixel.c +++ b/src/lib/sixel.c @@ -378,10 +378,22 @@ struct band_extender { int rep; // representation, 0..63 }; +static inline void +write_rle(char* vec, int* voff, int rle, int rep){ + if(rle > 2){ + *voff += sprintf(vec + *voff, "!%d", rle); + }else if(rle == 2){ + vec[(*voff)++] = rep; + } + if(rle){ + vec[(*voff)++] = rep; + } +} + // add the supplied rle section to the appropriate vector, which might // need to be created. we are writing out [bes->wrote, curx) (i.e. curx // ought *not* describe the |bes| element, and ought equal |dimx| when -// finalizing the band). +// finalizing the band). caller must update bes->wrote afterwards! static inline char* sixelband_extend(char* vec, struct band_extender* bes, int dimx, int curx){ assert(dimx >= rle); @@ -398,25 +410,10 @@ sixelband_extend(char* vec, struct band_extender* bes, int dimx, int curx){ } // rle will equal 0 if this is our first non-zero rep, at a non-zero x; // in that case, rep is guaranteed to be 0; catch it at the bottom. - if(bes->rle > 2){ - bes->length += sprintf(vec + bes->length, "!%d", bes->rle); - }else if(bes->rle == 2){ - vec[bes->length++] = bes->rep + 63; - } - if(bes->rle){ - vec[bes->length++] = bes->rep + 63; - } + write_rle(vec, &bes->length, bes->rle, bes->rep + 63); int clearlen = curx - (bes->rle + bes->wrote); - if(clearlen > 2){ - bes->length += sprintf(vec + bes->length, "!%d", clearlen); - }else if(clearlen == 2){ - vec[bes->length++] = '?'; - } - if(clearlen){ - vec[bes->length++] = '?'; - } + write_rle(vec, &bes->length, clearlen, '?'); vec[bes->length] = '\0'; - // bes->wrote = curx; handled by caller return vec; }