检测的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后得到一个好得多的大胆索拉字体(我也尝试过其他所有可用的字体(快递,档案,龙力等),他们也没有不利。影响我已将这个建议,腻子团队下面是该差异图:
添加于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
克里斯蒂安
不知道这是给你一个答案,但要确保字体的宽度是一个准确的整数像素宽度,将固定宽度在ClearType下,TrueType字体看起来不错。
要做到这一点,您需要通过一些试验和错误来“圆化”字体高度。
从我的测试中,最好不要指定字体宽度,而是让Windows选择适合高度的字体宽度。 – 2010-04-25 17:06:04
我确实尝试过,但您会注意到一些像素间距问题。 – leppie 2010-04-26 06:04:51
“(缩写)”代码是windows \ window.c的简化版本。你的分析与我的分析基本相同。我为本地副本PuTTY所做的解决方法是,如果字体名称为Consolas,则为字体宽度传递0。 (加下划线的字体也可能会搞砸;我认为你的修补程序将无法处理这些问题。) – 2010-04-07 02:05:39
谢谢你的提示。我也把这个问题跟踪到了这个代码区域,最后指责了CreateFont。现在我已经更改了代码,以便字体宽度作为0传递(第1421行),并且看起来和预期的一样好。要主动处理额外的和窄/宽的字体(虽然从未见过),如果它在行1596之前等于font_width,则将x重置为0.无法找到类似大小的其他固定宽度字体的任何错误。 – ygoe 2011-05-18 14:01:05