Где я могу найти современную версию «рок» (или «т») гарнитуры консоли?

8

Еще во времена Slackware и RedHat, предшествовавшие Fedora, существовал консольный шрифт, который иногда назывался «rock» или «t». Я искал это много раз, но не могу найти ссылку на него. Я думал, что было бы весело вернуть его на Ubuntu, если это возможно. Кто-нибудь знает, как он будет называться сейчас, или если есть версия TrueType, которую я мог бы поставить на другие системы?

Дэвид Кридер
источник
3
Это тот шрифт, который вы ищете? i.stack.imgur.com/lvMUZ.png
Runium
Да, это один!
Дэвид Кридер

Ответы:

19

AFAIK нет существующих портов этого шрифта для любого варианта схемы. Вот, однако, некоторые детали и хаки, которые могут помочь вам в пути.

T.fnt , тектитовых, был создан (бывший?) ClySmic Software , и , вероятно , Ральф B Смит - младший, президент / главный программист / Cook / Bottle Washer . Это растровый шрифт, который был включен в программу VFONT для DOS и OS / 2. Он загружает сменные шрифты для систем VGA. Его имя, данное автором, называется Tektite и описывается как «шрифт стиля« Архитектор »».

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

Это дает вам файл шрифта типа 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. Тектит имеет /T. Другие шрифты также включены, также названы опцией командной строки для VFONT. ( / S = s.fnt, / SD = sd.fnt, / RO = ro.fnt ... и т. Д.)

RAW шрифты

(Устаревший, но признанный) формат шрифта RAW - самый простой из существующих форматов шрифтов. Он не имеет ни заголовка, ни нижнего колонтитула, ни escape-байтов и т. Д. Он обычно имеет ширину 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:

Образцы VFONT

Редактирование с помощью FontForge

Если вы хотите работать со шрифтом, я думаю, вы можете перейти к FontForge . Поскольку он не распознает шрифты RAW, его необходимо преобразовать в другой формат. Одним из более простых преобразований может быть BDF. Одним из вариантов является использование PSF Tools Джона Эллиота . Сначала конвертируйте из RAW в PSF, затем из PSF в BDF:

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

Файл BDF теперь можно открыть в FontForge

Поскольку процесс довольно прост (и одинаков для всех 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и convertявляются частью ImageMagick .

Пример использования:

$ ./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;
}
Runium
источник
VFONT.DAT отсутствует в связанном архиве. Я отправился в путешествие и обнаружил, что это архив Slackware, сосредоточенный на шрифте, о котором я думал: ibiblio.org/pub/historic-linux/distributions/slackware-2.1/usr/… . Здесь все шрифты разбиты.
Дэвид Крайдер
1
@DavidKrider: Вы загружаете CVFONTA.ZIP? Nothe Aв конце CVFONTA. Я только что загрузил его, и он присутствует. Альтернативная ссылка: kimludvigsen.dk/os2/gfd/wps/font/index.php, где она называется cvfonta.zip - шрифты в вашей ссылке также совпадают, и здесь все в порядке, и diffпоказать их, идентичные тем, которые есть в упомянутый ZIP-архив.
Runium
Я действительно пропустил это "А". Извините за путаницу.
Дэвид Крайдер
Сейчас я использую шрифт, и он так же хорош, как я помню.
Дэвид Крайдер