32ピクセルを超えるTTYフォントを使用してください。

32ピクセルを超えるTTYフォントを使用してください。

私はHiDPIノートブックを持っていますが、32ピクセルは小さすぎて快適に読むことができません。大きなフォントが見つからなかったので、自分で作ることにしました。

これは高さ32ピクセル以下のすべてのフォントに対して機能しますが、より大きなフォントはsetfontによって拒否されます。

> file FC-32.psf
FC-32.psf: Linux/i386 PC Screen Font v2 data, 256 characters, Unicode directory, 32x16
> file FC-33.psf 
FC-33.psf: Linux/i386 PC Screen Font v2 data, 256 characters, Unicode directory, 33x16
> # -----------
> setfont ./FC-32.psf
> # 32 is fine
> setfont ./FC-33.psf
Bad character height 33
> # (It also reject reasonable numbers like 48 and 64)

私のフォントに問題があるのでしょうか?私は何が間違っていましたか?これはLinuxコンソールのハード制限ですか?制限に関する言及や、より大きなフォントの例が見つかりません。


使用されたテストファイルとスクリプト

FC-32.psf.gz - 32x16、有効

FC-33.psf.gz - 33x16、拒否

以下にフォントを生成するスクリプトを示します。.otf特定のフォントを設定可能な高さに変換します.psf.gz。数学は試行錯誤を受け、FiraCodeに固有のものです。

要求に応じてテストファイルを提供することもできます。

#!/bin/zsh
# Based on this: https://unix.stackexchange.com/questions/161890/how-can-i-make-a-psf-font-for-the-console-from-a-otf-one

H=32 # <- FONT HEIGHT
PTS=12
(( W=H*5/10 ))
(( WIDTH = W*10 ))
(( DPI=H*60/PTS ))
COUNT=256
OUT=FC

otf2bdf -r $DPI -p $PTS -c C ./FiraCode-Regular.otf \
  | sed -e "s/AVERAGE_WIDTH.*/AVERAGE_WIDTH $WIDTH/" \
  > "$OUT.bdf"

bdf2psf --fb "$OUT.bdf" \
  /usr/share/bdf2psf/standard.equivalents \
  /usr/share/bdf2psf/ascii.set+/usr/share/bdf2psf/useful.set \
  $COUNT "$OUT.psf"

gzip "$OUT.psf" -f

答え1

この制限がユーザー関連文書に明示的に文書化されているかどうかはわかりませんが、カーネルに含まれています。これ説明するfbcon_set_font説明する:

/*
 *  User asked to set font; we are guaranteed that
 *  a) width and height are in range 1..32
 *  b) charcount does not exceed 512
 *  but lets not assume that, since someone might someday want to use larger
 *  fonts. And charcount of 512 is small for unicode support.
 *
 *  However, user space gives the font in 32 rows , regardless of
 *  actual font height. So a new API is needed if support for larger fonts
 *  is ever implemented.
 */

そしてfbcon_get_font32行単位で文字を処理します。

    if (font->width <= 8) {
        j = vc->vc_font.height;
        for (i = 0; i < font->charcount; i++) {
            memcpy(data, fontdata, j);
            memset(data + j, 0, 32 - j);
            data += 32;
            fontdata += j;
        }

(8ピクセルより広いフォントについても同様の処理が行われます。)

関連情報