SlackwareとRedHat-pre-Fedoraの時代には、「rock」または「t」とも呼ばれるコンソールフォントがありました。何度も検索してみましたが参考資料がありませんね。可能であれば、これをUbuntuに戻すのは楽しいだろうと思いました。今それが何であるかを知っている人はいますか?それとも別のシステムにインストールできるTrueTypeのバージョンはありますか?
答え1
私が知る限り、このフォントのアウトラインバリアントの既存のポートはありません。しかし、役に立つかもしれないいくつかの詳細とヒントは次のとおりです。
これt.fnt、テクタイト、(以前?)で作ったものクラシックソフトウェア、そしておそらくRalph B Smith Jr、社長/ベストプログラマー/シェフ/ボトルクリーナー。 DOSおよびOS / 2用のVFONTプログラムに含まれるビットマップフォント。 VGAシステム用の代替フォントをロードします。作家の名前はテクタイトそして次のように説明されます。「建築家」スタイルのフォントです。
VFONTの確認ダウンロードCVFONT.ZIPおよびCVFONTA.ZIPアーカイブにあります。これテクタイトフォントは後者の一部です。前者は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
これにより、Slackwareなどに含まれるRAW形式のフォントファイルが提供されます。
各フォントは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
...またはもちろん、それを含むさまざまなディストリビューションの1つからダウンロードすることもできます。
次のファイルを端末に直接ロードできます。
setfont t.fnt
Linuxでの命名
フォント名は、Linux上のVFONTプログラムのオプションで指定されます。テクタイトがあります/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レンダリング
フォントはASCII範囲(0x20(スペース) - 0x7e(チルダ))に従うため、グリフの単純な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のすべてのフォントの出力例です。
FontForgeで編集する
そのフォントを使用するにはフォント鍛造。 RAWフォントを認識しないため、別の形式に変換する必要があります。より簡単な変換はBDFです。 1つのオプションは、次を使用することです。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フォントにはいくつかの修正バージョンがあります。検索すると追加できるオプションがあります。「聖なる」調査できるフレーズを検索します。
画像レンダリング
完成度を上げるために、上記の画像を生成するために混合Cコードを追加しました。display
そしてconvert
の一部ですイメージマジシャン。
使用例:
$ ./fntsampler t.fnt hello a
## ### ###
## ## ##
## ## ##
## ### ##### ## ## #####
## ## ## ## ## ## ## ## ##
#### #### ### ## ## ## ##
### ####### ## ## ## ##
## #### ## ## ## ##
## #### ## ## ## ## ##
## ## ###### ## ## #####
$ ./fntsampler t.fnt "Hello World!" > hello.pbm
$ display hello.pbm
上記のすべてのフォントのサンプル画像は、次のように作成されました。
$ 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;
}