在哪里可以找到现代版本的“ rock”(或“ t”)控制台字体?


8

早在Slackware和RedHat之前的Fedora时代,就有一种控制台字体,有时称为“ rock”或“ t”。我已经搜索了很多次,但是找不到任何参考。我认为,如果可能的话,将其重新安装到Ubuntu上将很有趣。有人知道它现在会被称为什么吗,或者我可以在其他系统上使用它的TrueType版本吗?


3
这是您要寻找的字体吗?i.stack.imgur.com/lvMUZ.png
Runium 2015年

是的,就是那个!
David Krider

Answers:


19

AFAIK没有该字体的现有端口,可用于任何Outline变体。但是,这里有一些细节和技巧可能会对您有所帮助。

t.fnt,熔融石,是由(前?)创建clySmic软件,并有可能拉尔夫乙JR史密斯,总裁/首席程序员/库克/洗瓶机。它是位图字体,已包含在DOS和OS / 2的VFONT程序中。它加载VGA系统的替换字体。作者提供的名字是Tektite,被描述为“一种“建筑师”风格的字体。”

可以在档案CVFONT.ZIP和CVFONTA.ZIP中下载 VFONT。的熔融石字体是后者的一部分。前者是仅用于DOS的较旧版本。

VFONT和提取:

该归档文件由DOS程序,VFONT.COM,OS / 2程序VFONT2.EXE,字体数据库VFONT.DAT和README.MAN组成。VFONT.DAT包含13种背对背存储的位图字体。要提取Tektite字体,请执行以下操作:

dd if=VFONT.DAT of=t.fnt bs=1 skip=28672 count=4096

这为您提供了RAW类型的字体文件,例如Slackware中包含的那种。

每个字体为4096字节。因此要提取其他内容,只需更改跳过选项。也就是说c.fnt,之后的t.fnt值会给您一个跳过值28672 + 4096 = 32768。所有字体都包含在Linux中,要完全提取,可以执行以下操作:

#!/bin/bash

pos=0
for n in s sd r ro rl mu ml t c b m mr sc; do
    dd if=VFONT.DAT of=$n.fnt bs=1 skip=$pos count=4096
    ((pos += 4096))
done

...,或者,当然,也可以从包含它们的各种发行版之一下载它。

这些文件可以通过以下方式直接加载到终端中:

setfont t.fnt

在Linux中命名

该字体在Linux中通过VFONT程序的选项为其命名。Tektite有/T。其他字体也包括在内,也通过VFONT的命令行选项来命名。(/ S = s.fnt,/ SD = sd.fnt,/ RO = ro.fnt ...等)

RAW字体

(已过时但公认的)RAW字体格式是最简单的字体格式。它没有标题,没有页脚,没有转义字节等。它通常具有8像素(位)的宽度– VFONT字体也是如此。它们始终具有256个字形。

由此我们可以通过以下方式轻松计算高度:

      file_size (bits)               8 × 4096
h = -------------------- e.g.  h = ------------- = 16
          w × 256                    8 × 256

由于所有VFONT字体的大小均为4096,因此我们也知道它们的高度均为16像素(位)。这也使每个字形为16个字节。

ASCII渲染

由于字体在0x20(空格)到0x7e(波浪号)之间符合ASCII范围,因此我们可以对字形进行简单的ASCII渲染。

例如,字母的A位置为65。由于每个字形为8×16 = 128位,我们将它们设为128/8 = 16个字节。

由于65×16 = 1040,我们可以提取字形A(此处包括转换为二进制以及替换0和1以使其更具可读性):

xxd -s 1040 -l 16 -b -c 1 t.fnt | cut -d' ' -f 2 | tr 0 ' ' | tr 1 '#'

这给了我们:

Output from  |          Data in file
 command:    |  Binary:   Hex:  Offset  Offset
             |                  Hex:     Dec:
             |  00000000  00    410     1040
             |  00000000  00    411     1041
   ##        |  00011000  18    412     1042
   ##        |  00011000  18    413     1043
  ####       |  00111100  3c    414     1044
  #  #       |  00100100  24    415     1045
 ##  ##      |  01100110  66    416     1046
 ## ###      |  01101110  6e    417     1047
 #### #      |  01111010  7a    418     1048
###   ##     |  11100011  e3    419     1049
##    ##     |  11000011  c3    41a     1050
##    ##     |  11000011  c3    41b     1051
             |  00000000  00    41c     1052
             |  00000000  00    41d     1053
             |  00000000  00    41e     1054
             |  00000000  00    41f     1055

使用一些简单的C代码,我们还可以渲染一些简单的PBM图像。这是VFONT中所有字体的示例输出:

VFONT样本

使用FontForge编辑

如果您希望使用字体,我想您可以去FontForge。由于它无法识别RAW字体,因此必须将其转换为另一种格式。更简单的转换之一可能是到BDF。一种选择是使用John Elliot的PSF工具。首先从RAW转换为PSF,然后从PSF转换为BDF:

raw2psf t.fnt t.psf
psf2bdf t.psf t.bdf

现在可以在FontForge中打开BDF文件

由于该过程非常简单(所有VFONT的过程都相同),因此您也可以使用以下脚本直接将其转换为BDF格式:

用法示例:

./raw2bdf Tektite t.fnt > t.bdf

