[SeaBIOS] [PATCH] vgabios: Support emulated text in gfx_read_char()
Kevin O'Connor
kevin at koconnor.net
Tue Jan 6 21:22:18 CET 2015
On Tue, Jan 06, 2015 at 08:59:09PM +0100, Paolo Bonzini wrote:
> On 06/01/2015 16:49, Kevin O'Connor wrote:
> > + 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;
> > + }
>
> It's better to use the top right pixel. The bottom right has a false
> positive for characters 23 and 95.
Hrmm. How did you test? The script I wrote shows the bottom right as
the least number of false positives. With the 8x16 font, there are
six false positives, but all six are mirror images of other characters
so there is no way to avoid them.
-Kevin
$ python ./scripts/countbits.py < vgasrc/vgafonts.c
256
49 83 107 129 113 82 51 16
58 101 110 98 100 103 61 19
78 146 139 132 146 132 72 29
92 136 122 140 154 122 63 17
108 159 142 139 154 147 88 44
81 135 124 116 134 132 59 14
66 123 132 152 134 101 66 13
22 31 42 57 44 30 28 11
256
6 8 21 41 23 21 19 8
14 24 40 57 41 32 26 7
44 78 102 125 110 102 65 13
48 93 92 92 93 110 76 12
51 90 92 99 95 99 81 15
80 146 129 132 138 141 89 26
85 133 109 134 133 140 95 18
99 151 121 134 138 149 114 39
86 129 88 111 120 130 92 13
80 116 84 105 113 134 90 10
47 109 126 148 122 136 83 10
12 16 25 39 30 31 26 6
9 16 28 47 30 27 22 9
6 7 20 33 20 20 20 6
256
6 8 21 41 23 21 19 8
15 24 40 57 41 33 27 7
41 72 95 118 100 89 59 20
43 88 90 85 82 93 75 20
51 83 79 92 81 91 81 21
81 140 126 134 138 134 94 31
79 130 98 122 131 131 89 25
110 153 119 140 146 142 120 52
82 130 91 107 111 120 92 24
85 127 87 103 112 125 95 17
87 117 71 100 105 130 96 18
49 115 134 154 122 136 90 15
9 13 23 40 28 31 23 8
8 13 25 38 29 30 25 8
8 11 23 41 25 22 19 8
6 7 20 33 20 20 20 6
==================================== countbits.py script
import sys
count = 0
counts = []
for line in sys.stdin:
if 'vgafont' in line:
if counts:
print count
for i in range(len(counts)):
print "%3d" % counts[i],
if i % 8 == 7:
print
print
count = 0
counts = []
try:
parts = [int(p.strip(), 0) for p in line.split(',') if p.strip()]
except ValueError:
continue
if not parts:
continue
count += 1
out = [0] * (len(parts) * 8)
for i in range(len(parts)):
p = parts[i]
for j in range(8):
if (1<<(7-j)) & p:
out[i*8 + j] += 1
if not counts:
counts = out
else:
for i in range(len(out)):
counts[i] += out[i]
More information about the SeaBIOS
mailing list