[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