桌面应用图形学【免费下载链接】fontforgeFree (libre) font editor for Windows, Mac OS X and GNULinux项目地址https://gitcode.com/gh_mirrors/fo/fontforge点击查看免费下载本文围绕 FontForge自由开源字体编辑器中Element → Bitmap Strikes Available...BDF Info 对话框展开说明如何为每个像素尺寸bitmap strike编辑与控制随附于位图字体的 BDF 属性BDF Properties包括默认值的生成、属性的新增/删除/重排、取值校验以及 RESOLUTION_Y 分辨率的特殊处理。读完本文你将掌握 BDF 属性体系的完整操作流程并能结合 bdfinfo.c 与 bitmapchar.c 的源码理解每个按钮背后的实现机制。本文核心依据官方文档 doc/sphinx/ui/dialogs/bdfinfo.rst并结合仓库内对话框实现fontforgeexe/bdfinfo.c、标准属性表与默认值计算逻辑fontforge/bitmapchar.c、BDF 输出实现fontforge/dumpbdf.c交叉印证。一、什么是 BDF 属性为什么需要 BDF Info 对话框BDFBitmap Distribution Format是 X11 生态中广泛使用的位图字体格式。BDF 文件头部含有一组键值对形式的属性Properties用于描述字体的身份、度量、版权与渲染参数等信息。X11 联合会X11 consortium在X Long Font DescriptorXLFD规范中定义了这些属性的常规含义参见 x11r6.4.0/doc/XLFD/xlfd.txt 所引用的规范原文链接为 XFree86 的xlfd.txt文档。在 FontForge 中每个**像素尺寸bitmap strike**都拥有自己独立的一套属性集合。当一个字体同时包含多个位图尺寸时每个尺寸的 BDF 属性彼此独立可分别编辑。BDF Info 对话框标题为 Strike Information for 字体名就是用来集中查看和修改这些属性的界面。需要强调的是属性与像素尺寸是一一绑定的。文档明确说明当你首次通过Element → Bitmaps Available...菜单项 Bitmap Strikes Available...创建某个位图尺寸时它初始是没有任何属性的只有当你随后基于该尺寸生成 bdf 文件时FontForge 才会按需为其计算并填充默认属性。BDF Info 对话框正是让你在生成前查看、微调这些默认值或在生成后手工补充、修正属性的入口。二、打开对话框从菜单到源码调用链BDF Info 对话框在字体视图Font View与位图视图Bitmap View中均可打开字体视图菜单项Element → BDF Info..._BDF Info...实现为FVMenuBDFInfo定义在 fontforgeexe/fontview.c#L2491位图视图菜单项BDF Info...实现为BVMenuBDFInfo定义在 fontforgeexe/bitmapview.c#L1895。两个入口最终都调用SFBdfProperties()定义于 fontforgeexe/bdfinfo.c#L713其关键行为如下遍历sf-bitmaps链表统计位图尺寸数量若无任何位图i0则直接返回对话框不会弹出bdfinfo.c#L736-L738为每个位图尺寸保存一份当前属性副本BdfPropsCopy作为 Cancel 时回滚的备份bdfinfo.c#L744-L745在字体视图场景下若当前显示的正是某个位图尺寸则该尺寸会作为默认选中项bd.cur出现在对话框顶部的像素尺寸下拉列表中bdfinfo.c#L748-L749。另外字体视图中FVMenuBDFInfo会先检查fv-b.sf-bitmapsNULL无位图时不弹出fontview.c#L2493-L2494与SFBdfProperties中的空检查形成双重保护。三、界面元素与基本操作对话框主要分为三部分顶部是像素尺寸选择下拉列表列出如10、124这类条目其中带N的表示该尺寸为 N-bit 灰度/彩色位图中部是属性列表区左侧列名、右侧列值中间以竖线分隔底部是一排操作按钮与 OK/Cancel。3.1 选择属性条目切换像素尺寸通过顶部下拉列表完成对应源码中的BdfP_ChangeBDFbdfinfo.c#L337。切换前会先强制提交当前正在编辑的值BdfP_FinishTextField若值非法会拒绝切换并弹回原条目。选中一行用鼠标点击某行最左端区域即可选中而不会弹出属性名菜单或进入值编辑模式。源码中鼠标事件BdfP_Mouse依据点击的 x 坐标区分行为x 落在属性名区域4到value_x之间时弹出属性名菜单落在值区域value_x右侧时进入值编辑bdfinfo.c#L631-L662。键盘操作选中行后按↑/↓方向键可将该属性在列表中上移/下移BdfP_Charbdfinfo.c#L667-L680。3.2 编辑属性名点击某行的属性名区域会弹出一个包含所有标准属性名的弹出菜单源码中由BdfP_PopupMenuProps构建菜单首项为 No Change其后按StandardProps表顺序列出全部标准属性bdfinfo.c#L594-L619。菜单底部有一个特殊条目 New...点击它会在列表末尾追加一条新属性并弹出同一个属性名菜单供你选择名称BdfP_Invoked中selbdf-prop_cnt即新建分支bdfinfo.c#L562-L586。选择新属性名后FontForge 会根据该名称在标准属性表中对应的类型字符串/整数/无符号整数/atom初始化默认值可默认的属性立即调用默认值计算不可默认的则置为空字符串或 0。若所选名称不在标准表中则按字符串类型创建bdfinfo.c#L568-L586。提示属性名必须为 ASCII 且大小写敏感X11 atom 命名惯例例如FONT_ASCENT与font_ascent是不同属性。源码中NumericKey/KeyType/KnownProp/UnknownKey均以strcmp精确比较属性名bdfinfo.c#L83-L121。3.3 编辑属性值点击某行的值区域该位置会出现一个文本输入框输入新值后按回车/点击其他位置提交。提交时BdfP_FinishTextField会执行严格校验bdfinfo.c#L172-L218值必须全部为 ASCII 字符否则报错 Not ASCII若该属性是数值型标准表类型为prt_int/prt_uint输入必须能被strtol完整解析不允许尾随字符否则报错 Bad Number若属性名不在标准表中用户自建则根据输入内容动态推断类型能解析为整数则存为整型否则存为字符串。对话框在暴露重绘时根据属性类型prt_string/prt_atom/prt_int/prt_uint用不同方式渲染值bdfinfo.c#L517-L529。四、三个核心按钮Default All、Default This、Delete4.1[Default All]一键恢复全部默认值点击该按钮BdfP_DefaultAllbdfinfo.c#L220-L237会读取当前属性表中的RESOLUTION_YBdfPropHasInt若存在则暂存其数值释放当前全部属性BDFPropsFree清空prop_cnt/props调用BDFDefaultProps(bdf, map, -1)重新生成整套默认属性fontforge/bitmapchar.c#L821-L840滚动位置归零、取消当前选中项并刷新列表。文档特别强调除RESOLUTION_Y外的所有属性都会被替换——RESOLUTION_Y的当前值会被保留并作为生成其他依赖分辨率的属性如POINT_SIZE、AVERAGE_WIDTH等的计算基准。BDFDefaultProps内部由三部分组成bitmapchar.c#L821-L840Default_XLFD构建完整的 XLFDFONT属性行-foundry-family-weight-slant-...格式并依分辨率推导PIXEL_SIZE、POINT_SIZE、RESOLUTION_X、RESOLUTION_Y等版权处理将字体sf-copyright按换行拆分成多条COMMENT属性Default_Properties计算FONT_NAME、FACE_NAME、COPYRIGHT、FONT_VERSION、FONT_ASCENT、FONT_DESCENT、UNDERLINE_POSITION、UNDERLINE_THICKNESS、X_HEIGHT、CAP_HEIGHT、DEFAULT_CHAR、RAW_ASCENT、RAW_DESCENT、ITALIC_ANGLE、NORM_SPACE等bitmapchar.c#L700-L769。4.2[Default This]为单条属性计算默认值选中任意属性后点击该按钮BdfP_DefaultCurrentbdfinfo.c#L255-L261FontForge 会为该属性单独计算默认值内部逻辑为_BdfP_DefaultCurrentbdfinfo.c#L239-L253若属性名为FONT调用Default_XLFD重建完整 XLFD 字符串若属性名为COMMENT直接返回不生成默认值其余属性调用Default_Properties的单属性版本。并非所有属性都能自动默认。标准属性表中的defaultable标志决定了这一点表中后段如WEIGHT、DESTINATION、MIN_SPACE、MAX_SPACE、END_SPACE、SMALL_CAP_SIZE、STRIKEOUT_ASCENT、STRIKEOUT_DESCENT、NOTICE、FONT_TYPE、RASTERIZER_NAME、RASTERIZER_VERSION、AXIS_NAMES、AXIS_LIMITS、AXIS_TYPES等均为falsebitmapchar.c#L97-L111这些属性 FontForge 无法推断需要你自行填写。按钮的可用性也据此动态控制BdfP_EnableButtons中只有当KnownProp(名称)为真时[Default This]才可点击bdfinfo.c#L149-L163。4.3[Delete]删除属性选中某属性后点击[Delete]BdfP_DeleteCurrentbdfinfo.c#L263-L286即可移除该属性释放字符串内存、将后续属性依次前移、收缩计数并刷新列表与滚动条。未选中任何属性时该按钮自动置灰。五、[Up]/[Down]调整属性显示顺序选中属性后点击↑/↓按钮BdfP_Up/BdfP_Downbdfinfo.c#L305-L335可将该属性在列表中向上或向下移动一行。文档明确指出目前没有发现调整顺序的任何功能理由这纯粹是为了满足你对属性排列顺序的美学偏好。X11 规范并不要求属性按特定顺序出现因此你可以自由地按自己的习惯例如按字母序、按逻辑分组排列它们生成 BDF 时属性将按此顺序写出。六、RESOLUTION_Y唯一无法可靠猜中的属性文档将RESOLUTION_Y称为唯一 FontForge 不一定能正确猜出的必需属性。原因在于RESOLUTION_Y是像素到物理尺寸dpi的换算基准它的正确值取决于位图字体将要部署的显示设备的垂直分辨率而这一信息在编辑字体时往往是未知的。因此 BDF Info 对话框给了它特殊待遇按下[Default All]时RESOLUTION_Y的当前值被保留而不是被替换其余属性的默认值尤其POINT_SIZE、AVERAGE_WIDTH、RESOLUTION等与物理尺寸相关的量都会以该保留的RESOLUTION_Y为基准重新计算。对应源码中BdfP_DefaultAll先BdfPropHasInt(...,RESOLUTION_Y,-1)取出旧值存入bdf-res再调用默认值生成bdfinfo.c#L223-L230。而在对话框点 OK 提交时BdfP_OK会解析 XLFD 中的res_y分量回写bdf-resbdfinfo.c#L395-L401保证后续生成、导出时分辨率信息一致。七、标准属性表FontForge 内置的 XLFD 属性全集对话框弹出菜单中列出的全部标准属性定义于 fontforge/bitmapchar.c#L49-L113 的StandardProps表。每个条目包含三列信息属性名、数据类型、是否可默认。下表汇总关键属性完整列表以源码为准属性名类型可默认说明FONTatom✅完整 XLFD 字体系列描述FOUNDRYstring✅字体厂商foundryFAMILY_NAME / WEIGHT_NAME / SLANT / SETWIDTH_NAME / ADD_STYLE_NAMEstring✅XLFD 字体族描述分量PIXEL_SIZE / POINT_SIZEint✅像素尺寸与点尺寸点尺寸像素尺寸×72000÷分辨率RESOLUTION_X / RESOLUTION_Yuint✅水平/垂直分辨率dpiSPACINGstring✅字符间距类型P/M/CAVERAGE_WIDTHint✅平均字宽CHARSET_REGISTRY / CHARSET_ENCODINGstring✅字符集登记与编码BITS_PER_PIXELint✅每像素位数FONT_NAME / FACE_NAMEstring✅字体名与面名COPYRIGHTstring✅版权声明FONT_VERSIONstring✅版本号FONT_ASCENT / FONT_DESCENTint✅字体上升/下降度量UNDERLINE_POSITION / UNDERLINE_THICKNESSint✅下划线位置与粗细X_HEIGHT / CAP_HEIGHTint✅x 高度与小写顶高DEFAULT_CHARuint✅缺省字符的编码RAW_ASCENT / RAW_DESCENTint✅原始上升/下降千分比ITALIC_ANGLEint✅斜体角度1/64 度NORM_SPACEint✅标准空格宽度QUAD_WIDTH / RESOLUTIONuint/int✅已废弃属性RELATIVE_SETWIDTH / RELATIVE_WEIGHTuint✅相对宽度/字重0-90SUPERSCRIPT_X/Y/SIZE、SUBSCRIPT_X/Y/SIZEint✅上下标位置与大小FIGURE_WIDTH、AVG_LOWERCASE_WIDTH、AVG_UPPERCASE_WIDTHint✅数字与大小写平均宽度WEIGHT / DESTINATION / MIN_SPACE / MAX_SPACE / END_SPACE—❌无法默认需手工填写SMALL_CAP_SIZE、STRIKEOUT_ASCENT、STRIKEOUT_DESCENT—❌无法默认NOTICE / FONT_TYPE / RASTERIZER_NAME / RASTERIZER_VERSIONstring❌无法默认AXIS_NAMES / AXIS_LIMITS / AXIS_TYPESstring❌多主字体mm轴描述无法默认这些属性在生成 BDF 文件时由 fontforge/dumpbdf.c 写出到文件头部属性值的类型信息string/int/uint/atom也在源码中通过BDFPropAppendString/BDFPropAddInt系列 API 保持与标准表一致。八、取消与确认属性的提交与回滚[Cancel]调用BdfP_DoCancelbdfinfo.c#L356-L366释放对话框期间的临时属性并恢复打开对话框时保存的属性快照old_props/old_prop_cnt即放弃所有修改[OK]调用BdfP_OKbdfinfo.c#L376-L407先强制提交正在编辑的文本值然后对每个位图尺寸释放旧属性快照、采纳新属性再根据FONT属性存在则解析、否则重建更新bdf-res分辨率最后将字体标记为已修改sf-changed true后续生成/保存时新属性生效。细节即使不做任何修改直接点 OK属性快照也会被正常交接不会出错——对话框对“零修改”场景是幂等安全的。九、实战建议创建位图尺寸后先看默认值用Element → Bitmap Strikes Available...快捷键Ctrl-Shift-B添加像素尺寸后打开 BDF Info 按[Default All]即可获得一份以当前RESOLUTION_Y为基准的完整属性集作为进一步修改的起点。优先设置 RESOLUTION_Y[Default All]会保留它但初次创建时该值可能为空或不准。建议在按[Default All]之前先手工把RESOLUTION_Y设为目标显示环境的分辨率如 X 常用 75dpi、Windows 常用 96dpi见 Bitmap Strikes Available 文档中的像素/点换算表。多尺寸字体逐尺寸核对每个像素尺寸的属性相互独立切换顶部下拉列表可分别编辑生成 BDF 前务必逐个尺寸确认FONT_ASCENT、FONT_DESCENT等度量与像素尺寸匹配。自建属性放心用不在标准表中的属性会按字符串保存同样能写入 BDF只是无法自动计算默认值。善用方向键与 New...频繁上下移动用方向键更快新增属性始终从列表末尾追加弹出菜单底部选 New... 后继续在下一级菜单中选择名称即可。十、相关资源对话框官方文档doc/sphinx/ui/dialogs/bdfinfo.rst对话框实现源码fontforgeexe/bdfinfo.c标准属性表与默认值计算fontforge/bitmapchar.cStandardProps表见 L49-L113BDFDefaultProps见 L821-L840BDF 写出实现fontforge/dumpbdf.c菜单入口与快捷键fontforgeexe/fontview.c#L2491、fontforgeexe/bitmapview.c#L1895、doc/sphinx/ui/misc/HotKeys.rst位图尺寸管理Bitmap Strikes Available...赞分享桌面应用图形学【免费下载链接】fontforgeFree (libre) font editor for Windows, Mac OS X and GNULinux项目地址https://gitcode.com/gh_mirrors/fo/fontforge点击查看免费下载相关推荐FontForge 灰度位图字体与 BDF 格式扩展BDFGrey完全指南FontForge 灰度位图字体与 BDF 格式扩展BDFGrey完全指南 导读 本文围绕 FontForge 官方技术文档 doc/sphinx/tech桌面应用图形学用 ANTLR4 解析 BDF 位图字体grammars-v4 中 bdf 语法的实现与实战指南用 ANTLR4 解析 BDF 位图字体grammars v4 中 bdf 语法的实现与实战指南 BDFGlyph Bitmap Distribution编程语言编译器开发工具Marlin 固件字体体系与多语言引擎实战从 BDF 位图字体到 LCD 多语言界面Marlin 固件字体体系与多语言引擎实战从 BDF 位图字体到 LCD 多语言界面 导读 本篇文章以 Marlin 官方字体与语言工具链为核心系统梳理固件智能硬件嵌入式固件物联网上一篇实战指南5个场景解锁GeoJSON地理数据可视化下一篇LightGlue深度解析基于自适应机制的实时特征匹配技术实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?