From: Michael D. Lowis Date: Thu, 19 Apr 2018 01:24:55 +0000 (-0400) Subject: reworked redraw code to prepare for more efficient scrolling X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=a17763c79f0a8d951ce35c8e677ef1895f691acb;p=projs%2Ftide.git reworked redraw code to prepare for more efficient scrolling --- diff --git a/inc/edit.h b/inc/edit.h index 0e71be8..3c0ec6b 100644 --- a/inc/edit.h +++ b/inc/edit.h @@ -89,6 +89,9 @@ typedef struct { CENTER = (1 << 1), } sync_flags; Buf buffer; /* the buffer used to populate the view */ + size_t index; + size_t width; + size_t nvisible; size_t nrows; /* number of rows and columns in the view */ Row** rows; /* array of row data structures */ } View; diff --git a/lib/view.c b/lib/view.c index bcff0eb..b41ce9e 100644 --- a/lib/view.c +++ b/lib/view.c @@ -61,15 +61,22 @@ static Sel* getsel(View* view) { return &(view->buffer.selection); } -void view_init(View* view, char* file) { - if (view->nrows) { +static void clear_rows(View* view) { + if (view->rows) { for (size_t i = 0; i < view->nrows; i++) free(view->rows[i]); free(view->rows); + view->rows = NULL; view->nrows = 0; - view->rows = NULL; } +} + +void view_init(View* view, char* file) { + clear_rows(view); view->sync_flags |= (CURSOR|CENTER); + view->index = 0; + view->width = 0; + view->nvisible = 0; /* load the file and jump to the address returned from the load function */ buf_init(BUF); if (file) buf_load(BUF, file); @@ -98,17 +105,16 @@ size_t rune_width(int c, size_t xpos, size_t width) { } void view_resize(View* view, size_t width, size_t nrows) { - /* free up the old data */ - if (view->rows) { - for (size_t i = 0; i < view->nrows; i++) - free(view->rows[i]); - free(view->rows); - view->rows = NULL; - view->nrows = 0; - } - size_t off = 0; + if (view->width == width && view->nvisible == nrows) + return; /* start from beginning of first line and populate row by row */ - for (size_t i = 0; i < nrows; i++) { + clear_rows(view); + view->width = width; + view->nvisible = nrows; + + size_t off = (view->rows ? view->rows[view->index]->off : 0); + off = buf_bol(&(view->buffer), off); + for (size_t i = 0; nrows > 0; nrows--, i++) { view->nrows++; view->rows = realloc(view->rows, sizeof(Row*) * view->nrows); view->rows[view->nrows-1] = calloc(1, sizeof(Row)); diff --git a/lib/x11.c b/lib/x11.c index 99f1d11..535dcdf 100644 --- a/lib/x11.c +++ b/lib/x11.c @@ -306,9 +306,9 @@ static void draw_view(int i, size_t nrows, drawcsr* csr, int bg, int fg, int sel view_resize(view, (csr->w - csr->x), nrows); view_update(view, &csrx, &csry); draw_rect(bg, csr->x, csr->y, csr->w, (nrows * fheight) + 9); - for (size_t y = 0; y < view->nrows; y++) { - Row* row = view_getrow(view, y); - draw_glyphs(csr->x + 2, csr->y + 2 + (y * fheight), row->cols, row->len); + for (size_t i = 0; i < nrows; i++) { + Row* row = view_getrow(view, i + view->index); + draw_glyphs(csr->x + 2, csr->y + 2 + (i * fheight), row->cols, row->len); } /* place the cursor on screen */ if (!view_selsize(view) && csrx != SIZE_MAX && csry != SIZE_MAX) {