sixel: overwrite-by-rectangle: optimize: break out of loop as soon as possible

Since the images are sorted, we can break out of the loop as soon as
we detect an image that *ends before* the rectangle's top starts.

In order for the row comparisons to work, the row numbers must be
re-based against the current scrollback offset, or the
scrollback *end*, to be precise.
This commit is contained in:
Daniel Eklöf 2020-06-28 19:22:23 +02:00
parent 43b890c8e4
commit 1140dd37d3
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F

18
sixel.c
View file

@ -344,12 +344,30 @@ _sixel_overwrite_by_rectangle(
const int start = row;
const int end = row + height - 1;
const int scrollback_end
= (term->grid->offset + term->rows) & (term->grid->num_rows - 1);
const int grid_relative_start
= (start
- scrollback_end
+ term->grid->num_rows) & (term->grid->num_rows - 1);
tll_foreach(term->grid->sixel_images, it) {
struct sixel *six = &it->item;
const int six_start = six->pos.row;
const int six_end = (six_start + six->rows - 1) & (term->grid->num_rows - 1);
const int six_grid_relative_end =
(six_end
- scrollback_end
+ + term->grid->num_rows) & (term->grid->num_rows - 1);
if (six_grid_relative_end < grid_relative_start) {
/* All remaining sixels are *before* our rectangle */
break;
}
/* We should never generate scrollback wrapping sixels */
assert(six_end >= six_start);