我正在尝试为任意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");
According to Microsoft's documentation,我实际上不应该更改名称ID 1或2,因为例如,如果给定家庭有四个以上的子家族,则某些较旧的软件可能会感到困惑。我应该改用id 16和17。
但是,我已经测试了更改ID 1和2的目的,只是为了检查该代码是否正常工作。结果产生的二进制otf确实有我的新字符串,因此看起来在该意义上是可行的。但是,这并没有欺骗Macos Mojave的Font Book,后者仍然认为它是原始文件(即使我更改了这些ID以及许多其他ID,包括唯一名称)。
哪些元数据将向Font Book(和其他应用程序)发出信号,表明这是不同于已安装的其他字体的新字体?这是名字表之外的东西吗?
最后,如果ID 16和17不存在,该如何添加它们呢? The documentation说,我需要包括@cover来设置不存在的ID。
该函数不会在表中添加任何名称,除非@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!
因此,在我偶然找到适合工作的正确语法之前,我不敢相信我会解决这个问题。