ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

FontForge 的起源与演进:从 PfaEdit 到开源字体编辑器的二十年技术编年史

FontForge 的起源与演进:从 PfaEdit 到开源字体编辑器的二十年技术编年史 桌面应用图形学【免费下载链接】fontforgeFree (libre) font editor for Windows, Mac OS X and GNULinux项目地址https://gitcode.com/gh_mirrors/fo/fontforge点击查看免费下载导读本文基于 FontForge 官方文档 ff-history.rst作者 George Williams 的第一人称亲笔回顾完整梳理 FontForge 从 2000 年诞生、2004 年更名到 2008 年完成重大内部重构的技术演进脉络。你将读到 PfaEdit/FontForge 在 PostScript、TrueType、OpenType、CID-keyed、Python 脚本、插件体系、多图层编辑等关键能力上的开发时间线与设计取舍并了解这些历史能力在当今仓库中对应的真实源码位置从而获得从历史看架构的纵深理解。一切从何而起书法、位图字体与 Fontographer 的缺憾作者自述一直对书法calligraphy感兴趣尤其着迷于 swash 与 black letter 大写字母的怪癖之处。父亲是研究文艺复兴印刷术的莎士比亚文本目录学家家中充满 long-s 等古老排版痕迹。这种环境奠定了作者对字形的终身兴趣。1980 年代初作者在 JPL喷气推进实验室工作遇到人生第一台位图显示器——它原本用于模拟火星 Olympus Mons 飞越动画。作者用它设计了第一个位图字体。1980 年代末购买第一台电脑 Mac II以及 Fontastic——一款设计 Mac 位图字体FONT resource的小工具。经朋友 Godfrey DiGiorgi 推荐作者购买了 Fontographer 开始设计 PostScript 字体起初怀疑光栅化器能否媲美手工位图质量最终被三次样条cubic spline的魅力说服。1990 年代初在初创公司 NaviSoft旋即被 AOL 收购开发 HTML 编辑器即后来的 AOLpress。在将其改造为支持 Unicode 的过程中作者深切感到 Unicode 字体的匮乏开始自行设计基于 Caslon 的 Unicode 字体及 Bold/Italic 变体后来又设计了等宽与无衬线家族无衬线设计名为 Caliban是对 Arial 的戏仿。转折点在于Fontographer 的开发商 Aldus 被 MacroMedia 收购后后者无意续作Fontographer 停止开发——它不支持 OpenTypeUnicode 支持也极为有限。作者于是开始编写小程序解码 Type1 字体并修复各种问题。1998 年 AOL 期权到期作者得以退休短暂尝试赴马达加斯加参与大竹狐猴Hapalemur simus田野研究未果后转而投入写作自己的 Unicode 控件库早于 Pango并用它构建了一个显示 PostScript 字体样条的小应用来测试控件库——然后顺理成章地允许用户编辑这些样条并保存回去。这就是 PfaEdit 的诞生而原本计划的 HTML 编辑器却再未写出来。作者很快发现自己更擅长设计字体编辑器而非设计字体于是彻底转向前者。仓库佐证如今 fontforge 目录 下splinefont.c、splineutil.c等文件仍然承载着样条编辑的核心逻辑gdraw/目录则是作者自研控件库gdraw widget set的完整实现这正是本文反复出现自有控件库话题的源头。PfaEdit 时代2000—2004核心格式支持的密集扩展2000 年 11 月 7 日作者将 PfaEdit 发布到朋友 Dan Kenan 的服务器bibliofile上一个月内收到第一份 bug 报告也迎来第一位用户。此后功能支持几乎按月推进时间里程碑2000-11首次公开发布 PfaEdit2000-12支持 pfb 字体随后支持 TrueType 与 BDF 字体2001-04迁移至 SourceForge开始支持 sfnt 封装中的 type2 字体即 OpenType 字体暂不含高级排版表开始支持 OpenType GSUB/GPOS 的简单部分2001-06Valek Filippov 建议国际化作者提供机制Valek 交付首个俄语界面翻译2001-07应韩国用户 MinGyoon 请求学习并支持 CID-keyed 字体2001-08支持 CID-keyed 字体2002-01获得运行脚本scripting能力2003-03将 TrueType 指令调试前端源自独立程序 mensis集成进 PfaEdit2003-08完成 GSUB/GPOS 的 contextual chaining lookup作者自嘲当然还忽略了不少 bug同期开始支持 Apple Advanced Typography 的 morx 等表2003-07实现 OpenType bitmapotbsfnt 封装的多层位图 strike无轮廓字体2004-02支持多主MultiMaster字体受 Yannis Haralambous 鼓励2004-03正式更名为 FontForge整合 freetype 指令模拟器作为视觉调试前端2004-04支持 Apple 可变形字体distortable font技术并扩展 freetype 以支持之国际化与翻译推进作者最初自研 i18n 机制2005 年 12 月改用 GNU gettext。文档给出了完整的翻译时间线表格这里完整继承语言译者初版时间英语——俄语Valek Filippov2001 年 6 月日语Kanou Hiroki2002 年 8 月法语Pierre Hanser2002 年 9 月意大利语Claudio Beccari2003 年 2 月西班牙语Walter Echarri2004 年 10 月越南语Clytie Siddall2006 年 7 月希腊语Apostolos Syropoulos2006 年 8 月简体中文Lee Chenhwa2006 年 10 月德语Philipp Poll2006 年 10 月波兰语Michal Nowakowski2006 年 10 月繁体中文Wei-Lun Chao2007 年 8 月仓库佐证如今 po 目录 下保存着 ca、de、el、en_GB、es、fr、hr、it、ja、ka、ko、ml、pl、pt、ru、th_TH、tr_TR、uk、vi、zh_CN、zh_TW 等 20 余个语种的 gettext 翻译文件正是这段历史不断累积的成果po/CMakeLists.txt负责将其接入构建系统。TrueType 指令模拟freetype 的引入作者早期尝试自写 TrueType 指令模拟器为生成的网格拟合指令调试但在真实字体上表现不佳。2001 年初发现 freetype 已正确实现此事于是放弃自己的实现直接以 freetype 作为指令模拟器随着复杂度上升得到 David Turner 许可与 Werner LEMBERG 的大量建议作者为 freetype 内置调试器写了可视化前端起初放在独立程序 mensis 中2003 年 3 月并入 PfaEdit。这一合作也促成了后来的更名FontForge 这个名字正是 freetype 的 David Turner 提出的。仓库佐证仓库根目录cmake/packages/FindFreeTypeSource.cmake与FindFreetype.cmake展示了项目与 freetype 的构建期集成方式fontforge/ttfinstrs.c 与fontforgeexe/ttfinstrsui.c则是 TrueType 指令生成与 UI 调试的现代表现。FontForge 时代2004—2006更名、重构与功能爆发从 PfaEdit 到 FontForge2004 年初用户们认为 PfaEdit 已无法反映程序能力要求更名。多人提议包括作者自己最终采纳 freetype 的 David Turner 所提的FontForge2004 年 3 月正式更名。同期作者实现了多图层编辑模式以更完整地处理 PostScript Type3 与 SVG 字体提供对矢量图形软件部分能力的、略显笨拙的接口。编码与分组2005 年的一次内部大手术2005 年一家韩国公司提出按字形分组的需求。当时 FontForge 把编码encoding作为字体的固有组成部分这导致无法实现分组。作者被迫重写大量内部结构以重构编码体系到 2005 年 7 月完成时韩方却已失去兴趣Ah well.。但这次重构为 FontForge 后续的 OpenType 处理与灵活编码体系奠定了基础。仓库佐证如今 fontforge/encoding.c 与fontforge/unicoderange.c独立负责编码与 Unicode 区间管理印证了编码从字体固有属性中剥离这一历史重构的最终形态。PDF 字体抽取与 OTB 往返转换2005 年 10 月作者对 PDF 产生兴趣先让 Print 命令支持输出 PDF进而实现从 PDF 中读取字体。他明知 PDF 中的字体大多是子集仅含用到的字形预感到会收到没读全字体的抱怨——结果果然如此且无法说服抱怨者字体本身就不完整。OTB 往返无损X11 社区希望摆脱 BDF 格式提出了 otbsfnt 封装、无轮廓的多层位图。作者 2003 年 7 月实现之2005 年 7 月 X11 社区希望保留 BDF 属性双方设计出名为 BDF 的新表容纳所有 strike 的属性使bdf→otb→bdf 往返转换不丢失任何信息。二次样条编辑的演化2006 年初大量用户抱怨二次样条quadratic spline编辑能力。作者坦言此前从未编辑过二次样条最初只是照搬三次样条编辑器的行为看起来显而易见但这难以利用 ttf 文件的优化且使指令化混乱。2006 年 1—2 月间在持续反馈驱动下 FontForge 的二次编辑能力经历了一场进化式变革。测试体系与 sfddiff作者为 FontForge 建立了测试套件最初只是一组执行各种操作的脚本只要不崩溃就算通过。为弥补仅测崩溃的不足他编写了比较两个字体是否等价的命令——最初是独立命令 sfddiff后来集成进 FontForge 以增强测试能力。仓库佐证独立脚本sfddiff.pe至今仍保留在 fontforgeexe 目录由fontforgeexe/CMakeLists.txt打包安装并附sfddiff.1手册tests 目录 下保留着大量.pe脚本如 test001.pe ~ test139.pe与bulk_test.sh正是这段历史的直接后裔。Type2/Type1 输出优化2006 年中FontForge 早期产出的 type1/type2 字体未充分利用 PostScript 的 subroutine 概念。2006 年 6 月作者大幅重写 type2 输出代码使输出字体体积显著减小并借助新的比较命令调试——但引入了不少 bug。作者一度因 Adobe 已不产 type1 而拒绝优化 type1 输出后在 Michael Zedler 的坚持下于 2006 年 10 月同样为 Type1 输出充分利用 subroutines。对话框自适应布局2006 年 8 月FontForge 所有对话框原本都是固定布局单一语言没问题一旦翻译成其他语言标签变长或变短就会溢出并压到文本域上。随着译者突然增多作者偷师 gtk 的 box 概念在自己的控件库中实现之让对话框按内容尺寸自动布局。仓库佐证自研控件库 gdraw 中的ggadgetP.h、gcontainer.c等正是这套布局体系的载体而后来的 GTK 版界面则位于 fontforgeexe/gtk。2007OpenType 内部重构、Python 与插件GSUB/GPOS 按 lookup 层级重做作者最初把 GSUB/GPOS 数据存在 feature 层而 OpenType 要求在 lookup 层组织作者曾认为 lookup 徒增复杂度而忽略之。结果用户反复抱怨字体读入 FontForge 再保存后就不能用了——因为 lookup 施加的顺序在保存中丢失。2007 年初作者不得不重做大量 OpenType 相关内部结构并让 Metrics View 支持全部 OpenType lookup 类型而不只是 kerningDisplay 对话框与 Print 对话框随后也同步扩展。放弃自有脚本语言拥抱 Python用户不喜欢作者的自有脚本语言质问为什么不用 Python作者自陈因为当时不会 Python 又懒得学。在没有 Python 就不用 FontForge的呼声下作者加入 Python 支持——却发现自己的构建机器 Python 版本过老、不提供 libpython且机器太旧无法再升级系统。仓库佐证Python 绑定现分布在 pyhookfontforgepyhook.c、psMatpyhook.c、fontforge/python.cpp 与fontforge/scripting.cpppycontrib 则收纳了 FontCompare、GlyphAlignment、svg2glyph 等 Python 贡献工具tests/test*.py提供了大量 Python API 测试样例。2007 年 5 月 LGM插件体系与更多作者在蒙特利尔 Libre Graphics Meeting 上受 Inkscape 插件演讲启发扩展 Python 接口以支持Python 插件与菜单项。Dave Crossland 持续提出需求更新 Display 对话框支持全部 OpenType lookup、并入 Print 对话框还希望 FontForge 能直接把字体存到 Open Font Library 网站——该站没有 API作者只得重新钻研 HTTP走通其用户 API。仓库佐证插件基础设施现位于 fontforge/plugin.cpp、fontforge/plugin.h与 fontforgeexe/pluginui.cpp。2007 年 6 月Adobe feature files 的挫败作者开始支持 Adobe 的 feature files此时已正确组织 lookup却震惊地发现其语法并不完整Adobe 给出的语法不完整无法表达全部 OpenType部分语法 Adobe 自身尚未实现还标注Subject to change无法方便地表达 class set 的 Everything elseclass 0除非逐字形枚举无法区分基于 contextual class 的 lookup 与基于 contextual coverage-table 的 lookup……诸如此类。作者原以为 feature files 是稳定可用的格式失望之余实现了 Adobe 未实现的部分并做扩展以表达更多 OpenType告知 Adobe 后对方表示不喜欢这些扩展。作者的本意是尽可能多地存储 OpenType不愿等待 Adobe 出台方案。仓库佐证feature file 的读取/解析实现现位于 fontforge/featurefile.ctests/fonts 下的*.fea测试字体与test_fea_context_sub.py、test_fea_hyphens.py等测试持续验证其行为。MATH 表、Embolden 与 TrueType 自动指令器MATH 表Apostolos Syropoulos 交给作者新 MATH 表规范但当时满纸 Microsoft Confidential。作者拒绝触碰Apostolos 转而让 MS 的 Sergey 寄来不再印 Confidential 的版本作者于 2007 年 7 月实现该表。Embolden作者长期没有好的加粗Embolden功能2007 年尝试一个极简思路——先 expand stroke 再把字形压缩回原高度基本奏效。自动指令器2007 年 7 月 Michal Nowakowski 提交大幅改进 TrueType 自动指令器的补丁作者以你得负责后续维护为条件接受随后 Alexej Kryukov 提出支持对角线主干两人开始合作。仓库佐证MATH 表现在由 fontforge/mathconstants.c内含struct MATH的字段/设备表定义与MathTableNew等函数与fontforge/tottf.c、fontforge/parsettf.c等读写路径共同支撑。Spiro 样条与库层分离libfontforge在 LGM 上 Dave 演示了 Raph Levien 的 spiro 样条鼓励集成。但 Raph 以 GPL 发布且不愿改作者以 BSD 发布也不愿改。最终征得 Raph 同意将 spiro 例程打包成独立小共享库libspiroFontForge 链接之而不受许可证约束。同时作者意识到不仅能把 Python 嵌进 FontForge还能把 FontForge 嵌进 Python——于是把 FontForge 大部分代码封装成 Python 可加载的共享库。Dave 长期抱怨自研控件库追问何时改用 gtk作者 2004 年试过 gtk觉得难用、丑且关键处不如自研库并提出资助 gtk 版 UI条件是改用 GPL。作者不喜欢 GPL拒绝后另辟蹊径把库重构成与控件库无关让 Dave 可以在其上自写 UI 而不受 FontForge 许可约束。于是作者重构 FontForge 内部使其可扩展从 libfontforge 中剥离 UI并开始自己动手写基于 gtk 的 FontForge。仓库佐证spiro 集成位于 fontforge/spiro.cSpiroCP2SplineSet等接口构建系统中通过cmake/packages/FindLibspiro.cmake查找 libspiro。GTK 版界面即今天的 fontforgeexe/gtk 目录。PfEd 表把信息存进字体本身Dave Crossland 在 Open Font Library 邮件列表抱怨字体发布时大量信息丢失指引guidelines、lookup 名称、用于生成 TrueType 二次曲线的三次样条……作者认为这些信息完全可以存在字体里。FontForge 本就创建名为 PfEd 的表PfaEdit 时代的遗产存储逐字形注释等作者将其扩展以保存 guidelines 等信息并形成文档。仓库佐证SFD 格式的指引读写逻辑位于 fontforge/sfd.cppSFDDumpGuidelines/SFDReadGuideline可在 sfd 文件中看到 Guideline: 记录正是 PfEd 精神的延续。2008多图层、BASE/bsln、字形变换与平台整合多图层2008 年 3 月Alexey 等人要求不止 Foreground/Background/Guidelines 三层的多图层支持常见诉求是同时持有三次PostScript与二次TrueType两层并可各自生成字体。FontForge 由此引入多图层支持。BASE/bsln 与渐变填充同月加入 OpenType BASE 与 Apple bsln 表支持并为自娱自乐在 Type3/SVG 字体中加入渐变填充。通用 Glyph Change 对话框2008 年 6 月作者意识到 2007 年 Embolden 的思路本质上就是从小写大写字母生成 Small Caps所需的思想部分算法还可用于生成 condensed/extended 字形于是写出通用的字形变换对话框。早年的 MetaFont 命令被用户误以为要读 Knuth 的 mf 文件实际是作者自己的字形变形工具因效果不佳被移除如今以新形态回归——只是作者学乖了不敢再叫它 MetaFont。Alexey 随后重写大量相关代码尤其改进了 Small Caps 生成时对角线主干的处理。Italics 挑战作者对斜体转换着迷——倾斜、压缩、衬线变化、字型变化……咨询多位字体设计师得到的共识是机械地把罗马体转成斜体永远做不好别试。作者没听认为这是绝妙挑战且 Ikarus 做过他也想做到。仓库佐证字形变换对话框现位于 fontforgeexe/transform.cTransformDlgCreate等Ikarus 支持逻辑保留在 fontforge/ikarus.c。Mac 平台体验2008 年 7 月一位 Mac 用户朋友表示不像 Mac 应用就不考虑用。作者于是研究如何构建 Mac Application、响应 Apple events双击字体文件、拖放文件到图标、自动启动 X、设计字体文件图标并把菜单改为 Mac 的 command 键与三叶草图标。朋友直到 11 月仍未看一眼——Ah well.Cairo/Pango 与主题Dave 雇人把 cairo 集成进 FontForge结果不了了之。作者在无聊冲动下自己研究 cairo发现并不难但在他那台不支持 XRender 的十年老 x86 上很慢。cairo 提供两点价值字形视图的抗锯齿样条与全局抗锯齿文本。作者决定只需在字形视图用 cairo其余用更轻量且支持复杂文本书写的 pango 提供模糊文本自研控件库不支持复杂脚本。Khaled Hosny 随后建议实现 pango——作者本想给人惊喜只好照做。日本的 Unofficial mingw fontforge page 提供了一套 X resources 主题其他用户开始编写主题进而暴露出 FontForge 资源读取代码从未被充分测试过的历史问题。尾声Widget 之争的未完故事作者在文末坦承 FontForge 当前最大的抱怨是控件库选择没人喜欢他的自研控件除了他自己。在 FAQ 的 widget-set 条目 中作者解释了为何自研需要良好支持 Unicode 的控件库尤其重视希伯来语/阿拉伯语所需的 bidi 文本支持且希望能明确判断复选框是否勾选——当时他不知道有现成方案。后来他意识到 QT 与 gtk 的 Unicode 支持远优于自研库但仍未切换原因包括转换工作繁琐且 bug 分心、更愿意把时间花在功能上、不喜欢 CQT 用 C、对 gtk 的多方面不满。作者自述会在 gtk 与 qt 之间反复尝试又反复放弃2008 年时虽仍不喜欢 gtk但已让 fontview 在其中跑通——一个开始但可能不会继续。而 faq.rst 也建议读者对更完整的叙述参见本文档FontForge history。现状注脚今天仓库中的 fontforgeexe/gtk 目录application.cpp、charview.c、fontview.c 等表明 GTK 版 UI 已成为现代 FontForge 的主流界面而 gdraw 自研控件库仍在仓库中保留二者并存印证了这段历史拉锯的最终走向。结语从历史中读出的架构智慧回顾这条时间线可以提炼出几条贯穿 FontForge 二十余年开发的线索用户驱动重构编码体系重做2005、OpenType lookup 层级重做2007、多图层2008每一次重大内部手术都源于真实用户需求而非技术洁癖。务实的外部集成freetype指令模拟、gettexti18n、libspiro样条、cairo/pango渲染与复杂文本、GTKUI——FontForge 的边界随需求不断外扩却始终保留自研内核gdraw、SFD、PfEd 表。格式支持的广度是核心竞争力Type1/Type2、TrueType、BDF/OTB、CID-keyed、OpenType、Apple Advanced Typography、PDF 内嵌字体、SVG/Type3、多主与 Apple 可变形字体——这段历史塑造了今天 README 中所宣称的创建、编辑、转换 OpenType、TrueType、UFO、CID-keyed、Multiple Master 等多种格式的能力版图。许可策略的智慧libspiro 的独立打包与 libfontforge 的 UI 剥离是以 BSD 许可内核换取更广泛生态的典型做法直接促成了今天 GTK UI 与 Python 绑定的共存格局。本文全部史实均出自 ff-history.rst 原始文档所有源码佐证路径均可直接在仓库中查阅。赞分享桌面应用图形学【免费下载链接】fontforgeFree (libre) font editor for Windows, Mac OS X and GNULinux项目地址https://gitcode.com/gh_mirrors/fo/fontforge点击查看免费下载相关推荐JSONEditor 版本演进史从 2011 年到 2026 年的 Web JSON 编辑器架构与技术主线JSONEditor 版本演进史从 2011 年到 2026 年的 Web JSON 编辑器架构与技术主线 导读 HISTORY.md 是 jsonedito前端UI组件从弃用到进化Kefir.js API设计的十年技术演进史从弃用到进化Kefir.js API设计的十年技术演进史 你是否曾因依赖的库突然移除核心API而重构代码是否好奇为什么某些函数会被标记为deprecate软件架构pypdf 历史沿革从 pyPdf 到 PyPDF2 再到 pypdf 的二十年演进pypdf 历史沿革从 pyPdf 到 PyPDF2 再到 pypdf 的二十年演进 导读 本文基于 docs/meta/history.md https:/后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表