更改 pango/cairo 中的字母间距

问题描述 投票:0回答:1

我想在开罗的文本中的字母之间添加更多空格。 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。

输出:

你好世界

我应该在代码中添加或更改什么来增加图像中的字母间距?我有一种感觉涉及属性或属性列表,但当目标只是修改整个字符串的这个属性时,不清楚使用它们的正确方法是什么。

c cairo pango pangocairo
1个回答
0
投票

我将来自 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);
}

Program output

1024是

PANGO_SCALE
,是Pango的缩放单位。所以例如0.5 对于 Pango 来说用 1024/2 表示。

© www.soinside.com 2019 - 2024. All rights reserved.