pad: replace pad_blank() and pad_blankrow() with pad_fill()
authorAli Gholami Rudi <ali@rudi.ir>
Mon, 23 Sep 2013 15:28:39 +0000 (23 18:58 +0330)
committerAli Gholami Rudi <ali@rudi.ir>
Mon, 23 Sep 2013 15:51:51 +0000 (23 19:21 +0330)
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
pad.c
term.c

diff --git a/fbpad.h b/fbpad.h
index 7dc2c47..136158e 100644 (file)
--- 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 (file)
--- 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 (file)
--- 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);
        }
 }