sixel: set ‘col’ outside image boundaries when we’ve reached max height

This is to optimize sixel_add(). It already checks ‘pos’, to see if it
needs to resize the image, and if the resize fails (either due to
allocation failures, or because we’ve reached the maximum width), we
bail out.

We need to do the same thing for height. But, we don’t want to add
another check to sixel_add() since its’s performance critical.

By setting ‘col’ outside the image boundaries when ‘row’ reaches the
maximum image height, we can “re-use” the existing code in
sixel_add().
This commit is contained in:
Daniel Eklöf 2021-03-07 11:51:24 +01:00
parent 4b0e9a6bee
commit 6ab7052be4
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F

16
sixel.c
View file

@ -966,7 +966,15 @@ decsixel(struct terminal *term, uint8_t c)
break;
case '$':
term->sixel.pos.col = 0;
if (likely(term->sixel.pos.col <= term->sixel.max_width)) {
/*
* We set, and keep, col outside the image boundary when
* weve reached the maximum image height, to avoid also
* having to check the row vs image height in the common
* path in sixel_add().
*/
term->sixel.pos.col = 0;
}
break;
case '-':
@ -974,8 +982,10 @@ decsixel(struct terminal *term, uint8_t c)
term->sixel.pos.col = 0;
term->sixel.row_byte_ofs += term->sixel.image.width * 6;
if (term->sixel.pos.row >= term->sixel.image.height)
resize(term, term->sixel.image.width, term->sixel.pos.row + 6);
if (term->sixel.pos.row >= term->sixel.image.height) {
if (!resize(term, term->sixel.image.width, term->sixel.pos.row + 6))
term->sixel.pos.col = term->sixel.max_width + 1;
}
break;
case '?': case '@': case 'A': case 'B': case 'C': case 'D': case 'E':