Revert "sixel: resize: always round up height to a multiple of 6"

This reverts commit 5a9d70da837c20a9641d6cbadccc962a8e5a4283.

This broke jexer.

Comparing with what XTerm does, we can see that it updates its image
height for *each* pixel in *each* sixel. I.e. empty pixels at the
bottom of a sixel will not increase the image size.

Foot currently bumps the image height 6 pixels at a time, i.e. always
a whole pixel.

Given this, always rounding up the height to the nearest multiple of
6 (say, for example, when responding to a DECGRA command), is wrong.

Now, we use the image size specified in DECGRA as is, while still
allowing the image to grow beyond that if necessary.

What’s left to do, if we want to behave *exactly* like XTerm, is stop
growing the image with 6 pixels at a time when dynamically adjusting
the image size.
This commit is contained in:
Daniel Eklöf 2021-03-07 00:03:34 +01:00
parent ab70b4f16a
commit 6416319a99
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F

10
sixel.c
View file

@ -853,8 +853,10 @@ resize(struct terminal *term, int new_width, int new_height)
const int old_width = term->sixel.image.width;
const int old_height = term->sixel.image.height;
new_height = (new_height + 6 - 1) / 6 * 6;
xassert(new_height % 6 == 0);
int alloc_new_width = new_width;
int alloc_new_height = (new_height + 6 - 1) / 6 * 6;
xassert(alloc_new_height >= new_height);
xassert(alloc_new_height - new_height < 6);
if (new_width > term->sixel.max_width)
return false;
@ -876,7 +878,7 @@ resize(struct terminal *term, int new_width, int new_height)
/* Width (and thus stride) is the same, so we can simply
* re-alloc the existing buffer */
new_data = realloc(old_data, new_width * new_height * sizeof(uint32_t));
new_data = realloc(old_data, alloc_new_width * alloc_new_height * sizeof(uint32_t));
if (new_data == NULL) {
LOG_ERRNO("failed to reallocate sixel image buffer");
return false;
@ -887,7 +889,7 @@ resize(struct terminal *term, int new_width, int new_height)
} else {
/* Width (and thus stride) change - need to allocate a new buffer */
xassert(new_width > old_width);
new_data = xmalloc(new_width * new_height * sizeof(uint32_t));
new_data = xmalloc(alloc_new_width * alloc_new_height * sizeof(uint32_t));
/* Copy old rows, and initialize new columns to background color */
for (int r = 0; r < min(old_height, new_height); r++) {