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@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};