用于Windows FontLab 5.2的UFO转换器

vfb2ufo3的Python项目详细描述


VFB2UFO3

说明

多主机兼容统一字体对象(UFO)版本3适用于Windows FontLab 5.2的字体编写器API

vfb2ufo3主要用于从a>;1000 upm multiple master fontlab.vfb字体和Postscript轮廓创建缩放的UFO实例,以便在使用Windows fontlab 5.2时与AFDKO工具一起创建二进制字体。导出中最重要的非平凡更改是对紧排标志符号组(fontlab)的重命名。提供一个.flc(FontLab类)文件,当字体组不能从其名称中识别为第一/第二个时,可以显著加快转换速度。忽略所有标志符号提示/链接。可以创建批处理命令,用于psautohint,它支持用十进制坐标提示轮廓。

要求

此包在标准库之外没有依赖项。它是用cython和python 3语法编写的,cython本机支持它。子模块被编译成.pyd扩展模块。要重新编译子模块,需要pypicython包和cython编译器,以便在扩展模块编译期间使用。

可选

功能性

生成UFO输出时不更改源字体。将复制源字体,并从副本创建UFO。如果字体是多主字体,则将从副本生成实例。如果没有为多主源字体提供特定的实例值,则将为该字体中的每个主字体生成UFO。

提供要优化的附加字形名称(glyphs_optimize_names)和/或字形名称和后缀(可以从最终的ufo实例中忽略这些名称和后缀,glyphs_ommit_namesglyphs_ommit_suffix)可使具有大量字形的字体受益匪浅。请参见下面的字形选项。

生成的实例/层可以在生成后通过vfb_savevfb_close选项保存和/或保持打开状态。如果vfb\u save设置为true,则生成的.vfb实例将在创建ufo期间更新。这包括字形轮廓更改(重叠删除和分解)。

所有路径选项都必须是绝对路径;非绝对路径的文件夹和文件路径将被忽略。默认输出路径是用户的桌面。

可以通过instance_attributes选项提供属性字典。这些属性应该由ufo规范中的键组成,并且它们必须与规范中的数据类型匹配。并非所有的fontinfo属性都是可配置的;请参见fontinfo.pxi源文件中的configurable\u attrs以获取属性列表,这些属性将在创建过程中被检查并更新到ufo中。

-------------------------------------------------------------------------------
EXAMPLE UFO GENERATION SCRIPT
-------------------------------------------------------------------------------
#FLM: write ufo
# coding: utf-8
from __future__ import absolute_import, unicode_literals

import os

from vfb2ufo3 import write_ufo

user_profile_folder = os.environ['USERPROFILE']
output_path = os.path.join(user_profile_folder, 'Documents', 'test_font')

instances = [
	0,
	200,
	400,
	650,
	1000,
	]
names = [
	'Thin',
	'Light',
	'Regular',
	'SemiBold',
	'Bold',
	]
attributes = [
	{'openTypeOS2WeightClass': 200},
	{'openTypeOS2WeightClass': 300},
	{'openTypeOS2WeightClass': 400},
	{'openTypeOS2WeightClass': 600},
	{'openTypeOS2WeightClass': 700},
	]

write_ufo(
	output_path=output_path,
	instance_values=instances,
	instance_names=names,
	instance_attributes=attributes,
	glyphs_decompose=True,
	glyphs_remove_overlaps=True,
	)

-------------------------------------------------------------------------------

缩放选项

默认情况下,UFO输出的目标UPM为1000。对于1000以外的upm,比如2048,应该通过scale\u to\u upm选项进行设置。如果小于1000,则忽略从scale_to_upm选项中的值。通过设置scale_autofalse可以关闭缩放;这不会减少转换时间。

执行所有缩放操作独立于fontlab;如果保存.vfb实例/主副本,则.vfb字体和字形值将是原始的未缩放值。

实例选项

从多主字体创建实例时,应提供值、名称(可选)和属性(可选)列表,以便从主字体生成实例UFO。

如果源是多主字体,并且没有提供实例值列表,则将为每个主字体创建一个UFO。

对于多个主字体,实例值列表应该是元组-或列表-格式中的值,每个轴都有一个值。对于单轴字体,如果列表值是数值,则值将转换为单元素列表:

双轴字体

  • 实例值=[[0,1000],[200,1000]

  • 实例值=[(0,1000),(200,1000)]

单轴字体

  • 实例值=[[0],[200]]

  • 实例值=[(0,),(200,)]

  • 实例值=[0,200]变为[[0],[200]

如果除了值列表之外还提供了名称和/或属性的可选列表,则它们的长度必须与值列表的长度相同。如果长度不匹配,将引发valueerror,因为这可能会产生不希望的结果:

正确:

instance_values = [(0, 1000), (200, 1000)]
instance_names = ['Light Display', 'Regular Display']

不正确(valueerror):

instance_values = [(0, 1000), (200, 1000)]
instance_names = ['Light Display']

字形选项

字形缩放与.vfb实例本身无关;如果保存.vfb实例,则.vfb中的字形将保持不缩放状态。

字形分解和重叠移除是可选的,在生成实例后发生。此选项用于从不明飞行物创建二进制字体时的最终输出。

默认情况下,在分解和移除要导出的glyph轮廓的重叠时,包含组件的glyph的glif文件将使用每个组件的基本轮廓的轮廓来构建。

仅分解时,上述优化将用于包含组件的所有图示符。

生成的.vfb实例将以组件形式保留组件。

要禁用上述优化,请将glyphs_optimize选项设置为false

忽略实例中的标志符号

  • 可以提供glyph后缀和/或glyph名称的列表,这些名称应该通过glyphs_ommit_suffixglyphs_ommit_names选项从实例ufo中省略。

优化字形名称和代码点列表

  • 如果删除重叠,则按上述方式构造的标志符号的默认代码点列表由通常没有重叠组件的标志符号组成。该列表位于ufo.pxi源文件中,这些代码点的字符表示如下所示。

  • 默认代码点列表中的代码点可以通过运行vfb2ufo3.show_default_optimize_code_points()函数来显示。代码点将打印到FontLab输出窗口,然后可以复制到文本编辑器中,并根据需要进行编辑。

  • 用户提供的代码点列表(glyphs_optimize_code_points)可以是'0x00ac'格式的字符串、十六进制形式的整数(0x00ac)或数字整数(172);无法转换为整数的值将引发valueerror。只有每个glyph的代码点列表(fontlabunicodes属性)中的第一个代码点才检查代码点集成员身份。

  • 可以提供用户提供的字形名称列表(glyphs_optimize_names)来补充字形的代码点列表。任何包含不重叠组件的图示符都应添加到此列表中。

  • 如果代码点列表中的代码点以.sc.smcp.c2sc后缀结尾,则代码点列表中代码点的小写变体也将添加到代码点列表中。

优化代码点
Latin
À Á Â Ã Ä Ā Ă Ǣ Ǽ Ȁ Ȃ Ǎ Ȧ
Ḇ
Ć Ĉ Ċ Č
Ď Ḍ Ḏ Ḓ
È É Ê Ë Ē Ĕ Ė Ė Ȅ Ȇ
Ĝ Ğ Ġ Ģ Ḡ Ǧ Ǵ
Ĥ Ḥ Ḫ
Ì Í Ĩ Ī Ĭ İ Î Ï Ȉ Ȋ Ǐ
Ĵ
Ķ Ḳ Ḵ
Ĺ Ļ Ľ Ŀ Ḷ Ḹ Ḻ Ḽ
Ḿ Ṁ Ṃ
Ñ Ń Ņ Ň Ṅ Ṇ Ṉ Ṋ Ǹ
Ò Ó Ô Õ Ö Ō Ŏ Ő Ȍ Ȏ Ȯ Ǒ
Ŗ Ř Ŕ Ṙ Ṛ Ṝ Ṟ Ȑ Ȓ
Ś Ŝ Ş Ș Š Ṣ
Ţ Ț Ť Ṭ Ṯ Ṱ
Ũ Ū Ŭ Ů Ű Ù Ú Û Ü Ȕ Ȗ Ǔ Ǖ Ǘ Ǚ Ǜ
Ṿ
Ŵ Ẁ Ẃ Ẅ Ẇ
Ẋ Ẍ
Ŷ Ÿ Ý Ẏ Ȳ
Ź Ż Ž Ẑ Ẓ Ẕ
IJ LJ NJ Lj Nj
DZ DŽ Dz Dž
à á â ã ä ā ă ǣ ǽ ȁ ȃ ǎ ȧ
ḇ
ć ĉ ċ č
ď ḍ ḏ ḓ
è é ê ë ē ĕ ė ě ȅ ȇ
ĝ ğ ġ ģ ḡ ǧ ǵ
ĥ ẖ ḥ ḫ
ì í ĩ ī ĭ î ï ȉ ȋ ǐ
ĵ ǰ
ķ ḳ ḵ
ĺ ļ ľ ŀ ḷ ḹ ḻ ḽ
ḿ ṁ ṃ
ń ņ ň ʼn ñ ṅ ṇ ṉ ṋ ǹ
ò ó ō ŏ ő ô õ ö ȍ ȏ ȯ ǒ
ŗ ř ŕ ṙ ṛ ṝ ṟ ȑ ȓ
ś ŝ ş ș š ṣ
ţ ț ť ṭ ṯ ṱ
ũ ū ŭ ů ű ù ú û ü ȕ ȗ ǔ ǖ ǘ ǚ ǜ
ṿ
ŵ ẁ ẃ ẅ ẇ
ẋ ẍ
ý ÿ ŷ ẏ ȳ
ź ż ž ẑ ẓ ẕ
ij lj nj
dz dž

Cyrillic
Ѓ Ќ Ѝ Й Ӣ Ӥ Ў Ӝ Ӂ Ѐ Ё Ӗ Ӟ Ѷ Ә Ӛ Ѕ І Ї Ј Ӑ Ӓ Ӕ Ӧ Ӯ Ӱ Ӳ Ӵ Ӹ Ӏ Ӏ
ѓ ќ ѝ й ӣ ӥ ў ӝ ӂ ѐ ё ӗ ӟ ѷ ә ӛ ѕ і ї ј ӑ ӓ ӕ ӧ ӯ ӱ ӳ ӵ ӹ

Greek Mono- and Polytonic
Ἀ Ἁ Ἂ Ἃ Ἄ Ἅ Ἆ Ἇ ᾈ ᾉ ᾊ ᾋ ᾌ ᾍ ᾎ ᾏ Ᾰ Ᾱ Ὰ Ά ᾼ
Ἐ Ἑ Ἒ Ἓ Ἔ Ἕ Ὲ Έ
Ἠ Ἡ Ἢ Ἣ Ἤ Ἥ Ἦ Ἧ ᾘ ᾙ ᾚ ᾛ ᾜ ᾝ ᾞ ᾟ Ὴ Ή ῌ
Ἰ Ἱ Ἲ Ἳ Ἴ Ἵ Ἶ Ἷ Ῐ Ῑ Ὶ Ί
Ὀ Ὁ Ὂ Ὃ Ὄ Ὅ Ὸ Ό
Ῥ
Ὑ Ὓ Ὕ Ὗ Ῠ Ῡ Ὺ Ύ
Ὠ Ὡ Ὢ Ὣ Ὤ Ὥ Ὦ Ὧ ᾨ ᾩ ᾪ ᾫ ᾬ ᾭ ᾮ ᾯ Ὼ Ώ ῼ
ἀ ἁ ἂ ἃ ἄ ἅ ἆ ἇ ᾀ ᾁ ᾂ ᾃ ᾄ ᾅ ᾆ ᾇ ᾰ ᾱ ᾲ ᾳ ᾴ ᾶ ᾷ ὰ ά
ἐ ἑ ἒ ἓ ἔ ἕ ὲ έ
ἠ ἡ ἢ ἣ ἤ ἥ ἦ ἧ ᾐ ᾑ ᾒ ᾓ ᾔ ᾕ ᾖ ᾗ ῂ ῃ ῄ ῆ ῇ ὴ ή
ἰ ἱ ἲ ἳ ἴ ἵ ἶ ἷ ῐ ῑ ῒ ΐ ῖ ῗ ὶ ί
ὀ ὁ ὂ ὃ ὄ ὅ ὸ ό
ῤ ῥ
ὐ ὑ ὒ ὓ ὔ ὕ ὖ ὗ ῠ ῡ ῢ ΰ ὺ ύ ῦ ῧ
ὠ ὡ ὢ ὣ ὤ ὥ ὦ ὧ ᾠ ᾡ ᾢ ᾣ ᾤ ᾥ ᾦ ᾧ ῲ ῳ ῴ ῶ ῷ ὼ ώ

功能选项

通过将features\u导入组设置为true,可以在导出时将字体组添加到features.fea文件中。字体的功能既不格式化也不检查是否正确。用户负责将引用的功能文件从include()语句移动到所选的输出目录。另请参见下面的kern功能选项和mark功能选项。

内核功能选项

内核值将按与输出ufo相等的比例缩放。此缩放与创建的.vfb实例无关。最小值可以使用kern_min_value设置。该值应为整数,设置时,所有不超过阈值的内核值(负值和正值)将从kern功能中忽略。

默认情况下,主字体的kern功能不包含在features.fea文件中。要包含母版字体中的kern功能,应将kern\u feature\u passthrough设置为true

具有kern功能的外部功能文件可以使用kern\u功能文件路径选项导入到字体功能,该选项要求文本文件的路径具有.fea扩展名。

默认情况下,为每个实例生成一个新的kern功能。将kern_feature_generate设置为false将关闭此功能。kern功能生成将根据需要添加子表和查找。这并不是特别优雅,到目前为止,还没有进行任何检查来保证可以工作的kern功能。任何剩余的子表溢出可能是由于glyph位于同一侧的多个kern组中;但是溢出也可能是由位于功能列表前面的一个或多个gpo功能引起的。

标记功能选项

通过将mark\u feature\u generate设置为true,可以在导出时生成标记功能。可以提供要省略的锚名称列表(标记锚省略)或要包含的锚名称列表(标记锚包含)来微调功能输出。

组选项

提供fontlab类文件(.flc)或groups.plist可在组名未使用第一组和第二组标识符命名时显著加快UFO创建时间(请参见groups flc\u pathgroups plist\u path选项)。.flc文件中的组名没有匹配任何特定格式(例如,mmk r<;key glyph>;public.kern2.<;key glyph>;)。

当不使用a.flcgroups.plist文件时,将检查组名称是否有UFO3样式的组标识符(public.kern1.&l t;key glyph>;public.kern2.<;key glyph>;)、MetricsMachine样式标识符(mmk l<;key glyph>;mmk r<;key glyph>;)和t他简化了标识符后缀。使用fontlab内置的getclassleft/getclassright方法将没有紧排或无法使用名称识别的组标识为第一/第二组。

ode>export_flc选项设置为true,将生成FontLab类文件(.flc),其中组名与生成的UFO的组名匹配。此文件将与生成的UFO位于同一目录中。

kern_ignore_no_kerning选项可以设置为true忽略没有紧排对的组。这可能是可取的,如果从不明飞行物的二进制字体。使用导入的.flc组.plist文件时,此选项无效。

在提供的.flc文件或主字体的kern类中没有键标志符号的fontlab kern类将把fontlab类中的第一个标志符号标记为键标志符号,并在输出控制台中记录。如果有多个标志符号标记为键标志符号,则第一个标记的标志符号将被视为键标志符号。这些键glyph操作可能会影响紧排。导入的groups.plist推断组名中的标志符号是键标志符号。

内核组命名建议

Typical FontLab-style kerning groups:
_A: A' Agrave Aacute Acircumflex Atilde Adieresis Aring...
_A_r: A' AE Agrave Aacute Acircumflex Atilde Adieresis Aring...

Recommended naming for FontLab-style kerning groups:
_public.kern1.A: A' Agrave Aacute Acircumflex Atilde Adieresis Aring...
_public.kern2.A: A' AE Agrave Aacute Acircumflex Atilde Adieresis Aring...

Final output (UFO group plist):
<key>public.kern1.A</key>
<array>
	<string>A</string>
	<string>Agrave</string>
	<string>Aacute</string>
	<string>Acircumflex</string>
	<string>Atilde</string>
	<string>Adieresis</string>
	<string>Aring</string>
	...
</array>

<key>public.kern2.A</key>
<array>
	<string>A</string>
	<string>AE</string>
	<string>Agrave</string>
	<string>Aacute</string>
	<string>Acircumflex</string>
	<string>Atilde</string>
	<string>Adieresis</string>
	<string>Aring</string>
	...
</array>

AFDKO选项

os/2hheaheadname表将添加到功能文件中。名称表条目字符串的格式将根据opentype功能文件规范9.e进行设置。无法为每个平台的特定编码限制完全格式化的任何字符串(Windows--utf-8>;,Macintosh--mac-os-roman.)将被格式化为最接近的等效ascii,而不是省略任何不可编码的字符。标准库unicodedata模块用于满足此需要的条目。

glyphorderandaliasdb(goadb)和fontmenunamedb可以生成用于makeotf的文件。可以提供goadab(afdko_makeotf_goadab_path),它来自.vfb的原始编码或源字体的顺序。

可选地,前256个标志符号可以从windows-1252mac-os-roman代码页(afdko-makeotf-u goadab-win)中填充。1252afdko_makeotf_goadab_macos_roman)。生成的goadb文件的第一个字符将始终以.notdef标志符号开头。如果提供goadb文件,则不检查其正确性。分别使用afdko_makeotf_cmdafdko_makeotf_batch_cmd选项分别为每个生成的实例或将所有实例作为批处理运行makeotf的命令。

有几个显式关键字选项可以启用特定的makeotf开关。对于那些不能通过关键字选项获得的字符串,应该将它们定义为字符串列表并传递给afdko_makeotf_args选项。

psautohint选项

psautohint可用于生成不明飞行物后的标志符号提示。分别为每个生成的实例运行psautohint或使用psautohint\u cmdpsautohint\u batch\u cmd选项将所有实例作为批处理运行的命令。默认选项为-d(写入十进制(浮点)提示坐标)和-w(写入高nt直接指向每个glyph的.glif库。

ufoz选项

ufo实例可以编写为.ufoz存档。如果您计划在创建后执行任何文件传输操作,则传输单个.ufoz文件要比生成的ufo实例中的大量小文本文件快得多,尤其是通过USB传输时。默认情况下,存档文件以压缩模式写入。通过将ufoz_compress设置为false

.设计空间字体选项

可以创建一个.designspace文档来代替单个ufo实例。将为每个主控形状生成一个UFO,并在.designspace文档中描述实例。可以使用designspace\u default选项描述默认实例。此值必须是一个列表或元组,字体中每个轴都有一个值。如果提供了"忽略符号列表"或"忽略符号后缀列表",则符号将保留在源UFO中,并且将为每个要忽略的符号添加一个符号静音规则。

基准

作为参考,测试是在一台Windows 10计算机上进行的,该计算机具有Intel Xeon E5 1650v3@3.5 GHz CPU和固态硬盘。

时间是每个实例(±.5秒),不包括加载和分析用户选项的时间,然后复制原始字体并准备副本以转换为UFO格式。如果不提供FontLab类或组,则此准备时间会增加。plist文件。

ufoz选项将减少0-0.5秒。

测试(~3200字形@10000 upm->;1000 upm),<;10秒

flc_path = <path to .flc file>

vfb2ufo3.write_ufo(
	glyphs_decompose=True,
	glyphs_remove_overlaps=True,
	groups_flc_path=flc_path,
	)

测试(~2900字形@10000 upm->;1000 upm),≈9秒

flc_path = <path to .flc file>
glyphs_omit_list = [
	<glyph names to be omitted go here>
	]
glyphs_omit_suffixes_list = [
	<glyph name suffixes to be omitted go here>
	]

vfb2ufo3.write_ufo(
	glyphs_decompose=True,
	glyphs_remove_overlaps=True,
	glyphs_omit_list=glyphs_omit_list,
	glyphs_omit_suffixes_list=glyphs_omit_suffixes_list,
	groups_flc_path=flc_path,
	)

测试(~2900字形@10000 upm->;1000 upm),<;6.5秒

flc_path = <path to .flc file>
glyphs_optimize_names = [
	<glyph names with no overlapping components go here>
	]
glyphs_omit_list = [
	<glyph names to be omitted go here>
	]
glyphs_omit_suffixes_list = [
	<glyph name suffixes to be omitted go here>
	]

vfb2ufo3.write_ufo(
	glyphs_decompose=True,
	glyphs_remove_overlaps=True,
	glyphs_optimize_names=glyphs_optimize_names,
	glyphs_omit_list=glyphs_omit_list,
	glyphs_omit_suffixes_list=glyphs_omit_suffixes_list,
	groups_flc_path=flc_path,
	)

测试(~2900字形@10000 upm->;1000 upm),≈4秒

flc_path = <path to .flc file>
vfb2ufo3.write_ufo(
	glyphs_decompose=True,
	groups_flc_path=flc_path,
	)

测试(~2900字形@10000 upm->;1000 upm),<;3.5秒

-------------------------------------------------------------------------------
EXAMPLE UFO GENERATION SCRIPT
-------------------------------------------------------------------------------
#FLM: write ufo
# coding: utf-8
from __future__ import absolute_import, unicode_literals

import os

from vfb2ufo3 import write_ufo

user_profile_folder = os.environ['USERPROFILE']
output_path = os.path.join(user_profile_folder, 'Documents', 'test_font')

instances = [
	0,
	200,
	400,
	650,
	1000,
	]
names = [
	'Thin',
	'Light',
	'Regular',
	'SemiBold',
	'Bold',
	]
attributes = [
	{'openTypeOS2WeightClass': 200},
	{'openTypeOS2WeightClass': 300},
	{'openTypeOS2WeightClass': 400},
	{'openTypeOS2WeightClass': 600},
	{'openTypeOS2WeightClass': 700},
	]

write_ufo(
	output_path=output_path,
	instance_values=instances,
	instance_names=names,
	instance_attributes=attributes,
	glyphs_decompose=True,
	glyphs_remove_overlaps=True,
	)

-------------------------------------------------------------------------------
0

测试(~3200字形@10000 upm->;1000 upm),≈3秒

-------------------------------------------------------------------------------
EXAMPLE UFO GENERATION SCRIPT
-------------------------------------------------------------------------------
#FLM: write ufo
# coding: utf-8
from __future__ import absolute_import, unicode_literals

import os

from vfb2ufo3 import write_ufo

user_profile_folder = os.environ['USERPROFILE']
output_path = os.path.join(user_profile_folder, 'Documents', 'test_font')

instances = [
	0,
	200,
	400,
	650,
	1000,
	]
names = [
	'Thin',
	'Light',
	'Regular',
	'SemiBold',
	'Bold',
	]
attributes = [
	{'openTypeOS2WeightClass': 200},
	{'openTypeOS2WeightClass': 300},
	{'openTypeOS2WeightClass': 400},
	{'openTypeOS2WeightClass': 600},
	{'openTypeOS2WeightClass': 700},
	]

write_ufo(
	output_path=output_path,
	instance_values=instances,
	instance_names=names,
	instance_attributes=attributes,
	glyphs_decompose=True,
	glyphs_remove_overlaps=True,
	)

-------------------------------------------------------------------------------
1

注释

一般来说,对输入的正确性没有任何假设。当设置了adfko_makeotf_release模式时,glyph名称错误将引发异常,ufo生成将不会继续。字形名称检查在生成实例之前进行。原始字体中的其他错误可能会传递给不明飞行物。

作者

詹姆逊尖塔

许可证

此软件包在麻省理工学院许可证下提供

版本历史记录
  • 版本0.5.1 大部分代码基被重写 仅支持UFO3规范 不明飞行物制造时间的显著改进 修正的ufoz构建结构 删除提示操作,添加psautohint批处理命令选项 改进的选项处理 改进的组转换 nativekernmark功能生成

  • 版本0.3.1 更新了示例脚本

  • 版本0.3.0 附加文件 glif和.glif文件创建时间略有改进 添加了示例基准时间

  • 版本0.2.0 次要格式 更改为组的plistlib.plist导入 删除了\u init.py中的注释行 添加了Futures包作为必需包 向pypi添加了模块

  • 版本0.1.0 初始版本

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Spring MVC 4.0 RequestMapping无值,基于methodname   java Samsung 10 plus不允许wifi p2p发现   春爪哇。伊奥。IOException:找不到文件   java JasperReport饼图示例   java我试图使用mockito注释来测试我的代码,但无法解决mockito异常   命令行界面Java:制作简单的交互式cli应用程序   java jdk1之间的区别是什么。7_9 9和jdk1。7_271   java重载一个被重写的、继承的方法   java LazyInitializationException春季启动   java Play Framework 2.2.1 3个表之间存在大量关系