diff options
author | Kevin O'Connor <kevin@koconnor.net> | 2015-01-06 09:36:41 -0500 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2015-01-07 10:08:33 -0500 |
commit | e638f97da08bd03c2d5be88325950d93d36911b1 (patch) | |
tree | a29d88c9c153e163e9bb2d6034e2c2e182d2e5c7 /vgasrc | |
parent | 60e0e55f212dadd043ab9e39bee05a48013ddd8f (diff) | |
download | qemu-seabios-e638f97da08bd03c2d5be88325950d93d36911b1.tar.gz |
vgabios: Support emulated text in gfx_read_char()
When emulating text mode on "coreboot framebuffer" SeaVGABIOS, return
a foreground and background attribute from gfx_read_char() and prefer
returning a space character (instead of null) on blank cells.
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>
Diffstat (limited to 'vgasrc')
-rw-r--r-- | vgasrc/vgafb.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/vgasrc/vgafb.c b/vgasrc/vgafb.c index 4bbbc16..1a94fcf 100644 --- a/vgasrc/vgafb.c +++ b/vgasrc/vgafb.c @@ -367,7 +367,7 @@ gfx_move_chars(struct vgamode_s *vmode_g, struct cursorpos dest handle_gfx_op(&op); } -// Clear are of screen in graphics mode. +// Clear area of screen in graphics mode. static void gfx_clear_chars(struct vgamode_s *vmode_g, struct cursorpos dest , struct carattr ca, struct cursorpos clearsize) @@ -469,23 +469,36 @@ 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; + // Report space character for blank cells (skip null character check) + 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}; @@ -594,7 +607,7 @@ vgafb_move_chars(struct cursorpos dest , movesize.x * 2, stride, movesize.y); } -// Clear are of screen. +// Clear area of screen. void vgafb_clear_chars(struct cursorpos dest , struct carattr ca, struct cursorpos clearsize) |