1

问题:

有没有办法检查给定字体是否是 Microsoft 的ClearType 优化字体之一?

我想我可以简单地对字体名称列表进行硬编码,因为它是一个相对较短的列表,但这看起来有点难看。无论 Windows 的区域设置和语言设置如何,字体名称都会相同吗?

背景:

PuTTY带有粗体、支持 ClearType 的 Consolas 文本,看起来真的很难看。我决定使用源代码,看看是否能找出问题所在,我想我将其追踪到以下(缩写)代码:

font_height = cfg.font.height;
if (font_height > 0) {
    font_height =
        -MulDiv(font_height, GetDeviceCaps(hdc, LOGPIXELSY), 72);
    }
}
font_width = 0;

#define f(i,c,w,u) \
    fonts[i] = CreateFont (font_height, font_width, 0, 0, w, FALSE, u, FALSE, \
                           c, OUT_DEFAULT_PRECIS, \
                           CLIP_DEFAULT_PRECIS, FONT_QUALITY(cfg.font_quality), \
                           FIXED_PITCH | FF_DONTCARE, cfg.font.name)

f(FONT_NORMAL, cfg.font.charset, fw_dontcare, FALSE);

SelectObject(hdc, fonts[FONT_NORMAL]);
GetTextMetrics(hdc, &tm);

font_height = tm.tmHeight;
font_width = tm.tmAveCharWidth;

f(FONT_BOLD, cfg.font.charset, fw_bold, FALSE);

目的是选择与普通字体尺寸相同的粗体字体。我假设 PuTTY 的 Consolas 文本看起来很难看,因为由于 Consolas 被高度优化以布置在特定像素边界上,试图将其硬塞到任意尺寸会产生不好的结果。

因此,一个合适的修复方法似乎是检测 ClearType 优化字体并尝试使用与初始 CreateFont 调用相同的宽度和高度创建这些字体的粗体版本。

4

2 回答 2

4

我不确定我是否完全遵循“将其跟踪到以下(缩写)代码”的含义,但可以肯定的是,Consolas 粗体在 Putty 中看起来很糟糕。这是 windows/window.c 的腻子源(2010 年 4 月 5 日使用颠覆“svn co svn://svn.tartarus.org/sgt/putty”获得的修订版 8914)。

      1386 字体[i] = CreateFont (font_height, font_width, 0, 0, w, FALSE, u, FALSE, \
      第1387章
      第1388章
      第1389章 FF_DONTCARE,cfg.font.name)
      1390  
      第1391章
      1392  
      第1393章
      第1394章
      1395  
      第1396章
      1397  
      第1398章
      第1399章
      1400 font_width = tm.tmAveCharWidth;
      第1401章
      ...
      第1477章
      第1478章
      第1479章

对于 10 pt Consolas,当为 FONT_NORMAL(通过宏 f)调用 CreateFont 时,font_height 和 font_width 的值为 -13 和 0,但在为 FONT_BOLD 调用它时为 15 和 7(值在第 1399,1400 行更改) . 显式设置 width 的值与 Consolas 粗体字体不一致。如果 window.c 被修改,以便将第 1477-1479 行移到第 1391 行之后,则会获得更好的粗体 Consolas 字体(我还尝试了所有其他可用的字体(Courier、Bitstream、Lucida 等)并且它们没有产生不利影响受影响。我已将此建议发送给 Putty 团队。这是显示差异的图: 大胆的consolas示例

2011 年 1 月 16 日添加:“错误”仍然存在,修复仍然有效。现在 window.c 中的行号是第 1510-1512 行应该移到第 1417 行之后。 Kristjan。

于 1 月添加。2012 年 12 月 13 日:该错误仍在 putty 0.62 版(2011 年 12 月 10 日发布)中。要移动的行号现在是 1532-1534 到 1439 之后。为了完整起见,这里是我在 cygwin 中执行的步骤:

$ svn co svn://svn.tartarus.org/sgt/putty2
$ cd putty
$ perl mkfiles.pl
$ cd windows
$ --- edit window.c and move the 3 lines---
$ make CC=gcc-3 -f Makefile.cyg
$ --- move resulting executable files (including putty.exe) to a suitable folder
$ --- add shortcuts to the executables to Windows start menu

克里斯蒂安

于 2010-04-06T00:05:42.513 回答
0

不确定这是否适合您,但确保字体的宽度是精确的整数像素宽度,将使固定宽度的 TrueType 字体在 ClearType 下看起来不错。

为此,您需要通过反复试验来“四舍五入”您的字体高度。

于 2010-04-06T11:20:51.880 回答