跳转到主要内容

字体文件操作工具

项目描述

CI Build Status Coverage Status PyPI Join the chat at https://gitter.im/fonttools-dev/Lobby

这是什么?

fontTools 是一个用于操作字体的库,用 Python 编写。该项目包括 TTX 工具,可以将 TrueType 和 OpenType 字体转换为 XML 文本格式,也称为 TTX。它支持 TrueType、OpenType、AFM,在一定程度上还支持 Type 1 和一些 Mac 特定格式。该项目拥有 MIT 开源许可证
这意味着您可以使用它而无需付费。

用户文档开发者文档 可在 Read the Docs 上找到。

安装

FontTools 需要 Python 3.8 或更高版本。我们试图遵循与 NumPy 相同的最小 Python 版本支持计划(参见 NEP 29)。

此包列在 Python 包索引(PyPI)中,因此您可以使用 pip 安装它

pip install fonttools

如果您想为其开发做出贡献,您可以从中克隆 GitHub 上的存储库,以“可编辑”模式安装包并就地修改源代码。我们建议创建一个虚拟环境,使用 virtualenv 或 Python 3 venv 模块。

# download the source code to 'fonttools' folder
git clone https://github.com/fonttools/fonttools.git
cd fonttools

# create new virtual environment called e.g. 'fonttools-venv', or anything you like
python -m virtualenv fonttools-venv

# source the `activate` shell script to enter the environment (Unix-like); to exit, just type `deactivate`
. fonttools-venv/bin/activate

# to activate the virtual environment in Windows `cmd.exe`, do
fonttools-venv\Scripts\activate.bat

# install in 'editable' mode
pip install -e .

可选要求

fontTools 包目前除了 Python 标准库中的模块外没有(必需)外部依赖。然而,一些模块需要一些额外的依赖项,这些依赖项是解锁可选功能所需的。fontTools PyPI 分发还支持所谓的“额外”依赖项,即描述一组额外依赖项的关键字集合,在通过 pip 安装或指定要求时可以使用。例如

pip install fonttools[ufo,lxml,woff,unicode]

此命令将安装 fontTools,以及解锁名为“ufo”等额外功能所需的可选依赖项。

  • Lib/fontTools/misc/etree.py

    该模块导出一个类似于 ElementTree 的 API,用于读取/写入 XML 文件,并允许使用内置的 xml.etree 模块或 lxml 作为后端。如果存在,后者是首选的,因为它通常更快、更安全。

    额外: lxml

  • Lib/fontTools/ufoLib

    用于读取和写入 UFO 源文件的包;它需要

    • fs: (又称 pyfilesystem2) 文件系统抽象层。

    • enum34:内置 enum 模块的回滚(仅在 Python < 3.4 时需要)。

    额外: ufo

  • Lib/fontTools/ttLib/woff2.py

    用于压缩/解压缩 WOFF 2.0 网页字体的模块;它需要

    • brotli:Brotli压缩库的Python绑定。

    附加: woff

  • Lib/fontTools/ttLib/sfnt.py

    为了更好地压缩WOFF 1.0网络字体,可以使用以下模块代替内置的zlib

    • zopfli:Zopfli压缩库的Python绑定。

    附加: woff

  • Lib/fontTools/unicode.py

    在用ttx导出cmap表时显示Unicode字符名称,我们使用标准库中的unicodedata模块。其中包含的版本在不同Python版本之间有所不同。要使用最新可用数据,您可以安装

    • unicodedata2unicodedata的Python 3.x回溯,更新到最新的Unicode 15.0版本。

    附加: unicode

  • Lib/fontTools/varLib/interpolatable.py

    此模块用于在不同主版本之间查找错误的轮廓/组件顺序。它需要以下包之一来解决所谓的“二分图中的最小权完美匹配问题”或分配问题

    • scipy:Python的科学库,内部使用NumPy数组,因此速度非常快;

    • munkres:一个纯Python模块,实现了匈牙利算法或Kuhn-Munkres算法。

    要将结果绘制为PDF或HTML格式,还需要安装

    • pycairo:Cairo图形库的Python绑定。请注意,目前轮文件仅适用于Windows,其他平台请参阅pycairo的安装说明

    附加: interpolatable

  • Lib/fontTools/varLib/plot.py

    用于可视化DesignSpaceDocument和结果VariationModel的模块。

    附加: plot

  • Lib/fontTools/misc/symfont.py

    用于符号字体统计分析的高级模块;它需要

    • sympy:用于符号数学的Python库。

    附加: symfont

  • Lib/fontTools/t1Lib.py

    要在Python 3上获取Macintosh PostScript Type 1字体的文件创建者和类型,需要安装以下模块,因为旧的MacOS模块不再包含在Mac Python中

    • xattr:扩展文件系统属性的Python包装器(仅适用于macOS平台)。

    附加: type1

  • Lib/fontTools/ttLib/removeOverlaps.py

    通过合并重叠的轮廓和组件来简化TrueType符号。

    • skia-pathops:Skia库PathOps模块的Python绑定,执行路径上的布尔操作(并集、交集等)。

    附加: pathops

  • Lib/fontTools/pens/cocoaPen.pyLib/fontTools/pens/quartzPen.py

    要使用Cocoa的NSBezierPathCGPath绘制符号,需要

    • PyObjC:Python与Objective-C运行时的桥梁(仅适用于macOS平台)。

  • Lib/fontTools/pens/qtPen.py

    要使用Qt的QPainterPath绘制符号,需要

    • PyQt5:Qt跨平台UI和应用工具包的Python绑定。

  • Lib/fontTools/pens/reportLabPen.py

    用于将符号绘制为PNG图像的笔,需要

    • reportlab:Python生成PDF和图形的工具包。

  • Lib/fontTools/pens/freetypePen.py

    使用FreeType作为光栅图像绘制符号的笔,需要

  • Lib/fontTools/ttLib/tables/otBase.py

    使用Harfbuzz库和方法序列化GPOS/GSUB,需要

    • uharfbuzz:Harfbuzz造型引擎的简化Cython绑定

    额外: repacker

如何制作新版本

  1. 更新NEWS.rst,包含自上次发布以来的所有更改。为每个PR编写一个更改日志条目,用一到两句话总结它,以及PR的链接和相关问题。不要添加新标题,下一个命令会为您完成。

  2. 使用语义版本控制来决定新版本是“主要”、“次要”还是“补丁”版本。通常它是后两种之一,具体取决于是否添加了向后兼容的API,或者只是修复了一些错误。

  3. 在venv内部,首先执行pip install -r dev-requirements.txt,然后从main分支的顶部运行python setup.py release命令。默认情况下,这只会增加第三位或“补丁”数字,除非您传递--major--minor来分别增加第一位或第二位数字。这会增加包版本字符串,从NEWS.rst中提取自最新版本以来的更改,并使用该文本创建一个注解的git标签(或者如果您传递了--sign选项并且您的git和GitHub账户已配置为使用GPG密钥签名提交,则是一个已签名的git标签)。它还会提交一个额外的版本增加提交,为随后的开发周期打开主分支

  4. 通过运行命令git push --follow-tags将标签和提交推送到上游存储库。注意:它可能会推送其他本地标签,请小心。

  5. 让CI构建wheel和源分发包,并验证两者是否已上传到Python包索引(PyPI)。

  6. [可选] 前往fonttools GitHub发行版页面,创建一个新版本,复制粘贴git标签消息的内容。这样,发布说明将格式化为Markdown,关注仓库的用户将收到电子邮件通知。我们将来也会自动化这一点。

致谢

按字母顺序排列

aschmitz, Olivier Berten, Samyak Bhuta, Erik van Blokland, Petr van Blokland, Jelle Bosma, Sascha Brawer, Tom Byrer, Antonio Cavedoni, Frédéric Coiffier, Vincent Connare, David Corbett, Simon Cozens, Dave Crossland, Simon Daniels, Peter Dekkers, Behdad Esfahbod, Behnam Esfahbod, Hannes Famira, Sam Fishman, Matt Fontaine, Takaaki Fuji, Rob Hagemans, Yannis Haralambous, Greg Hitchcock, Jeremie Hornus, Khaled Hosny, John Hudson, Denis Moyogo Jacquerye, Jack Jansen, Tom Kacvinsky, Jens Kutilek, Antoine Leca, Werner Lemberg, Tal Leming, Peter Lofting, Cosimo Lupo, Olli Meier, Masaya Nakamura, Dave Opstad, Laurence Penney, Roozbeh Pournader, Garret Rieger, Read Roberts, Colin Rofls, Guido van Rossum, Just van Rossum, Andreas Seidel, Georg Seifert, Chris Simpkins, Miguel Sousa, Adam Twardoch, Adrien Tétar, Vitaly Volkov, Paul Wise。

版权

版权(c)1999-2004 Just van Rossum,LettError (just@letterror.com)
请参阅LICENSE获取完整许可。

版权所有 (c) 2000 BeOpen.com。保留所有权利。

版权所有 (c) 1995-2001 国家研究倡议公司。保留所有权利。

版权所有 (c) 1991-1995 阿姆斯特丹数学研究中心。保留所有权利。

祝您玩得开心!

变更日志

4.54.1 (发布日期 2024-09-24)

  • [unicodedata] 更新至 Unicode 16

  • [subset] 在文档字符串中转义 \\

