32픽셀보다 큰 TTY 글꼴을 ​​사용하세요.

32픽셀보다 큰 TTY 글꼴을 ​​사용하세요.

나는 HiDPI 노트북을 가지고 있는데 32픽셀은 너무 작아서 편안하게 읽을 수 없습니다. 더 큰 글꼴을 찾을 수 없어서 직접 만들기로 결정했습니다.

이는 높이가 32px 이하인 모든 글꼴에 대해 작동하지만 더 큰 글꼴은 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픽셀보다 넓은 글꼴에 대해서도 유사한 처리가 수행됩니다.)

관련 정보