【问题标题】:Detecting ClearType-optimized fonts检测 ClearType 优化的字体
【发布时间】:2011-02-01 00:18:39
【问题描述】:

问题:

有没有办法检查给定字体是否是 Microsoft 的 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 调用相同的宽度和高度创建这些字体的粗体版本。

【问题讨论】:

    标签: fonts gdi putty cleartype consolas


    【解决方案1】:

    我不确定我是否完全遵循“将其跟踪到以下(缩写)代码”的含义,但可以肯定的是,Consolas 粗体在 Putty 中看起来很糟糕。这是 windows/window.c 的腻子源(2010 年 4 月 5 日,使用颠覆“svn co svn://svn.tartarus.org/sgt/putty”获得的修订版 8914)。

    1386 字体[i] = CreateFont (font_height, font_width, 0, 0, w, FALSE, u, FALSE, \ 第1387章 第1388章 第1389章FF_DONTCARE,cfg.font.name) 1390 第1391章 1392 第1393章 第1394章 1395 第1396章 1397 第1398章 第1399章 1400 font_width = tm.tmAveCharWidth; 第1401章 ... 第1477章 第1478章 第1479章

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

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

    于 1 月添加。 2012 年 12 月 13 日:该错误仍在 putty 0.62 版(2011 年 12 月 10 日发布)中。现在要移动的行号是 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
    

    克里斯蒂安

    【讨论】:

    • “(缩写)”代码是 windows\window.c 的简化版本。你的分析和我的基本一样。如果字体名称是 Consolas,我为我的本地 PuTTY 副本所做的解决方法是为字体宽度传递 0。 (带下划线的字体也可能会弄乱;我认为您的修复将无法处理这些。)
    • 感谢您的提示。我也确实将问题追溯到这个代码区域并最终归咎于 CreateFont。现在我更改了代码,以便将字体宽度作为 0 (第 1421 行)传递,它看起来和预期的一样好。为了主动处理额外和窄/宽字体(虽然从未见过),如果 x 在第 1596 行之前等于 font_width,我将它重置为 0。找不到其他类似大小的固定宽度字体的任何错误。
    【解决方案2】:

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

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

    【讨论】:

    • 根据我的测试,最好根本不指定字体宽度,而是让 Windows 选择适合高度的字体宽度。
    • 我确实尝试过,但您会注意到一些偏离 1 个像素的间距问题。
    猜你喜欢
    • 2018-06-14
    • 1970-01-01
    • 2011-12-26
    • 2011-11-21
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多