4.54.0 (发布日期 2024-09-23)

  • [Docs] 由 @n8willis 进行的小型文档整理 (#3611)

  • [Docs] 由 @n8willis 整理代码块 (#3627)

  • [Docs] 由 @n8willis 修复 Sphinx 构建 (#3625)

  • [merge] 对合并文档进行的小幅修复,由 @drj11 (#3588)

  • [subset] 由 @RoelN 对 pyftsubset 文档进行小幅调整 (#3633)

  • [Tests] 不需要字体工具命令可用,由 @behdad (#3612)

  • [Tests] subset_test:添加失败的测试以重现问题 #3616,由 @anthrotype (#3622)

  • [ttLib] NameRecordVisitor:包含字符变体序列的整个 UI 标签,而不仅仅是第一个,由 @anthrotype (#3617)

  • [varLib.avar] 由 @behdad 从二进制重建映射 (#3598)

  • [varLib.instancer] 由 @Hoolean 修复部分 L2 实例化中的视觉伪影 (#3635)

  • [varLib.interpolatable] 在 .designspace 中支持离散轴,由 @behdad (#3599)

  • [varLib.models] 默认假设为 OpenType 类似的标准化空间,由 @behdad (#3601)

4.53.1 (发布日期 2024-07-05)

  • [feaLib] 改进内联链查找的共享 (#3559)

  • [otlLib] 修正使用反转链上下文单替换计算的 OS/2.usMaxContext (#3569)

  • [misc.visitor] 访问者搜索它们访问的对象的继承链 (#3581)

4.53.0 (发布日期 2024-05-31)

  • [ttLib.removeOverlaps] 支持 CFF 表,以帮助将 CFF2 字体向下转换为 CFF (#3528)

  • [avar] 修复访问尚未存在的属性时崩溃的问题 (#3550)

  • [docs] 将 buildMathTable 添加到 otlLib.builder 文档 (#3540)

  • [feaLib] 读取功能时允许 UTF-8 带有 BOM (#3495)

  • [SVGPathPen] 回滚到默认情况下将坐标四舍五入到两位小数 (#3543)

  • [varLib.instancer] 重新修复输出文件名决策 (#3545, #3544, #3548)

4.52.4 (发布日期 2024-05-27)

  • [varLib.cff] 恢复并弃用 4.52.0 版本中删除的 convertCFFtoCFF2,因为它被下游项目使用 (#3535)。

4.52.3 (发布日期 2024-05-27)

  • 修复了 NEWS.rst 格式化的 reStructuredText 文件中的一个小语法错误,该错误导致 4.52.2 版本上传到 PyPI 失败。没有其他代码更改。

4.52.2 (发布日期 2024-05-27)

  • [varLib.interpolatable] 确保 scipy/numpy 输出是 JSON 可序列化的 (#3522, #3526)。

  • [housekeeping] 重新生成表格列表,以修复新的 VARC 表的 pyinstaller 打包 (#3531, #3529)。

  • [cffLib] 使 CFFToCFF2 和 CFF2ToCFF 更加健壮 (#3521, #3525)。

4.52.1 (发布日期 2024-05-24)

  • 修复了 NEWS.rst 格式化的 reStructuredText 文件中的一个小语法错误,该错误导致 4.52.0 版本上传到 PyPI 失败。没有其他代码更改。

4.52.0 (发布日期 2024-05-24)

  • 添加了对新 VARC (可变组合) 表的支持,该表正在提议添加到 OpenType 规范中 (#3395)。更多信息:https://github.com/harfbuzz/boring-expansion-spec/blob/main/VARC.md

  • [ttLib.__main__] 修复了解压所有表 (90fed08)。

  • [feaLib] 不要在同一个功能记录中多次引用相同的查找索引,因为它只应用一次 (#3520)。

  • [cffLib] 将方法移动到从 subset 模块到 cffLib 的 desubroutinize、删除提示和未使用子例程 (#3517)。

  • [varLib.instancer] 添加了对部分实例化 CFF2 表的支持!还添加了从 CFF2 到 CFF 1.0 的降级方法和 CFF<->CFF2 的 CLI 入口点 (#3506)。

  • 即使有–name-IDs=’*’ 选项,也会修剪未使用的用户名称 ID(#3410)。

  • [ttx] 使用 GNU 风格的 getopt 混合选项和位置参数(#3509)。

  • [feaLib.variableScalar] 修复 value_at_location() 方法(#3491)

  • [psCharStrings] 缩短 encodeFloat 的输出(#3492)。

  • [bezierTools] 修复 calcCubicArcLength 中的无限递归(#3502)。

  • [avar2] 在 TTFont.getGlyphSet() 中实现 avar2 支持(#3473)。

4.51.0(发布日期:2024-04-05)

  • [ttLib] 加载辅助字段时的优化(#3464)。

  • [ttFont] 添加 reorderGlyphs(#3468)。

4.50.0(发布日期:2024-03-15)

  • [pens] 添加分解笔,以常规轮廓绘制组件(#3460)。

  • [instancer] 从 TupleVariations 中删除显式的 no-op 轴(#3457)。

  • [cu2qu/ufo] 从 fonts_to_quadratic 返回修改过的字形名称集(#3456)。

4.49.0(发布日期:2024-02-15)

  • [otlLib] 添加构建 MATH 表的 API(#3446)

4.48.1(发布日期:2024-02-06)

  • 修复了上传 wheel 到 PyPI 的问题,自 v4.48.0 以来没有代码更改。

4.48.0(发布日期:2024-02-06)

  • [varLib] 当没有 OTL 表要合并时,不记录日志。

  • [setup.py] 不再限制 lxml 版本低于 5,测试在 lxml>=5 的情况下也能正常通过。

  • [feaLib] 在 FEA 中移除字形和类名长度限制(#3424)。

  • [roundingPens] 在圆整笔中添加 transformRoundFunc 参数,以允许对组件的变换进行自定义圆整(#3426)。

  • [feaLib] 在 ligature 集内保持 ligature 组件的声明顺序,而不是按字形名称排序(#3429)。

  • [feaLib] 修复 aalt 查找中的 alternates 排序,遵循 aalt 特性块内特性引用的声明顺序(#3430)。

  • [varLib.instancer] 修复 instancer 的 IUP 优化中的 bug(#3432)。

  • [sbix] 支持带有新图形类型“flip”的 sbix 字形(#3433)。

  • [svgPathPen] 添加 --glyphs 选项,以转储字体中指定字形的 SVG 路径(0572f78)。

  • [designspaceLib] 在 <mappings><mapping> 元素中添加“description”属性,并允许多个 <mappings> 元素分组逻辑上相关的 <mapping> 元素(#3435, #3437)。

  • [otlLib] 正确选择最紧凑的 GSUB 上下文查找格式(#3439)。

4.47.2(发布日期:2024-01-11)

小版本发布,修复上传 wheel 到 PyPI 的问题。

4.47.1(发布日期:2024-01-11)

  • [merge] 改进帮助信息并添加标准命令行选项(#3408)

  • [otlLib] 在 buildStatTable 中将 ttFont 传递给 name.addName(#3406)

  • [featureVars] 当可能时重用 FeatureVariationRecord(#3413)

4.47.0(发布日期:2023-12-18)

  • [varLib.models] 为 VariationModel 新增 API:getMasterScalarsinterpolateFromValuesAndScalars

  • [varLib.interpolatable] 修复各种错误和渲染改进。特别是,在封面添加一个总结页面,在背面添加索引和目录。将页面大小改为 Letter。

  • [Docs/designspaceLib] 定义了一个新的 public.fontInfo 库密钥,尚未使用(#3358)。

4.46.0(发布日期:2023-12-02)

  • [featureVars] 允许将相同的替换规则集注册到多个特性中。现在 addFeatureVariations 函数可以接受一个特征标签列表;同样,lib 键 'com.github.fonttools.varLib.featureVarsFeatureTag' 现在可以接受以逗号分隔的特征标签字符串(例如,“salt,ss01”)而不是单个标签(#3360)。

  • [[功能变量]] 不要覆盖 GSUB 功能变体,但对于尚未存在的功能,请将其新记录附加到其上。但如果功能标签已经与功能变体相关联,则引发 VarLibError(#3363)。

  • [[varLib]] 添加了 addGSUBFeatureVariations 函数,用于将 GSUB 功能变体添加到现有可变字体,这些变体由 DesignSpace 文档中定义的规则确定(#3362)。

  • [[varLib.interpolatable]] 修复了各种错误并提高了渲染质量。特别是,增加了一个针对“轻量”字形的测试。但新测试报告了相当多的假阳性。请提供反馈。

4.45.1(发布日期:2023-11-23)

  • [[varLib.interpolatable]] 修复了各种错误并提高了质量,报告更准确,减少了假阳性。

  • [[ttGlyphSet]] 添加了不重新计算 glyf 边界的选择(#3348)。

4.45.0(发布日期:2023-11-20)

  • [[varLib.interpolatable]] 大幅改进了算法。现在还可以使用 --pdf--html 选项生成关于插值问题的 PDF 或 HTML 报告。PDF/HTML 报告展示了有问题的主字体、插值损坏的字形以及建议的修复版本。

4.44.3(发布日期:2023-11-15)

  • [[subset]] 仅在 OS/2.version >= 1 时修剪代码页范围,否则忽略(#3334)。

  • [[instancer]] 确保在实例化包含 'hasc'、'hdsc' 或 'hlgp' 标签的 MVAR 表后,hhea 垂直度量与 OS/2 保持同步(#3297)。

4.44.2(发布日期:2023-11-14)

  • [[glyf]] 在计算组合字形的边界框时,Glyph.recalcBounds 跳过空组件(没有轮廓的基本字形)。这仅仅恢复了在 fonttools 4.44.0 中引入某些更改之前的现有行为(#3333)。

4.44.1(发布日期:2023-11-14)

  • [[feaLib]] 在构建时确保变量标记锚点被深度复制,因为它们在原地被修改并在以后重新使用(#3330)。

  • [[OS/2|subset]] 将 recalcCodePageRanges 方法添加到 OS/2 表类中;将 --prune-codepage-ranges 添加到 fonttools subset 命令中(#3328,#2607)。

4.44.0(发布日期:2023-11-03)

  • [[instancer]] 如果默认值更改,则在实例化后重新计算 OS/2 AvgCharWidth(#3317)。

  • [[otlLib]] 使 ClassDefBuilder 类的顺序与 varLib.merger 的顺序相匹配,即先是大类,然后是字形的字典顺序(#3321,#3324)。

  • [[instancer]] 允许不指定 min:default:max 中的任何值,并让 fvar 的值填充(#3322,#3323)。

  • [[instancer]] 在运行 --update-name-table 时,忽略没有 STAT 轴值的轴(#3318,#3319)。

  • [[Debg]] 将嵌入的 JSON 写作具有缩进的多行字符串,当将其导出到 ttx 时(92cbfee0d)。

  • [[varStore]] 通过拆分 VarData 子表处理每个编码中 > 65535 个项(#3310)。

  • [[subset]] 处理 MarkLigPos 子表中的 null 偏移。

  • [[subset]] 默认保留东亚间距功能 vhal、halt、chws、vchw(#3305)。

  • [[instancer.solver]] 修复了 axisDef < lower 且 upper < axisMax 的情况(#3304)。

  • [[glyf]] 加快编译速度,主要围绕 recalcBounds(#3301)。

  • [[varLib.interpolatable]] 在处理可变字体时加快速度,以及各种微优化(#3300)。

  • 当使用 'unicode' 额外功能安装时,需要 unicodedata2 >= 15.1.0,包含 UCD 15.1。

4.43.1(发布日期:2023-10-06)

  • [[EBDT]] 修复了在以 ttx -z bitwise 选项导出某些位图字体时触发 _reverseBytes 方法的 TypeError 异常(#3162)。

  • [[v/hhea]] 修复了在不存在 vmtx 或 hmtx 表时,recalc 方法中引发的 UnboundLocalError 异常(#3290)。

  • [[bezierTools]] 修复了在调用 calcQuadraticArcLength 时,由于 cython 本地变量类型错误导致的 TypeError(#3288)。

  • [[feaLib/otlLib]] 当构建缺少字形的 Coverage 表时,提供了更好的错误信息(#3286)。

4.43.0(发布日期:2023-09-29)

  • 在解析 OT-SVG 文档时设置 lxml XMLParser(resolve_entities=False) 以防止 XML 外部实体(XXE)攻击(9f61271dc):https://codeql.githubdocs.cn/codeql-query-help/python/py-xxe/

  • iup_delta_optimize 中的 Cython 缺陷添加了解决方案,该缺陷导致 IUP 容忍度初始化错误,从而产生次优的 delta 值(60126435d,cython/cython#5732)。

  • 添加了新的命令行入口 fonttools varLib.avar,用于将 avar 表添加到现有的 VF,从 .designspace 文件中的轴映射中(0a3360e52)。

  • 修复了在 VarData 优化后不再使用的变异区域没有被正确修剪的漏洞 (#3268)。

  • 增加了对 Python 3.12 的支持 (#3283)。

4.42.1(发布于 2023-08-20)

  • [t1Lib] 修复了几个 Type 1 问题 (#3238, #3240)。

  • [otBase/packer] 允许通过不同偏移量大小共享表 (#3241, #3236)。

  • [varLib/merger] 修复了当所有锚点都为 NULL 时,草书附件合并错误的漏洞 (#3248, #3247)。

  • [ttLib] 修复了调用 addMultilingualName 时出现的警告,当 ttFont 参数未传递给 findMultilingualName 时 (#3253)。

4.42.0(发布于 2023-08-02)

  • [varLib] 使用哨兵值 0xFFFF 标记 hmtx/vmtx 中的非参与字形进位,允许稀疏主字包含用于除 {H,V}VAR 之外变异目的的字形 (#3235)。

  • [varLib/cff] 将非默认主中的空字形视为缺失,因此不参与 CFF2 delta 计算,类似于 varLib 已经为 gvar 处理它们 (#3234)。

  • 添加了 varLib.avarPlanner 脚本,根据字形平均权重推断 'correct' avar v1 轴映射 (#3223)。

4.41.1(发布于 2023-07-21)

  • [subset] 通过仅访问包含 nameID 引用的表来修复 v4.41.0 中的性能回归 (#3213, #3214)。

  • [varLib.instancer] 支持包含 null ConditionSet 偏移量在 FeatureVariationRecords 中的字体实例 (#3211, #3212)。

  • [statisticsPen] 报告字体字形平均重量/宽度和字体宽斜率。

  • [fontBuilder] 修复了在 v4.40.0 中引入的将 head.created 日期错误设置为 0 而不是当前时间戳的回归 (#3210)。

  • [varLib.merger] 支持稀疏的 CursivePos 主 (#3209)。

4.41.0(发布于 2023-07-12)

  • [fontBuilder] 修复了 setupOS2 中的错误,默认 panose 属性错误地设置为字典而不是 Panose 对象 (#3201)。

  • [name] 在用户范围内添加了 removeUnusedNameRecords 方法 (#3185)。

  • [varLib.instancer] 修复了 L4 实例化(移动默认值)的问题 (#3179)。

  • [cffLib] 使用 latin1,以便我们可以往返于 {Full,Font,Family}Name 中的非 ASCII 字符 (#3202)。

  • [designspaceLib] 在文档中将 <source name="..."> 标记为可选(如代码中所做)。

  • [glyf-1] 修复了 drawPoints() 错误,其中最后一个二次曲线段变成二次曲线 (#3189, #3190)。

  • [fontBuilder] 将 'hidden' 标志传播到 fvar 轴实例 (#3184)。

  • [fontBuilder] 更新 setupAvar() 以支持 avar 2,修复 _add_avar() 调用位置 (#3183)。

  • 添加了新的 voltLib.voltToFea 子模块(最初是 Tiro Typeworks 的“Volto”),用于将 VOLT OpenType Layout 源转换为 FEA 格式 (#3164)。

4.40.0(发布于 2023-06-12)

  • 为目前支持的所有 Python 小版本、平台和架构发布了本地二进制 wheel,这将对它们有益。它们将包括预编译的 Cython 加速模块(例如 cu2qu),而无需从源代码编译它们。纯 Python wheel 和源分发将继续像往常一样发布(当给定平台没有可用的二进制 wheel 时,pip 将自动选择它们,例如 pypy)。使用 pip install --no-binary=fonttools fonttools 明确请求 pip 从纯 Python 源安装。

  • [designspaceLib|varLib] 添加了对指定轴映射的初始支持,并从这些映射中构建 avar2 表 (#3123)。

  • [feaLib] 支持可变连字符位置 (#3130)。

  • 在[glyf]中添加了选项来–drop-implied-oncurves;测试了在四舍五入前后可插值曲线点的情况 (#3146, #3147, #3155, #3156)。

  • 在[TTGlyphPointPen]中,如果出现空轮廓,不报错,仅忽略它们 (#3145)。

  • 在[sfnt]中修复了在处理WOFF元数据的编译/反编译时py3转换遗留的str vs bytes问题 (#3129)。

  • 在[instancer-solver]中修复了在移动具有稀疏主实例的默认实例时的错误 (#3139, #3140)。

  • 在[feaLib]中简化了不变化的变量标量 (#3132)。

  • 在[pens]中添加了当lastPt != movePt时显式发出闭合线的过滤器笔 (#3100)。

  • 在[varStore]中改进优化算法,并更好地记录算法 (#3124, #3127)。添加了量化选项 (#3126)。

  • 添加了CI工作流程配置文件,用于构建本地二进制轮 (#3121)。

  • 在[fontBuilder]中添加了glyphDataFormat=0选项;如果符号包含立方轮廓但glyphDataFormat未显式设置为1,则引发错误 (#3113, #3119)。

  • 在[subset]中删除了空的GDEF.MarkGlyphSetsDef并重映射索引;确保在GSUB和GPOS之前对GDEF进行子集化 (#3114, #3118)。

  • 在[xmlReader]中修复了DSIG表数据解析错误的问题 (#3115, #2614)。

  • 在[varLib/merger]中修复了与pos=0的SinglePos合并 (#3111, #3112)。

  • 在[feaLib]中,当构建aalt并引用的特征为空时,将“特征未定义”错误降级为警告 (#3110)。

  • 在[feaLib]中删除了具有类别的多个替换 (#3105)。

4.39.4(发布于2023-05-10)

  • 在[varLib.interpolatable]中允许稀疏主实例 (#3075)

  • 在[merge]中处理CFF中的不同默认/名义宽度X (#3070)

  • 在[ttLib]中添加ttLib包中缺失的main.py文件 (#3088)

  • 在[ttx]中修复了XML中缺失的复合指令 (#3092)

  • 在[ttx]中修复了split tables选项,使其能够处理包含‘%’的文件名 (#3096)

  • 在[featureVars]中处理除rvrn last之外的特征的查找 (#3099)

  • 在[feaLib]中支持具有类别的多个替换 (#3103)

4.39.3(发布于2023-03-28)

  • 在[sbix]中修复了在编译imageData为None的空符号时出现的TypeError,回归发生在v4.39中 (#3059)。

  • 在[ttFont]中修复了在打开来自tempfile SpooledTemporaryFile的TTFont时在python <= 3.10时出现的AttributeError,该方法仅在python 3.11中添加 (#3052)。

4.39.2(发布于2023-03-16)

  • 在[varLib]中修复了在4.39.1中引入的回归,即即使DesignSpace v5包含'STAT'定义,也会构建不完整的'STAT'表 (#3045, #3046)。

4.39.1(发布于2023-03-16)

  • 在[avar2]中添加了对读取/写入本提案中指定的avar版本2的实验性支持:[https://github.com/harfbuzz/boring-expansion-spec/blob/main/avar2.md](https://github.com/harfbuzz/boring-expansion-spec/blob/main/avar2.md)

  • 在[glifLib]中,在解析GLIF时将底层XML库异常包装在GlifLibError中,并打印出失败的符号的名称和路径 (#3042)。

  • 在[feaLib]中,在ConditionSets和VariableScalars中,使用avar来规范化用户空间值 (#3042, #3043)。

  • 在[ttProgram]中处理Program.fromAssembly()的字符串输入 (#3038)。

  • 在[otlLib]中添加了一个配置选项来发出GPOS 7查找,目前默认禁用,因为macOS存在错误 (#3034)。

  • 在[COLRv1]中添加了自动计算ClipBoxes的方法 (#3027)。

  • 在[ttFont]中修复了getGlyphID在缺少符号时引发KeyError而不是返回None的问题。该回归发生在v4.27.0中 (#3032)。

  • 在[sbix]中修复了UnboundLocalError:无法访问局部变量'rawdata' (#3031)。

  • 在[varLib]中,在构建VF时,不要覆盖由feaLib从FEA特征文件构建的现有STAT表。还添加了对从fonttools varLib脚本构建Designspace v5中定义的多个VF的支持 (#3024)。

  • 在[mtiLib]中,只有当设置了FONTTOOLS_LOOKUP_DEBUGGING环境变量时,才添加Debg表及其查找名称 (#3023)。

4.39.0(发布于2023-03-06)

  • 在[mtiLib]中,可选地添加MTI特征构建的Debg调试信息 (#3018)。

  • 在[ttx]中支持使用特殊字符-从标准输入读取输入文件,类似于现有的将输出写入标准输出的-o -选项 (#3020)。

  • [cython] 防止当cython未正确安装时,cython.compiled引发AttributeError (#3017)。

  • [OS/2] 防止在计算xAvgCharWidth时发生ZeroDivisionError,在极不可能没有字形具有非零进阶的情况下 (#3015)。

  • [subset] 独立重新计算xAvgCharWidth,不依赖于–no-prune-unicode-ranges,之前这两个选项被无意中捆绑在一起 (#3012)。

  • [fontBuilder] 在addOpenTypeFeatures方法中添加debug参数,以便在Debg私有表中添加字体源调试信息 (#3008)。

  • [name] 使NameRecord __lt__比较在Unicode编码错误时不失败 (#3006)。

  • [featureVars] 修复了overlayBox中的错误 (#3003, #3005)。

  • [glyf] 在TrueType glyf表中添加了对实验性的立方贝塞尔曲线的支持,如glyf v1建议所述 (#2988): https://github.com/harfbuzz/boring-expansion-spec/blob/main/glyf1-cubicOutlines.md

  • 添加了新的qu2cu模块和相关qu2cuPen,这是cu2qu的反向,用于将TrueType二次样条转换为立方贝塞尔曲线 (#2993)。

  • [glyf] 添加了对根据glyf v1规范建议读取和写入可变组合/组件的实验性支持 (#2958): https://github.com/harfbuzz/boring-expansion-spec/blob/main/glyf1-varComposites.md

  • [pens]: 为笔协议的基类添加了addVarComponent方法,笔可以实施以处理varcomponents(默认情况下它们被分解) (#2958)。

  • [misc.transform] 添加了DecomposedTransform类,该类实现了具有单独平移、旋转、缩放、倾斜和变换中心组件的仿射变换 (#2598)

  • [sbix] 确保Glyph.referenceGlyphName已设置;修复了在导出和重新编译sbix表后包含重复字形的错误 (#2984)。

  • [feaLib] 当使用内联表示法指定时,更智能地合并链式单替换到相同的查找中 (#2150, #2974)。

  • [instancer] 将用户输入的轴范围限制为fvar的轴范围 (#2959)。

  • [otBase/subset] 为BaseTable定义__getstate__,以便复制的/pickled“lazy”对象获得自己的OTTableReader进行读取;顺便修复了在python 3.11上包含ClipBoxes的COLRv1表子集时的错误 (#2965, #2968)。

  • [sbix] 正确处理编译时具有“dupe”图形类型的字形 (#2963)。

  • [glyf] endPointsOfContours字段应该是无符号的!感谢behdad发现了FT中最古老的错误之一。可能没有人敢制作包含超过32767个点的字形… (#2957)。

  • [feaLib] 修复了对带有未标记字形的ignore语句的处理,以匹配makeotf行为,它假定第一个字形已标记 (#2950)。

  • 使用black格式化代码,并通过CI检查强制执行新的代码风格 (#2925)。

  • [feaLib] 在构建器中根据OT规范规定的顺序排序名称表条目 (#2927)。

  • [cu2quPen] 添加了Cu2QuMultiPen,它可以以插值兼容的方式一次转换多个轮廓;其方法接受一个列表的元组参数,这些参数通常传递给单个段笔,最后它将转换的轮廓分派给每个笔 (#2912)。

  • [reverseContourPen/ttGlyphPen] 添加输出ImpliedClosingLine选项 (#2913, #2914, #2921, #2922, #2995)。

  • [gvar] 避免在编译时无必要地展开所有字形 (#2918)。

  • [scaleUpem] 修复了CFF2 vsindex被缩放的错误;它不应该这样 (#2893, #2894)。

  • [designspaceLib] 添加DS.getAxisByTag和重构getAxis (#2891)。

  • [unicodedata] 在ot_tag_{to,from}_script中映射Zmth<->math (#1737, #2889)。

  • [woff2] 支持对OVERLAP_SIMPLE glyf标志进行编码/解码 (#2576, #2884)。

  • [instancer] 更新OS/2类和post.italicAngle,当默认值移动到(L4)时 (#2983)。

  • 已停止支持Python 3.7,该版本已达到EOL,fontTools需要3.8+。

  • [instancer] 修复了当规则范围变为默认适用时,instantiateFeatureVariations逻辑的错误 (#2737, #2880)。

  • [ttLib] 将主程序添加到 ttFont 和 ttCollection,用于仅反编译和重新编译输入的字体 (#2869)。

  • [featureVars] 在 LookupList 开头插入 'rvrn' 查找,以解决苹果对 'rvrn' 功能实现的 bug,规范说明应早期处理,但在 macOS 10.15 中它遵循查找顺序 (#2140, #2867)。

  • [instancer/mutator] 如果存在,则移除 'DSIG' 表。

  • [svgPathPen] 在 endPath() 中不要关闭路径,假设是开放的除非调用 closePath() (#2089, #2865)。

4.38.0 (发布日期:2022-10-21)

  • [varLib.instancer] 添加对 L4 实例化的支持,即在保持可变性的同时移动轴的默认值。感谢 Behdad!(#2728, #2861)。现在也可以限制轴的最小/最大值超过当前默认值,例如,一个 wght 字体的 min=100,def=400,max=900,如果您想创建一个只在 500 到 700 之间变化的局部 VF,您现在可以做到。您可以指定两个 min/max 值(wght=500:700),新默认值将设置为最接近当前默认值的最小或最大值(例如,本例中的 500)。或者,您可以指定三个值(例如,wght=500:600:700)以显式指定新默认值。

  • [otlLib/featureVars] 设置一些 Count 值,以便无需编译字体即可更新它们 (#2860)。

  • [varLib.models] 使外推对于两个主模型也有效,其中一个主模型位于默认位置 (#2843, #2846)。将 optional extrapolate=False 添加到 normalizeLocation() (#2847, #2849)。

  • [varLib.cff] 通过不再将 CFF2 增量四舍五入到整数来修复 CFF2 增量的次优打包 (#2838)。

  • [scaleUpem] 在缩放后计算 VarData 中的 numShorts;处理 CFF hintmasks (#2840)。

4.37.4 (发布日期:2022-09-30)

  • [subset] 保持 CPAL 调色板条目标签使用的 nameIDs (#2837)。

  • [varLib] 创建从可变的 CFF2 字体创建字体时避免出现负的 hmtx 值 (#2827)。

  • [instancer] 不要修剪 stat.ElidedFallbackNameID (#2828)。

  • [unicodedata] 更新 Scripts/Blocks 到 Unicode 15.0 (#2833)。

4.37.3 (发布日期:2022-09-20)

  • 修复了调用 (glyf) glyph.draw() 和 drawPoints() 时的问题,其中偏移量没有正确传递;此修复还暴露了第二个错误,其中 lsb 和 tsb 未设置 (#2824, #2825, adobe-type-tools/afdko#1560)。

4.37.2 (发布日期:2022-09-15)

  • [subset] 如果 OT-SVG 表存在,即使 COLR 表已被子集化,也要保留 CPAL 表并尝试修剪未使用的颜色索引;OT-SVG 可能引用 CPAL 表;目前我们假设这是这种情况 (#2814, #2815)。

  • [varLib.instancer] 如果实例化后没有更多的 FeatureVariations,则降低 GPOS/GSUB 版本 (#2812)。

  • [subset] 添加 --no-lazy 以可选地立即加载字体(主要用于简化表延迟加载的调试,没有实际影响)(#2807)。

  • [varLib] 避免仅包含身份映射的空 COLR.DeltaSetIndexMap (#2803)。

  • [feaLib] 允许在同一个 PairPos 子表中存在多个值记录类型(通过提升到最通用的格式);例如,这允许变量和非变量字距调整规则共享相同的子表。这也修复了由于子表过早分割而导致某些字距调整对不可访问的 bug (#2772, #2776)。

  • [feaLib] 通过缓存经常出现的主位置模型来加快 VarScalar (#2798)。

  • [feaLib] 可选地 cythonize feaLib.lexer,加快 FEA 解析 (#2799)。

  • [designspaceLib] 避免处理无界规则条件时崩溃 (#2797)。

  • [post] 如果 post 旧格式 1 无效或不正确使用,则不会崩溃 (#2786)

  • [gvar] 当 TTFont.lazy=False 时不要“懒惰”(预先加载所有字型变化)(#2771)。

  • [TTFont] 添加 normalizeLocation 方法,用于将来自字体定义轴空间的字典(也称为“用户空间”)标准化到归一化空间(-1..+1)。如果字体包含 avar 表,则应用 avar 映射 (#2789)。

  • [TTVarGlyphSet] 支持从 CFF2 可变字形集 (#2784) 中绘制字形实例。

  • [fontBuilder] 如果 cmap 中没有代码点,则不报错 (#2785)。

  • [varLib.plot] 添加了绘制变化模型及其对应于模型主位置的主值集的能力,并将它们绘制到 pyplot 图形中 (#2767)。

  • [Snippets] 添加了 statShape.py 脚本,用于将字形的统计形状绘制为椭圆(需要 pycairo)(baecd88)。

  • [TTVarGlyphSet] 本地实现 drawPoints,避免通过 SegmentToPointPen 进行转换 (#2778)。

  • [TTVarGlyphSet] 修复了在多次绘制复合字形时,其组件会发生偏移的错误;需要额外的复制 (#2774)。

4.37.1(发布日期:2022-08-24)

  • [subset] 修复了在子集化 HVARVVAR 表的 VarStore 时引入的回归问题,其中会抛出 AttributeError: subset_varidxes 异常,因为一个显然未使用的导入语句(具有将 subset_varidxes 方法动态绑定到 VarStore 类的副作用)在无关的 PR 中意外删除 (#2679, #2773)。

  • [pens] 添加了 cairoPen (#2678)。

  • [gvar] 通过不解析整个 glyf 表来更懒地读取 gvar (#2771)。

  • [ttGlyphSet] 通过适配器笔使 drawPoints(pointPen) 方法也能用于 CFF 字体 (#2770)。

4.37.0(发布日期:2022-08-23)

  • [varLib.models] 回滚了在 v4.36.0 中添加了对“窄帐篷”支持 (#2717) 的 PR,因为它引入了回归 (#2764, #2765)。一旦找到解决该错误的方案,它将在未来的版本中恢复。

  • [cff.specializer] 修复了字符串通用化器中 blend 运算符的问题 (#2750, #1975)。

  • [varLib.models] 添加了对外推的支持 (#2757)。

  • [ttGlyphSet] 确保新添加的 _TTVarGlyphSet 继承自 _TTGlyphSet,以保持与现有 API 的向后兼容性 (#2762)。

  • [kern] 允许编译具有超过 64k 个条目的旧版 kern 表 (d21cfdede)。

  • [visitor] 添加了新的访问者 API,用于遍历对象的树并基于属性类型进行分发:cf. fontTools.misc.visitorfontTools.ttLib.ttVisitor。添加了使用后者的 fontTools.ttLib.scaleUpem 模块,该模块用于更改字体单位每 em 值并相应地缩放所有相关字段 (#2718, #2755)。

4.36.0(发布日期:2022-08-17)

  • [varLib.models] 在可能的情况下使用更简单的模型,该模型在两个积极“合作”的轴(两个轴在非零位置都有主轴)具有完整的中间值集时生成更窄的“帐篷”(区域,主支持)。该简单算法产生的重叠区域更少,并且在峰值位置相对于通用求解器具有更好的舍入行为,总是精确匹配中间主轴,而不是最多 0.5 个单位偏移。当需要 100% 的度量兼容性时,这可能很有用 (#2218, #2717)。

  • [feaLib] 当显式不请求时,移除关于 GDEF 未构建的警告;即使不请求,也不要无条件地构建 (#2744,也解决了 #2747)。

  • [ttFont] TTFont.getGlyphSet 方法现在支持选择表示可变字体实例的位置(支持通过 normalized=False 参数进行用户缩放和标准化轴坐标)。目前这仅适用于 TrueType 类型的可变字体 (#2738)。

4.35.0(发布日期:2022-08-15)

  • [otData/otConverters] 添加了对‘有偏’ PaintSweepGradient 起始/结束角度的支持,以匹配最新的 COLRv1 规范 (#2743)。

  • 修复了在同时固定一个轴并限制后续轴的范围时,在 _instantiateFeatureVariations 中的bug;在后续步骤中使用了错误的轴标签(因为在先前的步骤中更新了记录的轴索引Idx,但在后续步骤中使用的是旧的轴顺序)(#2733, #2734)。

  • 当脚本标签长度小于4个字符时,使用空格填充([mtiLib])(#1727)。

  • 在重复的符号名称中使用 '.' 而不是 '#' ([merge])(#2742)。

  • 添加了对懒加载符号变体的支持([gvar])(#2741)。

  • build_many 中,我们忘记将 colr_layer_reuse 参数传递给 build 方法([varLib])(#2730)。

  • 添加了一个主程序,用于打印输入文本的SVG([svgPathPen])(6df779fd)。

  • 在优化值中修复了偏移量错误;之前的代码与上面的代码块不匹配([cffLib.width])(2963fa50)。

  • 支持通过可选的 glyphsLib 读取 .designspace 和 .glyphs 文件([varLib.interpolatable])。

  • 当可用时,使用 Cython 编译一些模块,并在从源代码构建/安装 fonttools:[varLib.iup](35%加速),[pens.momentsPen](使 [varLib.interpolatable] 加速3倍)(35% faster), [pens.momentsPen](使 [varLib.interpolatable] 3x faster)。

  • 允许为VF构建功能而不构建GDEF表(例如,仅构建GSUB);当需要GDEF但未请求时发出警告([feaLib])(#2705, 2694)。

  • 修复了当 uharfbuzz < 0.23.0 且 'repack' 方法缺失时的 AttributeError ([otBase])(32aa8eaf)。当 uharfbuzz>=0.30.0 时,使用新的 uharfbuzz.repack_with_tag,使表特定优化能够在重新打包期间执行(#2724)。

  • 默认报告所有符号([statisticsPen])(4139d891)。避免除以零([statisticsPen])(52b28f90)。

  • 向 FeatureLibError 异常中添加了缺失的必需参数([feaLib])(#2693)

  • 修复了错误报告期间的错误([varLib.merge])(#2689)。修复了未定义的 NotANone 变量([varLib.merge])(#2714)。

4.34.4 (发布于 2022-07-07)

  • 修复了 varLib/merger.py 中的拼写错误,这会导致在合并包含超过255层 COLR 符号时出现 NameError(#2685)。

4.34.3 (发布于 2022-07-07)

  • 当没有 STAT 数据时,不要构建错误的 PS 名称([designspaceLib])(#2684)

4.34.2 (发布于 2022-07-06)

  • 修复了在 GPOS/GDEF 中对 varidxes 进行子集化时关于 NO_VARIATION_INDEX 的 KeyError 异常([varStore/subset])(a08140d)。

4.34.1 (发布于 2022-07-06)

  • 当优化 HVAR/VVAR VarStore 时,使用 use_NO_VARIATION_INDEX=False 以避免在 AdvWidthMap、RsbMap、LsbMap 映射中包含 NO_VARIATION_INDEX,这会将 VarIdx 宽度推至最大(4字节),这是不希望的。这也修复了在 use_NO_VARIATION_INDEX=True 时尝试子集化 varfont 后发生的硬崩溃([instancer])(#2673)。

4.34.0 (发布于 2022-07-06)

  • 在剪切实例时,在 head 和 OS/2 表中设置 RIBBI 位,当子族名称ID=2包含类似于“斜体”或“粗体”的字符串时([instancer])(#2673)。

  • 添加了包含遍历 otData 表树的方法的模块([otTraverse])(#2660)。

  • 通过省略无操作条目来减少 DeltaSetIndexMap TTX 导出的冗余([otTables])(#2660)。

  • 添加了禁用 PaintColrLayers 从 LayerList 重新使用层的选项([colorLib.builder])(#2660)。

  • 添加了对将多个主 COLRv1 表合并为单个变量 COLR 表的支持([varLib])(#2660, #2328)。具有相同名称的不同主表的基本颜色符号必须具有相同的绘图图结构(包括层数、调色板索引、颜色线停止数、图中的每个级别的相应绘图格式),但可以在可变字段中有所不同(例如,PaintSolid.Alpha)。当发生这种情况时,将生成 PaintVar* 表,并将 VarStore/DeltaSetIndexMap 添加到变量 COLR 表中。对于非默认主表,可以是“稀疏”的,即省略默认主表中存在的某些颜色符号。

  • 让解析器设置之前预留的名称ID 1 到 6 (#2675)。

  • [varLib.varStore] 在优化器和实例化器中支持 NO_VARIATION_INDEX。

  • [feaLib] 在解析结束时一次性显示所有缺失的符号 (#2665)。

  • [varLib.iup] 重写强制设置条件并限制 DP 循环回环长度 (#2651)。对于 Noto Sans,IUP 时间从 23 秒降至 9 秒,最终字体尺寸略有增加。这基本上将算法从 O(n^3) 转换为 O(n)。

  • [featureVars] 报告关于替换规则中缺失的符号 (#2654)。

  • [mutator/instancer] 添加了 CLI 标志 –no-recalc-timestamp (#2649)。

  • [SVG] 允许 SVG OT 表中的单个 SVG 文档在未压缩的 SVG 上进行压缩,并记住在往返于 ttx 时的状态。SVG.docList 现在是一个包含额外 compressed 字段的 SVGDocument namedtuple-like dataclass 列表,而不再是裸的 3 元组 (#2645)。

  • [designspaceLib] 使用 hasattr() 检查描述符类型,以允许不继承默认描述符的自定义类 (#2634)。

  • [subset] 启用扩展查找子表的共享,以支持 harfbuzz 打包 (#2626)。更新了表格打包从 harfbuzz 返回到 fontTools 的方式 (#2668)。

  • [subset] 根据当前 Harfbuzz 更新默认特征标记 (#2637)。

  • [svgLib] 修复了用于实数的正则表达式,以支持例如 1e-4,以及 1.0e-4。支持解析弧命令中的负 rx、ry (#2596, #2611)。

  • [subset] 修复了当 ValueFormat=0 时子集 SinglePosFormat2 的问题 (#2603)。

4.33.3 (发布日期 2022-04-26)

  • [designspaceLib] 在 deepcopyExceptFonts 方法中修复了拼写错误,防止字体引用被转移。修复了数据类 Range__post_init__ 魔法方法的名称中的另一个拼写错误 (#2600)。

4.33.2 (发布日期 2022-04-22)

  • [otBase] 当 harfbuzz 无法序列化时,使日志更简洁。不要在第一次失败时退出,而应继续尝试使用纯 Python 序列化器修复偏移量溢出错误,即使将 USE_HARFBUZZ_REPACKER 选项明确设置为 True。这对于具有相对较大表的字体来说是正常的,至少直到 hb.repack 实现了适当的表分割。

4.33.1 (发布日期 2022-04-22)

  • [otlLib] 将 FONTTOOLS_GPOS_COMPACT_MODE 环境变量放回,以修复 v4.33.0 中引入的 ufo2ft(以及 fontmake)的回归 (#2592, #2593)。这已被弃用,将在 ufo2ft 更新到使用新的配置设置后删除。

4.33.0 (发布日期 2022-04-21)

  • [OS/2 / merge] 在使用 fontTools.merge 合并字体后自动重新计算 OS/2.xAvgCharWidth (#2591, #2538)。

  • [misc/config] 添加了 fontTools.misc.configTools 模块,一个通用配置系统 (#2416, #2439)。添加了 fontTools.config 模块,它是一个使用上述 configTools 的特定于 fontTools 的配置系统。将 Config 对象附加到 TTFont

  • [otlLib] 使用新的配置系统替换了 GPOS 压缩级别的环境变量,并提供了等效选项。

  • 将格式版本提升到5.0(#2436)。添加了离散轴、可变字体、STAT信息,实例的设计空间或用户空间位置。添加了fontTools.designspaceLib.split模块,用于将设计空间分割成子空间,这些子空间可以进行插值,并代表文档中列出的可变字体。使实例名称可选,并允许从STAT数据中计算它们。添加了fontTools.designspaceLib.statNames模块。允许实例与先前定义的STAT标签具有相同的位置。弃用了一些属性:SourceDescriptorcopyLibcopyInfocopyGroupscopyFeaturesInstanceDescriptorkerninginfoglyphs:使用规则或稀疏源。对于两者,location:使用更明确的设计位置。注意:所有这些都是软弃用,现有代码应继续工作。更新了Python方法和XML格式的文档。

  • 添加了build_many,可以从单个设计空间文档构建多个可变字体(#2436)。添加了fontTools.varLib.stat模块,用于从设计空间文档构建STAT表。

  • uharfbuzz Python绑定可用时,尝试使用Harfbuzz Repacker对GSUB/GPOS表进行打包(#2552)。通过将“fontTools.ttLib.tables.otBase:USE_HARFBUZZ_REPACKER”配置选项设置为False来禁用它。如果显式设置为True,但无法导入uharfbuzz或由于任何原因失败序列化,将引发错误(ImportError或uharfbuzz错误)。

  • 确保对CFF2 charstrings调用pen.closePath()(#2577)。在T2OutlineExtractor中处理隐式CFF2 closePath(#2580)。

4.32.0(发布日期:2022-04-08)

  • 为解决Apple CoreText中的错误,禁用GPOS7优化,目前始终强制执行Chaining GPOS8(#2540)。

  • Glyph.draw()添加了outputImpliedClosingLine=False参数,以控制PointToSegmentPen的行为(6b4e2e7)。

  • 检查错误的轮廓起始点(#2571)。

  • 删除了遗留的GlobalState类,并修复了对TopDictIndex()的调用(#2569,#2570)。

  • 实例化后,如果AxisValueArray为空,则清除它(#2563)。

4.31.2(发布日期:2022-03-22)

  • 修复了GPOS SinglePos值的实例化(#2555)。

4.31.1(发布日期:2022-03-18)

  • 修复了当glyph id属性位于根<svg>元素时对OT-SVG的子集操作(#2553)。

4.31.0(发布日期:2022-03-18)

  • 修复了“ResourceWarning: unclosed file”警告(#2549)。

  • 处理具有valueformat=0的SinglePos合并(#2550)。

  • 在调用TTFont.setGlyphOrder()时更新glyf的glyphOrder(#2544)。

  • 添加了ensureDecompiled方法,以加载所有表,而不考虑lazy属性(#2551)。

  • 添加了iterSubTable方法,以遍历类型为BaseTable的BaseTable子项;对于遍历otTables树很有用(#2551)。

4.30.0(发布日期:2022-03-10)

  • 添加了显示gvar所构建的字符名称的调试记录器(#2542)。

  • 修复了FoundANoneUnsupportedFormat异常中的未定义名称(ac4d5611)。

  • [otlLib.builder] 向 buildStatTabe 函数添加了 windowsNamesmacNames (bool) 参数,以便可以选择只添加这两个集合中的一个或两个 (#2528)。

  • [t1Lib] 添加了重新创建 PostScript 流的能力 (#2504)。

  • [name] 添加了 getFirstDebugNamegetBest{Family,SubFamily,Full}Name 方法 (#2526)。

4.29.1 (发布日期:2022-02-01)

  • [colorLib] 修复了径向渐变中内嵌的起始/结束圆的舍入问题 (#2521)。

  • [freetypePen] 处理自动计算缓冲区宽高时的旋转/倾斜变换;当缺少 moveTo 时抛出 PenError (#2517)

4.29.0 (发布日期:2022-01-24)

  • [ufoLib] 修复了非法字符和扩展了保留文件名 (#2506)。

  • [COLRv1] 在 LayerListBuilder 中不要发出无用的 PaintColrLayers 长度为 1 (#2513)。

  • [ttx] 在 Windows 上移除了过时的 waitForKeyPress 方法 (#2509)。

  • [pens] 添加了使用 freetype-py 和笔协议进行轮廓路径光栅化的 FreeTypePen (#2494)。

  • [unicodedata] 更新了脚本方向列表到 Unicode 14.0 (#2484)。将 unicodedata2 依赖项升级到 14.0 (#2499)。

  • [psLib] 修复了 suckfontfontName 的类型 (#2496)。

4.28.5 (发布日期:2021-12-19)

  • [svgPathPen] #2471 的延续:确保现在所有 str() 的出现都替换为用户定义的 ntos 可调用。

  • [merge] 代码重构为子模块,包括多个错误修复和改进:修复了重复符号解析 GSUB-查找生成代码;在空符号宽度比较中使用容差;忽略默认可忽略符号的空间;将缺少 GSUB 的重复解析从 assert 降级为 warn;添加了 –drop-tables 选项 (#2473、#2475、#2476)。

4.28.4 (发布日期:2021-12-15)

  • [merge] 正确合并 GDEF 标记集 (#2474)。

  • [feaLib] 当构建失败时,fontTools feaLib 脚本将退出错误代码 (#2459)

  • [svgPathPen] 添加了 ntos 选项来自定义数字格式(例如舍入) (#2471)。

  • [subset] 加速大 CFF 字体的子集处理 (#2467)。

  • [otTables] 假设将查找提升到扩展以提高编译速度。如果查找 N 的偏移量太大而无法适合 ushort,那么查找 N+1 的偏移量也将太大,因此我们将从查找 N 开始的所有查找提升到扩展 (#2465)。

4.28.3 (发布日期:2021-12-03)

  • [subset] 修复了在子集化 COLR 表时的错误,其中不完整的层记录指向丢失的符号被保留,导致在编译时出现 struct.error。确保跟随 COLR 符号关闭的 glyf 符号关闭不会影响 COLR 表的子集化 (#2461、#2462)。

  • [docs] 完全记录 cmapglyf 表 (#2454、#2457)。

  • [colorLib.unbuilder] 通过删除不再存在的参数修复 CLI (180bb1867)。

4.28.2 (发布日期:2021-11-22)

  • [otlLib] 在构建覆盖率时删除重复项 (#2433)。

  • [docs] 添加了询问配置 (#2443)。

  • [docs] 移除了关于缺少 calcChecksum 的可选参数 “start” 的注释 (#2448)。

  • [cu2qu/cli] 适应最新的 ufoLib2 (#2449)。

  • [subset] 支持子集化 SVG 表,默认情况下将其从要删除的表列表中删除 (#534)。

  • [subset] 添加 --pretty-svg 选项以美化打印 SVG 表内容 (#2452)。

  • [merge] 支持合并 CFF 表(CID 密钥的 CFF 仍然不支持) (#2447)。

  • [merge] 支持 --output-file (#2447)。

  • [docs] 将表文档拆分为单独的页面 (#2444)。

  • 【feaLib】禁止空类(#2446)。

  • 【文档】改进了 fontTools.ttLib.ttFont 的文档(#2442)。

4.28.1(发布于2021-11-08)

  • 【subset】当没有 LayerList(可选)时,修复了遍历颜色字形 Paint 图时出现的 AttributeError(#2441)。

4.28.0(发布于2021-11-05)

  • 移除了对 Python 3.6 的支持,要求 Python 3.7 或更高版本(#2417)。

  • 【ufoLib/glifLib】通过使用集合而不是列表来加速文件名冲突检查(#2422)。

  • 【subset】如果可选的 ClipList 和 LayerList 为 None(空),则不会崩溃(#2424, 2439)。

  • 【OT-SVG】移除了对旧版已弃用的版本 1 和嵌入式调色板的支持,这些调色板从未正式成为 OpenType SVG 规范的一部分。在编译时,重复使用相同的偏移量到 SVG 文档(#2430)。

  • 【feaLib】添加了对可变特性文件语法的支持。这是实验性的,直到它在 Adobe FEA 规范中最终确定之前可能会有所变化(#2432)。

  • 【unicodedata】将 Scripts/ScriptExtensions/Blocks 更新到 UnicodeData 14.0(#2437)。

4.27.1(发布于2021-09-23)

  • 【otlLib】修复了链式上下文查找构建器溢出的错误(#2404, #2411)。

  • 【bezierTools】修复了两个浮点数错误:一个是在计算几乎水平/垂直线上一点的 t 值时;另一个是在计算曲线和线之间的交点时(#2413)。

4.27.0(发布于2021-09-14)

  • 【ttLib/otTables】清理了虚拟 GID 处理:允许在 CoverageClassDef 读取器中使用虚拟 GID;从 TTFont 构造函数中移除了未使用的 allowVID 参数,并在 TTFont.getGlyphID 方法中移除了 requireReal 参数。使 TTFont.setGlyphOrder 清晰地反转 glyphOrder 映射,并假设内部属性 glyphOrder 从不修改除 setGlyphOrder 之外;添加了 TTFont.getGlyphNameManygetGlyphIDMany(#1536, #1654, #2334, #2398)。

  • 【py23】移除了内部对 fontTools.py23 模块的调用,以解决导入 fontTools 的客户端代码中的弃用警告(#2234, #2399, #2400)。

  • 【subset】修复了在字体懒加载时加载 COLRv1 剪裁框的子集(#2408)。

4.26.2(发布于2021-08-09)

  • 【otTables】添加了缺失的 CompositeMode.PLUS 操作符(#2390)。

4.26.1(发布于2021-08-03)

  • 【transform】将 transformVectortransformVectors 方法添加到 Transform 类。与 transformPoint 类似,但忽略平移部分(#2386)。

4.26.0(发布于2021-08-03)

  • 【xmlWriter】对于 newlinestr,默认使用 "\n" 而不是平台特定的 os.linesep(#2384)。

  • 【otData】定义 COLRv1 ClipList 和 ClipBox(#2379)。

  • 【removeOverlaps/instancer】添加了 –ignore-overlap-errors 选项,以解决 Skia PathOps.Simplify 错误(#2382, #2363, google/fonts#3365)。

  • 注意:这将是最后一个支持 Python 3.6 的版本。FontTools 从下一个版本开始将需要 Python 3.7 或更高版本(#2350)

4.25.2(发布于2021-07-26)

  • 【COLRv1】对同步最新 COLRv1 草案规范的各种更改。特别是:定义 COLR.VarIndexMap,移除/内联 ColorIndex 结构体,向 PaintVar* 表添加 VarIndexBase;添加了精简精度专用变换 Paint;将角度定义为半圆的分数,以 F2Dot14 编码;对所有 Paint 中心坐标使用 FWORD(int16);将 PaintTransform 修改为具有 Affine2x3 的偏移量;

  • 【ttLib】在导入 XML 时,只有当字体没有读取器且为空时才设置 sfntVersion(#2376)

4.25.1(发布于2021-07-16)

  • 【ttGlyphPen】修复了 TTGlyphPointPen 中的错误,其中开放轮廓(即以 segmentType “move” 开始)会引发 NotImplementedError。现在它们被处理为如果它们是封闭的,就像 TTGlyphPen 一样(#2364, #2366)。

4.25.0(发布于2021-07-05)

  • 在tfmLib中添加了新的库以解析TeX字体度量(TFM)文件 (#2354)。

  • 在python < 3.7中,使共享元组顺序具有确定性,因为Counter(dict的子类)不会记住插入顺序 (#2351, #2353)。

  • 在otData中将COLRv1结构重命名为移除‘v1’后缀以匹配更新的规范草案:‘LayerV1List’ -> ‘LayerList’,‘BaseGlyphV1List’ -> ‘BaseGlyphList’,‘BaseGlyphV1Record’ -> ‘BaseGlyphPaintRecord’ (#2346)。添加了8个新的PaintScale*表:有/无中心,均匀与非均匀。在PaintRotatePaintSkew中添加了*AroundCenter变体:默认版本不再有centerX/Y,而是默认为原点。PaintRotatePaintSkewPaintComposite格式已重新编号。注意:这些是破坏性更改;使用实验性COLRv1 API的客户必须进行更新 (#2348)。

  • 允许GuessSmoothPointPen接受一个容差。修复了调用math.atan2时x/y参数颠倒的问题。将代码与fontPens同步 (#2344)。

  • 修复了解析包含字符串Data数组末尾额外垃圾的post表格式2.0 (#2314)。

  • 除非有包含FeatureParams表的‘size’,否则删除空特征 (#2324)。

  • 在otlLib中添加了otlLib.optimize模块;添加了GPOS压缩算法。可以使用fonttools otlLib.optimize或使用片段compact_gpos.py在现有字体上运行压缩。实验性支持在编译时使用环境变量压缩字体,但以后可能会删除 (#2326)。

4.24.4(发布日期:2021-05-25)

  • 在实例化包含GPOS ValueRecords且具有Device表但没有相应非Device值(例如,没有XAdvance的XAdvDevice)的VF时修复了AttributeError。如果没有明确设置,则假定后者为0 (#2323)。

4.24.3(发布日期:2021-05-20)

  • 在发生偏移量溢出时修复了在拆分LigatureSubst、MultipleSubst和AlternateSubst子表时方法的AttributeError。在v4.22.0中删除了Format属性 (#2319)。

4.24.2(发布日期:2021-05-20)

  • 修复了TTGlyphPen glyphSet参数的打字注释 (#2315)。

  • 修复了两个DeprecationWarning:无效的转义序列实例 (#2311)。

4.24.1(发布日期:2021-05-20)

  • 修复了SinglePos子表具有None Value(ValueFormat 0)时的AttributeError (#2312, #2313)。

4.24.0(发布日期:2021-05-17)

  • 添加了类似于TTGlyphPenttGlyphPen.TTGlyphPointPen (#2205)。

4.23.1(发布日期:2021-05-14)

  • 修复了在子集包含同时包含v0和v1颜色符号的COLR表时,当子集仅请求v1符号时出现的KeyError;我们没有剪枝表中的v0部分 (#2308)。

  • 在CORLv1中将LayerV1List属性设置为None,当它为空时,它是可选的 (#2308)。

4.23.0(发布日期:2021-05-13)

  • 在Windows上允许使用\\UNC绝对路径 (#2299, #2306)。

  • 修复了在具有不正确参数时引发VarLibMergeError的bug (#2300)。

  • 允许用NULL替换字形类以删除多个字形 (#2303)。

  • 修复了在getPhantomPoints中抛出的NameError异常 (#2295, #2305)。

  • 如果使用浮点数时失败,则在第一次使用浮点数失败后重试pathops.simplify,以解决难以调试的Skia的罕见bug (#2288)。

  • 添加了对构建、读取、写入和优化用于COLRv1表中的32位ItemVariationStore的支持 (#2285)。

  • 为int类型添加了数组读取器/写入器 (#2285)。

  • [feaLib] 允许在“值在末尾”的上下文中使用多个前瞻字符/类定位 (#2293, #2294)。

  • [COLRv1] 默认 varIdx 应为 0xFFFFFFFF (#2297, #2298)。

  • [pens] 让 RecordingPointPen 实际传递标识符;用显式的 PenError 异常替换断言 (#2284)。

  • [mutator] 对 CF2 字体也进行 lsb 四舍五入 (#2286)。

4.22.1 (发布于 2021-04-26)

  • [feaLib] 如果查找块定义是空的,则跳过对命名查找的引用,类似于 makeotf。这也修复了在生成 aalt 功能时发生的 AttributeError (#2276, #2277)。

  • [subset] 修复了 Device 表格的 --no-hinting 实现中的错误 (#2272, #2275)。之前的代码在请求无提示时始终丢弃 Device 表格,但一些 Device 表格(DeltaFormat=0x8000)也用于编码变化索引,需要保留。

  • [otBase] 修复了解析 MVAR 表格时获取 ValueRecordSize 的错误 (#2273, #2274)。

  • [varLib/glyf/gvar] 优化并简化了 GlyphCoordinatesTupleVariation 类,尽可能使用 bytearray,重构了幽灵点计算。我们测量到加载主 ttfs、构建 gvar 和保存的总时间加快了约 30% (#2261, #2266)。

  • [subset] 修复了存在 0xFFFF 时修剪未使用 CPAL 调色板时的 AssertionError (#2257, #2259)。

4.22.0 (发布于 2021-04-01)

  • [ttLib] 从 Coverage、ClassDef、SingleSubst、LigatureSubst、AlternateSubst、MultipleSubst 中移除 .Format (#2238)。注意:这将改变您的 TTX 导出!

  • [misc.arrayTools] 将 Vector 移至自己的子模块,并重写为元组子类 (#2201)。

  • [docs] 为 varLib 添加术语部分 (#2209)。

  • [varLib] 将舍入移动到 VariationModel,以避免多个 delta 导致的错误累积 (#2214)

  • [varLib] 用更人性化的术语解释合并错误 (#2223, #2226)

  • [otlLib] 纠正一些文档 (#2225)

  • [varLib/otlLib] 允许在保存 GPOS PairPos2 之前合并到 VariationFont (#2229)

  • [subset] 改进了 PairPosFormat2 子集 (#2221)

  • [ttLib] TTFont.save: 尽可能晚地创建磁盘上的文件 (#2253)

  • [cffLib] 添加了缺失的 CFF2 字典运算符 LanguageGroup 和 ExpansionFactor (#2249) 注意:这将改变您的 TTX 导出!

4.21.1 (发布于 2021-02-26)

  • [pens] 撤销了将 AbstractPenAbstractPointPen 转换为抽象基类的破坏性更改 (#2164, #2198)。

4.21.0 (发布于 2021-02-26)

  • [feaLib] 在 asFea() 中缩进锚点语句,以使其更易于阅读和 diff (#2193)。

  • [pens] 将 AbstractPenAbstractPointPen 转换为抽象基类 (#2164)。

  • [feaLib] 添加了对从 AFDKO 功能文件解析和构建 STAT 表的支持 (#2039)。

  • [instancer] 添加了使用 STAT 表的轴值更新生成的实例名称表的功能 (#2189)。

  • [bezierTools] 添加了计算 bezier 点在时间上的函数,以及线-线、曲线-线和曲线-曲线的交点函数 (#2192)。

4.20.0 (发布于 2021-02-15)

  • [COLRv1] 添加了 unbuildColrV1,将 COLRv1 otTables 解构为原始可 json-化的数据结构;这是 buildColrV1 的逆操作 (#2171)。

  • [feaLib] 允许使用 sub X by NULL 序列删除一个字符 (#2170)。

  • [arrayTools] 修复了 Vector 除法 (#2173)。

  • [COLRv1] 定义了新的 PaintSweepGradient (#2172)。

  • Paint.Format枚举类从Paint类定义中移出,现更名为PaintFormat。它曾与画笔实例的Format属性冲突,因此破坏了依赖于魔法__getattr__(#2175)的COLR表的懒加载。

  • 将手编的构建函数替换为otData驱动的动态实现(#2181)。

  • 定义额外的静态(非变量)Paint格式(#2181)。

  • 为subset添加了对COLR v1和CPAL表的子集支持(#2174,#2177)。

  • 允许setupFvar可选地接受designspaceLib.AxisDescriptor对象。添加了新的setupAvar方法。支持轴和命名实例的本地化名称(#2185)。

4.19.1(发布于2021-01-28)

  • 压缩后,初始离曲线点(具有重叠标志)现在仍然是一个离曲线点。

4.19.0(发布于2021-01-25)

  • 处理与“strict”不同的errors参数的自定义扩展mac编码(#2137,#2132)。

  • 当脚本缺少所需的默认语言系统时,提供更好的错误信息(#2154)。

  • 避免由于起始圆几乎接触结束圆的边缘而导致的PaintRadialGradient.c0四舍五入时的突然变化(#2148)。

  • 支持将无限列表的paint作为255-ary树构建PaintColrLayers表(#2153)。

  • 当删除所有非BMP字符时,修剪冗余的格式-12 cmap子表(#2146)。

  • 当引用的组件缺失时,抛出MissingComponentError而不是裸的KeyError(#2145)。

4.18.2(发布于2020-12-16)

  • 实现了PaintTranslate画笔格式(#2129)。

  • 修复了varLib.cff中的未绑定局部变量错误(#1787)。

  • 当某些字形出现多次时,不会在创建OpenType类定义时崩溃(#2125)。

4.18.1(发布于2020-12-09)

  • LayerV1ListBuilder进行了速度优化(#2119)。

  • 修复了interpolate_cff2_metrics中缺失的制表符(0957dc7a)。

4.18.0(发布于2020-12-04)

  • PaintRotatePaintSkew更新到最新草案(#2118)。

  • 为PyPy支持新的brotlicffi绑定(#2117)。

  • GlyphSet添加了expectContentsFile参数,用于读取现有UFO时,以符合指定要求,即字体集中必须存在contents.plist文件(#2114)。

  • 允许在--layout-scripts选项中使用LangSys标记(#2112)。例如:--layout-scripts=arab.dflt,arab.URD,latn;这将为arab脚本保留DefaultLangSysURD语言,并为latn脚本保留所有语言。

  • 允许检查UFO;报告开放路径、不存在的字形;添加一个--json选项来生成机器可读的不兼容性列表。

  • 添加了QuartzPen以在macOS上从字形轮廓创建CGPath。需要pyobjc(#2107)。

  • 您可以将FONTTOOLS_LOOKUP_DEBUGGING=1导出以启用存储在Debg表中的功能文件调试信息(#2106)。

  • 尽可能构建更有效的格式1和格式2上下文查找(#2101)。

4.17.1(发布于2020-11-16)

  • 在4.17.0版本中修复了构建COLR v0表的回归问题;当颜色层存储在UFO库的plist中时,我们无法区分元组与列表,因此我们需要接受任意类型(e5439eb9,googlefonts/ufo2ft/issues#426)。

4.17.0(发布日期:2020-11-12)

  • [colorLib/otData] 更新到最新的COLR v1规范草案 (#2092)。

  • [svgLib] 修复了当圆弧命令的布尔标志没有用空格或逗号分隔时的解析错误 (#2094)。

  • [varLib] 如果默认字符不为空,则将空的非默认字符解释为“缺失” (#2082)。

  • [feaLib.builder] 只有当Builder.buildLookups_ 协作时,才缓存Debg的查找位置 (#2065, #2067)。

  • [varLib] 修复了VarStore优化器中的错误 (#2073, #2083)。

  • [varLib] 为自定义feavar特征标签添加设计空间库键 (#2080)。

  • 添加了从psautohint改编的HashPointPen。使用此笔,可以计算字符的哈希值,这可以用于以后检测字符变化 (#2005)。

4.16.1(发布日期:2020-10-05)

  • [varLib.instancer] 修复了在实例化具有GSUB表1.1且FeatureVariations属性存在但设置为None的VF时抛出的TypeError异常——表示可选的FeatureVariations缺失 (#2077)。

  • [glifLib] 即使关闭验证,也要求point元素的x和y属性为必需的,并在发生这种情况时引发有意义的GlifLibError消息 (#2075)。

4.16.0(发布日期:2020-09-30)

  • [removeOverlaps] 添加了新模块和removeOverlaps函数,该函数合并了TrueType字符中的重叠轮廓和组件。它需要skia-pathops模块。请注意,删除重叠将使TrueType提示无效 (#2068)。

  • [varLib.instancer] 添加了--remove-overlaps命令行选项。现在,instantiateVariableFont中的overlap选项采用OverlapMode枚举:0: KEEP_AND_DONT_SET_FLAGS,1: KEEP_AND_SET_FLAGS(默认),和2: REMOVE。后者相当于在生成的静态实例上调用removeOverlaps。该选项继续接受bool值以保持向后兼容。

4.15.0(发布日期:2020-09-21)

  • [plistlib] 为plistlib模块添加了类型注解。在CI上自动设置mypy静态类型检查器 (#2061)。

  • [ttLib] 实现了私有的Debg表,一个反向DNS命名空间的JSON字典。

  • [feaLib] 可选地向Debg表中添加条目,包括原始查找名称(如果有),特征名称/脚本/语言组合(如果有),以及原始源文件名和行位置。使用Debg表中的信息注释ttx输出的查找 (#2052)。

  • [sfnt] 默认情况下在SFNTReader中禁用了校验和检查 (#2058)。

  • [Docs] 记录mtiLib模块 (#2027)。

  • [varLib.interpolatable] 为每个节点的轮廓节点数和操作类型添加了检查 (#2054)。

  • [ttLib] 添加了注册自定义表打包/解包类的API (#2055)。

4.14.0(发布日期:2020-08-19)

  • [feaLib] 允许在LookupFlags定义中使用匿名类 (#2037)。

  • [Docs] 更好地记录DesignSpace规则处理顺序 (#2041)。

  • [ttLib] 修复了maxp.maxComponentDepth计算中的21年旧错误 (#2044, #2045)。

  • [varLib.models] 修复了CLI入口点中拼写的错误参数名称 (81d0042a)。

  • [subset] 在子集GSUB v1.1时,通过检查可选的FeatureVariations表是否存在修复了TypeError (#e63ecc5b)。

  • [Snippets] 添加了一个片段,展示了如何分解TTF中的字符 (#2030)。

  • [otlLib] 在适当的情况下生成GSUB类型5和GPOS类型7上下文查找 (#2016)。

4.13.0(发布日期:2020-07-10)

  • [feaLib/otlLib] 将查找子表构建器从feaLib移动到otlLib;重构了一些通用代码 (#2004, #2007)。

  • 文档][otlLib模块 (#2009)。

  • 修复了glifLib中某些UFO .glif文件名在大小写不敏感的文件系统中冲突的bug (#2001, #2002)。

  • 根据规范草案的变化更新了COLRv1实现: (#2008, googlefonts/colr-gradients-spec#24)。

4.12.1 (发布日期:2020-06-16)

  • [_n_a_m_e] 修复了addMultilingualName中的一个字符名称错误。仅尝试从bytes字符串中恢复格式错误的UTF-16数据,而不是从unicode str中 (#1997, #1998)。

4.12.0 (发布日期:2020-06-09)

  • [otlLib/varLib] 确保STAT和fvar表中的AxisNameID大于255,符合OpenType规范 (#1985, #1986)。

  • 文档][fontTools.misc]包中更多模块: filenamesfixedToolsintToolsloggingToolsmacCreatorTypemacResplistlib (#1981)。

  • [OS/2] 不计算整个Unicode码点集,使用更快的内存效率更高的范围和二分查找来计算 (#1984)。

  • [voltLib] 支持将抽象语法树作为VOLT数据写入 (#1983)。

  • [voltLib] 接受DO_NOT_TOUCH_CMAP关键字 (#1987)。

  • [subset/merge] 修复了一个涉及私有辅助类的命名空间冲突 (#1955)。

4.11.0 (发布日期:2020-05-28)

  • [feaLib] 在遇到include语句时,在解析器和IncludingLexer上引入了includeDir参数,以明确指定要搜索的目录 (#1973)。

  • [ufoLib] 在读取组时,静默删除同一核群内的重复字形 (#1970)。

  • [ttLib] 在反编译COLRv1时设置COLR表版本 (提交 9d8a7e2)。

4.10.2 (发布日期:2020-05-20)

  • 修复了在读取TTC标题时出现的NameError: SimpleNamespace错误。这种回归是在移除py23星号导入后随着4.10.1引入的 (#1962, #1967)。

4.10.1 (发布日期:2020-05-19)

  • 当TTFont使用lazy=True选项加载并因此保留对外部文件的引用时,使SFNTReader可序列化 (#1962, #1967)。

  • 修复了[feaLib.ast]中ChainContextPosStatementChainContextSubstStatement类的向后兼容性(在4.10中因#1905而中断)。使它们接受查找列表或查找列表的列表 (#1961)。

  • 文档][fontTools.misc]包中的某些模块: arrayToolsbezierToolscliToolseexec (#1956)。

  • 修复了[ttLib._n_a_m_e]中当名称记录的string以字节序列编码时的findMultilingualName()错误 (#1963)。

4.10.0 (发布日期:2020-05-15)

  • [varLib] 允许特征变化在整个空间中激活 (#1957)。

  • [ufoLib] 在UFO的fontinfo.plist中添加了对formatVersionMinor的支持,并在GLIF文件中添加了对formatMinor属性的formatMinor属性支持,如统一字体对象/ufo-spec#78中讨论的那样。在发布即将到来的(非0)UFO规范次要更新之前,不会更改读取或写入UFO (#1786)。

  • 修复了[merge]中不同版本OS/2表的字体合并 (#1865, #1952)。

  • 修复了[subset]在子集化ContextSubst和ContextPos格式3子表时出现的AttributeError (#1879, #1944)。

  • 如果数据是ascii,则在TTX中发出注释 [ttLib.table._m_e_t_a] (#1938)。

  • [feaLib] 支持每个字形位置多个查找 (#1905)。

  • [psCharStrings] 在初始化器中使用继承以避免重复代码 (#1932)。

  • 文档改进:以下模块的文档进行了改进:afmLib (#1933), agl (#1934), cffLib (#1935), cu2qu (#1937), encodings (#1940), feaLib (#1941), merge (#1949)。

  • 文档改进:将面向开发者的信息分离到新页面,使文档首页更注重用户体验。列出所有工具和子模块的简要描述。使README更简洁、专注 (#1914)。

  • [otlLib] 添加从高级描述构建STAT表的功能 (#1926)。

  • [ttLib._n_a_m_e] 添加 findMultilingualName() 方法 (#1921)。

  • [unicodedata] 更新 RTL_SCRIPTS 以适应Unicode 13.0 (#1925)。

  • [gvar] 按字形名称排序 gvar XML输出,而不是按字形顺序 (#1907, #1908)。

  • 文档改进:为 fonttools 命令行工具添加了帮助选项 (#1913, #1920)。确保所有 fonttools CLI 工具都有帮助文档 (#1948)。

  • [ufoLib] 仅在有实际内容时写入fontinfo.plist (#1911)。

4.9.0(发布日期:2020-04-29)

  • [subset] 修复了FeatureVariations表的子集操作。子集器不再丢弃具有空替换的FeatureVariationRecords,因为这会导致搜索继续,从而改变逻辑。它只会丢弃出现在FeatureVariationRecords数组末尾的空记录 (#1881)。

  • [subset] 当子集操作后FeatureVariations不包含FeatureVariationRecords时,移除FeatureVariations表并将GSUB/GPOS降级到版本0x10000 (#1903)。

  • [agl] 在 fontTools.agl 中添加了对旧版Adobe字形列表的支持 (#1895)。

  • [feaLib] 忽略多余的脚本语句 (#1883)。

  • [feaLib] 默认情况下在 fonttools feaLib 命令行中隐藏跟踪信息。使用 --traceback 选项来显示 (#1898)。

  • [feaLib] 在链式子/pos查找中检查查找索引,并打印更好的错误信息 (#1896, #1897)。

  • [feaLib] 修复了构建链式alt替换 (#1902)。

  • 文档改进:将所有fontTools模块包含在sphinx生成的文档中,并将其发布到ReadTheDocs以对fontTools项目进行持续文档化 (#1333)。请访问 https://fonttools.readthedocs.io/ 查看文档。感谢Chris Simpkins!

  • [transform] Transform 类现在是 typing.NamedTuple 的子类。功能没有变化 (#1904)。

4.8.1(发布日期:2020-04-17)

  • [feaLib] 当 aalt 功能引用链式上下文替换查找时,修复了 AttributeError: 'NoneType' has no attribute 'getAlternateGlyphs' (#googlefonts/fontmake#648, #1878)。

4.8.0(发布日期:2020-04-16)

  • [feaLib] 如果没有初始化 glyphNames 参数,解析器无法区分包含连字符的字形名称或字形名称的范围;现在它将它们解释为字面字形名称,同时输出日志警告来提醒用户关于歧义 (#1768, #1870)。

  • [feaLib] 在将AST序列化为字符串时,在表示范围的连字符周围输出空格。还修复了CID范围在AST->字符串->AST往返中的问题 (#1872)。

  • [Snippets/otf2ttf] 在 otf2ttf.py 脚本中更新 LSB 以匹配 xMin (#1873)。

  • [colorLib] 根据colr-gradients-spec草案提案添加了对构建COLR v1表的实验性支持。 注意:在讨论和正式化提案期间,API和COLR v1的XML转储都可能会发生变化 (#1822)。

4.7.0(发布日期:2020-04-03)

  • 添加了来自原始 cu2qu 项目导入的 fontTools.cu2qu 包。将 cu2qu.pens 模块移动到 fontTools.pens.cu2quPen。在安装源码(即git仓库或sdist tarball)安装fonttools之前,可以通过安装 Cython 来编译可选的cu2qu扩展模块。目前发布的PyPI上的wheel包(即pip下载的包,除非使用 --no-binary 选项),将继续为纯Python包 (#1868)。

4.6.0(发布于2020-03-24)

  • 支持构建变量 BASE 表格版本1.1 (#1858)。

  • Color 类添加了 fromRGBA 方法 (#1861)。

4.5.0(发布于2020-03-20)

  • DesignSpaceDocument 类添加了 add{Axis,Source,Instance,Rule}Descriptor 方法,以使用关键字参数初始化新描述符对象,同时将它们附加到当前文档中 (#1860)。

  • 更新到Unicode 13.0 (#1859)。

4.4.3(发布于2020-03-13)

  • 对于TrueType风格的可变字体,始终构建 gvar 表格,即使它不包含任何变化数据。根据OpenType规范,需要此表格 (#1855, #1857)。

4.4.2(发布于2020-03-12)

  • 在XML转储中注释 LookupFlag,并附上注释解释设置了哪些位以及它们的含义 (#1850)。

  • IncludedFeaNotFound 错误添加了更多描述性消息 (#1842)。

4.4.1(发布于2020-02-26)

  • 如果字体(例如在NotoColorEmoji中使用 CBDT/CBLC 表格)中缺少 glyfloca 表格,则跳过规范化这些表格。

  • timestampFromString 中使用非本地化日期解析,以修复当设置非英语 LC_TIME 本地时出现的错误 (#1838, #1839)。

  • 确保由fontBuilder生成的CFF表格可以由varLib使用,而无需先编译和解编译表格。这是由于一些未设置的属性,在将CFF表格转换为CFF2时导致破坏 (#1836)。

4.4.0(发布于2020-02-18)

  • 添加了 fontTools.colorLib.builder 模块,最初包含 buildCOLRbuildCPAL 公共函数。将添加更多颜色字体格式 (#1827)。

  • 添加了 setupCOLRsetupCPAL 方法 (#1826)。

  • 量化 GlyphComponent.transform 浮点数到 F2Dot14,以修复计算变换组件边界框时的往返问题 (#1830)。

  • 如果组件使用参考点(firstPtsecondPt)进行对齐(而不是X和Y偏移量),则在应用任何变换后计算有效平移偏移量 (#1831)。

  • 如果所有符号都没有轮廓,则将 glyf 表格数据编译为单个空字节,以通过OTS和Windows的验证 (#1829)。

  • 在解析功能代码时确保引用的符号名称是已知符号集的一部分,除非未提供符号集。

  • 当为缺失的源或实例填充默认轴值时,正确映射该值。

  • avar表现在可以包含大于或等于前一个值的映射输出值,因为avar规范允许这样做。

  • 模块的错误现在按照层次结构在VarLibError之下排序。见 #1821。

4.3.0(发布于2020-02-03)

  • 修复了Format 3 IndexSubTable的无效填充长度计算 (#1817, #1818)。

  • 修复了当作为 lazy=True 加载时,合并OTL表格和TTFonts时出现的错误 (#1808, #1809)。

  • [varLib] 允许在构建VF时使用包含 CFF2 表的主字体 (#1816)。

  • [ttLib] 使 recalcBBoxes 选项也能与 CFF2 表一起工作 (#1816)。

  • [feaLib] 不要在特征块内部定义的查找中重置 lookupflag。现在它们将继承特征的当前 lookupflag。这是 Adobe makeotf 在此情况下也执行的操作 (#1815)。

  • [feaLib] 修复了混合单/多个替换的bug。如果一个单次替换涉及到一个字形类,我们错误地只使用了该类中的第一个字形 (#1814)。

4.2.5(发布日期:2020-01-29)

  • [feaLib] 不要在重复的多个替换上失败,只警告 (#1811)。

  • [subset] 优化所有值记录相同的 SinglePos 子表为格式1 (#1802)。

4.2.4(发布日期:2020-01-09)

  • [unicodedata] 更新 Unicode 11 和 12 的 RTL_SCRIPTS。

4.2.3(发布日期:2020-01-07)

  • [otTables] 修复了在分割 MarkBasePos 子表时由于偏移量溢出而导致的bug。分割子表中的标记类值没有被更新,导致无效的标记基连接 (#1797, googlefonts/noto-source#145)。

  • [feaLib] 当特征包含重复的替换时,只记录警告而不是错误 (#1767)。

  • [glifLib] 在使用 lxml 解析时删除 XML 注释 (#1784, #1785)。

4.2.2(发布日期:2019-12-12)

  • [subset] 修复了在特征被删除时特征索引发生变化时对 FeatureVariations 表进行子集化的问题。特征索引需要重新映射以指向剩余特征的索引 (#1777, #1782)。

  • [fontBuilder] 向 FontBuilder 类添加了 addFeatureVariations 方法。这是在构建器的 TTFont 对象上调用 featureVars.addFeatureVariations 的简写 (#1781)。

  • [glyf] 修复了与 glyph.drawPoints() 中的标志相同的bug,就像我们对 glyph.draw() 做的那样 (#1771, #1774)。

4.2.1(发布日期:2019-12-06)

  • [glyf] 在 glyph.draw() 中使用 flagOnCurve 位掩码,这样我们就可以忽略在实例化可变字体时可能设置的 overlap 标志 (#1771)。

4.2.0(发布日期:2019-11-28)

  • [pens] 添加以下画笔

    • roundingPen.RoundingPen:过滤画笔,将坐标和组件偏移量四舍五入到整数;

    • roundingPen.RoundingPointPen:类似于上面的,但使用 PointPen 协议。

    • filterPen.FilterPointPen:过滤点画笔的基类;

    • transformPen.TransformPointPen:应用仿射变换的过滤点画笔;

    • recordingPen.RecordingPointPen:记录和重放点画笔命令。

  • [ttGlyphPen] 总是将浮点坐标和组件偏移量四舍五入到整数 (#1763)。

  • [ufoLib] 在将 UFO2 中的字距调整组转换为 UFO3 时,避免将具有与字形相同的名称的组混淆 (#1761, #1762, unified-font-object/ufo-spec#98)。

4.1.0(发布日期:2019-11-18)

  • [instancer] 实现了限制轴范围(3级部分实例化)。现在你可以将 {axis_tag: (min, max)} 元组作为输入传递给 instantiateVariableFont 函数。请注意,目前不支持更改默认轴位置。命令行脚本也接受以冒号分隔的浮点值形式的轴范围,例如 wght=400:700 (#1753, #1537)。

  • [instancer] 永远不删除 STAT DesignAxis 记录,但仅修剪超出范围的 AxisValue 记录。

  • [otBase/otTables] 强制 VarStore.RegionAxisCount == fvar.axisCount,即使区域列表为空,也要满足 OTS < v8.0 的要求 (#1752)。

  • [designspaceLib] 为 <rules> 元素定义了新的 processing 属性,值有“first”或“last”,以及 DesignSpace 规范的其他编辑更改。格式版本提升到 4.1 (#1750)。

  • [varLib] 改进了主字形单调不一致时的错误信息 (#1758, #1759)。

  • [[功能变量]] 允许在 addFeatureVariations 中指定自定义功能标签;允许该功能已存在,在这种情况下,我们将新查找索引附加到现有功能。根据 #1750 中 DesignSpace 规范的更新实现了 <rules> 属性处理。根据此标志,我们生成一个‘rvrn’(始终首先处理)或一个‘rclt’功能(遵循查找顺序,因此最后)(#1747, #1625, #1371)。

  • [[ttCollection]] 增加了通过 with 语句自动关闭上下文管理器的支持,例如通过 TTFont (#1751)。

  • [[unicodedata]] 需要 unicodedata2 >= 12.1.0。

  • [[py2.py3]] 移除了更多的 PY2 痕迹 (#1743)。

  • [[_n_a_m_e]] 修复了在比较具有不同字符串类型的 NameRecords 时的问题 (#1742)。

  • [[fixedTools]] 将 fixedToFloat 改为不进行任何舍入,而是简单地返回 value / (1 << precisionBits)。添加了 floatToFixedToStrstrToFixedToFloat 函数,用于从 XML 加载或导出到 XML。现在在反编译时将固定值(例如 fvar 轴和实例坐标、avar 映射等)存储为未舍入的十进制浮点数 (#1740, #737)。

  • [[feaLib]] 修复了对同一字形多次 LigatureCaret 语句的处理。仅使用每个字形的第一个规则,额外的规则将被忽略 (#1733)。

4.0.2(发布于 2019-09-26)

  • [[voltLib]] 在 PROCESS_MARKS 中增加了对 ALLNONE 的支持 (#1732)。

  • [[Silf]] 修复了在 Silf 表编译和反编译中关于 python3 中 str 与 bytes 的问题 (#1728)。

  • [[merge]] 更好地处理重复的字形名称:而不是将字体索引附加到所有字形名称,使用类似于我们在 postCFF 表中使用的类似代码 (#1729)。

4.0.1(发布于 2019-09-11)

  • [[otTables]] 支持 MultipleSubst 查找子表中的溢出偏移量修正 (#1706)。

  • [[subset]] 在 EBDTCBDT 表数据中修剪空打击 (#1698, #1633)。

  • [[pens]] 修复了在 PointToSegmentPen 中当封闭轮廓的最后一个点和起始点具有相同的坐标且被错误地删除时的问题 (#1720)。

  • [[Graphite]] 修复了 Sill 表输出以通过 OTS (#1705)。

  • [[name]] 向 table__n_a_m_e 类添加了 removeNames 方法 (#1719)。

  • [[ttLib]] 在 hhea 表中为重命名的条目 ascenderdescender 添加了别名 (#1715)。

4.0.0(发布于 2019-08-22)

  • 注意:v4.x 版本系列仅支持 Python 3.6 或更高版本。如果您需要 Python 2 的支持,可以继续使用 fonttools 3.x。

  • [[py23]] 移除了所有 python2 仅有的代码,因为它们现在无法访问,因此不再使用;只保留了 Python3 符号,但这些是 no-op。该模块现在是弃用的,将来将删除。

  • [[ttLib]] 修复了空 loca/glyph 表的 UnboundLocalError。还允许在导出到 XML 时 glyf 表不完整 (#1680)。(#1681)。

  • [[varLib.models]] 修复了在排序主表时没有给定轴的 on-axis(38a8eb0e)时的 KeyError。

  • [[cffLib]] 确保字形名称是唯一的 (#1699)。

  • [[feaLib]] 修复了特征解析器以正确处理八进制数字 (#1700)。

3.44.0(发布于 2019-08-02)

  • 注意:这是最后计划支持 Python 2.7 的发布。即将到来的 fonttools v4.x 系列将需要 Python 3.6 或更高版本。

  • 为部分实例化可变字体,新增了 varLib.instancer 模块。这扩展了(并最终将取代)varLib.mutator 模块,因为它不仅可以从可变字体创建完整的静态实例,还可以创建“部分”或“不那么可变”的字体,其中一些轴被删除或实例化为特定值。还可在命令行上使用 fonttools varLib.instancer –help 获取帮助 (#1537, #1628)。

  • 添加了对 FDSelect 格式 4 的支持 (#1677)。

  • 添加了对 sbix(Apple位图彩色字体)表的子集支持。

  • 修复了在 Type1 字体中解析 eexec 部分,当尾随零之间穿插空格字符时的错误 (#1676)。

  • 修复了在 CFF2 字符串中使用 programToCommands 时出现的错误 (#1669)。

3.43.2(发布于 2019-07-10)

  • 修复了在 python3 上合并区域合并代码的错误 (#1659)。

  • 修复了合并稀疏的 PrivateDict 项的错误 (#1653)。

3.43.1(发布于 2019-06-19)

  • 修复了在输入字体已经是 WOFF 1.0 压缩的情况下传递 --flavor=woff2 选项时的回归 (#1650)。

3.43.0(发布于 2019-06-18)

  • 添加了对压缩/解压缩带有非转换 glyfloca 表以及转换的 hmtx 表的 WOFF2 字体的支持。移除了 Snippets/woff2_compress.pySnippets/woff2_decompress.py 脚本,并用新的控制台入口点 fonttools ttLib.woff2 替换它们,该入口点提供两个子命令 compressdecompress

  • 修复了合并 CFF2 PrivateDicts 时的错误。第一个区域字体的 PrivateDict 数据错误地用于所有后续字体。该错误只会影响带有提示的可变 CFF2 字体 (#1643, #1644)。还修复了当 VF 主字体没有混合或标记字形时的合并错误 (#1632, #1642)。

  • 移除了 LastResortLogger 类的未使用回滚。

  • 优雅地处理部分 MATH 表 (#1635)。

  • 在调用 addFeatureVariations 时,避免在字体尚未具有 GSUB 表的情况下对 DefaultLangSys 表中重复引用 rvrn 特性记录 (aa8a5bc6)。

  • 修复了基于类的字距调整合并。之前,此过程可能会引入针对随机类(未分类的任何内容)的随机字距调整值和变体。

  • 修复了从具有不同数量 SinglePos 子表的母字体合并 GPOS 表的错误 (#1621, #1641)。

  • 更新了 Blocks、Scripts 和 ScriptExtensions 以符合 Unicode 12.1。

3.42.0(发布于 2019-05-28)

  • 修复了 fsType 的符号:它应该是 uint16,而不是 int16 (#1619)。

  • 在标记附件中跳过范围之外的类值 (#1478)。

  • 使用 setupDummyDSIG 方法添加一个空的 DSIG 表 (#1621)。

  • 修复了通过 varLib.mutator 生成实例时丢失 GDEF.GlyphClassDef 的错误 (#1614)。

  • 添加了命令行选项 -v-q 以配置记录 (#1613)。

  • 更新头表中的字体范围 (#1612)。

  • 在最后一个非空字形之后截断空字形,使用 –retain-gids 选项 (#1611)。

  • 更新了 unicodedata2 的 Unicode 12.0 回滚 (#27)。

3.41.2(发布于 2019-05-13)

  • 修复了从XML导入CFF2可变字体的一个问题,该问题导致VarStore状态没有传播到PrivateDict (#1598)。

  • 在构建CFF2可变字体时,不要删除post字形名称 (#1609)。

3.41.1(发布日期:2019-05-13)

  • designspaceLib添加了loadSourceFonts方法,使用自定义打开函数来加载源字体 (#1606)。

  • 将字体边界框坐标四舍五入为整数,以修复CFF字体具有浮点坐标时的编译错误 (#1604, #1605)。

  • feaLib中,不要在ast.ValueRecord.asFea()中写入None (#1599)。

  • 修复了使用--desubroutinize选项时出现的AssertionError问题 (#1590, #1594)。

  • 修复了由之前拼写错误修复未揭露的Silfdecompile方法中的错误。在Sill表的decompile方法中将语言代码解码为UTF-8 (#1597, #1600)。

3.41.0(发布日期:2019-04-29)

  • varLib/cffLib添加了对从稀疏主字体或具有多个模型(多个VarStore.VarData)的主字体构建CFF2可变字体的支持。在cffLib.specializer中,添加了对具有blend运算符的CFF2 CharStrings的支持 (#1547, #1591)。

  • 修复了使用--retain-gids选项进行子集化时对HVARVVAR的子集化,以及当advances映射为空而sidebearings映射非空时 (#1587, #1588)。

  • 添加了otlLib.maxContextCalc模块,用于计算OS/2.usMaxContext值。当使用feaLib编译功能时自动计算。将选项--recalc-max-context添加到subset模块 (#1582)。

  • 修复了从TTX导入字体后缺失OT表字段的AttributeError (#1584)。

  • 修复了Silfdecompile方法中的拼写错误 (#1586)。

  • otlLib中,更好地压缩GPOS SinglePos (LookupType 1) 子表 (#1539)。

3.40.0(发布日期:2019-04-08)

  • 修复了使用--retain-gids选项进行VVAR子集化时的错误 (#1552)。

  • findDefault方法中使用最新的默认位置 (designspaceLib) (#1554)。

  • 允许将文件对象传递给Parser (voltLib)。

  • 现在calcIntBounds(用于计算glyf表字形的边界框)使用otRound而不是round3 (arrayTools/glyf) (#1566)。

  • svgLib添加了将更多SVG形状转换为路径d字符串(椭圆、直线、折线)的支持,以及支持transform属性。目前仅支持matrix变换 (#1564, #1564)。

  • varLib添加了从vmtxVORG表构建VVAR表的支持 (#1551)。

  • 使fontBuilder能够使用格式2的post表创建CFF2字体 (#1557)。

  • 修复了无效转义序列导致的DeprecationWarning (#1562)。

3.39.0(发布日期:2019-03-19)

  • 当遇到递归组件引用时,提高错误的具体性 (ttLib/glyf) (#1545, #1546)。

  • Doc/designspaceLib定义了新的public.skipExportGlyphs库键 (#1534, unified-font-object/ufo-spec#84)。

  • 使用vmtx计算垂直幽灵点;如果缺少vmtx,则使用hhea.ascenthead.unitsPerEM (varLib) (#1528)。

  • [gvar/cvar] 在 TupleVariation 的 toXML 中对 XML 元素的 min/value/max 属性进行排序,以改善 TTX 导出的可读性 (#1527)。

  • [varLib.plot] 添加了对仅有一个变化轴的 2D 图的支持 (#1522)。

  • [designspaceLib] 在 DesignSpaceDocument 中归一化位置时使用轴映射(#1226,#1521),以及在查找默认源时(#1535)。

  • [mutator] 在 instantiateVariableFont 中默认设置 OVERLAP_SIMPLEOVERLAP_COMPOUND glyf 标志。添加了 --no-overlap 命令行选项来禁用此功能 (#1518)。

  • [subset] 修复了 VVAR 表的子集处理 (#1516,#1517)。当使用 --retain-gids 选项时,修复了具有 AdvanceWidthMapHVAR 表的子集处理。

  • [feaLib] 在 MultipleSubstStatement 中添加了 forceChained。修复了 subtable 语句的双重缩进 (#1512)。在除了 PairPos 查找之外的其他位置也支持 subtable 语句 (#1520)。处理 lookupflag 0 和没有值的 lookupflag (#1540)。

  • [varLib] 在 load_designspace 中,为 ital 轴标签提供默认英文名称。

  • 移除 pyftinspect,因为它不再维护且已损坏。

3.38.0(发布日期:2019-02-18)

  • [cffLib] 修复了在反序列化或深层复制带有 CFF 表的 TTFont 时发生的 RecursionError(#1488,649dc49)。

  • [subset] 修复了使用 –desubroutinize 选项时的 AttributeError(#1490)。还修复了当 subrs 包含提示时 desubroutinizing 的错误(#1499)。

  • [CPAL] 使 Color 成为 namedtuple 的子类(173a0f5)。

  • [feaLib] 允许在 glyph 类名称中使用连字符。

  • [feaLib] 在 __main__.py 中添加了 ‘tables’ 选项 (#1497)。

  • [feaLib] 添加了对特殊案例上下文定位格式的支持 (#1501)。

  • [svgLib] 支持将 SVG 基本形状(矩形、圆形等)转换为等效的 SVG 路径 (#1500,#1508)。

  • [Snippets] 添加了 name-viewer.ipynb Jupyter 笔记本。

3.37.3(发布日期:2019-02-05)

  • 前一个版本意外地将几个文件从 Unix 行结束转换为 DOS 行结束。修复该问题。

3.37.2(发布日期:2019-02-05)

  • [varLib] 暂时撤销了对 load_masters() 的修复,这导致在复制 OTF 时 interpolate_layout() 发生崩溃。

3.37.1(发布日期:2019-02-05)

  • [varLib] load_masters() 现在实际上将加载的字体分配给了 source.font 属性。

  • [varLib] 修复了涉及稀疏主字体时的 MVAR 表生成崩溃。

  • [voltLib] parse_coverage_() 返回一个元组而不是一个 ast.Enum。

  • [feaLib] 块内的 MarkClassDefinition 不再与块的其他部分双重缩进。

3.37.0(发布日期:2019-01-28)

  • [svgLib] 添加了将椭圆弧转换为三次贝塞尔曲线的支持 (#1464)。

  • [py23] 添加了 math.isfinite 的回滚支持。

  • [varLib] 如果设计空间轴具有属性 hidden=1,则将 HIDDEN 标志应用于 fvar 轴。

  • 修复了 Python 3.7 中的“DeprecationWarning: invalid escape sequence”。

  • [voltLib] 修复了解析 glyph 组。区分不同的 PROCESS_MARKS。接受 COMPONENT glyph 类型。

  • [feaLib] 区分 PairPos2 格式 A 中的缺失值和显式 <NULL>。实现 ValueRecord.asFea 方法。回程 useExtension 关键字。

  • [subset] 在保留 gids 时将空宽度插入 hdmx 中 (#1458)。

3.36.0(发布日期:2019-01-17)

  • [ttx] 添加了 --no-recalc-timestamp 选项以保留原始字体 head.modified 时间戳 (#1455,#46)。

  • [ttx/psCharStrings] 修复了使用 ttx 导出和回绕 CFF2 表时的问题 (#1451,#1452,#1456)。

  • [voltLib] 修复了对重复锚点的检查 (#1450)。在 .vtp 文件中不要尝试读取超过 END 操作符 (#1453)。

  • [varLib] 在生成 MVAR 增量时使用哨兵值 -0x8000 (-32768) 来忽略 post.underlineThickness 和 post.underlinePosition (#1449,googlei18n/ufo2ft#308)。

  • 在子集字体中添加了 --retain-gids 选项,以修改当前字形索引,而不修改子集字体(#1443,#1447)。

  • 用新的等效调用 readbyteswritebytes 替换已弃用的 getbytessetbytes 调用。fs >= 2.2 无需要求。

  • 允许从 TTX 文件加载主文件(#1441)。

3.35.2(发布日期:2019-01-14)

  • [hmtx/vmtx]: 即使没有相应的(必需)度量表头表(hhea 和 vhea),也允许编译/反编译 hmtxvmtx 表(#1439)。

  • [varLib] 添加了对本地化轴的 labelname 和命名实例的 stylename 的支持(#1438)。

3.35.1(发布日期:2019-01-09)

  • [_m_a_x_p] 在 maxp 表的重新计算中包含 maxComponentElements

3.35.0(发布日期:2019-01-07)

  • [psCharStrings] 在 encodeFloat 函数中,使用浮点数的“通用格式”以8位精度(即 %8g)代替 str()。这解决了当 CFF 表中的实数太长时 macOS 渲染问题,并确保在 python 2.7 和 3.x 中浮点数以相同的精度编码(#1430,googlei18n/ufo2ft#306)。

  • [_n_a_m_e/fontBuilder] 默认将 _n_a_m_e_table.addMultilingualName 也添加 Macintosh(platformID=1)名称。在 FontBuildersetupNameTable 方法中添加选项,以可选方式禁用 Macintosh 或 Windows 名称。(#1359,#1431)

  • [varLib] 使 build 可选地接受一个 DesignSpaceDocument 对象,而不是设计空间文件路径。调用者现在可以将设计空间源中的 font 属性设置为 TTFont 对象,从而允许完全跳过文件名操作(#1416,#1425)。

  • [sfnt] 允许深拷贝 SFNTReader 对象。

  • 在 py27 上要求 typing>=3.6.4 以修复与 singledispatch 相关的问题(#1423)。

  • [designspaceLib/t1Lib/macRes] 修复了一些 pathlib.Path 对象不被接受的情况(#1421)。

  • [varLib] 修复了多个 PairPosFormat2 子表的合并(#1411)。

  • [varLib] 默认将 STAT 表版本设置为 1.1,以改善与旧应用程序的兼容性(#1413)。

3.34.2(发布日期:2018-12-17)

  • [merge] 当 GPOS/GSUB 中的脚本表没有 DefaultLangSys 记录时,修复了 AssertionError(#1408,135a4a1)。

3.34.1(发布日期:2018-12-17)

  • [varLib] 解决了对于没有 gvar 条目的合成体在 macOS 上渲染问题(#1381)。

3.34.0(发布日期:2018-12-14)

  • [varLib] 支持生成 CFF2 可变字体。现在 model.reorderMasters() 支持任意映射。修复了特征变体重叠范围的处理(#1400)。

  • [cffLib, subset] 对 CFF2 支持进行代码清理和修复。

  • [ttLib.tables.ttProgram] 使用原始字符串作为正则表达式模式(#1389)。

  • [fontbuilder] 初始支持构建 CFF2 字体。从 unitsPerEm 自动设置 CFF 的 FontMatrix

  • [plistLib] 接受更通用的 collections.Mapping 而不是特定的 dict 类,以支持应序列化为字典的自定义数据类。(#1368)

3.33.0(发布日期:2018-11-30)

  • [subset] 修复了与可变字体相关的 subsetter 缺陷。

  • [varLib.featureVar] 通过许多规则改进了 FeatureVariations 生成。

  • [varLib] 在构建可变字体时启用稀疏主文件:https://github.com/fonttools/fonttools/pull/1368#issuecomment-437257368

  • [varLib.mutator] 为 GETVARIATION 操作码添加 IDEF,用于处理实例中的提示。

  • [ttLib] 忽略 kern 表子表格式 0 的长度。

3.32.0(发布日期:2018-11-01)

  • [ufoLib] 将 UFOWriter 设置为 UFOReader 的子类,并使用混合方法共享方法(#1344)。

  • <rule>(设计空间)中缺少条件的最小/最大属性时,修复了归一化错误(#1366)。

  • setup.py中,将[plot]添加到额外安装项中,以便可选地安装matplotlib,这是使用fonTools.varLib.plot模块所必需的。

  • 在解决模型时考虑总边界框(7ee81c8)。如果多个轴具有相同的范围比例,则在两者之间进行切割(62003f4)。

  • STAT没有AxisValue表时,不会报错。

  • 添加了一个新的子模块,其中包含围绕TTFontFontBuilder包装类,这使得从头开始使用代码创建可工作的TTF或OTF字体更容易。注意:API仍然是实验性的,并且可能在未来的版本中发生变化。

3.31.0(发布日期:2018-10-21)

  • ufoLib的master分支合并到新的fontTools.ufoLib包中(#1335, #1095)。将ufoLib.pointPen模块移动到fontTools.pens.pointPen。将ufoLib.etree模块移动到fontTools.misc.etree。将ufoLib.plistlib模块移动到fontTools.misc.plistlib。要使用新的fontTools.ufoLib模块,您需要使用带有[ufo]额外选项的fonttools进行安装,或者您可以手动安装所需的附加依赖项(参阅README.rst)。

  • 支持AAT动作类型以插入符号并清理AAT动作表的编译(4a1871f, 2011ccf)。

  • 在CFF字体上的--no-hinting现在还会丢弃私有字典中的可选提示键:ForceBoldLanguageGroupExpansionFactor(#1322)。

  • 包括由STAT表引用的nameIDs(#1327)。

  • msg=None参数添加到CapturingLogHandler.assertRegex(0245f2c)。

  • 实现了FeatureVariations实例化(#1244)。

  • _TTGlyph对象添加了PointPen支持(#1334)。

3.30.0(发布日期:2018-09-18)

  • 跳过构建当Coverage为NULL时没有操作类的PairPos子表(#1318)。

  • 在TTX转储中公开glyf表的轮廓点的先前保留位标志OVERLAP_SIMPLE。这在某些实现中用于指定具有重叠轮廓的非零填充(#1316)。

  • 添加了对包含VTT源代码的TS1C表的反汇编/汇编支持,用于cvar变异表(#1310)。

  • 使用fontTools.designspaceLib读取DesignSpaceDocument。现在已弃用fontTools.varLib.designspace模块,并在未来的版本中将其删除。现在必须存在显式的axes元素才能构建可变字体(#1224, #1313)。

  • 从DesignSpace文档的rules元素中实现构建GSUB FeatureVariations表(#1240, #713, #1314)。

  • 添加了--no-layout-closure选项,以便不使用由OpenType布局功能产生的符号扩展子集。相反,OpenType功能将子集化到仅与否则指定的符号集相关的规则(#43, #1121)。

3.29.1(发布日期:2018-09-10)

  • 修复了从DFLT/dflt中的查找不包括在DFLT/non-dflt语言系统中的问题(#1307)。

  • 修复了在大端架构(例如ppc64)上的问题(#1311)。

  • [子集] 添加了 --layout-scripts 选项,用于添加/排除要保留的 OpenType 布局脚本集。默认情况下保留所有脚本 ('*') (#1303)。

3.29.0(发布于 2018-07-26)

  • [feaLib] 在 OTL 表构建器中,如果从要构建的表列表中排除了 name 表,则跳过编译 featureNames 块,因为 FeatureParams 表中引用的记录不存在 (68951b7)。

  • [otBase] 如果其他偏移量溢出方法失败,则尝试 ExtensionLookup (05f95f0)。

  • [feaLib] 在 PairPos 查询中添加了对显式 subtable 和 break 语句的支持;之前这些被忽略了 (#1279, #1300, #1302)。

  • [cffLib.specializer] 确保堆栈深度不超过 maxstack - 1,以便子例程化器可以插入子例程调用 (#1301, https://github.com/googlei18n/ufo2ft/issues/266)。

  • [otTables] 添加了对修复 MarkBasePos 子表中发生的偏移量溢出错误的支持 (#1297)。

  • [subset] 根据 --flavor 选项或 TTFont.sfntVersion 的值写入默认输出文件扩展名 (d7ac0ad)。

  • [unicodedata] 更新了 Unicode 11 的块、脚本和 ScriptExtensions (452c85e)。

  • [xmlWriter] 向 XMLWriter 类添加了上下文管理器,以便在退出时自动关闭文件描述符 (#1290)。

  • [psCharStrings] 通过将所有没有小数部分的浮点值编码为整数来优化 charstring 的字节码 (8d7774a)。

  • [ttFont] 修复了缺少 TTLibError 异常导入的问题 (#1285)。

  • [feaLib] 允许在 DFLT 脚本下使用除 dflt 之外的语言 (#1278, #1292)。

3.28.0(发布于 2018-06-19)

  • [featureVars] 添加了构建 FeatureVariations 表的实验性模块。仍需要将其连接到 varLib.build (#1240)。

  • [fixedTools] 添加了 otRound,用于将浮点数四舍五入到最近的整数,朝向正无穷大。现在它用于处理像 X/Y 坐标、advanc宽度/高度、变化增量等视觉数据 (#1274, #1248)。

  • [subset] 改进了 GSUB 关闭记忆化算法。

  • [varLib.models] 修复了模型解析中的回归问题 (180124, #1269)。

  • [feaLib.ast] 修复了将 SubtableStatement 转换为字符串时的错误 (#1275)。

  • [varLib.mutator] 根据 'wght'、'wdth' 和 'slnt' 轴值设置 OS/2.usWeightClassusWidthClass,以及 post.italicAngle (#1276, #1264)。

  • [py23/loggingTools] 在 py27 上不要自动设置 logging.lastResort 处理器。将 LastResortLogger 移动到 loggingTools 模块 (#1277)。

3.27.1(发布于 2018-06-11)

3.27.0(发布于 2018-06-11)

  • [designspaceLib] 在设计空间文档中的 rule 元素中添加了新的 conditionSet 元素。将 format 属性提升到 4.0(以前,它被格式化为整数)。移除了 checkDefaultcheckAxes 方法,以及在 <axes> 元素缺失时对轴的任何猜测。默认主轴预计位于每个轴的默认值交叉点 (#1254, #1255, #1267)。

  • [cffLib] 修复了在编译 CFF2 或从 CFF 转换字体时字体具有 FDArray 的问题 (#1211, #1271)。

  • 当不存在 glyf 表时,避免尝试构建 cvar 表,如 CFF2 字体的情况。

  • 处理 MarkGlyphSets 中的 None 覆盖率;撤销将 MarkGlyphSets 中的空 Coverage 表设置为 None 的 02616ab 提交,以使 OTS 满意。

  • 当缺少 postcmap 时,允许从 maxp.numGlyphs 构建 glyf 排序。

  • _TTGlyphSet 添加了 __len__ 方法。

  • 确保 GlyphCoordinates 从不溢出有符号短整型 (#1230)。

  • itertools.izip 添加别名,以覆盖内置的 zip

  • LogMixin 类的 log 属性进行记忆化处理 (fbab12)。

  • 改进测试覆盖率 (#1261)。

  • 为字体中的所有家族名称添加后缀的脚本。

  • 使它与 matplotlib >= 2.1 兼容 (b38e2b)。

3.26.0 (发布于 2018-05-03)

  • 为源元素添加了新的可选 layer 属性,以及相应的 layerName 属性到 SourceDescriptor 对象 (#1253)。将 conditionset 元素添加到规则元素中,但在 designspace 读取器/写入器中尚未实现 (#1254)。

  • 再次细化建模 (0ecf5c5)。

  • 修复了不同偏移量大小引用的表之间的共享问题 (795f2f9)。

  • 不要丢弃只有 VarStore 的 GDEF (fc819d6)。在 MarkGlyphSets 中将空 Coverage 表设置为 None (02616ab)。

  • 添加了 --master-finder 命令行选项 (#1249)。

  • 从实例的名称表中剪枝 fvar nameIDs (#1245)。

  • 允许在警告的情况下反编译格式无效的坏 ClassDef 表 (#1236)。

  • 使 STAT v1.2 可用并重用 fvar 表中的 nameIDs (#1242)。

  • 显示主位置。将坐标轴限制设置为 -1, +1。

  • 处理 HVAR 直接映射。传递 'cvar'。为集合添加了 --font-number 命令行选项。

  • 解析 Type 1 字体时允许指定文本编码 (#1234)。为 T1Font 构造函数添加了 kind 参数 (c5c161c)。

  • TTFont 类添加了上下文管理器 API,因此它可以在 with 语句中使用,以便在退出上下文时自动关闭文件 (#1232)。

3.25.0 (发布于 2018-04-03)

  • 改进了解析算法。以前,轴上的主控制点总是会切割空间。现在不再这样。这更一致,并修复了 Erik 在 2017 年 TYPO Labs 上展示的主要问题。任何具有不寻常的主控制配置的 varfont 在重建时都会更改(42bef17, a523a697, [链接](https://github.com/googlei18n/fontmake/issues/264))。

  • varLib.models 添加了 main() 入口,它接受位置并打印模型结果。

  • 为设计空间的 VariationModel 添加了新的绘图模块。需要 matplotlib

  • varLib.mutator 添加了 -o 选项以指定输出文件路径(2ef60fa)。

  • 在 HVAR 预写入修剪期间修复了 IndexError(6b6c34a)。

  • 如果值超过有符号短整型的范围,将 delta 数组转换为浮点数(0055f94)。

3.24.2 (发布于 2018-03-26)

  • [otBase] 如果src包含更多项,则在复制ValueRecord时不要失败。我们通过简单地更改ValueFormat来在subsetter中删除提示,而不清理实际的ValueRecords。这会导致在未进行提示的情况下对变量字体进行subset处理,然后直接将其传递给mutator进行实例化(而没有先将其保存到磁盘)时出现断言错误。

3.24.1(发布日期:2018-03-06)

  • [varLib] 不要在VarStore优化器中两次重映射相同的DeviceTable(#1206)。

  • [varLib] 向fonttools varLib脚本添加--disable-iup选项,并将optimize=True关键字参数添加到varLib.build函数中,以在构建varfonts时可选地禁用IUP优化。

  • [ttCollection] 修复了使用python3反编译ttc时的问题(#1207)。

3.24.0(发布日期:2018-03-01)

  • [ttGlyphPen] 如果任何组件的变换太大而无法适合F2Dot14值,则分解复合字形;如果变换值(几乎)等于+2.0,则将其夹紧以使其适合并避免分解(#1200、#1204、#1205)。

  • [ttx] 添加了新的-g选项,以从glyf表将字形导出到单独的ttx文件中(#153、#1035、#1132、#1202)。

  • ufoLib.filenames模块复制到fontTools.misc.filenames,用于ttx拆分字形选项(#1202)。

  • [feaLib] 在字符变体功能cv01-cv99中添加了对cvParameters块的支持(#860、#1169)。

  • [Snippets] 添加了用于生成/检查ttx文件SHA1散列的checksum.py脚本(#1197)。

  • [varLib.mutator] 修复了一些变量字体实例化时的问题,其中从gvar幽灵点计算得到的水平进位宽度可能为负(#1198)。

  • [varLib/subset] 修复了在subset GPOS变异数据时未获取ValueRecord Device对象的问题(54fd71f)。

  • [feaLib/voltLib] 在所有AST元素中,location不再是必需的位置参数,而是可选的关键字参数(默认为None)。这将使从代码构建特征AST更容易(#1201)。

3.23.0(发布日期:2018-02-26)

  • [designspaceLib] 向整个designspace以及实例元素添加了一个可选的lib元素,用于存储任意数据在属性列表字典中,类似于UFO的lib。向SourceDescriptor添加了一个可选的font属性,允许操作内存中的字体对象(#1175)。

  • [cffLib] 修复了尝试设置CFF TopDict.Encoding时属性懒加载的问题(#1177、#1187)。

  • [ttx] 修复了3.22.0版本中引入的回归,该回归影响了-s选项拆分表(#1188)。

  • [feaLib] 添加了自定义异常子类IncludedFeaNotFound,当找不到包含的功能文件时引发(#1186)。

  • [otTables] 将VarIdxMap更改为使用字形名称而不是字形索引作为内部使用。仍然可以导入包含索引的旧ttx HVAR/VVAR表转储(21cbab8、38a0ffb)。

  • [varLib] 实现了VarStore优化器(#1184)。

  • [subset] 实现了GDEF VarStore、HVAR和MVAR的修剪(#1179)。

  • [sfnt] 恢复与SFNTReader对象numFonts属性的向后兼容性(#1181)。

  • [merge] 对合并LangSysRecords提供了初始支持(#1180)。

  • [ttCollection] 在向可能不可回溯的流写入时不要seek(0)。

  • [subset] 默认保留从0到6的所有--name-IDs(#1170、#605、#114)。

  • [cffLib] 添加了用于计算最优CFF默认和名义字形宽度的width模块。

  • 如果STAT已经存在于主字体中,则不要失败(#1166)。

3.22.0(发布日期:2018-02-04)

  • 支持子集化 endchar,在 CFF 中作为类似 seac 的组件(修复了 #1162)。

  • 允许从预解析的 ast.FeatureFile 对象构建。添加了 tables 参数,以便只构建一些表而不是所有表(#1159,#1163)。

  • safeEval 替换为 ast.literal_eval(#1139)。

  • 在解析器中添加了选项,以便不解析 include 语句(#1154)。

  • 添加了新的 ttCollection 模块,用于读取/写入 TrueType 和 OpenType 集合。导出具有 fonts 属性的 TTCollection 类,该属性包含一个 TTFont 实例列表,以及 savesaveXML 方法,以及一些类似列表的方法。尚未实现 importXML 方法(#17)。

  • 添加了 ot_tag_to_script 函数,该函数将 OpenType 脚本标签转换为 Unicode 脚本代码。

  • 添加了新的 designspaceLib 子包,最初来自 Erik Van Blokland 的 designSpaceDocumenthttps://github.com/LettError/designSpaceDocument 备注:这尚未在 varLib 内部使用,API 可能会发生变化(#911,#1110,LettError/designSpaceDocument#28)。

  • 添加了新的 FontTools 图标图像(8ee7c32)。

  • 添加了 script_horizontal_direction 函数,该函数返回“LTR”或“RTL”,取决于 Unicode 脚本代码。

  • 如果 NameID 值为 0(== NULL),则不要将描述性名称字符串写入 XML 注释(#1151,#1152)。

  • 添加了 ot_tags_from_script 函数,以获取与 Unicode 脚本代码关联的 OpenType 脚本标签列表(#1150)。

  • 当“枚举”字对与前面的单个字对冲突时,不要错误,发出警告并选择第一个值(#1147,#1148)。

  • CapturingLogHandler.assertRegex 方法中,匹配完全格式化的日志消息。

  • 修复了在连接 str 和 bytes 时的 TypeError(#1154)。

  • 实现了 cusp 支持,并在 calcQuadraticArcLength 中删除了 approximate_fallback 参数。添加了 calcCubicArcLength(#1142)。

3.21.2(发布日期:2018-01-08)

  • 修复了合并 PairPos 格式 1/2 与缺少子表的问题(#1125)。

3.21.1(发布日期:2018-01-03)

  • 允许混合单/多替换(#612)

  • 将缺失的 *.afm 测试资源添加到 MAINFEST.in(#1137)。

  • 修复了包含颜色调板的 SVG 表的转储(#1124)。

3.21.0(发布日期:2017-12-18)

  • 在编译格式 6 子表时,不要假设 gid0 总是称为‘.notdef’(1e42224)。

  • 允许反编译具有不良覆盖格式号的字体(1aafae8)。

  • 将 FontTools 许可证更改为 MIT(#1127)。

  • 修剪标准 Mac 集中已存在的额外名称(df1e8c7)。

  • 在子集化后删除空 SubrsIndex(#994,#1118)。

  • 默认情况下不要在 cvar 中共享点,因为当前它在某些浏览器上失败(#1113)。

  • 使古老的 afmLib 在 python3 上工作。

3.20.1(发布日期:2017-11-22)

  • 修复了 scriptscript_extension 函数返回不一致的短名和长名的问题。它们现在都返回短的四字母脚本代码。添加了 script_namescript_code 函数,以从脚本代码查找长的人读脚本名称,反之亦然(#1109,#1111)。

3.20.0(发布日期:2017-11-21)

  • 添加了新的模块 fontTools.unicodedata,该模块导出与内置的 unicodedata 模块相同的接口,并增加了几个后者所缺少的功能,例如 scriptscript_extensionblock。添加了 MetaTools/buildUCD.py 脚本,用于下载和解析 Unicode 字符数据库中的数据文件,并生成包含范围和属性值的 Python 模块。

  • 为所有 ast 元素添加了 __str__ 方法(委托给 asFea 方法)。

  • Parser 构造函数现在接受一个 glyphNames 可迭代对象,而不是 glyphMap 字典。后者仍然有效,但会发出即将弃用的警告(#1104)。

  • pens.perimeterPen 模块添加了圆弧长度计算函数(#1101)。

  • varLib 开始生成 STAT 表(8af4309)。目前它仅反映轴,甚至这一点也有一定的限制:* AxisOrdering 设置为轴定义的顺序,* 名称表条目与 fvar 不共享。

  • 添加了对 redirect_stdoutredirect_stderr 上下文管理器的 backport(#1097)。

  • 修复了一些往返错误(#1093)。

3.19.0(发布日期 2017-11-06)

  • 在测试是否在元组之间共享点时,尝试使用使用过的点集而不是所有点(#1090)。

  • 修复了读取/写入 CFF2 表中的 PrivateDict BlueValues 到 TTX 文件的问题。请参阅提交信息 8b02b5a 和问题 #1030 获取更多详细信息。注意:此更改使所有使用先前版本 fonttools 导出的包含 CFF2 表的 TTX 文件无效。CFF2 Subr 项目可以在最后一个操作符之后在栈上有值,因此添加了 CFF2Subr 类以适应这种情况(#1091)。

  • 修复了 AAT kern 版本=1.0 表的编译问题(#1089、#1094)

  • 为 TTFont 类和 cmap 表类添加了 getBestCmap() 便利方法,该方法返回给定选项列表的首选 Unicode cmap 子表(#1092)。

  • 生成更有意义的子表标志。实现 InsertionMorphAction

3.18.0(发布日期 2017-10-30)

  • 修复了写入嵌套字形类的问题(#1086)。

  • 重新激活了共享点逻辑,修复了错误(#1009)。

  • 实现了 morx 连字子表(#1082)。

  • 在 moveTo 后保持重复的 lineTo 线(#1080,https://github.com/googlei18n/cu2qu/issues/51)。

  • 支持 GPOS、GDEF 和 MVAR 的实例化(#1079)。

  • 修复了旧版 python 2.7 中 unicode_literalsstruct 模块的问题(#993)。

3.17.0(发布日期 2017-10-16)

  • 添加了 SVGPathPen,它将段笔命令转换为 SVG 路径描述。从 Tal Leming 的 ufo2svg.svgPathPen 复制(https://github.com/typesupply/ufo2svg/blob/d69f992/Lib/ufo2svg/svgPathPen.py)。

  • 添加了 ReverseContourPen,这是一个过滤器笔,它以反转的环绕方向绘制轮廓,同时保持起始点(#1071)。

  • 添加了 ContourFilterPen,它可以整体操纵轮廓,而不是逐段。

  • 添加了 Vector 类,用于在数字数组上应用数学运算,以及 pairwise 函数,用于遍历可迭代对象的元素对。

  • 添加了对构建和插值 cvar 表的支持(f874cf6、a25a401)。

3.16.0(发布日期 2017-10-03)

  • 尝试使用 SOURCE_DATE_EPOCH 环境变量设置 head 修改时间戳,以确保可重复构建(#1063)。请参阅 https://reproducible-builds.org/specs/source-date-epoch/

  • [VTT] 解码 VTT 的 TSI* 表格文本为 UTF-8 (#1060)。

  • 增加了对 Graphite 字体表的支持:Feat, Glat, Gloc, Silf 和 Sill。感谢 @mhosken!(#1054)。

  • [varLib] 如果缺少 "labelname" 元素,则默认使用轴 "name" 属性(588f524)。

  • [merge] 增加了合并 Script 记录的支持。合并后删除未使用的功能和查找(d802580, 556508b)。

  • 增加了 fontTools.svgLib 包。包括支持 Pen 协议的 SVG 路径解析器 (#1051)。还添加了一个将 SVG 轮廓转换为 UFO GLIF 的代码片段 (#1053)。

  • [AAT] 增加了支持 ankrbslnmortmorxgcidcidg

  • [subset] 实现了 propopbdbslnlcar 的子集。

3.15.1(发布于 2017-08-18)

  • [otConverters] 在 otConverters._LazyList 上实现了 __add____radd__ 方法,在将其添加到另一个列表或 _LazyList 实例之前解编译延迟列表。修复了在 subset 模块中尝试对 _LazyList 对象求和时的 AttributeError(6ef48bd2, 1aef1683)。

  • [AAT] 支持 opbd 表格,具有光学边界(a47f6588)。

  • [AAT] 支持 prop 表格,具有字形属性(d05617b4)。

3.15.0(发布于 2017-08-17)

  • [AAT] 增加了 AAT 查找的支持。可以解编译和重新编译 lcar 表格;需要进一步工作来处理 morx 表格 (#1025)。

  • [subset] 保持 Script ‘DFLT’ 的(空)DefaultLangSys(6eb807b5)。

  • [subset] 支持 GSUB/GPOS.FeatureVariations(fe01d87b)。

  • [varLib] 在 models.supportScalars 中,忽略峰值值为 0 的轴(修复 #1020)。

  • [varLib] 将所有轴的默认映射添加到 avar 中以修复某些光栅化器中的渲染问题(19c4b377, 04eacf13)。

  • [varLib] 在合并之前将多个 tail PairPosFormat2 子表展平(c55ef525)。

  • [ttLib] 增加了在 CFFhead 表格中重新计算字体边界框,以及 hheavhea 表格中的最小/最大值的支持 (#970)。

3.14.0(发布于 2017-07-31)

  • [varLib.merger] 在合并之前删除扩展子表(f7c20cf8)。

  • [varLib] 使用所需默认条目初始化 avar 段映射 (#1014)。

  • [varLib] 实现了最优 IUP 优化 (#1019)。

  • [otData] 为 OT v1.8.2 的 STAT 表 v1.2 添加了 AxisValueFormat4 (#1015)。

  • [name] 修复了 Mac langID=9 的 BCP46 语言标签:’si’ -> ‘sl’。

  • [subset] 从 _DehintingT2Decompiler.op_hintmask 返回值(c0d672ba)。

  • [cffLib] 允许通过索引和名称获取 TopDict(dca96c9c)。

  • [cffLib] 删除了全局 isCFF2 状态;使用一组类来处理 CFF 和 CFF2,保持与现有代码的向后兼容性 (#1007)。

  • [cffLib] 根据 OpenType 规范更新 1.8.1 废弃了 maxstack 运算符。

  • [cffLib] 添加了 UnderlinePosition 的缺失默认值 (-100) (#983)。

  • [feaLib] 启用设置大于 255 的 nameID (#1003)。

  • [varLib] 在合并 SinglePos 时重新计算 ValueFormat (#996)。

  • [varLib] 如果变体存储中没有条目,则不发出 MVAR (#987)。

  • [ttx] 对于 -x 选项,如果表标签长度小于 4,则用空格填充(c0d672ba)。

3.13.1(发布于 2017-05-30)

  • [feaLib.builder] 删除了重复查找优化。保留特征文件的原始查找顺序和语义 (#976)。

3.13.0(发布于 2017-05-24)

  • [varLib.mutator] 实现IUP优化(#969)。

  • [_g_l_y_f.GlyphCoordinates] 将__bool__()的语义修改为与其他可迭代对象一致(e46f949)。移除__abs__()(3db5be2)。

  • [varLib.interpolate_layout] 向interpolate_layout函数添加了mapped关键字参数,允许禁用映射:如果为False(默认值),则使用设计空间文件中轴的映射元素来映射位置;如果为True,则假设位置在设计空间内部空间中,不进行映射(#950,#975)。

  • [varLib.interpolate_layout] 从varLib导入设计空间加载逻辑。

  • [varLib] 修复了重新组合PairPosClass2子表的bug(81498e5,#914)。

  • [cffLib.specializer] 在复制可迭代对象时,转换为列表(462b7f86)。

3.12.1(发布日期:2017-05-18)

  • [pens.t2CharStringPen] 修复了在T2CharStringPen中调用addComponent时出现的AttributeError(#965)。

3.12.0(发布日期:2017-05-17)

  • [cffLib.specializer] 添加了新的specializer模块以优化CFF字符串,该模块由T2CharStringPen使用(#948)。

  • [varLib.mutator] 在计算组合字符的边界框之前按组件深度对字符进行排序,以确保正确计算增量(#945)。

  • [_g_l_y_f] 通过使用‘d’(双精度浮点数)而不是‘f’(单精度浮点数)作为array.array类型代码来修复GlyphCoordinates中的精度丢失(#963,#964)。

3.11.0(发布日期:2017-05-03)

  • [t2CharStringPen] 初始支持特殊化的Type2路径运算符:vmoveto、hmoveto、vlineto、hlineto、vvcurveto、hhcurveto、vhcurveto和hvcurveto。这应该会产生更紧凑的字符字符串(#940,#403)。

  • [Doc] 添加了文档的Sphinx源代码。感谢@gferreira(#935)。

  • [fvar] 在XML中公开标志(#932)

  • [name] 添加用于构建多语言名称的辅助函数(#921)

  • [varLib] 修复了当PairPosFormat2的ClassDef1具有不在Coverage中出现的字符时合并kern的bug(1b5e1c4,#939)。

  • [varLib] 修复了PY3下的非确定性的ClassDef顺序(f056c12,#927)。

  • [feLib] 在同一查找的多个标记类中定义相同的字符时抛出错误(3e3ff00,#453)。

3.10.0(发布日期:2017-04-14)

  • [varLib] 添加了对构建avar表的支持,使用设计空间的<map>元素。

  • [varLib] 移除了未使用的build(..., axisMap)参数。现在应在设计空间文件中指定轴映射。如果不包含<axes>元素,我们不接受非标准轴。

  • [varLib] 从standard_axis_map中移除了“自定义”轴。这是在glyphsLib始终导出(未使用)的自定义轴之前添加的。

  • [varLib] 添加了对构建MVAR表的部分支持;尚未实现gasp表变体。

  • [pens] 添加了FilterPen基类,用于控制另一个笔刷;将BasePen中的addComponent方法提取到一个独立的抽象DecomposingPen类中;添加了DecomposingRecordingPen,它记录分解为常规轮廓的组件。

  • [TSI1] 修复了计算VTT私有表的textLength的bug(#913)。

  • [loggingTools] 添加了提供子类log属性的LogMixin类,该属性返回一个名为子类的logging.Logger

  • [loggingTools] 向CapturingLogHandler添加了assertRegex方法。

  • [py23] 添加了python 3的types.SimpleNamespace类的backport。

  • [EBLC] 修复了python 3 zip迭代器的bug。

3.9.2(发布日期:2017-04-08)

  • [pens] 添加了使用WxPython GraphicsPath类绘制字符的笔刷:[链接](https://wxpython.org/docs/api/wx.GraphicsPath-class.html)

  • [varLib.merger] 修复了重新组合多个PairPosFormat2子表的bug(#888)

  • [varLib] 不对全为零或所有值都小于容忍度的gvar增量进行编码。

  • vmtx 表中,现在 [ttLib] 的 _TTGlyphSet 字体也有 heighttsb(顶部边距)属性,如果存在的话。

  • GlyphCoordinates 类中,增加了 __bool__ / __nonzero__ 方法,以及 array 属性以获取原始数组。

  • 支持读取带有 BOM(#896)的 TTX 文件。

  • 修复了字体中区域数量的报告问题。

3.9.1(发布日期:2017-03-20)

  • 当多个 PairPosFormat2 子表因为偏移溢出而拆分时,[varLib.merger] 修复了重新组合的问题(9798c30)。

  • [varLib.merger] 仅在有至少一个字体具有非空 Format1 子表的情况下合并多个 PairPosFormat1 子表(0f5a46b)。

  • 修复了 PairPosFormat2 中空 ClassDef1 的 IndexError(aad0d46)。

  • 避免重复使用 Class2Record(可变)对象(e6125b3)。

  • 在合并 PairPosFormat2 时计算 ClassDef1 和 ClassDef2 的格式(23511fd)。

  • 在 [macUtils] 中添加了缺少的 ttLib 导入(b05f203)。

3.9.0(发布日期:2017-03-13)

  • 在 [feaLib] 中添加了对解析特征文件注释的支持(#879)。

  • 清理了 FeatureNames 的语法树。

  • 在 [ttLib] 中添加了对读取/写入 CFF2 表(感谢 Adobe 的 @readroberts)和 TTFA(ttfautohint)表的支持。

  • 修复了 3.8.0 中引入的关于计算 NumShorts 的回归问题,即 ItemVariationData 的 delta 集中使用 16 位表示的 delta 数量(b2825ff)。

3.8.0(发布日期:2017-03-05)

  • 新增画笔:MomentsPen、StatisticsPen、RecordingPen 和 TeePen。

  • 在 [misc] 中添加了新的 fontTools.misc.symfont 模块,用于符号字体统计分析;需要 sympyhttps://sympy.cn/en/index.html

  • 在 [varLib] 中添加了用于查找不同主图之间错误轮廓顺序的实验性 fontTools.varLib.interpolatable 模块。

  • [varLib] designspace.load() 现在返回一个字典,而不是一个元组,并支持 <axes> 元素(#864);将 'masters' 项目重命名为 'sources',类似于设计空间文档中的 <sources> 元素

  • 在保存 CFF 字体时修复了重新计算 head 修改时间戳的问题。

  • 在 TupleVariation 中,在编译之前对 delta 进行四舍五入(#861,修复 #592)。

  • 在用作 MarkFilteringSet 和 MarkAttachmentType 的类中忽略重复的符号(#863)。

  • 修改了 gasp 表合并逻辑,以便只保留第一个字体的一个,类似于其他提示表(#862)。

  • 在 [Tests] 中添加了 varLib 包的测试,以及来自“Annotated OpenType Specification”(AOTS)的测试字体,以测试 ttLib 的表读取器/写入器(<https://github.com/adobe-type-tools/aots>)

3.7.2(发布日期:2017-02-17)

  • 在剥离 CID 键控 CFF 字体中的 “.notdef” 字体轮廓时保持进阶宽度(#845)。

  • 在 [feaLib] 中,零值现在产生与 makeotf 相同的结果(#633,#848)。

  • 在 [feaLib] 中为“使用内联单位置规则的上下文定位”提供了更紧凑的编码(#514)。

3.7.1(发布日期:2017-02-15)

  • 修复了 [subset] 中的 --no-hinting 选项问题,即 Type 2 字符串中的进阶宽度也被剥离(#709,#343)。

  • 在 [feaLib] 中,现在可以解析类似 makeotf 的相对路径的 include 语句(#838)。

  • 在 [feaLib] 中,现在表 name 可以处理超出基本多语言平面的 Unicode 码点,也支持旧式 MacOS 平台编码(#842)。

  • 在生成特征语法时正确转义字符串字面量(#780)。

3.7.0(发布日期:2017-02-11)

  • 在 [ttx, mtiLib] 中保留了 GSUB 类型 3 中符号替代的顺序(#833)。

  • 根据新的 AFDKO 语法 v1.20,[feaLib] 中的符号名称可以包含破折号(#559)。

  • 现在 [feaLib].Parser 需要字体中的符号映射进行解析。

  • 修复了将 GPOS 值存储为 0 的回归问题。

  • 允许合并基于类的字距调整,当 ClassDefs 不同时。

3.6.3(发布日期:2017-02-06)

  • 修复了 PairPosFormat2 的构建问题(b5c34ce)。

  • 即使对于有 postRead 的 otTables,也填充默认值(e45297b)。

  • 修复了编译 MultipleSubstFormat1 时出现零个 'out' 图形的问题(b887860)。

3.6.2(发布日期:2017-01-30)

  • 修复了 [varLib.merger] 中出现的“TypeError: reduce() of empty sequence with no initial value”错误(3717dc6)。

3.6.1(发布日期:2017-01-28)

  • 修复了在“最后手段”日志处理程序中关闭解释器时发生的未处理异常(972b3e6)。

  • 确保所有字形名称都是本地的 'str' 类型;在 TTFont.glyphOrder 中避免混合 'str' 和 'unicode'(d8c4058)。

  • 修复了 README.rst 中不一致的标题级别,导致 PyPI 错误渲染 reStructuredText 页面。

3.6.0(发布日期:2017-01-26)

  • 重构并改进了变体字体构建过程。

  • fpgm、prep 和 glyf 表中的汇编代码现在在 XML 输出中缩进,以提高可读性。如果为空,则将 instruction 元素写入为简单标签(#819)。

  • 修复了使用 '-o -' 选项将多个 TTX 输出到标准输出时出现的“I/O operation on closed file”错误。

  • 将单元测试模块(*_test.py)已移至 fontTools 包之外的 Tests 文件夹,因此它们不再被安装(#811)。

3.5.0(发布日期:2017-01-14)

  • 现在可以从 XML 读取字体表,并可以无损失地将其写回 XML。

  • GSUB/GPOS LookupType 现在以元素形式写入 XML,而不是注释。 (#792)

  • 解析 cmap 表时,不要存储映射到字形 id 0 的项。(#790)

  • 将 ClassDef 排序变为确定性。[otlLib] 解决 #766(7d1ddb2)

  • 在 [mtiLib] 中添加了单元测试(#787)

  • 实现了 cvar 表

  • 将 GlyphVariation 重命名为 TupleVariation,以匹配 OpenType 术语。

  • 在编译 XML 时,优雅地处理空的 VarData.Item 数组。(#797)

  • 重新启用为具有 TrueType 轮廓的字体生成 HVAR 表;移除了 --build-HVAR 命令行选项。

  • 现在可以通过使用自定义的抽象语法树来扩展解析器,以支持 FEA 代码中的非标准语句。[feaLib] 请参阅示例 feaLib.builder_test.test_extensions 和 baseClass.feax(#794,修复 #773)。

  • 添加了 [feaLib] 命令到 'fonttools' 命令行工具;将特征文件应用于字体。使用 fonttools feaLib -h 获取帮助。

  • 现在 T2CharStringPen 可以接受一个可选的 roundTolerance 参数,以控制坐标的舍入(#804,修复 #769)。

  • 在所有支持的 Python 版本和操作系统上测量测试覆盖率,合并覆盖率数据并将其上传到 https://codecov.io/gh/fonttools/fonttools(#786)

  • 为 Python 3.6 配置了 Travis 和 Appveyor 以运行测试(#785,55c03bc)

  • 可以通过 FONTTOOLS_MANPATH 环境变量自定义手册页安装目录(#799,修复 #84)

  • 在 [Snippets] 中添加了 otf2ttf.py,用于使用 googlei18n/cu2qu 模块将字体从 CFF 转换为 TrueType。

3.4.0(发布日期:2016-12-21)

  • 为 [feaLib] 添加了对从抽象语法树(AST)对象生成 FEA 文本的支持(#776)。感谢 @mhosken

  • 添加了 agl.toUnicode 函数,用于将 AGL 兼容的字形名称转换为 Unicode 字符串(#774)

  • 实现了 MVAR 表(b4d5381)

3.3.1(发布日期:2016-12-15)

  • 不再使用 versioneer.py 来从 git 元数据计算 fonttools 版本,因为这对于一些用户来说已导致问题。[setup] 现在手动使用 setup.py 脚本的自定义 release 命令提升版本字符串(#767)。

3.3.0 (发布日期:2016-12-06)

  • [ttLib] 实现了来自OpenType 1.8的STAT表 (#758)

  • [cffLib] 修复了包含非标准键值对的CFF字体在FontDict中的反编译问题(问题#740;PR #744)

  • [py23] 微调:在round3函数中,允许第二个参数为None (#757)

  • 自版本3.2.0以来已弃用的独立sstructxmlWriter模块已被删除。它们可以从fontTools.misc包中导入。

3.2.3 (发布日期:2016-12-02)

  • [py23] 优化了round3函数的性能;添加了py35 math.isclose()的回退版本(9d8dacb)

  • [subset] 修复了“narrow” (UCS-2) Python 2构建和包含非BMP字符的--text/--text-file选项的问题(16d0e5e)

  • [varLib] 修复了在标准化位置值时的问题(8fa2ee1,#749)

  • [inspect] 使其与python2和python3兼容(167ee60,#748)。感谢@pnemade

3.2.2 (发布日期:2016-11-24)

  • [varLib] 不要在fvar中发出null轴(1bebcec)。感谢@robmck-ms

  • [varLib] 处理没有GPOS的字体(7915a45)

  • [merge] 如果为None,则忽略LangSys(a11bc56)

  • [subset] 修复了MathVariants的子集问题(78d3cbe)

  • [OS/2] 修复了“私有使用(平面15)”范围(08a0d55)。感谢@mashabow

3.2.1 (发布日期:2016-11-03)

  • [OS/2] 修复了检查fsSelection位与head.macStyle位匹配的问题

  • [varLib] 添加了--build-HVAR选项来为具有TrueType轮廓的字体生成HVAR表。对于CFF2,默认启用。

3.2.0 (发布日期:2016-11-02)

  • [varLib] 改进了对OpenType 1.8可变字体的支持

  • 实现GDEF的VariationStore

  • 实现HVAR/VVAR表

  • 部分支持使用varLib.designspace模块加载MutatorMath .designspace文件

  • 添加了带有可变字体插值模型的varLib.models

  • 实现GSUB/GPOS FeatureVariations

  • 对插值和合并OpenType Layout表提供初始支持(请参阅varLib.interpolate_layoutvarLib.merger模块)

  • [API更改] 将XML输出中的版本更改为整数而不是浮点数。设置这些的脚本的版本为1.0或其他浮点值也需要修复。当代码或XML需要修复时,会发出警告。

  • 对cffLib模块进行了多个错误修复,由Adobe的@readroberts提供

  • CFF表的XML输出现在有“major”和“minor”元素来指定它是版本1.0还是2.0(CFF2的支持即将推出)

  • [setup.py] 删除了未记录的/已弃用的extra_path Distutils参数。这意味着我们不再在site-packages中创建一个“FontTools”子文件夹,其中包含实际的fontTools包,以及独立的xmlWriter和sstruct模块。后两个模块也已弃用,并计划在未来的版本中删除。请更改您的导入语句,使其指向from fontTools.misc import xmlWriter和from fontTools.misc import sstruct。

  • [scripts] 添加了一个“fonttools”命令行工具,该工具简单地运行fontTools.*子模块:例如fonttools ttxfonttools subset等。

  • [hmtx/vmts] 以无符号短整型(uint16)读取前导宽度/高度;自动将浮点值四舍五入为整数。

  • [ttLib/xmlWriter] 将“newlinestr=None”关键字参数添加到TTFont.saveXML中,以覆盖特定于操作系统的换行符(传递给XMLWriter实例)。

  • [versioning] 使用versioneer而不是setuptools_scm在导入时间动态加载版本信息。

  • [feaLib] 支持以反斜杠为前缀的符号名称。

3.1.2 (发布日期:2016-09-27)

  • 恢复Makefile作为构建/检查/安装的替代方式

  • README.md:更新了从源代码安装包的说明以及运行测试套件的说明

  • NEWS:更改日志与标记的发布版本不同步

3.1.1(发布日期:2016-09-27)

  • 修复TTX文件中ttLibVersion属性仍然显示为‘3.0’而不是‘3.1’的问题。

  • 使用setuptools_scm来管理包版本。

3.1.0(发布日期:2016-09-26)

  • [feaLib] 新库用于解析和编译Adobe FDK OpenType Feature文件。

  • [mtiLib] 新库用于解析和编译Monotype ‘FontDame’ OpenType Layout Tables文件。

  • [voltLib] 新库用于解析Microsoft VOLT项目文件。

  • [otlLib] 新库用于处理OpenType Layout表格。

  • [varLib] 新库用于处理OpenType Font Variations。

  • [pens] 添加ttGlyphPen以绘制到TrueType符号,添加t2CharStringPen以绘制到Type 2 Charstrings (CFF);添加areaPen和perimeterPen。

  • [ttLib.tables] 实现‘meta’和‘trak’表格。

  • [ttx] 添加编译到‘woff’或‘woff2’的–flavor选项;添加--with-zopfli选项以使用Zopfli压缩WOFF 1.0字体。

  • [subset] 支持对‘COLR’/‘CPAL’和‘CBDT’/‘CBLC’颜色字体表格以及变体字体的‘gvar’表格进行子集化。

  • [Snippets] 添加symfont.py,用于符号字体统计分析;添加interpolatable.py,用于检测插值错误;{merge,dump}_woff_metadata.py

  • [classifyTools] 用于将事物分类到类别的辅助工具。

  • [CI] 使用Appveyor和Travis CI在Windows、Linux和macOS上运行测试;使用Coverage.py/Coveralls检查单元测试覆盖率;在标签上自动部署到PyPI。

  • [loggingTools] 使用Python内置的logging模块打印消息。

  • [py23] 使round()的行为与Python 3内置的round()一致;定义round2()和round3()。

3.0(发布日期:2015-09-01)

  • 添加用于cmap子表格式转换、打印GSUB/GPOS功能以及从两个主文件构建GX字体的Snippet脚本

  • TTX WOFF2支持和-f选项以覆盖输出文件

  • 支持GX表格:avar、gvar、fvar、meta

  • 支持feat和gzip压缩的SVG表格

  • 如果可用,升级Mac东亚编码到本地实现

  • 添加罗马克罗地亚语和罗马尼亚语编码,mac-extended东亚编码的编解码器

  • 实现最优GLYF符号轮廓打包;默认禁用

2.5(发布日期:2014-09-24)

  • 添加Qt笔

  • 添加VDMX表格转换器

  • 懒加载所有OpenType子结构

  • 添加对cmap格式13的支持

  • 添加pyftmerge工具

  • 更新到Unicode 6.3.0d3

  • 添加pyftinspect工具

  • 添加对Google CBLC/CBDT颜色位图、标准EBLC/EBDT嵌入位图以及SVG表格的支持(感谢Adobe的Read Roberts)

  • 添加对加载、保存和ttx WOFF文件格式的支持

  • 添加对Microsoft COLR/CPAL分层颜色符号的支持

  • 支持PyPy

  • 支持Jython,通过替换numpy模块为array/lists模块并移除它,使用纯Python的StringIO,而不是cStringIO

  • 添加pyftsubset和Subsetter对象,支持CFF和TTF

  • 为ttx添加args -q用于静默模式,-z用于选择位图转储格式

2.4(发布日期:2013-06-22)

  • 写入任意文件的选项

  • 改进DSIG的转储格式

  • 改进OTF XML的检测

  • 修复苹果的kern表格格式问题

  • 修复TT符号程序的问题

  • 修复与mona.ttf相关的问题

  • 修复Windows安装说明问题

  • 修复一些现代MacOS问题

  • 修复一些小问题和错别字

2.3(发布日期:2009-11-08)

  • 支持TrueType Collection (TTC)

  • 支持Python 2.6

  • 更新Unicode数据到5.2.0

  • 几个bug修复

2.2(发布日期:2008-05-18)

  • 支持ClearType

  • 支持cmap格式1

  • 支持PFA字体

  • 从Numeric切换到numpy

  • 更新Unicode数据到5.1.0

  • 更新AGLFN数据到1.6

  • 许多错误修复

2.1(发布于2008-01-28)

  • 多年的修复和功能

2.0b2(发布于2002-??-??)

  • 在解释maxp表版本字段时要有“宽容”的态度:如果值不是0.5,则将其解释为1.0。修复了这些GPL字体的输出:https://freebsd.ac.cn/cgi/pds.cgi?ports/chinese/wangttf

  • 修复了ttx -l:原来这部分代码与Python 2.2.1及更早版本不兼容。我在进行测试时使用了与发布的TTX版本不同的版本,真是糟糕:-(

  • 修复了ClassDef格式1子表中的错误(Andreas Seidel遇到了这个问题)。

2.0b1(发布于2002-09-10)

  • 修复了一个令人尴尬的错误:现在即使在小端平台(如Intel)上,头表中的主校验和也能正确计算。

  • 使cmap格式4编译器更智能:它创建的二进制数据现在尽可能紧凑。TTX现在创建的数据比我在测试过的任何已发布字体都要紧凑。

  • 将字形名称作为单独的“GlyphOrder”伪表输出,而不是作为glyf表的一部分(显然对于CFF-OTF是必要的)。

  • 增加了对CFF表的正确支持。

  • 不要在空表上产生错误(有争议,但“确实有字体是这样的……”)

  • 在写入TT glyf数据时,将字形对齐到4字节边界。这似乎是微软目前的建议。此外:不要在已对齐到4字节的字体上产生错误。

  • Windows安装程序由Adam Twardoch贡献!太好了!

  • 再次更改了命令行界面,现在通过创建一个新工具来替换旧工具:ttx。它根据输入文件类型进行输出和编译。选项已有所变化。

  • -d选项已恢复(输出目录)

  • ttcompile的-i选项现在称为-m(类似于“合并”),以避免与dump的-i冲突。

  • -s选项(“分割表”)不再创建目录,而是输出一个包含对单个表文件引用的小型.ttx文件。这不是真正的链接,只是一个简单的文件名,引用的文件应位于同一目录中,以便ttcompile可以找到它们。

  • compile不再接受目录作为输入参数。相反,它可以解析“迷你-ttx”格式,该格式由“ttx -s”输出。

  • 所有参数都是输入文件

  • 重命名了命令行程序,并将它们移动到Tools子目录。它们现在由setup.py install脚本安装。

  • 增加了OpenType支持。BASE、GDEF、GPOS、GSUB和JSTF(几乎)完全支持。XML输出尚未最终确定,因为我还在考虑以更人性化的方式输出某些子表。

  • 修复了“kern”表,使其能够正确接受它不知道的子表,以及正确解释苹果对“kern”表头部的定义。

  • 修复了一个错误,即当cmap是(其中之一)第一个被反编译的表时,不会从cmap计算字形名称。更具体地说:cmap是第一个请求glyphID -> glyphName映射的。

  • 切换XML解析器:使用expat而不是xmlproc。应该更快。

  • 移除了我的UnicodeString对象:我现在要求Python 2.0或更高版本,它内置了unicode支持。

  • 移除了glyf表中的assert:现在忽略表尾的冗余数据,而不是引发错误。这应该成为一个警告。

  • 修复了仅在所有进位相等时才会发生的hmtx/vmtx代码中的错误。

  • 修复了TT指令反汇编器中的一个微妙错误。

  • 对“post”表进行了一些修复。

  • 更新了OS/2表到最新规范。

1.0b1(发布于2001-08-10)

  • 重新组织了ttDump.py和ttCompile.py的命令行接口,它们现在更像“正常”的命令行工具,接受多个输入文件进行批量处理。

  • ttDump.py 和 ttCompile.py 现在不再静默地覆盖文件,而是在覆盖之前会询问。可以通过 -f 选项来覆盖。

  • 为 ttDump.py 和 ttCompile.py 增加了 -d 选项。

  • 现在使用 distutils 进行安装。(需要在没有编译器的环境中进行工作。)

  • 更新了安装说明。

  • 添加了一些解决方案,以便更优雅地处理某些有问题的字体。

  • 更新了 Unicode 表到 Unicode 3.0(感谢 Antoine!)

  • 包含了一个 Adam Twardoch 编写的 Python 脚本,该脚本向 Windows 注册表添加了一些有用的内容。

  • 将项目迁移到 SourceForge。

1.0a6(发布于 2000-03-15)

  • 进行了大规模重组:将 ttLib 做为新的 fontTools 包的子包,更改了几个模块名称。整个套件称为“FontTools”

  • 向 fontTools 添加了几个子模块,其中一些是新模块,一些是旧模块。

  • 向 ttLib 添加了实验性的 CFF/GPOS/GSUB 支持,为只读(但现在禁用了 GPOS/GSUB 的 XML 导出)

  • 修复了 hdmx 字节序错误

  • 为 ttCompile.py 添加了 -b 选项,它禁用了边界框的重新计算,这是 Werner Lemberg 所要求的。

  • 将 tt2xml.pt 重命名为 ttDump.py,并将 xml2tt.py 重命名为 ttCompile.py

  • 使用 “.ttx” 作为文件扩展名,而不是 “.xml”。

  • TTX 现在是 TT 字体的 XML-based 格式 的名称,而不仅仅是应用程序。

1.0a5

从未发布

  • 支持更多表格:hdmx、vhea、vmtx

1.0a3 & 1.0a4

从未发布

  • 修复了大多数可移植性问题

  • 撤销了 1.0a2 中的 “Euro_or_currency” 变更:这是无意义的!

1.0a2(发布于 1999-05-02)

  • MacOS 的二进制发布版

  • 生成完整的 FOND 资源:包括宽度表、PS 字体名称信息和可选的核表。

  • 添加了 cmap 格式 4 支持。额外:将 Unicode 字符名称作为 XML 注释导出!

  • 添加了 cmap 格式 6 支持

  • 现在接受以“true”开头的真型文件(而不是仅限于 0x00010000 和“OTTO”)

  • ‘glyf’ 表支持现在是完整的:我为复合缩放、xy 缩放和 ‘glyf’ 表中的 2x2 添加了支持。目前,组件偏移缩放行为默认为 Apple 风格。这只会影响字体边界框的(重新)计算。

  • 在标准 Apple 字体顺序列表中将“Euro”更改为“Euro_or_currency”,因为我们无法从 ‘post’ 表中判断其含义。如果可用,我可能需要使用 Unicode 编码进行双重检查。(这不会影响输出!)

修复了错误:- ‘hhea’ 表现在正确重新计算 - 修复了关于 sfnt 资源名称的错误假设

1.0a1(发布于 1999-04-27)

  • MacOS 的初始二进制发布版

项目详情


发布历史 发布通知 | RSS 源

下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

fonttools-4.54.1.tar.gz (3.5 MB 查看哈希值)

上传时间 源代码

构建分发

fonttools-4.54.1-py3-none-any.whl (1.1 MB 查看哈希值)

上传时间 Python 3

fonttools-4.54.1-cp313-cp313-win_amd64.whl (2.2 MB 查看哈希值)

上传时间 CPython 3.13 Windows x86-64

fonttools-4.54.1-cp313-cp313-win32.whl (2.2 MB 查看哈希值)

上传时间 CPython 3.13 Windows x86

fonttools-4.54.1-cp313-cp313-musllinux_1_2_x86_64.whl (5.0 MB 查看哈希值)

上传时间 CPython 3.13 musllinux: musl 1.2+ x86-64

fonttools-4.54.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.9 MB 查看哈希值)

上传时间 CPython 3.13 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

fonttools-4.54.1-cp313-cp313-macosx_11_0_arm64.whl (2.2 MB 查看哈希值)

上传时间 CPython 3.13 macOS 11.0+ ARM64

fonttools-4.54.1-cp313-cp313-macosx_10_13_universal2.whl (2.7 MB 查看哈希值)

上传时间 CPython 3.13 macOS 10.13+ universal2 (ARM64, x86-64)

fonttools-4.54.1-cp312-cp312-win_amd64.whl (2.2 MB 查看哈希值)

上传时间 CPython 3.12 Windows x86-64

fonttools-4.54.1-cp312-cp312-win32.whl (2.2 MB 查看哈希值)

上传于 CPython 3.12 Windows x86

fonttools-4.54.1-cp312-cp312-musllinux_1_2_x86_64.whl (5.0 MB 查看哈希值)

上传于 CPython 3.12 musllinux: musl 1.2+ x86-64

fonttools-4.54.1-cp312-cp312-musllinux_1_2_aarch64.whl (4.8 MB 查看哈希值)

上传于 CPython 3.12 musllinux: musl 1.2+ ARM64

fonttools-4.54.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.8 MB 查看哈希值)

上传于 CPython 3.12 manylinux: glibc 2.17+ ARM64

fonttools-4.54.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.9 MB 查看哈希值)

上传于 CPython 3.12 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

fonttools-4.54.1-cp312-cp312-macosx_11_0_arm64.whl (2.3 MB 查看哈希值)

上传于 CPython 3.12 macOS 11.0+ ARM64

fonttools-4.54.1-cp312-cp312-macosx_10_13_universal2.whl (2.8 MB 查看哈希值)

上传于 CPython 3.12 macOS 10.13+ universal2 (ARM64, x86-64)

fonttools-4.54.1-cp311-cp311-win_amd64.whl (2.2 MB 查看哈希值)

上传于 CPython 3.11 Windows x86-64

fonttools-4.54.1-cp311-cp311-win32.whl (2.2 MB 查看哈希值)

上传于 CPython 3.11 Windows x86

fonttools-4.54.1-cp311-cp311-musllinux_1_2_x86_64.whl (5.1 MB 查看哈希值)

上传于 CPython 3.11 musllinux: musl 1.2+ x86-64

fonttools-4.54.1-cp311-cp311-musllinux_1_2_aarch64.whl (4.9 MB 查看哈希值)

上传于 CPython 3.11 musllinux: musl 1.2+ ARM64

fonttools-4.54.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.9 MB 查看哈希值)

上传于 CPython 3.11 manylinux: glibc 2.17+ x86-64

fonttools-4.54.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.9 MB 查看哈希值)

上传于 CPython 3.11 manylinux: glibc 2.17+ ARM64

fonttools-4.54.1-cp311-cp311-macosx_11_0_arm64.whl (2.3 MB 查看哈希值)

上传于 CPython 3.11 macOS 11.0+ ARM64

fonttools-4.54.1-cp311-cp311-macosx_10_9_universal2.whl (2.8 MB 查看哈希值)

上传于 CPython 3.11 macOS 10.9+ universal2 (ARM64, x86-64)

fonttools-4.54.1-cp310-cp310-win_amd64.whl (2.2 MB 查看哈希值)

上传于 CPython 3.10 Windows x86-64

fonttools-4.54.1-cp310-cp310-win32.whl (2.2 MB 查看哈希值)

上传于 CPython 3.10 Windows x86

fonttools-4.54.1-cp310-cp310-musllinux_1_2_x86_64.whl (4.7 MB 查看哈希值)

上传于 CPython 3.10 musllinux: musl 1.2+ x86-64

fonttools-4.54.1-cp310-cp310-musllinux_1_2_aarch64.whl (4.6 MB 查看哈希值)

上传于 CPython 3.10 musllinux: musl 1.2+ ARM64

fonttools-4.54.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.6 MB 查看哈希值)

上传于 CPython 3.10 manylinux: glibc 2.17+ x86-64

fonttools-4.54.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.6 MB 查看哈希值)

上传于 CPython 3.10 manylinux: glibc 2.17+ ARM64

fonttools-4.54.1-cp310-cp310-macosx_11_0_arm64.whl (2.3 MB 查看哈希值)

上传于 CPython 3.10 macOS 11.0+ ARM64

fonttools-4.54.1-cp310-cp310-macosx_10_9_universal2.whl (2.8 MB 查看哈希值)

上传于 CPython 3.10 macOS 10.9+ universal2 (ARM64, x86-64)

fonttools-4.54.1-cp39-cp39-win_amd64.whl (2.2 MB 查看哈希值)

上传于 CPython 3.9 Windows x86-64

fonttools-4.54.1-cp39-cp39-win32.whl (2.2 MB 查看哈希值)

上传于 CPython 3.9 Windows x86

fonttools-4.54.1-cp39-cp39-musllinux_1_2_x86_64.whl (4.7 MB 查看哈希值)

上传于 CPython 3.9 musllinux: musl 1.2+ x86-64

fonttools-4.54.1-cp39-cp39-musllinux_1_2_aarch64.whl (4.6 MB 查看哈希值)

上传于 CPython 3.9 musllinux: musl 1.2+ ARM64

fonttools-4.54.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.6 MB 查看哈希值)

上传于 CPython 3.9 manylinux: glibc 2.17+ x86-64

fonttools-4.54.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.6 MB 查看哈希值)

上传于 CPython 3.9 manylinux: glibc 2.17+ ARM64

fonttools-4.54.1-cp39-cp39-macosx_11_0_arm64.whl (2.3 MB 查看哈希值)

上传于 CPython 3.9 macOS 11.0+ ARM64

fonttools-4.54.1-cp39-cp39-macosx_10_9_universal2.whl (2.8 MB 查看哈希值)

上传于 CPython 3.9 macOS 10.9+ universal2 (ARM64, x86-64)

fonttools-4.54.1-cp38-cp38-win_amd64.whl (1.5 MB 查看哈希值)

上传于 CPython 3.8 Windows x86-64

fonttools-4.54.1-cp38-cp38-win32.whl (1.5 MB 查看哈希值)

上传于 CPython 3.8 Windows x86

fonttools-4.54.1-cp38-cp38-musllinux_1_2_x86_64.whl (4.9 MB 查看哈希值)

上传于 CPython 3.8 musllinux: musl 1.2+ x86-64

fonttools-4.54.1-cp38-cp38-musllinux_1_2_aarch64.whl (4.7 MB 查看哈希值)

上传于 CPython 3.8 musllinux: musl 1.2+ ARM64

fonttools-4.54.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.7 MB 查看哈希值)

上传于 CPython 3.8 manylinux: glibc 2.17+ x86-64

fonttools-4.54.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.7 MB 查看哈希值)

上传于 CPython 3.8 manylinux: glibc 2.17+ ARM64

fonttools-4.54.1-cp38-cp38-macosx_11_0_arm64.whl (2.3 MB 查看哈希值)

上传于 CPython 3.8 macOS 11.0+ ARM64

fonttools-4.54.1-cp38-cp38-macosx_10_9_universal2.whl (2.8 MB 查看哈希值)

上传于 CPython 3.8 macOS 10.9+ universal2 (ARM64, x86-64)

支持者