[SeaBIOS] [PATCH 2/2] vgabios: Add support handling text mode attributes while in graphics mode
Kevin O'Connor
kevin at koconnor.net
Fri Oct 17 17:28:21 CEST 2014
Add support for simple text mode attribute emulation while in graphics
mode. This seems to help with text highlighting and colors with a few
boot-loaders. Turn it on only for CBVGA vgabios.
Signed-off-by: Kevin O'Connor <kevin at koconnor.net>
---
vgasrc/Kconfig | 6 ++++++
vgasrc/vgafb.c | 26 +++++++++++++++++++++++---
2 files changed, 29 insertions(+), 3 deletions(-)
diff --git a/vgasrc/Kconfig b/vgasrc/Kconfig
index 951240c..6474c22 100644
--- a/vgasrc/Kconfig
+++ b/vgasrc/Kconfig
@@ -50,6 +50,7 @@ menu "VGA ROM"
config VGA_COREBOOT
depends on COREBOOT
bool "coreboot linear framebuffer"
+ select VGA_EMULATE_TEXTATTR
help
Build support for a vgabios wrapper around video
devices initialized using coreboot native vga init.
@@ -83,6 +84,11 @@ menu "VGA ROM"
config VGA_STDVGA_PORTS
bool
+ config VGA_EMULATE_TEXTATTR
+ bool
+ help
+ Try to emulate text mode attributes when writing text in
+ graphics mode.
config VGA_ALLOCATE_EXTRA_STACK
depends on BUILD_VGABIOS
diff --git a/vgasrc/vgafb.c b/vgasrc/vgafb.c
index e67244f..74ddc53 100644
--- a/vgasrc/vgafb.c
+++ b/vgasrc/vgafb.c
@@ -380,6 +380,8 @@ gfx_clear_chars(struct vgamode_s *vmode_g, struct cursorpos dest
op.y = dest.y * cheight;
op.ylen = clearsize.y * cheight;
op.pixels[0] = ca.attr;
+ if (CONFIG_VGA_EMULATE_TEXTATTR)
+ op.pixels[0] = ca.attr >> 4;
op.op = GO_MEMSET;
handle_gfx_op(&op);
}
@@ -414,7 +416,25 @@ gfx_write_char(struct vgamode_s *vmode_g
op.x = cp.x * 8;
int cheight = GET_BDA(char_height);
op.y = cp.y * cheight;
- int usexor = ca.attr & 0x80 && GET_GLOBAL(vmode_g->depth) < 8;
+ u8 fgattr = ca.attr, bgattr = 0x00;
+ int usexor = 0;
+ if (CONFIG_VGA_EMULATE_TEXTATTR) {
+ if (ca.use_attr) {
+ bgattr = fgattr >> 4;
+ fgattr = fgattr & 0x0f;
+ } else {
+ // Read bottom right pixel of the cell to guess bg color
+ op.op = GO_READ8;
+ op.y += cheight-1;
+ handle_gfx_op(&op);
+ op.y -= cheight-1;
+ bgattr = op.pixels[7];
+ fgattr = bgattr ^ 0x7;
+ }
+ } else if (fgattr & 0x80 && GET_GLOBAL(vmode_g->depth) < 8) {
+ usexor = 1;
+ fgattr &= 0x7f;
+ }
int i;
for (i = 0; i < cheight; i++, op.y++) {
u8 fontline = GET_FARVAR(font.seg, *(u8*)(font.offset+i));
@@ -423,11 +443,11 @@ gfx_write_char(struct vgamode_s *vmode_g
handle_gfx_op(&op);
int j;
for (j = 0; j < 8; j++)
- op.pixels[j] ^= (fontline & (0x80>>j)) ? (ca.attr & 0x7f) : 0x00;
+ op.pixels[j] ^= (fontline & (0x80>>j)) ? fgattr : 0x00;
} else {
int j;
for (j = 0; j < 8; j++)
- op.pixels[j] = (fontline & (0x80>>j)) ? ca.attr : 0x00;
+ op.pixels[j] = (fontline & (0x80>>j)) ? fgattr : bgattr;
}
op.op = GO_WRITE8;
handle_gfx_op(&op);
--
1.9.3
More information about the SeaBIOS
mailing list