使用Perl的Font :: TTF修改字体内部元数据

时间:2019-03-15 19:22:59

标签: perl fonts true-type-fonts opentype

我正在尝试为任意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!

因此,在我偶然找到适合工作的正确语法之前,我不敢相信我会解决这个问题。

0 个答案:

没有答案