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]