为您提供Tektite字体作为BDF。

#!/bin/bash

if [ $# -lt 2 ]; then
    printf "Usage: %s <NAME> <raw-fnt-file>\n" $0
    exit
fi

name=$1
file=$2

cat <<EOM
STARTFONT 2.1
FONT $name
SIZE 16 75 75
FONTBOUNDINGBOX 8 16 0 -4
STARTPROPERTIES 3
FONT_DESCENT 4
FONT_ASCENT 12
DEFAULT_CHAR 255
ENDPROPERTIES
CHARS 256
EOM

hexdump -ve '/1 "%02x\n"' "$file" | awk '
    BEGIN {
        n = 0;
    }
    (!((NR - 1) % 16)) {
        if (n > 0)
            print "ENDCHAR"
        printf "STARTCHAR C00%02x\n"\
                "ENCODING %d\n"\
                "SWIDTH 666 0\n"\
                "DWIDTH 8 0\n"\
                "BBX 8 16 0 -4\n"\
                "BITMAP\n",
                n, n
        ++n
    }
    {
        print $0
    }
    END {
        print "ENDCHAR"
        print "ENDFONT"
    }
'

其他版本

Tektite字体有几种修改版本。如果您要搜索,可以选择在您要研究的搜索短语中添加“ clysmic”

图像渲染

为了完整起见,我添加了混成上面的图像的C代码。display并且convertImageMagick的一部分。

用法示例:

$ ./fntsampler t.fnt hello a

##                ###     ###           
##                 ##      ##           
##                 ##      ##           
##  ###   #####    ##      ##     ##### 
## ## ## ##   ##   ##      ##    ##   ##
####  ####  ###    ##      ##   ##    ##
###   #######      ##      ##   ##    ##
##    ####         ##      ##   ##    ##
##    ####    ##   ##      ##   ##   ## 
##    ## ######    ##      ##    #####  

$ ./fntsampler t.fnt "Hello World!" > hello.pbm
$ display hello.pbm

你好在Tekite中的Wold

上面所有字体的示例图像是通过以下方式创建的:

$ for f in *.fnt; do ./fntsampler "$f" "$(printf "%-6s Hello ABC abc 123" "$f")" | convert - "${f%.*}.png"; done

$ convert -negate -append *.png collection.png

码:

#include <stdio.h>
#include <errno.h>
#include <string.h>

int usage(char *me, char *s)
{
    fprintf(stderr,
        "Usage: %s <RAW-font-file> \"<string>\" [format] [[invert] | [dot] [blank]]\n\n"
        "  format    p : PBM image (default).\n"
        "            a : ASCII.\n"
        "  invert    i : invert b/w in PBM.\n"
        "  dot\n"
        "  blank       : Dot / blank in ASCII mode.\n\n"
        "%s\n"
        ,
        me, errno ? "" : s
    );
    if (errno)
        perror(s);
    return 1;
}

int main(int argc, char *argv[])
{
    char *me = argv[0];
    char buf[4096];
    size_t n;
    char *p;
    int i, j, k;

    FILE *fh;
    char *s;
    char fmt = 'p', dot = '1', blank = '0';

    if (argc < 3)
        return usage(me, "Missing argument(s)");

    if (!(fh = fopen(argv[1], "r")))
        return usage(me, "Unable to open file");
    if ((fread(buf, 1, 4096, fh) != 4096))
        return usage(me, "Bad file size");

    s = argv[2];
    if ((n = strlen(s)) < 1)
        return usage(me, "Empty string");

    if (argc > 3)
        fmt = argv[3][0];
    if (fmt != 'a' && fmt != 'p')
        return usage(me, "Unknown format");

    if (fmt == 'a') {
        dot = argc > 4 ? argv[4][0] : '#';
        blank = argc > 5 ? argv[5][0] : ' ';
    } else {
        if (argc > 4 && argv[4][0] == 'i') {
            dot = '0';
            blank = '1';
        }
        printf("P1\n");
        printf("#Text: \"%s\", using %s\n", s, argv[1]);
        printf("%u 16\n", n * 8);
    }

    for (i = 0; i < 16; ++i) {
        for (j = 0; j < (int)n; ++j) {
            p = buf + (s[j] * 16) + i;
            for (k = 7; k >= 0; --k) {
                putchar((*p >> k) & 0x01 ? dot : blank);
            }
            /*putchar(' '); */
        }
        putchar('\n');
    }

    return 0;
}

链接的档案中缺少VFONT.DAT。我进行了一次旅行,发现了这个文件,它围绕我正在考虑的字体的Slackware归档文件:ibiblio.org/pub/historic-linux/distributions/slackware-2.1/usr/…。字体全部在这里分解。
David Krider 2015年

1
@DavidKrider:您要下载CVFONTA.ZIP吗?Nothe的ACVFONTA的结束。我刚刚下载了它,并且它存在。替代链接:kimludvigsen.dk/os2/gfd/wps/font/index.php,其中的名称为cvfonta.zip –您链接中的字体也匹配并且可以在这里找到,并diff显示与该字体相同的字体。提到ZIP存档。
Runium 2015年

我的确确实想念那个“ A”。对困惑感到抱歉。
大卫·克里德

我现在正在使用字体,就像我记得的那样棒。
David Krider
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.