检测ClearType优化字体

时间:2010-03-26 01:26:24

标签: fonts gdi putty cleartype consolas

问题:

有没有办法检查某个字体是否属于Microsoft的ClearType-optimized fonts

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

背景

使用粗体,支持ClearType的Consolas文本,

PuTTY看起来非常难看。我决定玩一下源代码,看看我是否能解决问题,我想我将其跟踪到以下(缩写)代码:

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调用相同的宽度和高度创建这些字体的粗体版本。

2 个答案:

答案 0 :(得分:4)

我不确定我是否遵循“追踪到以下(缩写)代码”的含义,但确定Consolas大胆在Putty看起来很糟糕。这是windows / window.c的putty源码(2010年4月5日使用subversion“svn co svn://svn.tartarus.org/sgt/putty”获得的修订版8914)。


      1386      fonts[i] = CreateFont (font_height, font_width, 0, 0, w, FALSE, u, FALSE, \
      1387                             c, OUT_DEFAULT_PRECIS, \
      1388                             CLIP_DEFAULT_PRECIS, FONT_QUALITY(cfg.font_quality), \
      1389                             FIXED_PITCH | FF_DONTCARE, cfg.font.name)
      1390  
      1391      f(FONT_NORMAL, cfg.font.charset, fw_dontcare, FALSE);
      1392  
      1393      SelectObject(hdc, fonts[FONT_NORMAL]);
      1394      GetTextMetrics(hdc, &tm);
      1395  
      1396      GetObject(fonts[FONT_NORMAL], sizeof(LOGFONT), &lfont);
      1397  
      1398      if (pick_width == 0 || pick_height == 0) {
      1399            font_height = tm.tmHeight;
      1400            font_width = tm.tmAveCharWidth;
      1401      }
      ...
      1477      if (bold_mode == BOLD_FONT) {
      1478      f(FONT_BOLD, cfg.font.charset, fw_bold, FALSE);
      1479      }

对于10 pt Consolas,当为FONT_NORMAL(通过宏f)调用CreateFont时,font_height和font_width的值为-13和0,而在为FONT_BOLD调用它时为15和7(值在1399行更改,1400)。明确设置宽度值与Consolas粗体字体不一致。如果修改了window.c以便将第1477-1479行移动到第1391行之后,则获得更好的粗体Consolas字体(我还尝试了所有其他可用字体(Courier,Bitstream,Lucida等)并且它们没有不利我把这个建议发给了Putty团队。这是一个显示差异的图: Bold-consolas-example

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

1月新增。 13,2012:该漏洞仍然是腻子版本0.62(2011年12月10日发布)。移动的亚麻布现在是1539年后的1532-1534。为了完整起见,这里是我在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

Kristjan

答案 1 :(得分:0)

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

要实现这一点,您需要通过一些反复试验来“舍入”字体高度。