如何在Cairo中利用font extents参数计算Freetype字体的baseline
基于Cairo字体度量参数计算baseline的方法
首先先明确Cairo中cairo_font_extents_t结构体各相关参数的定义:
ascent:字体中字符从基线向上延伸的最大距离,数值始终非负descent:字体中字符从基线向下延伸的最大距离,数值始终非负height:单行文本的官方推荐行高,通常等于ascent + descent + 默认行间距max_x_advance:单个字符的最大水平前进距离,仅横排文本会用到max_y_advance:单个字符的最大垂直前进距离,仅竖排文本会用到
具体计算逻辑
Cairo默认使用左上角为坐标原点、y轴向下递增的坐标体系,不同使用场景下的基线计算方式如下:
已知文本行的顶部对齐坐标:
如果你的文本需要顶部对齐到y坐标为text_top_y的位置,那么基线的y坐标为:baseline_y = text_top_y + ascent
你直接调用cairo_move_to(cr, x坐标, baseline_y)后绘制文本,即可实现文本顶部对齐到text_top_y的效果。已知文本行的底部对齐坐标:
如果你的文本需要底部对齐到y坐标为text_bottom_y的位置,那么基线的y坐标为:baseline_y = text_bottom_y - descent多行文本逐行计算基线:
如果需要绘制多行文本,第一行的基线按顶部对齐规则计算即可,后续每一行的基线直接在上一行基线的基础上加height即可:next_line_baseline_y = current_line_baseline_y + height
注意事项
- 如果你修改过Cairo上下文的坐标变换矩阵(比如将y轴改为向上递增),需要根据实际坐标系调整计算时的加减符号
- 不要直接用
height减去descent来计算顶部对齐的基线,因为height包含了额外的行间距,计算结果会有偏差
内容的提问来源于stack exchange,提问作者david
相关产品推荐
相关产品推荐

