From 45835b4c21fe5e9455f6c9572eb5ac1a68930d01 Mon Sep 17 00:00:00 2001 From: Ali Gholami Rudi Date: Mon, 23 Sep 2013 18:58:39 +0330 Subject: [PATCH] pad: replace pad_blank() and pad_blankrow() with pad_fill() This also changes _draw_row(): instead of filling each row with the background color and skipping blank columns, _draw_row() now merges following blank columns and calls pad_fill() once for each set of these columns. --- fbpad.h | 3 +-- pad.c | 20 +++++++------------- term.c | 23 ++++++++++++++++++----- 3 files changed, 26 insertions(+), 20 deletions(-) diff --git a/fbpad.h b/fbpad.h index 7dc2c47..136158e 100644 --- a/fbpad.h +++ b/fbpad.h @@ -60,8 +60,7 @@ int pad_font(char *fr, char *fi, char *fb); void pad_put(int ch, int r, int c, int fg, int bg); int pad_rows(void); int pad_cols(void); -void pad_blank(int c); -void pad_blankrow(int r, int bg); +void pad_fill(int sr, int er, int sc, int ec, int c); /* font.c */ struct font *font_open(char *path); diff --git a/pad.c b/pad.c index 2bf485c..00b4533 100644 --- a/pad.c +++ b/pad.c @@ -7,7 +7,6 @@ #include "fbpad.h" #define NCACHE (1 << 11) -#define MAXFBWIDTH (1 << 12) static unsigned int cd[256] = { COLOR0, COLOR1, COLOR2, COLOR3, @@ -133,9 +132,9 @@ static fbval_t *ch2fb(int fn, int c, short fg, short bg) return fbbits; } -static void fb_box(int sr, int sc, int er, int ec, fbval_t val) +static void fb_box(int sr, int er, int sc, int ec, fbval_t val) { - static fbval_t line[MAXFBWIDTH]; + static fbval_t line[32 * NCOLS]; int cn = ec - sc; int i; for (i = 0; i < cn; i++) @@ -165,22 +164,17 @@ void pad_put(int ch, int r, int c, int fg, int bg) if (!bits) bits = ch2fb(0, ch, fg, bg); if (!bits) - fb_box(sr, sc, sr + fnrows, sc + fncols, color2fb(bg & FN_C)); + fb_box(sr, sr + fnrows, sc, sc + fncols, color2fb(bg & FN_C)); else for (i = 0; i < fnrows; i++) fb_set(sr + i, sc, bits + (i * fncols), fncols); } -void pad_blank(int c) +void pad_fill(int sr, int er, int sc, int ec, int c) { - fb_box(0, 0, fb_rows(), fb_cols(), color2fb(c & FN_C)); -} - -void pad_blankrow(int r, int bg) -{ - int sr = r * fnrows; - int er = r == rows - 1 ? fb_rows() : (r + 1) * fnrows; - fb_box(sr, 0, er, fb_cols(), color2fb(bg & FN_C)); + int fber = er >= 0 ? er * fnrows : fb_rows(); + int fbec = ec >= 0 ? ec * fncols : fb_cols(); + fb_box(sr * fnrows, fber, sc * fncols, fbec, color2fb(c & FN_C)); } int pad_rows(void) diff --git a/term.c b/term.c index dd07106..dcef4b3 100644 --- a/term.c +++ b/term.c @@ -69,13 +69,25 @@ static void _draw_pos(int r, int c, int cursor) /* assumes visible && !lazy */ static void _draw_row(int r) { + int cbg, cch; /* current background and character */ + int fbg, fsc = -1; /* filling background and start column */ int i; - pad_blankrow(r, bgcolor()); + /* call pad_fill() only once for blank columns with identical backgrounds */ for (i = 0; i < pad_cols(); i++) { - int c = screen[OFFSET(r, i)]; - if ((c && c != ' ') || bgs[OFFSET(r, i)] != bgcolor()) + cbg = bgs[OFFSET(r, i)]; + cch = screen[OFFSET(r, i)] ? screen[OFFSET(r, i)] : ' '; + if (fsc >= 0 && (cbg != fbg || (cch != ' '))) { + pad_fill(r, r + 1, fsc, i, fbg & FN_C); + fsc = -1; + } + if (cch != ' ') { _draw_pos(r, i, 0); + } else if (fsc < 0) { + fsc = i; + fbg = cbg; + } } + pad_fill(r, r + 1, fsc >= 0 ? fsc : pad_cols(), -1, cbg & FN_C); } static int candraw(int sr, int er) @@ -212,7 +224,7 @@ static void term_blank(void) { screen_reset(0, pad_rows() * pad_cols()); if (visible) - pad_blank(bgcolor()); + pad_fill(0, -1, 0, -1, bgcolor() & FN_C); } static void ctlseq(void); @@ -356,6 +368,7 @@ void term_redraw(int all) { if (term->fd) { if (all) { + pad_fill(pad_rows(), -1, 0, -1, BGCOLOR); lazy_start(); memset(dirty, 1, pad_rows() * sizeof(*dirty)); } @@ -363,7 +376,7 @@ void term_redraw(int all) lazy_flush(); } else { if (all) - pad_blank(0); + pad_fill(0, -1, 0, -1, 0); } } -- 2.11.4.GIT