Skip to content

Commit 2eceda3

Browse files
committed
Speed up window drawing.
We were repeatedly calling gb_linecol_to_pos for each cell, which is linear in the number of lines. gb_linecol_to_pos could be optimized, but for now just inline the work and do it incrementally. Closes #54.
1 parent d5a4cd3 commit 2eceda3

File tree

3 files changed

+25
-7
lines changed

3 files changed

+25
-7
lines changed

draw.c

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -313,17 +313,36 @@ static void window_draw_leaf(struct window *window, struct editor *editor) {
313313
struct syntax syntax;
314314
struct syntax_token token = {SYNTAX_TOKEN_NONE, 0, 0};
315315
bool highlight = syntax_init(&syntax, window->buffer);
316+
317+
size_t line_pos = 0;
318+
for (size_t i = 0; i < window->top; ++i) {
319+
line_pos += gb->lines->buf[i] + 1;
320+
}
321+
316322
for (size_t y = 0; y < rows; ++y) {
317323
size_t line = y + window->top;
318324
window_draw_line_number(window, line);
319325

320-
size_t cols = (size_t) max(0,
321-
min((ssize_t) gb_utf8len_line(gb, line) - (ssize_t) window->left, (ssize_t) w));
326+
if (y > 0) {
327+
line_pos += gb->lines->buf[line - 1] + 1;
328+
}
329+
322330
size_t tabs = 0;
331+
size_t linelen = gb_utf8len_line(gb, line_pos);
332+
size_t cols = (size_t)max(0,
333+
min((ssize_t)linelen - (ssize_t)window->left, (ssize_t)w));
334+
335+
size_t pos = line_pos;
336+
for (size_t i = 0; i < window->left; ++i) {
337+
pos += gb_utf8len(gb, pos);
338+
}
339+
323340
for (size_t x = 0; x < cols; ++x) {
324341
size_t x_offset = tabs * (tabstop - 1) + numberwidth + x;
325-
size_t col = x + window->left;
326-
size_t pos = gb_linecol_to_pos(gb, line, col);
342+
343+
if (x > 0) {
344+
pos += gb_utf8len(gb, pos);
345+
}
327346

328347
tb_color fg = COLOR_WHITE;
329348
tb_color bg = COLOR_DEFAULT;

gap.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -296,8 +296,7 @@ size_t gb_linecol_to_pos(struct gapbuf *gb, size_t line, size_t column) {
296296
return offset;
297297
}
298298

299-
size_t gb_utf8len_line(struct gapbuf *gb, size_t line) {
300-
size_t pos = gb_linecol_to_pos(gb, line, 0);
299+
size_t gb_utf8len_line(struct gapbuf *gb, size_t pos) {
301300
size_t len = 0;
302301
while (gb_getchar(gb, pos) != '\n') {
303302
pos += gb_utf8len(gb, pos);

gap.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ size_t gb_utf8next(struct gapbuf *gb, size_t pos);
5656
// Returns the offset of the previous utf8 start byte before pos.
5757
size_t gb_utf8prev(struct gapbuf *gb, size_t pos);
5858
// Returns the number of the unicode codepoints for the given line.
59-
size_t gb_utf8len_line(struct gapbuf *gb, size_t line);
59+
size_t gb_utf8len_line(struct gapbuf *gb, size_t line_pos);
6060

6161
// Reads n characters starting at offset pos.
6262
struct buf *gb_getstring(struct gapbuf *gb, size_t pos, size_t n);

0 commit comments

Comments
 (0)