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 <ke...@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


_______________________________________________
SeaBIOS mailing list
SeaBIOS@seabios.org
http://www.seabios.org/mailman/listinfo/seabios

Reply via email to