[SeaBIOS] [PATCH] vgabios: Support emulated text in gfx_read_char()

Kevin O'Connor kevin at koconnor.net
Tue Jan 6 16:49:27 CET 2015


If emulating text, return a foreground and background attribute from
gfx_read_char().  Also, prefer returning a space character (instead of
null) on blank cells.  This may help with some users of "cbvga"
seavgabios.

This also returns the foreground color (instead of always returning
zero) for regular graphics mode gfx_read_char() calls.  This seems
fine as tests show other vgabios implementations also return various
values here.

Signed-off-by: Kevin O'Connor <kevin at koconnor.net>
---
 vgasrc/vgafb.c | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/vgasrc/vgafb.c b/vgasrc/vgafb.c
index 4bbbc16..b1d7aef 100644
--- a/vgasrc/vgafb.c
+++ b/vgasrc/vgafb.c
@@ -469,23 +469,35 @@ gfx_read_char(struct vgamode_s *vmode_g, struct cursorpos cp)
     op.op = GO_READ8;
     op.x = cp.x * 8;
     op.y = cp.y * cheight;
+    int car = 0;
+    u8 fgattr = 0x00, bgattr = 0x00;
+    if (vga_emulate_text()) {
+        // Read bottom right pixel of the cell to guess bg color
+        op.y += cheight-1;
+        handle_gfx_op(&op);
+        op.y -= cheight-1;
+        bgattr = op.pixels[7];
+        fgattr = bgattr ^ 0x7;
+        car = 1;
+    }
     u8 i, j;
     for (i=0; i<cheight; i++, op.y++) {
         u8 line = 0;
         handle_gfx_op(&op);
         for (j=0; j<8; j++)
-            if (op.pixels[j])
+            if (op.pixels[j] != bgattr) {
                 line |= 0x80 >> j;
+                fgattr = op.pixels[j];
+            }
         lines[i] = line;
     }
 
     // Determine font
-    u16 car;
-    for (car=0; car<256; car++) {
+    for (; car<256; car++) {
         struct segoff_s font = get_font_data(car);
         if (memcmp_far(GET_SEG(SS), lines
                        , font.seg, (void*)(font.offset+0), cheight) == 0)
-            return (struct carattr){car, 0, 0};
+            return (struct carattr){car, fgattr | (bgattr << 4), 0};
     }
 fail:
     return (struct carattr){0, 0, 0};
-- 
1.9.3




More information about the SeaBIOS mailing list