FreeType粗体时是如何计算的
Posted 柳鲲鹏
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FreeType粗体时是如何计算的相关的知识,希望对你有一定的参考价值。
提交了一个粗体代码,对方提出,粗体增加的程度是怎么算的。
粗体是有代码的,就是这个计算加粗幅度(比例关系),对方也表示是个经验值,希望能知道原理。所以我先以矢量字体为例,研究一下FreeType是怎么加粗的。
- 现有的粗体接口FT_GlyphSlot_Embolden
接口及加粗单位:
FT_GlyphSlot_Embolden( FT_GlyphSlot slot )
...
xstr = FT_MulFix( face->units_per_EM,
face->size->metrics.y_scale ) / 24;
...
加粗与字号有关,这一点是毫无疑问的。对方提出:24是个经验值,能不能找到原因?
- 矢量加粗接口FT_Outline_EmboldenXY
FT_Outline_EmboldenXY( FT_Outline* outline,
FT_Pos xstrength,
FT_Pos ystrength )
xstrength /= 2;
ystrength /= 2;
if ( d > -0xF000L )
...
/* non-strict inequalities avoid divide-by-zero when q == l == 0 */
if ( FT_MulFix( xstrength, q ) <= FT_MulFix( l, d ) )
shift.x = FT_MulDiv( shift.x, xstrength, d );
else
shift.x = FT_MulDiv( shift.x, l, q );
if ( FT_MulFix( ystrength, q ) <= FT_MulFix( l, d ) )
shift.y = FT_MulDiv( shift.y, ystrength, d );
else
shift.y = FT_MulDiv( shift.y, l, q );
else
shift.x = shift.y = 0;
for ( ;
i != j;
i = i < last ? i + 1 : first )
points[i].x += xstrength + shift.x;
points[i].y += ystrength + shift.y;
...
这一段代码什么意思呢?
- 参数如何起作用
把x或y的if部分注释,都会导致没有画面。
把else部分注释,没有影响。
if ( FT_MulFix( xstrength, q ) <= FT_MulFix( l, d ) )
shift.x = FT_MulDiv( shift.x, xstrength, d );
else
shift.x = FT_MulDiv( shift.x, l, q );
if ( FT_MulFix( ystrength, q ) <= FT_MulFix( l, d ) )
shift.y = FT_MulDiv( shift.y, ystrength, d );
else
shift.y = FT_MulDiv( shift.y, l, q );
这说明,关键在于FT_MulDiv。从代码也能看出,差异就在于中间的参数。
查了一下FT_MulDiv(a, b, c),大意是a*b/c
以上是关于FreeType粗体时是如何计算的的主要内容,如果未能解决你的问题,请参考以下文章
粗体效果对比:(Times New Roman自带) VS (FreeType粗体)