From: Ahmad Fatoum <a.fatoum@barebox.org>
To: barebox@lists.infradead.org
Cc: Ahmad Fatoum <a.fatoum@barebox.org>
Subject: [PATCH 09/20] fbconsole: precompute foreground/background colors
Date: Sun, 3 May 2026 10:33:11 +0200 [thread overview]
Message-ID: <20260503084430.2765761-10-a.fatoum@barebox.org> (raw)
In-Reply-To: <20260503084430.2765761-1-a.fatoum@barebox.org>
We did color format conversion on every drawchar(), when it would have
been sufficient to do this only when the color is actually changed.
As clearing the screen should also be color aware and doesn't
necessarily involve a call to drawchar(), optimize the color conversion
to happen on only when the color actually changes.
Signed-off-by: Ahmad Fatoum <a.fatoum@barebox.org>
---
drivers/video/fbconsole.c | 77 ++++++++++++++++++++++++++-------------
1 file changed, 52 insertions(+), 25 deletions(-)
diff --git a/drivers/video/fbconsole.c b/drivers/video/fbconsole.c
index 285f22901573..74b37b429f2a 100644
--- a/drivers/video/fbconsole.c
+++ b/drivers/video/fbconsole.c
@@ -39,6 +39,7 @@ enum ansi_color {
};
#define DEFAULT_COLOR WHITE
+#define DEFAULT_BGCOLOR BLACK
struct fbc_priv {
struct console_device cdev;
@@ -66,6 +67,9 @@ struct fbc_priv {
int color;
int bgcolor;
+ u32 color_rgb;
+ u32 bgcolor_rgb;
+
#define ANSI_FLAG_INVERT (1 << 0)
#define ANSI_FLAG_BRIGHT (1 << 1)
#define SGR_ATTRIBUTES (ANSI_FLAG_INVERT | ANSI_FLAG_BRIGHT)
@@ -200,8 +204,6 @@ static void drawchar(struct fbc_priv *priv, int x, int y, int c)
int i;
const uint8_t *inbuf;
int line_length;
- u32 color, bgcolor;
- struct rgb *rgb;
int xstep;
int ystep;
int startx;
@@ -214,18 +216,6 @@ static void drawchar(struct fbc_priv *priv, int x, int y, int c)
line_length = priv->fb->line_length;
- color = priv->flags & ANSI_FLAG_INVERT ? priv->bgcolor : priv->color;
- bgcolor = priv->flags & ANSI_FLAG_INVERT ? priv->color : priv->bgcolor;
-
- if (priv->flags & ANSI_FLAG_BRIGHT)
- color += BRIGHT;
-
- rgb = &colors[color];
- color = gu_rgb_to_pixel(priv->fb, rgb->r, rgb->g, rgb->b, 0xff);
-
- rgb = &colors[bgcolor];
- bgcolor = gu_rgb_to_pixel(priv->fb, rgb->r, rgb->g, rgb->b, 0x0);
-
adr = buf;
switch (priv->rotation) {
@@ -271,9 +261,11 @@ static void drawchar(struct fbc_priv *priv, int x, int y, int c)
}
if (*inbuf & mask)
- gu_set_pixel(priv->fb, adr + j * xstep, color);
+ gu_set_pixel(priv->fb, adr + j * xstep,
+ priv->color_rgb);
else
- gu_set_pixel(priv->fb, adr + j * xstep, bgcolor);
+ gu_set_pixel(priv->fb, adr + j * xstep,
+ priv->bgcolor_rgb);
mask >>= 1;
@@ -497,8 +489,41 @@ static void printchar(struct fbc_priv *priv, int c)
toggle_cursor_visibility(priv);
}
+static void fbc_update_colors(struct fbc_priv *priv, int color, int bgcolor)
+{
+ struct rgb *rgb;
+
+ if (color >= 0)
+ priv->color = color;
+ if (bgcolor >= 0)
+ priv->bgcolor = bgcolor;
+
+ if (priv->flags & ANSI_FLAG_INVERT) {
+ color = priv->bgcolor;
+ bgcolor = priv->color;
+ } else {
+ color = priv->color;
+ bgcolor = priv->bgcolor;
+ }
+
+ if (priv->flags & ANSI_FLAG_BRIGHT)
+ color += BRIGHT;
+
+ rgb = &colors[color];
+ priv->color_rgb = gu_rgb_to_pixel(priv->fb, rgb->r, rgb->g, rgb->b, 0xff);
+
+ rgb = &colors[bgcolor];
+ priv->bgcolor_rgb = gu_rgb_to_pixel(priv->fb, rgb->r, rgb->g, rgb->b, 0x0);
+}
+
+static void fbc_reset_colors(struct fbc_priv *priv)
+{
+ fbc_update_colors(priv, DEFAULT_COLOR, DEFAULT_BGCOLOR);
+}
+
static void fbc_parse_colors(struct fbc_priv *priv)
{
+ int color = -1, bgcolor = -1;
int code;
char *str;
@@ -509,8 +534,8 @@ static void fbc_parse_colors(struct fbc_priv *priv)
switch (code) {
case 0:
priv->flags &= ~SGR_ATTRIBUTES;
- priv->color = DEFAULT_COLOR;
- priv->bgcolor = BLACK;
+ color = DEFAULT_COLOR;
+ bgcolor = DEFAULT_BGCOLOR;
break;
case 1:
priv->flags |= ANSI_FLAG_BRIGHT;
@@ -519,20 +544,20 @@ static void fbc_parse_colors(struct fbc_priv *priv)
priv->flags |= ANSI_FLAG_INVERT;
break;
case 30 ... 37:
- priv->color = code - 30;
+ color = code - 30;
break;
case 39:
- priv->color = DEFAULT_COLOR;
+ color = DEFAULT_COLOR;
break;
case 40 ... 47:
- priv->bgcolor = code - 40;
+ bgcolor = code - 40;
break;
case 49:
- priv->bgcolor = BLACK;
+ bgcolor = DEFAULT_BGCOLOR;
break;
case 90 ... 97:
priv->flags |= ANSI_FLAG_BRIGHT;
- priv->color = code - 90;
+ color = code - 90;
break;
}
@@ -540,6 +565,8 @@ static void fbc_parse_colors(struct fbc_priv *priv)
break;
str++;
}
+
+ fbc_update_colors(priv, color, bgcolor);
}
static void fbc_set_cursor_row(struct fbc_priv *priv, int y)
@@ -872,8 +899,8 @@ int register_fbconsole(struct fb_info *fb)
priv->fb = fb;
priv->x = 0;
priv->y = 0;
- priv->color = WHITE;
- priv->bgcolor = BLACK;
+
+ fbc_reset_colors(priv);
cdev = &priv->cdev;
cdev->dev = &fb->dev;
--
2.47.3
next prev parent reply other threads:[~2026-05-03 8:45 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-03 8:33 [PATCH 00/20] fbconsole: support TUI-relevant escape sequences Ahmad Fatoum
2026-05-03 8:33 ` [PATCH 01/20] fbconsole: remove incomplete CSI_CNT state Ahmad Fatoum
2026-05-03 8:33 ` [PATCH 02/20] fbconsole: improve handling of unexpected escape sequences Ahmad Fatoum
2026-05-03 8:33 ` [PATCH 03/20] fbconsole: fix handling of CSI buffer overflow Ahmad Fatoum
2026-05-03 8:33 ` [PATCH 04/20] fbconsole: do not reset cursor visibility alongside attributes Ahmad Fatoum
2026-05-03 8:33 ` [PATCH 05/20] fbconsole: respect hidden cursor everywhere Ahmad Fatoum
2026-05-03 8:33 ` [PATCH 06/20] fbconsole: call fb_blit_area for every drawchar Ahmad Fatoum
2026-05-03 8:33 ` [PATCH 07/20] fbconsole: skip fb_flush when processing escape sequences Ahmad Fatoum
2026-05-03 8:33 ` [PATCH 08/20] fbconsole: factor out helpers for clamped cursor row/col setting Ahmad Fatoum
2026-05-03 8:33 ` Ahmad Fatoum [this message]
2026-05-03 8:33 ` [PATCH 10/20] fbconsole: collect renderable state into struct fbc_screen_state Ahmad Fatoum
2026-05-03 8:33 ` [PATCH 11/20] fbconsole: implement CSI A/B/C/D cursor movement sequences Ahmad Fatoum
2026-05-03 8:33 ` [PATCH 12/20] fbconsole: restrict cursor visibility to DEC private mode 25 Ahmad Fatoum
2026-05-03 8:33 ` [PATCH 13/20] fbconsole: add new clear_chars helper Ahmad Fatoum
2026-05-03 8:33 ` [PATCH 14/20] fbconsole: implement erase entire line CSI Ahmad Fatoum
2026-05-03 8:33 ` [PATCH 15/20] fbconsole: support ESC[0J and ESC[1J partial screen clear Ahmad Fatoum
2026-05-03 8:33 ` [PATCH 16/20] fbconsole: implement DEC save/restore cursor Ahmad Fatoum
2026-05-03 8:33 ` [PATCH 17/20] fbconsole: implement VT100 deferred wrap (last column flag) Ahmad Fatoum
2026-05-03 8:33 ` [PATCH 18/20] fbconsole: implement alternate screen buffer (ESC[?1049h/l) Ahmad Fatoum
2026-05-03 8:33 ` [PATCH 19/20] fbconsole: adapt logging depending on activated streams Ahmad Fatoum
2026-05-03 8:33 ` [PATCH 20/20] netconsole: suppress log message when opening console file Ahmad Fatoum
2026-05-07 10:38 ` [PATCH 00/20] fbconsole: support TUI-relevant escape sequences Sascha Hauer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260503084430.2765761-10-a.fatoum@barebox.org \
--to=a.fatoum@barebox.org \
--cc=barebox@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox