[SeaBIOS] [PATCH] vgabios: Support emulated text in gfx_read_char()

Paolo Bonzini pbonzini at redhat.com
Wed Jan 7 07:16:16 CET 2015



On 06/01/2015 21:22, Kevin O'Connor wrote:
> 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.

I used the 8x8 font.  I suspect that my new favorite testcase (gwbasic,
what else) will mess up PRINT "_" if you use the bottom right.

Paolo

> -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