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粗体)

粗体效果对比:(Times New Roman自带) VS (FreeType粗体)

FreeType粗体研究

FreeType粗体代码改动,对于效果的影响

FreeType粗体代码改动,对于效果的影响

中国FreeType联盟的几项工作