mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-13 04:27:47 -05:00
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:
parent
43b890c8e4
commit
1140dd37d3
1 changed files with 18 additions and 0 deletions
18
sixel.c
18
sixel.c
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue