Package: vfb2ufo3
VFB2UFO3DescriptionMultiple master-compatibleUnified Font Object(UFO) version 3 font writer API for Windows FontLab 5.2VFB2UFO3is primarily intended to create scaled UFO instances from a > 1000 UPM multiple master FontLab.vfbfont with PostScript outlines for use with the AFDKO tools for creating binary fonts while still working with Windows FontLab 5.2. The most significant non-trivial change that will occur in export is the renaming of kerning glyph groups (FontLabclasses). Providing an.flc(FontLab-class) file can speed up conversion significantly when font groups are not identifiable as first/second from their name. Glyph hints/links can be exported using 1 of 3 formats; the UFO3 specification, Adobe AutoHint v1, or Adobe AutoHint v2. The hinting information is the same, however makeOTF does not support the UFO3 specification.VFB2UFO3also quickly creates UFO masters from multiple master.vfbfonts. This is the default behavior when theinstance_valuesoption is not supplied, or building a.designspacefile for use in building a variable font.InstallationPyPipip install vfb2ufo3FontLab InstallerDownload the lastest release FontLab installer (.flw) file and drag it into the FontLab main window then restart FontLab or reset macro system.ZIP ArchiveDownload and extract the latest release ZIP file and move the extracted files to your FontLab Macros folder. The default directory structure is shown below.[user folder]
  └─ Documents  
     └─ Fontlab  
        └─ Studio 5  
           └─ Macros  
              └─ System  
                 └─ Modules  
                    └─ vfb2ufo3  
                       ├─ __init__.py  
                       ├─ core.pyd  
                       ├─ fea.pyd  
                       ├─ glif.pyd  
                       ├─ libgcc_s_dw2-1.dll  
                       ├─ libgomp-1.dll  
                       ├─ libstdc++-6.dll  
                       ├─ libwinpthread-1.dll  
                       ├─ user.py  
                       ├─ vfb.pyd  
                       └─ zlib1.dllRequirementsThis package has no Python dependencies outside of the standard library. It is written in C++ and Cython. The submodules are compiled into.pydextension modules. To recompile the submodules, the PyPicythonpackage and a compiler for Cython to utilize during extension module compilation will be required. The modules are currently compiled using a MSYS2 version of GCC.Extension modules compiled from C++ require several DLLs from the GCC which are included in the release ZIP archive, FontLab installer, and PyPi package.Optionalcythonpip install cythonhttps://github.com/cython/cythonAFDKOpip install afdkohttps://github.com/adobe-type-tools/afdkopsautohintpip install psautohinthttps://github.com/adobe-type-tools/psautohintMinGW 32-bit/i686 GCC >= 9.3.0http://winlibs.comhttps://www.msys2.orghttp://mingw-w64.org{fmt}https://github.com/fmtlib/fmtFunctionalityUFO output is produced without changes to the source font. If a specificlayerorinstance_valuesare not provided for a multiple master source font, a UFO will be generated for each master in the font.Fonts with a large number of glyphs benefit greatly from supplying additional glyph names to be optimized when removing overlaps (glyphs_optimize_names) and/or glyph names and suffixes which can be omitted from the final UFO instance (glyphs_omit_names,glyphs_omit_suffixes). SeeGLYPHS OPTIONSbelow.All path options must be absolute paths; folder and file paths which are not absolute will be ignored. The default output path is the user's Desktop.A dictionary of attributes may be suppled via theinstance_attributesoption. These attributes should consist of keys from the UFO specification and they must match the data type in the specification. Not all fontinfo attributes are configurable; please seeCONFIGURABLE_ATTRSin thefontinfo.pxisource file for a list of attributes which will be checked and updated to the UFO(s) during creation.-------------------------------------------------------------------------------
EXAMPLE UFO GENERATION SCRIPT FOR SINGLE-AXIS MULTIPLE MASTER .VFB FONT
-------------------------------------------------------------------------------
# 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,  
  )  

-------------------------------------------------------------------------------Scale optionsBy default, the target UPM for UFO output is 1000. For a UPM other than 1000, say 2048, it should be set via thescale_to_upmoption. The value from thescale_to_upmoption is ignored if it is lower than 1000. Scaling can be turned off by settingscale_autotoFalse; this does not reduce conversion times.All scaling operations are performed independently from FontLab.Instance optionsWhen creating instances from a multiple master source font, lists of values, names (optional), and attributes (optional) should be provided to generate instance UFOs from the master font.If the source is a multiple master font and a list of instance values is not provided, a UFO for each master will be created.For multiple master fonts, the instance values list should be values intuple- orlist-form with a value for each axis. For single-axis fonts, if the list values are numerical, the values will be converted to single-element lists:2-axis fontinstance_values = [[0, 1000], [200, 1000]]instance_values = [(0, 1000), (200, 1000)]1-axis fontinstance_values = [[0], [200]]instance_values = [(0,), (200,)]instance_values = [0, 200]becomes[[0], [200]]If the optional lists of names and/or attributes are provided in addition to a list of values, they must be of the same length as the values list. AValueErrorwill be raised if the lengths do not match, since this will likely produce undesirable results:Correct:instance_values = [(0, 1000), (200, 1000)]
instance_names = ['Light Display', 'Regular Display']Incorrect (ValueError):instance_values = [(0, 1000), (200, 1000)]
instance_names = ['Light Display']Glyph optionsGlyph scaling is independent from the.vfbinstance itself.Glyph decomposition and overlap removal is optional and occurs after instances are generated. This option is intended for final output when a binary font will be created from the UFO.By default, when decomposing and removing overlaps from glyph outlines for export, GLIF files for glyphs containing components will be built using contours from each component's base contours.When decomposing only, the optimization outlined above will be used for all glyphs containing components.To disable the optimizations outlined above, set theglyphs_optimizeoption toFalse.To specify explicitly which glyphs to decompose and/or remove overlaps, theglyphs_decompose_namesandglyphs_remove_overlap_namesoptions should be supplied. The supplied names must match exactly with the glyph names in the target font. Theglyphs_optimizeoption should be disabled if using either of these options.Omit glyphs from instanceA list of glyph suffixes and/or glyph names can be supplied that should be omitted from the instance UFO via theglyphs_omit_suffixesandglyphs_omit_namesoptions, respectively.Optimize glyph name and code point listsFor output intended for makeOTF where construction glyphs are being omitted viaglyphs_omit_listorglyphs_omit_suffixes_list, enablingglyphs_optimize_makeotfwill decompose and remove overlaps for the omitted glyphs where needed. Overlaps will be removed for all other base components but remain in component-form. This will decrease UFO creation time and allow makeOTF to more efficiently subroutinize the outlines and reduce .otf compilation time.If removing overlaps, the default list of code points for glyphs to be constructed in the above manner is composed of glyphs that normally have no overlapping components. The list is located in thecore.pxisource file with the character representations for these code points shown below.The code points from the default code point list can be shown by running thevfb2ufo3.show_default_optimize_code_points()function. The code points will print to the FontLab output window and can then be copied into a text editor and edited as needed.A user-supplied code point list (glyphs_optimize_code_points) can be a list of'0x00ac'-format strings, integers in hexadecimal-form (0x00ac), or numeric integers (172); values which cannot be converted to an integer will raise aValueError. Only the first code point in each glyph's list of code points (FontLab glyphunicodesattribute) is checked for code point set membership.A user-supplied glyph name list (glyphs_optimize_names) can be supplied to supplement the code point list for glyphs. Any glyphs containing components that do not overlap should be added to this list.Small case variants of the code points in the code point list will be also added to code point list assuming they end with.sc,.smcp, or.c2scsuffixes.OPTIMIZE_CODE_POINTSLatin
À Á Â Ã Ä Ā Ă Ǣ Ǽ Ȁ Ȃ Ǎ Ȧ
Ḇ
Ć Ĉ Ċ Č
Ď Ḍ Ḏ Ḓ
È É Ê Ë Ē Ĕ Ė Ė Ȅ Ȇ
Ĝ Ğ Ġ Ģ Ḡ Ǧ Ǵ
Ĥ Ḥ Ḫ
Ì Í Ĩ Ī Ĭ İ Î Ï Ȉ Ȋ Ǐ
Ĵ
Ķ Ḳ Ḵ
Ĺ Ļ Ľ Ŀ Ḷ Ḹ Ḻ Ḽ
Ḿ Ṁ Ṃ
Ñ Ń Ņ Ň Ṅ Ṇ Ṉ Ṋ Ǹ
Ò Ó Ô Õ Ö Ō Ŏ Ő Ȍ Ȏ Ȯ Ǒ
Ŗ Ř Ŕ Ṙ Ṛ Ṝ Ṟ Ȑ Ȓ
Ś Ŝ Ş Ș Š Ṣ
Ţ Ț Ť Ṭ Ṯ Ṱ
Ũ Ū Ŭ Ů Ű Ù Ú Û Ü Ȕ Ȗ Ǔ Ǖ Ǘ Ǚ Ǜ
Ṿ
Ŵ Ẁ Ẃ Ẅ Ẇ
Ẋ Ẍ
Ŷ Ÿ Ý Ẏ Ȳ
Ź Ż Ž Ẑ Ẓ Ẕ
Ĳ Ǉ Ǌ ǈ ǋ
Ǳ Ǆ ǲ ǅ
à á â ã ä ā ă ǣ ǽ ȁ ȃ ǎ ȧ
ḇ
ć ĉ ċ č
ď ḍ ḏ ḓ
è é ê ë ē ĕ ė ě ȅ ȇ
ĝ ğ ġ ģ ḡ ǧ ǵ
ĥ ẖ ḥ ḫ
ì í ĩ ī ĭ î ï ȉ ȋ ǐ
ĵ ǰ
ķ ḳ ḵ
ĺ ļ ľ ŀ ḷ ḹ ḻ ḽ
ḿ ṁ ṃ
ń ņ ň ŉ ñ ṅ ṇ ṉ ṋ ǹ
ò ó ō ŏ ő ô õ ö ȍ ȏ ȯ ǒ
ŗ ř ŕ ṙ ṛ ṝ ṟ ȑ ȓ
ś ŝ ş ș š ṣ
ţ ț ť ṭ ṯ ṱ
ũ ū ŭ ů ű ù ú û ü ȕ ȗ ǔ ǖ ǘ ǚ ǜ
ṿ
ŵ ẁ ẃ ẅ ẇ
ẋ ẍ
ý ÿ ŷ ẏ ȳ
ź ż ž ẑ ẓ ẕ
ĳ ǉ ǌ
ǳ ǆ

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

Greek Mono- and Polytonic
Ἀ Ἁ Ἂ Ἃ Ἄ Ἅ Ἆ Ἇ ᾈ ᾉ ᾊ ᾋ ᾌ ᾍ ᾎ ᾏ Ᾰ Ᾱ Ὰ Ά ᾼ
Ἐ Ἑ Ἒ Ἓ Ἔ Ἕ Ὲ Έ
Ἠ Ἡ Ἢ Ἣ Ἤ Ἥ Ἦ Ἧ ᾘ ᾙ ᾚ ᾛ ᾜ ᾝ ᾞ ᾟ Ὴ Ή ῌ
Ἰ Ἱ Ἲ Ἳ Ἴ Ἵ Ἶ Ἷ Ῐ Ῑ Ὶ Ί
Ὀ Ὁ Ὂ Ὃ Ὄ Ὅ Ὸ Ό
Ῥ
Ὑ Ὓ Ὕ Ὗ Ῠ Ῡ Ὺ Ύ
Ὠ Ὡ Ὢ Ὣ Ὤ Ὥ Ὦ Ὧ ᾨ ᾩ ᾪ ᾫ ᾬ ᾭ ᾮ ᾯ Ὼ Ώ ῼ
ἀ ἁ ἂ ἃ ἄ ἅ ἆ ἇ ᾀ ᾁ ᾂ ᾃ ᾄ ᾅ ᾆ ᾇ ᾰ ᾱ ᾲ ᾳ ᾴ ᾶ ᾷ ὰ ά
ἐ ἑ ἒ ἓ ἔ ἕ ὲ έ
ἠ ἡ ἢ ἣ ἤ ἥ ἦ ἧ ᾐ ᾑ ᾒ ᾓ ᾔ ᾕ ᾖ ᾗ ῂ ῃ ῄ ῆ ῇ ὴ ή
ἰ ἱ ἲ ἳ ἴ ἵ ἶ ἷ ῐ ῑ ῒ ΐ ῖ ῗ ὶ ί
ὀ ὁ ὂ ὃ ὄ ὅ ὸ ό
ῤ ῥ
ὐ ὑ ὒ ὓ ὔ ὕ ὖ ὗ ῠ ῡ ῢ ΰ ὺ ύ ῦ ῧ
ὠ ὡ ὢ ὣ ὤ ὥ ὦ ὧ ᾠ ᾡ ᾢ ᾣ ᾤ ᾥ ᾦ ᾧ ῲ ῳ ῴ ῶ ῷ ὼ ώFeatures optionsFont groups can be added to thefeatures.feafile on export by settingfeatures_import_groupstoTrue(ifafdko_partsis enabled, this will also be enabled). The font's features are neither formatted nor checked for correctness. Users are responsible for moving referenced feature files frominclude()statements to the chosen output directory. Also seeKERN FEATURE OPTIONSandMARK FEATURE OPTIONSbelow forkernandmarkfeature options.Hint optionsIf enabled, theglyph_hintsoption converts hints on export (glyph links are converted to hints). By default, hints will be created following the UFO3public.postscript.hintsspecification.  Theglyphs_hints_afdko_v1andglyphs_hints_afdko_v2options enables hints compatible with MakeOTF.glyphs_hints_vertical_onlyignores horizontal hints/linksKern feature optionsKern values will be scaled in parity with the output UFO. This scaling is independent from the created.vfbinstance. A minimum value can be set usingkern_min_value. This value should be a positive integer and when set, all kern values (negative and positive) not above the threshold will be omitted from thekernfeature.By default, thekernfeature from the master font is not included in thefeatures.feafile. To include thekernfeature from the master font,kern_feature_passthroughshould be set toTrue.An external feature file with akernfeature can be imported to the font features using thekern_feature_file_pathoption, which expects a path to a text file with the.feaextension.By default, a newkernfeature is generated for each instance. Settingkern_feature_generatetoFalsewill turn this off. Thekernfeature generation will add subtables and a lookup as necessary. This is not particularly elegant, and so far, no checks are made to guarantee a workingkernfeature. Any remaining subtable overflows may be due to glyph(s) being in more than one kern group of the same side; however overflows can also be caused by issues from one or moreGPOSfeatures located earlier in the feature list.Mark feature optionsAmarkfeature can be generated on export by settingmark_feature_generatetoTrue. A list of anchor names to omit (mark_anchors_omit) or a list of anchor names to include (mark_anchors_include) can be supplied to fine-tune themarkfeature output. For both anchor name lists, the corresponding_<anchor name>anchor will be added to their respective list.Group optionsProviding a FontLab-class file (.flc) orgroups.plistspeeds up UFO creation time significantly when the group names are not named using first and second group identifiers (seegroups_flc_pathandgroups_plist_pathoptions). Group names in the.flcfile do not have match any specific formatting (e.g.MMK_R_<key glyph>,public.kern2.<key glyph>).When not using either a.flcorgroups.plistfile, group names will be checked for UFO3-style group identifiers (public.kern1.<key glyph>,public.kern2.<key glyph>), MetricsMachine-style identifiers (MMK_L_<key glyph>,MMK_R_<key glyph>), and the simpler_Land_Ridentifier suffixes. Groups which either have no kerning or are not identifiable using their name will be identified as first/second using FontLab's built-inGetClassLeft/GetClassRightmethods.If theexport_flcoption is set toTrue, a FontLab-class file (.flc) will be generated with group names matching those of the generated UFOs. This file will be located in the same directory as the generated UFO(s).Thekern_ignore_no_kerningoption can be set toTrueto ignore groups which have no kerning pairs. This may be desirable if making a binary font from the UFO. This option has no effect when using an imported.flcorgroups.plistfile.FontLab kern classes without a key glyph in a provided.flcfile or in the master font's kern classes will have the first glyph in the FontLab class marked as the key glyph and it will be noted in the output console. If there is more than one glyph marked as a key glyph, the first marked glyph is considered the key glyph. These key glyph operationsmayaffect the kerning. An importedgroups.plistinfers that the glyph in the group name is the key glyph.Kern group naming recommendationsTypical 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 groups.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 optionsTheOS/2,hhea,head, andnametables will be added to the features file. Thenametable entry strings will be formatted according toOpenType Feature File Specification § 9.e. Any strings unable to be formatted fully for each platform's specific encoding restriction (Windows --UTF-8, Macintosh --Mac OS Roman) will be formatted to their nearest ASCII equivalent rather than omitting any un-encodable characters. The standard libraryunicodedatamodule is used for any entries meeting this criteria.GlyphOrderAndAliasDB(GOADB) andFontMenuNameDBfiles can be generated for use with MakeOTF. The GOADB can be provided (afdko_makeotf_GOADB_path), derived from the.vfb's original encoding, or the order of the source font.Optionally, the first 256 glyphs can be filled from theWindows-1252orMac OS Romancode pages (afdko_makeotf_GOADB_win1252,afdko_makeotf_GOADB_macos_roman). The first character of a generated GOADB file will always start with the.notdefglyph. If a GOADB file is provided, it is not checked for correctness. Commands to run MakeOTF for each generated instance separately or all instances as a batch using the optionsafdko_makeotf_cmdandafdko_makeotf_batch_cmd, respectively.There are several explicit keyword options to enable specific MakeOTF switches. For those not available via a keyword option, they should be defined as a list of strings and passed to theafdko_makeotf_argsoption.Note:afdkofor Python 2.7 is no longer developed.psautohint optionspsautohintcan be utilized for generating glyph hints after UFO generation. Commands to runpsautohintfor each generated instance separately or all instances as a batch using the optionspsautohint_cmdandpsautohint_batch_cmd, respectively. The default options are-d(write decimal (float) hint coordinates) and-w(write hints directly to the .glif lib for each glyph).Note:psautohintfor Python 2.7 is no longer developed.UFOZ optionsUFO instances can be written as a.ufozarchive. If you are planning on any file transfer operations after creation, transferring a single.ufozfile is much quicker than the large number of small text files in the generated UFO instance(s), especially when transferring through USB. By default, archives are written in compressed mode. Compression can be turned off by settingufoz_compresstoFalse..designspacefont optionsA.designspacedocument can be created in place of individual UFO instances. A UFO for each master will be generated and the instances will be described in the.designspacedocument. A default instance can be described with thedesignspace_defaultoption. This value must be a list or tuple with a value for each axis in the font. Ifglyphs_omit_listorglyphs_omit_suffixes_listlists are provided, the glyphs will remain in the source UFOs and a glyph mute rule for each glyph to be omitted will be added for each instance.A list of names can be provided for each layer of the multiple-master source font. The name list must be of the same length as the number of layers in the source font, and its order is assumed to match the order of the source font layers. If a names list is not supplied, the names of the exported masters will be constructed using the abbreviated axis names as set in the font (accessible via the master font'saxisattribute).BenchmarksFor reference, testing was performed on a Windows 10 machine with an Intel Xeon E5 1650v3 @ 3.5 GHz CPU and a solid-state hard drive; CPUs with fewer cores and/or a hard disk drive increases file write times considerably.Times are per-instance (±.5 sec) and do not include time to load and parse user options, then copy the information from the original font to prepare for conversion to the UFO format. This prep time increases when not providing a FontLab-class (.flc) orgroups.plistfile.Theufozoption reduces build time considerably.Test (~3200 glyphs @ 10,000 UPM -> 1,000 UPM), <10 secflc_path = <path to .flc file>

