我想在640 * 480的屏幕上显示一些文字。我在哪里可以获得RGB程序的RGB565格式的ASCII字符代码,这样我就可以拥有自然的外观作为这种屏幕的命令行终端。
1-角色的最佳宽度是多少?
2-在哪里可以获得每个字符的16位十六进制代码(称为位图字体或栅格字体)?
e.g。 const unsigned short myChar[] = {0x0001, 0x0002, 0x0003, 0x0004 ...}
答案 0 :(得分:1)
“...... 16位十六进制代码......”是一种误解。你必须要有16个字节 - 每个字符行一个字节(8个像素)。具有“自然”大小文本的640 * 480屏幕分辨率需要8x16位图。这将显示为30行80列(原始MCGA屏幕实际上只显示了25行,但相当于640 * 400 - 略微拉伸)。
基本的Google-fu出现在这个页面上:https://fossies.org/dox/X11Basic-1.23/8x16_8c_source.html,字符集非常接近,因为我记得你从单色显示器那里得知: a
................................................................
................................................................
................................................................
................................................................
...XXXX.........................................................
....XX..........................................................
....XX..........................................................
....XX...XXXXX..XX.XXX...XXX.XX.XX...XX..XXXX...XX.XXX...XXXXX..
....XX..XX...XX..XX..XX.XX..XX..XX...XX.....XX...XXX.XX.XX...XX.
....XX..XX...XX..XX..XX.XX..XX..XX.X.XX..XXXXX...XX..XX.XXXXXXX.
XX..XX..XX...XX..XX..XX.XX..XX..XX.X.XX.XX..XX...XX.....XX......
XX..XX..XX...XX..XX..XX..XXXXX..XXXXXXX.XX..XX...XX.....XX...XX.
.XXXX....XXXXX...XX..XX.....XX...XX.XX...XXX.XX.XXXX.....XXXXX..
........................XX..XX..................................
.........................XXXX...................................
................................................................
由于这是一个简单的单色位图模式,因此您不需要“C5程序的RGB565格式”(另一种误解)。循环遍历每个位图并使用本地等效的PutPixel
来绘制您想要的任何颜色的每个字符都会更容易。您可以选择不绘制背景(0
像素)或具有“背景颜色”。位图底部的空间足够大,可以放下划线。
那说:我已经使用了这些位图多年,但我最近改用了完全抗锯齿的灰色阴影格式。位图因此更大(每像素一个字节而不是单个位),但您不必再循环各个位,这是一个巨大的优势。另一个是,我现在可以使用灰色阴影(因此绘制'不透明')或将它们视为 alpha ,并以任何颜色和任何背景获得良好的抗锯齿文本。
看起来像这样:
我没画这个字体;我喜欢它在我的终端上的样子,所以我写了一个C程序来转储一个基本的字符集并抓住了一个屏幕的副本。然后我将图像转换为纯灰度,并编写了一个快速而肮脏的程序,将原始数据转换为适当的C结构。
a 不完全为真。 MCGA视频卡中的字体阻挡器在每个字符的右侧添加了另一列,因此文本有效地为9x16像素。对于一小组边框图形 - ╔╦╤╕╩
等等 - 额外的列从最右边的列复制。
答案 1 :(得分:1)
没有最优雅的解决方案,但我创建了一个bmp空图像并用字符填充它。
然后我使用This tool将bmp文件转换为C位图数组。 然后,您应该能够区分数组中的字符。
答案 2 :(得分:0)
如果您可以访问某种类型的16位dos模式,您可以从BIOS INT 10(十六进制10)调用中获取字体。在此示例中,字体表的地址以es:bp(es通常为0xc000)返回。这适用于32位版本Windows上Windows DOS控制台模式下的16位程序。对于64位版本的Windows,DOSBOX可以工作,或者使用虚拟PC也可以工作。如果这不起作用,请通过网络搜索" 8 by 16 font&#34 ;,这样可以获得一些示例字体。
INT 10 - VIDEO - GET FONT INFORMATION (EGA, MCGA, VGA)
AX = 1130h
BH = pointer specifier
00h INT 1Fh pointer
01h INT 43h pointer
02h ROM 8x14 character font pointer
03h ROM 8x8 double dot font pointer
04h ROM 8x8 double dot font (high 128 characters)
05h ROM alpha alternate (9 by 14) pointer (EGA,VGA)
06h ROM 8x16 font (MCGA, VGA)
07h ROM alternate 9x16 font (VGA only) (see #0020)
11h (UltraVision v2+) 8x20 font (VGA) or 8x19 font (autosync EGA)
12h (UltraVision v2+) 8x10 font (VGA) or 8x11 font (autosync EGA)
Return: ES:BP = specified pointer
CX = bytes/character of on-screen font (not the requested font!)
DL = highest character row on screen
Note: for UltraVision v2+, the 9xN alternate fonts follow the corresponding
8xN font at ES:BP+256N
BUG: the IBM EGA and some other EGA cards return in DL the number of rows on
screen rather than the highest row number (which is one less).
SeeAlso: AX=1100h,AX=1103h,AX=1120h,INT 1F"SYSTEM DATA",INT 43"VIDEO DATA"