问题:
有没有办法检查某个字体是否属于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调用相同的宽度和高度创建这些字体的粗体版本。
答案 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团队。这是一个显示差异的图:
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字体看起来不错。
要实现这一点,您需要通过一些反复试验来“舍入”字体高度。