检测的ClearType优化的字体

问题描述:

问:检测的ClearType优化的字体

有没有一种方法来检查,如果给定的字体是微软ClearType-optimized fonts之一?

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

背景:

PuTTY看起来大胆,启用ClearType的-,索拉文字真难看。我决定玩的来源,看看我能想出的问题,我想我跟踪它到以下(略)代码:

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的索拉文字看起来丑陋,因为自从索拉如此高度优化的特定的像素边界进行奠定了,试图把它变成鞋拔子任意尺寸产生不好的结果。

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

我不确定我遵循的是什么意思是“追踪到下面的(缩写)代码”,但确实够不够Consolas在腻子中看起来不好。下面是窗户/ window.c的油灰源(与颠覆“SVN共同的svn://svn.tartarus.org/sgt/putty”获得的修订8914 2010年4月,5)。

 

     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个索拉,font_height和font_width的值分别为-13和0时的CreateFont被称为用于FONT_NORMAL(经由宏F),但15和图7,当它被要求FONT_BOLD(该值是改为1399,1400行)。显式设置宽度的值不符合Consolas粗体字体。如果window.c被修改,使得线1477-1479移动来线1391后得到一个好得多的大胆索拉字体(我也尝试过其他所有可用的字体(快递,档案,龙力等),他们也没有不利。影响我已将这个建议,腻子团队下面是该差异图: Bold-consolas-example

添加于2011年1月16日:“虫”依然存在,而修复仍然有效现在行了。在window.c中的数字是行1510-1512应该移动到行1417之后。Kristjan。

2012年1月13日添加:错误仍然在版本0.62的腻子(发布12月10日,2011)现在移动的亚麻布现在是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 

克里斯蒂安

+0

“(缩写)”代码是windows \ window.c的简化版本。你的分析与我的分析基本相同。我为本地副本PuTTY所做的解决方法是,如果字体名称为Consolas,则为字体宽度传递0。 (加下划线的字体也可能会搞砸;我认为你的修补程序将无法处理这些问题。) – 2010-04-07 02:05:39

+0

谢谢你的提示。我也把这个问题跟踪到了这个代码区域,最后指责了CreateFont。现在我已经更改了代码,以便字体宽度作为0传递(第1421行),并且看起来和预期的一样好。要主动处理额外的和窄/宽的字体(虽然从未见过),如果它在行1596之前等于font_width,则将x重置为0.无法找到类似大小的其他固定宽度字体的任何错误。 – ygoe 2011-05-18 14:01:05

不知道这是给你一个答案,但要确保字体的宽度是一个准确的整数像素宽度,将固定宽度在ClearType下,TrueType字体看起来不错。

要做到这一点,您需要通过一些试验和错误来“圆化”字体高度。

+0

从我的测试中,最好不要指定字体宽度,而是让Windows选择适合高度的字体宽度。 – 2010-04-25 17:06:04

+0

我确实尝试过,但您会注意到一些像素间距问题。 – leppie 2010-04-26 06:04:51