vfb2ufo3.write_ufo(
  glyphs_decompose=True,  
  glyphs_remove_overlaps=True,  
  groups_flc_path=flc_path,  
  )Test (~2900 glyphs @ 10,000 UPM -> 1,000 UPM), ≈9 secflc_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,  
  )Test (~2900 glyphs @ 10,000 UPM -> 1,000 UPM), ≈7 secflc_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,  
  )Test (~2900 glyphs @ 10,000 UPM -> 1,000 UPM), ≈4 secflc_path = <path to .flc file>
vfb2ufo3.write_ufo(
  glyphs_decompose=True,  
  groups_flc_path=flc_path,  
  )Test (~2900 glyphs @ 10,000 UPM -> 1,000 UPM), ≈3-4 secflc_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_omit_list=glyphs_omit_list,  
  glyphs_omit_suffixes_list=glyphs_omit_suffixes_list,  
  groups_flc_path=flc_path,  
  )Test (~3200 glyphs @ 10,000 UPM -> 1,000 UPM), ≈3 secflc_path = <path to .flc file>

vfb2ufo3.write_ufo(
  groups_flc_path=flc_path,  
  )Test (~3200 glyphs @ 10,000 UPM -> 1,000 UPM), <1.5 secflc_path = <path to .flc file>

vfb2ufo3.write_ufo(
  groups_flc_path=flc_path,  
  ufoz=True,  
  )Test (~3200 glyphs @ 10,000 UPM -> 1,000 UPM), <1.5 secflc_path = <path to .flc file>

