字体如何告诉操作系统"I AM a MONSPACED / FIXED-WIDTH FONT"?



首先,我只想知道,为什么在Windows 10上的IDE PYCHARM中,在选中"仅显示等宽字体"的同时,许多字体将不会在编辑器的字体选择对话框中列出[设置/编辑器/颜色和字体/字体],也是Mintty。

我不知道pycharm是怎么做的,但薄荷糖使用win32 API"LOGFONT"。

那么,Windows操作系统如何知道字体是否为等宽(固定宽度)?

即: "源代码专业版"列出,"源代码专业版黑色/超轻/轻...不是;

列出了"Fira代码",但没有列出Fira代码浅色/中/视网膜;

而且,如果"仅显示等宽",则不会在此处列出其他一些等宽字体。

似乎 Pycharm 仅在选中"仅显示单色字体"时识别字体系列名称

在OSX(Mavericks)中,这有点复杂:如果选中"仅显示等宽字体",pycharm仍然可以获取姓氏,但如果安装了rugular加权字体版本,它无法知道默认的字体权重。


然后,我尝试修改一些字体,顺便看了一眼字体锻造中原始字体的"文件信息",但我不知道哪个部分真正影响了WINDOWS或PYCHARM(IDEA/INTELIJ/实际上由JDK?)知道哪种字体是等宽的。

在"OS/2"部分中,检查了任何提到的固定宽度/等宽/等宽参数,但没有帮助,并且在Windows pycharm中仍然无法检测到它们。

所以,最后,我真的想知道,TTF 文件或任何其他字体文件类型使用哪个参数来告诉 [Windows/OSX/Mac OS/Linux] 操作系统"我是等宽的"?

PyCharm 以及就此而言,所有 JetBrains IDEA 套件都不使用字体标志来识别等宽字体。相反,它们使用以下算法确定字体是否为等宽字体:

  • 常规变体的'l''W'' '字符在大小为 12 时宽度是否相同?
  • 粗体变体的'l''W'' '字符的宽度是否相同 作为 12 号的常规变体?
  • 斜体变体的'l''W'' '字符是否相同 宽度作为 12 码的常规变体?
  • 粗斜体变体的'l''W'' '字符是 宽度与 12 码的常规变体相同?

如果上述任何宽度计算返回不一致的答案,则该字体将被列为非等宽字体。

要解决此问题,您应该安装您尝试使用的字体的粗体变体。如果字体的粗体版本不可用,IntelliJ 的字体渲染器将自动生成一个影响字符宽度的字体渲染器,从而导致等宽检查失败。


来源:IntelliJ社区版源代码(为简洁起见,摘录缩短,并在Apache 2.0许可证下获得许可,而不是StackOverflow的CC-BY-SA许可证。

private static int getFontWidth(Font font, int mask) {
int width = getCharWidth(font, ' ');
return width == getCharWidth(font, 'l')
&& width == getCharWidth(font, 'W') ? width : 0;
}

FontInfo构造函数中。

int width = getFontWidth(font, Font.PLAIN);
if (!plainOnly) {
if (width != 0 && width != getFontWidth(font, Font.BOLD)) width = 0;
if (width != 0 && width != getFontWidth(font, Font.ITALIC)) width = 0;
if (width != 0 && width != getFontWidth(font, Font.BOLD | Font.ITALIC)) width = 0;
}
boolean isMonospaced = width > 0;

TrueType 字体可以包含post表。post表包含一个名为isFixedPitch的 32 位字段。如果它包含一个0,则表示比例字体。等宽字体将此设置为1(但通常建议字体引擎应接受任何非零值作为指示等宽字体,因为这是 TT 规范的早期版本所要求的)。

等宽字体还应将hheahmtx表中的numberOfHMetrics设置为3

panose字体中还有与数据匹配的数据(在OS/2表中),用于指定字体是否为等宽字体。

如果我不得不猜测,我会说苹果更有可能使用post表,而Microsoft更有可能使用Panose数据(但我很容易错其中一个或两个)。


引用:

  1. 苹果文档的"发布"表
  2. Microsoft开放类型建议
  3. 帕诺斯分类指标指南

相关内容

  • 没有找到相关文章

最新更新