我想在开罗的文本中的字母之间添加更多空格。 Cairo 似乎没有用于更改字母间距的本机实现。
看来Pango 应该是天作之合。然而,网上似乎没有很多使用 pangocairo 的例子,而且 Pango 文档相当简洁。
这是一个最小的工作示例,展示了我迄今为止所做的工作:
#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.0, 128.0);
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);
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);
pango_cairo_update_layout(ctx, layout);
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);
}
编译
gcc -o helloworld `pkg-config --cflags --libs cairo pangocairo pango` helloworld.c
然后用
helloworld
生成最终的png。
输出:
我应该在代码中添加或更改什么来增加图像中的字母间距?我有一种感觉涉及属性或属性列表,但当目标只是修改整个字符串的这个属性时,不清楚使用它们的正确方法是什么。
我将来自 https://stackoverflow.com/users/8339821/user14063792468 的评论变成了对示例程序的修改。只需将
pango_layout_set_text(layout, "Hello world", -1);
替换为 pango_layout_set_markup(layout, "Hello <span letter_spacing=\"10240\" underline=\"low\">world</span>!", -1);
即可。为什么要标记?只是因为。
#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.0, 128.0);
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_markup(layout, "Hello <span letter_spacing=\"10240\" underline=\"low\">world</span>!", -1);
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);
pango_cairo_update_layout(ctx, layout);
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);
}
1024是
PANGO_SCALE
,是Pango的缩放单位。所以例如0.5 对于 Pango 来说用 1024/2 表示。