如何在Pango/Cairo中调整文本字间距?
在Cairo中使用Pango调整文本字符间距
要给Cairo中的文本增加字符间距,需借助Pango的属性系统实现。核心是通过pango_attr_letter_spacing_new创建字间距属性,并将其应用到整个文本范围。
以下是修改后的完整可运行代码:
#include <cairo.h> #include <pango/pangocairo.h> int main(int argc, char **argv) { cairo_surface_t *s = cairo_image_surface_create(CAIRO_FORMAT_RGBA128F, 512, 128); cairo_t *ctx = cairo_create(s); cairo_set_source_rgb(ctx, 1, 1, 1); cairo_paint(ctx); cairo_set_source_rgb(ctx, 0.0, 0.0, 0.0); PangoLayout *layout = pango_cairo_create_layout(ctx); pango_layout_set_text(layout, "Hello world", -1); // 创建并设置字间距属性 PangoAttrList *attr_list = pango_attr_list_new(); // 额外字间距:500*PANGO_SCALE 对应约0.488em的间距(PANGO_SCALE固定为1024) // 正数增加间距,负数缩小间距,可根据需求调整数值 PangoAttribute *letter_spacing_attr = pango_attr_letter_spacing_new(500 * PANGO_SCALE); letter_spacing_attr->start_index = 0; letter_spacing_attr->end_index = -1; // 应用到全部文本 pango_attr_list_insert(attr_list, letter_spacing_attr); pango_layout_set_attributes(layout, attr_list); pango_attr_list_unref(attr_list); PangoFontDescription *desc = pango_font_description_from_string("Times New Roman"); pango_font_description_set_size(desc, 32*PANGO_SCALE); pango_layout_set_font_description(layout, desc); pango_font_description_free(desc); cairo_move_to(ctx, 32.0, 32.0); pango_cairo_show_layout(ctx, layout); g_object_unref(layout); cairo_surface_write_to_png(s, "helloworld.png"); cairo_destroy(ctx); cairo_surface_destroy(s); }
关键说明
- 属性列表:
PangoAttrList用于管理文本属性,这里仅需添加字间距属性。 - 间距单位:
pango_attr_letter_spacing_new的参数单位是1/PANGO_SCALE em,PANGO_SCALE固定为1024,因此500*PANGO_SCALE等价于约0.488em的额外间距。 - 应用范围:
start_index=0和end_index=-1表示将属性作用于整个文本,若需局部调整,可修改这两个索引值。 - 资源释放:使用完属性列表后需调用
pango_attr_list_unref释放内存,避免泄漏。
编译命令保持不变:
gcc -o helloworld `pkg-config --cflags --libs cairo pangocairo pango` helloworld.c
内容的提问来源于stack exchange,提问作者cryptarch
相关产品推荐
相关产品推荐

