From c95c6639899a3fd50256352eb552b4f302fd6d6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sat, 6 Mar 2021 15:03:47 +0100 Subject: [PATCH] sixel: size provided by DECGRA does *not* limit the sixel size MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Foot has, up until now, used a fixed image size when the application used DECGRA (Raster Attributes) to “configure” the image size. This was based on a misunderstanding, that this was how you emitted sixels where the height was *not* a multiple of 6. This isn’t the case. The VT340 documentation is actually pretty clear about this: Ph and Pv do not limit the size of the image defined by the sixel data. However, Ph and Pv let you omit background sixel data from the image definition and still have a color background. They also provide a concise way for the application or terminal to encode the size of an image. This is also how XTerm behaves. Test image: \EPq "1;1;1;1 #0;2;0;0;0#1;2;100;100;0#2;2;0;100;0 #1~~@@vv@@~~@@~~$ #2??}}GG}}??}}??- #1!14@ \E\ This uses DECGRA to set the image size to 1x1. The sixel however is *not* clipped to 1x1, but is resized to 14x12 --- sixel.c | 7 +------ terminal.h | 1 - 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/sixel.c b/sixel.c index ecc6d141..6d57b6c4 100644 --- a/sixel.c +++ b/sixel.c @@ -45,7 +45,6 @@ sixel_init(struct terminal *term) term->sixel.image.data = xmalloc(1 * 6 * sizeof(term->sixel.image.data[0])); term->sixel.image.width = 1; term->sixel.image.height = 6; - term->sixel.image.autosize = true; /* TODO: default palette */ @@ -841,9 +840,6 @@ sixel_unhook(struct terminal *term) static bool resize(struct terminal *term, int new_width, int new_height) { - if (!term->sixel.image.autosize) - return false; - LOG_DBG("resizing image: %dx%d -> %dx%d", term->sixel.image.width, term->sixel.image.height, new_width, new_height); @@ -1034,8 +1030,7 @@ decgra(struct terminal *term, uint8_t c) if (ph >= term->sixel.image.height && pv >= term->sixel.image.width && ph <= term->sixel.max_height && pv <= term->sixel.max_width) { - if (resize(term, ph, pv)) - term->sixel.image.autosize = false; + resize(term, ph, pv); } term->sixel.state = SIXEL_DECSIXEL; diff --git a/terminal.h b/terminal.h index a7f2ed36..e4e662fb 100644 --- a/terminal.h +++ b/terminal.h @@ -531,7 +531,6 @@ struct terminal { uint32_t *data; /* Raw image data, in ARGB */ int width; /* Image width, in pixels */ int height; /* Image height, in pixels */ - bool autosize; } image; bool scrolling:1; /* Private mode 80 */