代码之家  ›  专栏  ›  技术社区  ›  Josh Kelley

检测ClearType优化字体

  •  1
  • Josh Kelley  · 技术社区  · 15 年前

    问题:

    有没有办法检查给定的字体是否是微软的 ClearType-optimized fonts ?

    我想我可以简单地硬编码字体名称列表,因为它是一个相对较短的列表,但这看起来有点难看。不管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调用相同的宽度和高度创建这些字体的粗体版本。

    2 回复  |  直到 13 年前
        1
  •  4
  •   Kristjan Jonasson    13 年前

    我不确定我是否完全遵循了“跟踪到下面(缩写)代码”的意思,但是足够的consolas-bold在putty中看起来很糟糕。这是windows/window.c的Putty源(修订版8914,由Subversion“SVN CO SVN://svn.tartarus.org/sgt/putty”于2010年4月5日获得)。

    < PRE> 1386字体[i]=createfont(字体高度,字体宽度,0,0,w,false,u,false,,\ 1387 C,输出默认值\ 1388 clip_-default_-precis,字体质量(cfg.font_-quality),,\ 1389 Fixed_Pitch_FF U Dontcare,cfg.font.name) 一千三百九十 1391 F(字体_normal,cfg.font.charset,fw_dontcare,false); 一千三百九十二 1393 SelectObject(HDC,字体[FONT_normal]); 1394 GetTextMetrics(HDC和TM); 一千三百九十五 1396 GetObject(字体[Font_Normal]、Sizeof(LogFont)、&LFont); 一千三百九十七 1398如果(pick_width==0 pick_height==0){ 1399字体高度=tm.tm height; 1400字体宽度=tm.tmavecharwidth; 1401 } … 1477 if(粗体模式=粗体字体){ 1478 F(字体\粗体,cfg.font.charset,fw \粗体,假); 1479 }

    对于10 pt consolas,当为字体“normal”调用createfont时(通过宏f),字体“height”和“font”宽度的值分别为-13和0,而为字体“bold”调用时,字体“height”和“font”宽度的值分别为15和7(在第13991400行上更改值)。显式设置宽度值与consolas粗体字体不一致。如果修改window.c,使第1477-1479行移到第1391行之后,将获得更好的粗体consolas字体(我还尝试了所有其他可用字体(courier、bitstream、lucida等),并且它们没有受到不利影响。我已经把这个建议发给油灰队了。下图显示了不同之处:

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

    2012年1月13日增加:Bug仍在Putty的0.62版本中(2011年12月10日发布)。现在要移动的行号是1439之后的1532-1534。为了完整起见,以下是我在Cygwin中执行的步骤:

    $svn co svn://svn.tartarus.org/sgt/putty2
    $CD腻子
    $perl mkfiles.pl文件
    CD窗口
    $---编辑window.c并移动3行---
    $make cc=gcc-3-f makefile.cyg
    $---将生成的可执行文件(包括putty.exe)移动到合适的文件夹
    $---将可执行文件的快捷方式添加到Windows“开始”菜单
    < /代码> 
    
    

    克里斯琴

    o以下(缩写)代码”,但确实足够的consolas粗体在油灰中看起来不好。这里是windows/window.c的Putty源(修订版8914,由Subversion“SVN CO SVN://svn.tartarus.org/sgt/putty”于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 pt consolas,当为字体“normal”调用createfont时(通过宏f),字体“height”和“font”宽度的值分别为-13和0,而为字体“bold”调用时,字体“height”和“font”宽度的值分别为15和7(在第13991400行上更改值)。显式设置宽度值与consolas粗体字体不一致。如果修改window.c,使第1477-1479行移到第1391行之后,将获得更好的粗体consolas字体(我还尝试了所有其他可用字体(courier、bitstream、lucida等),并且它们没有受到不利影响。我已经把这个建议发给油灰队了。下图显示了不同之处: Bold-consolas-example

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

    2012年1月13日增加:Bug仍在Putty的0.62版本中(2011年12月10日发布)。现在要移动的行号是1439之后的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
    

    克里斯詹

        2
  •  0
  •   leppie    15 年前

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

    要实现这一点,您需要“四舍五入”您的字体高度与一些尝试和错误。

    推荐文章