sixel: don’t *ever* shrink image below its SRA size

If the image was accompanied with a “Set Raster Attributes” (SRA)
command, make sure we *never* shrink the image below the size
specified in the SRA.

Images are normally shrunk when their bottom rows are fully
transparent. This enables sixels that aren’t a multiple of 6 to be
emitted, without also emitting an SRA command.

But if there *is* an SRA command, obey it.

Verified against XTerm-367
This commit is contained in:
Daniel Eklöf 2021-05-16 10:57:43 +02:00
parent 92e517ae34
commit e0f1a4ae33
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
2 changed files with 8 additions and 6 deletions

View file

@ -101,6 +101,8 @@
* Font underlines being positioned below the cell (and thus being
invisible) for certain combinations of fonts and font sizes
(https://codeberg.org/dnkl/foot/issues/503).
* Sixels with transparent bottom border being resized below the size
specified in _”Set Raster Attributes”_.
### Security

12
sixel.c
View file

@ -816,7 +816,8 @@ sixel_unhook(struct terminal *term)
xassert(image.rows <= term->grid->num_rows);
xassert(image.pos.row + image.rows - 1 < term->grid->num_rows);
LOG_DBG("generating %dx%d pixman image at %d-%d",
LOG_DBG("generating %s %dx%d pixman image at %d-%d",
image.opaque ? "opaque" : "transparent",
image.width, image.height,
image.pos.row, image.pos.row + image.rows);
@ -1195,11 +1196,10 @@ decgra(struct terminal *term, uint8_t c)
ph <= term->sixel.max_height && pv <= term->sixel.max_width)
{
resize(term, ph, pv);
if (!term->sixel.transparent_bg) {
/* This ensures the sixels final image size is *at
* least* this large */
term->sixel.max_non_empty_row_no = pv - 1;
}
/* This ensures the sixels final image size is *at least*
* this large */
term->sixel.max_non_empty_row_no = pv - 1;
}
term->sixel.state = SIXEL_DECSIXEL;