vfb2ufo3.write_ufo(
  groups_flc_path=flc_path,  
  ufoz=True,  
  ufoz_compress=False,  
  )NotesGenerally, no assumptions are made about the correctness of the input. Whenadfko_makeotf_releasemode is set, glyph name errors will raise an exception and UFO generation will not continue. Glyph name checks are made prior to building instances. Other errors in the original font will likely be passed through to the UFO.AuthorJameson R SpiresLicensesSource files are covered under theMIT License. SHA512 hash algorithm is a modification of an implementation from Olivier Gay'sSHA2 library, which is covered under aBSD License.Version historyversion 0.8.5addedscale_factorandinteger_coordinatesoptionssmall changes and correctionsmodule consolidationversion 0.8.3reorganizationversion 0.8.2small changes and correctionsversion 0.8.1addedglyphs_optimize_makeotfoption for use with makeOTFaddedglyphs_decompose_namesandglyphs_remove_overlap_namesoptionscorrection to SHA512 hint ID hashingcorrection to font groups parsing when not using.flcorgroups.plistgroup filescorrection to features.fea copyUFO glyph order derivation from encoding now checks for and includes glyphs missing from FontLab.encfileremoved option to save VFB instances/copiesversion 0.8.0a copy of the original font is no longer created, decreasing master processing overhead by a considerable amountre-inclusion of glyph hints/links.gliffile creation performance improvementscorrections tomarkfeature generationversion 0.7.5small changes/correctionsversion 0.7.4corrections to makeOTF batch command creationcorrections tokernfeature generationversion 0.7.3corrections tomarkfeature generationreverted to use of"from'in XML files for compatibility with makeOTFversion 0.7.2reorganization of.pxiincludesremoval of.pxdCython declaration filesincorporated automatic string encoding from Python to C/C++more explicit Python string encoding/decodingversion 0.7.1changes to.ufozC++ codeversion 0.7.0additional C++ conversion for.ufozfile creation utilizingzlibcompressionsmall changes and correctionsversion 0.6.6change tosetup.pyfor PyPi packagecreated FontLab installerversion 0.6.5change toglif.hppversion 0.6.4remove schedule from OpenMP pragmacorrection for quadratic curves inglif.pyxcorrection forgliffile name creationversion 0.6.3added 32-bit GCC DLLsC++ string formatting improved utilizing{fmt}formatting librarymarkfeature generation correctionssmall changes and correctionsversion 0.6.2replacedpush_backwithemplace_backwhere possible inglif.hppcorrections to shifted and scaled contour-from-component buildsversion 0.6.1small correctionsversion 0.6.0small fix for single-master font buildssmall changes to several source filesglif.pyxhas been rewritten in C++ as much as possibleversion 0.5.2small change togroups.pyxre-added link to known working GCC compilerversion 0.5.1majority of code base rewrittensupport for UFO3 specification onlyconsiderable improvement in UFO creation timescorrected UFOZ build structureremoved hint operations, added psautohint batch command optionsimproved option handlingimproved group conversionnativekernandmarkfeature generationversion 0.3.1updated sample scriptversion 0.3.0additional documentationslight improvement in glif and .glif file creation timesadded sample benchmark timesversion 0.2.0minor formattingchange to plistlib for groups.plist importremoved commented lines in__init__.pyaddedfuturespackage as a required packageadded module to PyPiversion 0.1.0initial release