PC面是程序员友好型资源的集合,允许在图形画布上绘制CP437字符。该项目提供了使用各种免费字体来呈现的CP437字符集的所有256个字形的位图阵列,这些字体集可重现原始的IBM PC OEM字体。
此外,该项目还包括一些Python函数,以生成这些位图和一些JavaScript函数,以在图形帆布上呈现这些位图。
也许您正在制作一款复古风格的游戏,您想完全控制每个像素应该是什么。或者,也许您想使用星号渲染CP437字形来制作文本横幅。该项目中提供的位图阵列可能对此类活动有用。可用的位图数组可以转换为屏幕上的像素或标准输出符号以渲染CP437字形。
访问susam.github.io/pcface/查看演示。
该项目的OUT/目录中提供了许多文件。请访问susam.github.io/pcface/out/浏览这些文件。该目录包含基于原始IBM PC OEM字体的各种免费字体的几个子目录。每个字体目录都包含字体和其他一些文件的位图数组。在描述这些资源时,下面提供了指向现代DOS-8X16资源文件的链接。这是每个文件的简要说明:
@ )和点( . )表示的所有CP437字形。字形的每一行都以十六进制中表示的行的二进制代码前缀。相同的二进制代码如上所述的JavaScript文件中显示为注释。该项目中包含的每种此类字体都可以使用类似的文件。请访问susam.github.io/pcface/out/浏览它们。
这些文件也可以通过CDN上的https://cdn.jsdelivr.net/npm/pcface/out/获得。
有关此项目中可用的各种位图的快速演示,请访问susam.github.io/pcface/的演示页面。底部有一个下拉菜单,可用于选择不同字体的位图。
该演示既可以从fontlist.js进行字体列表,也可以从fontmap.js字体映射中为选定的字体进行字体映射。字体列表演示使用绿色前景颜色在第一个画布中显示。字体地图演示使用琥珀色在第二个画布中显示。
在两个演示中,渲染的字形看起来完全相同,因为在两种情况下都使用了相同的位图数组。 fontlist.js和fontmap.js之间的唯一区别是如何在JavaScript const中公开这些位图数组。前者公开了位图数组的数组,而后者则将每个CP437字符映射到其位图数组中。
susam.github.io/pcface/retro.html还有另一个更详细的演示。
在演示页面中,您会注意到每个位图演示都有两个变体:一个带有后缀font-list ,另一个带有后缀font-map 。 font-list演示加载了所选字体的fontlist.js ,并以绿色的字形呈现字形。 font-map演示加载所选字体的fontmap.js ,并在琥珀中呈现字形。
虽然先前的演示在固定尺寸的画布上仅显示40个字符,其单个字体尺寸等于原始字体大小两次的缩放尺寸,但该演示显示了每行80个字符,分为两个不同的字体大小:原始字体尺寸以及缩放的字体大小,是原始字体大小的两倍。此外,在此演示中,每当调整浏览器大小时,帆布会自动调整自身大小以适合浏览器窗口大小。
该项目中可用的位图的格式非常简单。每个字形用像素的WXH网格表示,其中w是每个字形的宽度,而H是每个字形的高度。例如,ModernDos-8x16中的每个位图代表16行像素,每行8列。这16行表示为每个字形的位图中的16行。例如,使用此字体呈现的大写字母“ b”的字形表示为:
[
0x00 , 0x00 , 0xfc , 0x66 , 0x66 , 0x66 , 0x7c , 0x66 ,
0x66 , 0x66 , 0x66 , 0xfc , 0x00 , 0x00 , 0x00 , 0x00
] , // [B] (66)每个整数代表必须为字形的每一行绘制的点。开头的整数0x00和0x00表示字形的顶部两个行是空白的。然后, 0xfc (二进制1111100 )表示第三行的前6像素被字体的前景颜色绘制,最后两个像素留为空白。以这种方式,必须绘制16行像素。
这是一个示例python代码,该代码读取这些位图并使用DOT( . )每0位(每1位)绘制标准输出( @ )的标准输出。
bitmap = [
0x00 , 0x00 , 0xfc , 0x66 , 0x66 , 0x66 , 0x7c , 0x66 ,
0x66 , 0x66 , 0x66 , 0xfc , 0x00 , 0x00 , 0x00 , 0x00 ,
]
s = ''
for row in bitmap :
s += f' { row :#04x } ' + f' { row :08b } n ' . translate ( str . maketrans ( '01' , '.@' ))
print ( s )这是输出:
0x00 ........
0x00 ........
0xfc @@@@@@..
0x66 .@@..@@.
0x66 .@@..@@.
0x66 .@@..@@.
0x7c .@@@@@..
0x66 .@@..@@.
0x66 .@@..@@.
0x66 .@@..@@.
0x66 .@@..@@.
0xfc @@@@@@..
0x00 ........
0x00 ........
0x00 ........
0x00 ........
如果您在编写代码以将位图转换为像素的代码时需要更多帮助,请参阅src/pcface.js中的drawChar() , drawString()和drawStrings()函数。您还可以使用CDN URL将此脚本加载到网页中,并直接在您的页面中使用这些功能。这在JavaScript API节中更详细地说明了这一点。
应该参考这些功能,并用不同的编程语言编写类似的代码,以便您选择的图形工具包。
该项目包括由Jayvee Enaguas开发的现代DOS 8x16字体(20190101.02版)。该字体可根据CC0 1.0通用公共领域奉献的条款获得。该项目的SRC/FONT/ModernDos/Directory还存档该字体的副本。
该字体基于IBM VGA 8X16和IBM PC的Verite 8x16 OEM字体。该字体中的某些字形看起来完全像IBM VGA 8x16的字形,而其他一些字形看起来完全像Verite 8x16的字形。但是,该字体中也有几个字形,两种OEM字体都不匹配。相反,它们恰好是在OEM字体中发现的字形的改编。
我认为,该字体包含两种OEM字体的最佳部分。我喜欢这种字体具有verite的零。我也喜欢已继承在该字体中的Verite中的更平方的轮廓。虽然它从Verite 8x16继承了许多良好的设计,但它也继承了IBM VGA 8X16的一些不错的功能。例如,它具有Digit 2的凸起的茎和IBM VGA 8x16的Digit 7的弯曲茎。
该项目包括Viler开发的几种Oldschool PC字体(2.2版)。这些字体可根据Creative Commons归因 - 共享4.0国际许可证获得。这些字体的副本也存储在该项目的SRC/Font/OldSchool/Directory中。
这些字体在尽可能忠实地复制原始IBM PC OEM字体方面做得非常出色。但是,这些字体与原始OEM字体的不同方式尤其是纠正原始字体中的次要错误。有关这些更正的更多详细信息,请参见Oldschool PC文档的常见问题。
虽然该项目的主要目的是为CP437字形分发位图数组,但该项目也使某些工作用于生成和测试这些位图作为Python和JavaScript函数。 Python功能还以命令行接口(CLI)工具的形式打包。以下小节简要介绍了CLI工具以及Python和JavaScript函数。
该项目提供的Python命令行接口(CLI)工具可用于生成带有您选择字体的CP437字形的位图数组。以下步骤解释了我们如何使用Oldschool IBM EGA 9x14字体来做到这一点,该字体不包括该项目。
首先下载并提取Oldschool IBM EGA 9x14的字体文件:
curl -o oldschool.zip https://int10h.org/oldschool-pc-fonts/download/oldschool_pc_font_pack_v2.2_FULL.zip
unzip -j oldschool.zip " ttf - Px (pixel outline)/Px437_IBM_EGA_9x14.ttf "创建虚拟Python环境并安装PC面:
python3 -m venv venv
venv/bin/pip3 install pcface输入以下命令以打印工具的使用详细信息:
venv/bin/pcface -h创建位图数组和其他输出文件:
venv/bin/pcface -s 16 Px437_IBM_EGA_9x14.ttf oldschool-ega-9x14/请注意,输出目录名称必须以以WxH格式表示的每个输出字形的尺寸结束,其中W是每个字形的宽度, H是每个字形的高度。 -s选项指定字体大小。它应设置为导致所需尺寸字形的字体大小。如果省略了-s选项,则使用H的字体大小,其中H是从输出目录名称读取的Glyph高度,该名称可能并不总是会产生正确的Glyph尺寸。
现在,为同一字体创建位图阵列,但具有字形宽度和高度加倍:
venv/bin/pcface -s 32 Px437_IBM_EGA_9x14.ttf oldschool-ega-18x28/现在,输出目录将包含包含位图数组的JavaScript文件以及其他一些说明字形的文件。有关这些文件的简要说明,请参见部分资源。
以下步骤显示了如何开始使用Python API:
首先下载并提取Oldschool IBM EGA 9x14的字体文件:
curl -o oldschool.zip https://int10h.org/oldschool-pc-fonts/download/oldschool_pc_font_pack_v2.2_FULL.zip
unzip -j oldschool.zip " ttf - Px (pixel outline)/Px437_IBM_EGA_9x14.ttf "创建虚拟Python环境并安装PC面:
python3 -m venv venv
venv/bin/pip3 install pcface现在,编写此Python脚本并将其保存在文件中,例如ex1.py
import pcface
bitmap = pcface . make_bitmap ( 'A' , 'Px437_IBM_EGA_9x14.ttf' , 16 , 9 , 14 )
graph = pcface . make_graph ( bitmap , 9 , '.@' , False )
print ( graph )输入以下命令执行脚本:
venv/bin/python3 ex1.py以下输出应显示:
.........
.........
...@.....
..@@@....
.@@.@@...
@@...@@..
@@...@@..
@@@@@@@..
@@...@@..
@@...@@..
@@...@@..
.........
.........
.........
有关调用该项目的Python API的Python脚本的更多示例,请参见SRC/示例/。
另外,有关Python API中所有功能的完整文档,请参见Python API文档。
这是一个最小的HTML示例,该示例显示了如何将PC面和字体映射从CDN加载到网页中并使用:
<!DOCTYPE html >
< html lang =" en " >
< head >
< title > PC Face Demo </ title >
< meta name =" viewport " content =" width=device-width, initial-scale=1.0, user-scalable=no " >
< style >
body {background: #111}
canvas {background: #000; image-rendering: pixelated; margin: auto; display: block}
</ style >
< script src =" https://cdn.jsdelivr.net/npm/pcface/src/pcface.js " > </ script >
< script src =" https://cdn.jsdelivr.net/npm/pcface/out/moderndos-8x16/fontmap.js " > </ script >
< script >
'use strict'
window . addEventListener ( 'load' , function ( ) {
const canvas = document . getElementById ( 'canvas' )
const ctx = canvas . getContext ( '2d' )
ctx . fillStyle = '#3f3'
pcface . drawString ( PC_FACE_MODERNDOS_8X16_FONT_MAP , ctx , 8 , "hello, world" , 0 , 0 , 2 )
} )
</ script >
</ head >
< body >
< canvas id =" canvas " > </ canvas >
</ body >
</ html >这是加载字体列表而不是字体映射的另一个示例:
<!DOCTYPE html >
< html lang =" en " >
< head >
< title > PC Face Demo </ title >
< meta name =" viewport " content =" width=device-width, initial-scale=1.0, user-scalable=no " >
< style >
body {background: #111}
canvas {background: #000; image-rendering: pixelated; margin: auto; display: block}
</ style >
< script src =" https://cdn.jsdelivr.net/npm/pcface/src/pcface.js " > </ script >
< script src =" https://cdn.jsdelivr.net/npm/pcface/out/moderndos-8x16/fontlist.js " > </ script >
< script >
'use strict'
window . addEventListener ( 'load' , function ( ) {
const canvas = document . getElementById ( 'canvas' )
const ctx = canvas . getContext ( '2d' )
ctx . fillStyle = '#3f3'
pcface . drawString ( PC_FACE_MODERNDOS_8X16_FONT_LIST , ctx , 8 ,
[ 65 , 32 , 61 , 32 , 227 , 114 , 253 ] , 0 , 0 , 2 )
} )
</ script >
</ head >
< body >
< canvas id =" canvas " > </ canvas >
</ body >
</ html >有关JavaScript API中所有功能的完整文档,请参见JavaScript API文档。
该项目中存档的原始字体可根据字体开发人员(即
您可以根据MIT许可或CC0 1.0通用公共领域奉献的条款使用以下目录的内容:
您可以根据GNU通用公共许可证V3或创意共享归因 - 共享4.0国际许可证的条款使用以下目录的内容:
该项目中的所有其他文件(不包括上述三个小节中列出的文件)可根据MIT许可证的条款获得。有关完整的许可文本,请参见License.MD。
要报告错误,建议改进或提出问题,请引起问题。
该项目的作者在以下位置闲逛:
欢迎您订阅,关注或加入上述一个或多个渠道,以接收作者的更新或询问有关此项目的问题。
请参阅Andromeda Invaders,该项目中可用的现代DOS 8x16位图的一小部分已用于在游戏画布上渲染文本。