代码之家  ›  专栏  ›  技术社区  ›  John O

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

  •  0
  • John O  · 技术社区  · 5 年前

    我正在尝试为任意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 ,实际上我不应该更改名称ids 1或2,因为一些旧的软件可能会变得混乱,例如,对于给定的家族,有四个以上的子家族。我应该改用16号和17号身份证。

    但是,我已经测试了更改ids 1和ids 2,只是为了检查这段代码是否正常工作。结果的二进制otf有我的新字符串,所以它看起来在这个意义上工作。然而,这并没有愚弄Macos Mojave的字体手册,它仍然相信它是原始文件(尽管我已经更改了这些ID和许多其他的ID,包括唯一的名称)。

    什么元数据将向字体集(和其他应用程序)发出信号,表明这是一种与已安装的任何其他字体不同的新字体?这是名字表之外的东西吗?

    最后,如果id 16和17还不存在,如何将它们添加到字体中? The documentation

    除非@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 回复  |  直到 5 年前
    推荐文章