在cairo中使用pango文字渲染的文本显示区域是如何计算的

首先,pango可以使用pango_layout_get_pixel_extents获取ink_rect和logical_rect。

// API声明
void pango_layout_get_extents (PangoLayout    *layout,
			  PangoRectangle *ink_rect,
			  PangoRectangle *logical_rect);
// 调用示例
PangoRectangle rcInk, rcLogic;
pango_layout_get_pixel_extents(layout, &rcInk, &rcLogic);

假设使用cairo在(0, 0)位置输出文本”选项1″三个字,使用以上代码获取的 rcInk值为(x=0, y=6, w=52, h=19),rcLogi的值为(0,0,51,30)。那么输出的文字几个关键位置如下:

在绘制时,rcInk.y的值是实际墨迹的y方向起始值,可以理解为文字的顶部空白部分。这个空白在英文字母的绘制中比较明显,比如a会比i的rcInk.y的值更大,因为在四线三格中

垂直居中对齐:上图的是一个文本框的示意图,如果让“墨迹区域”在文本框box内垂直居中显示,可以按如下代码计算oy的值。

rcInk, rcLogic; 
...

topspace = rcInk.y;
oy = (box.h - ink.h) / 2 - topspace;

...
cairo_move(x, oy);
....

底部对齐:底部对齐可按如下方法 计算oy的值

rcInk, rcLogic; 
...

topspace = rcInk.y;
oy = box.h - ink.h - topsace;

...
cairo_move(x, oy);
....