Изменение внутренних метаданных шрифта с помощью Perl's Font :: TTF - PullRequest
0 голосов
/ 15 марта 2019

Я пытаюсь установить имена семейства и подсемейства для произвольного файла otf. Мой код выглядит так:

#!/usr/bin/perl
use strict;
use warnings;

use Font::TTF::Font;
use Data::Dumper;

# Open the font file.
my $font = Font::TTF::Font->open($ARGV[0]) || die ("Couldn't open TTF '$ARGV[0]'\n");
$font->{'name'}->read();
$font->{'name'}->set_name(1, "Bluster Doodads");
$font->{'name'}->set_name(6, "BlusterDoodads");
$font->{'name'}->set_name(17, "BlusterDoodadsLow", [[0, 0], [3,0]]);

print Dumper($font->{name}->{strings}), "\n";

$font->out("./test.otf");

Согласно документации Microsoft , мне не следует менять имена 1 или 2, так как некоторые старые программы могут запутаться, если, например, для данного семейства существует более четырех подсемейств. Вместо этого я должен использовать идентификаторы 16 и 17.

Однако я протестировал изменение идентификаторов 1 и 2, просто чтобы проверить, работает ли этот код правильно. Двоичный otf, который приводит к результатам, имеет мои новые строки, так что похоже, что он работает в этом смысле. Тем не менее, это не обманывает книгу шрифтов Macos Mojave, которая по-прежнему считает, что это оригинальный файл (хотя я изменил эти идентификаторы и многие другие, включая уникальное имя).

Какие метаданные будут сообщать Font Book (и другим приложениям), что это новый шрифт, отличный от любых других установленных шрифтов? Это что-то вне таблицы имен?

Наконец, как мне добавить идентификаторы 16 и 17 к шрифту, если они еще не существуют? В документации сказано, что мне нужно включить @cover, чтобы установить идентификаторы, которых еще нет.

Эта функция не добавляет имена в таблицу, если @cover не Прилагаемые.

Однако, я не могу найти ни одного полезного примера. Большинство моих экспериментов привели к некоторым действительно странным ошибкам, которых я раньше не видел, например:

perl(32468,0x1196fa5c0) malloc: can't allocate region
*** mach_vm_map(size=1123971692511232) failed (error code=3)
perl(32468,0x1196fa5c0) malloc: *** set a breakpoint in malloc_error_break to debug
Out of memory!

Так что я не уверен, что могу просто взломать это, пока не наткнусь на правильный синтаксис, чтобы все работало.

...