如何在C中用Cairo绘制雪人等unicode文本符号?

时间:2016-10-19 02:06:03

标签: c unicode cairo

我正在尝试绘制雪人(☃)或山(⛰)等Unicode符号。绘制希腊语(例如,在UTF-8中为2个字节)或欧元符号(€,在UTF-8中为3个字节)有效,但没有一个更“复杂”的符号(⛱⛲⛳⛴...)有效。

我在Ubuntu上,我主要使用Ubuntu字体进行测试。它似乎支持那些因为我可以在我的文本编辑器,命令行和其他地方正确地看到符号。是否可以使用一些常用字体用Cairo实际绘制这些Unicode符号?

我想知道如何在C中以跨平台方式绘制符号,如果可能的话,没有其他依赖关系(例如pango)。

我的示例代码如下。当我使用所谓的玩具API并使用Python(目前仅暴露玩具API的pycairo)时,我得到相同的结果。

代码:

#include <cairo.h>
#include <cairo-ft.h>

int main(int argc, char *argv[]) {
    cairo_surface_t *surface;
    cairo_t *cr;
    cairo_font_face_t *face;
    cairo_status_t status;
    cairo_glyph_t *glyphs = NULL;
    int num_glyphs;
    FcPattern *pattern;
    FcResult result;
    char *name = "Ubuntu";

    char *utf8;
    if (argc > 1)
        utf8 = argv[1];
    else
        utf8 = "ε";
    double x = 5;
    double y = 40;

    surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 200, 50);
    cr = cairo_create(surface);

    FcInit();
    pattern = FcNameParse(name);
    FcDefaultSubstitute(pattern);
    FcConfigSubstitute(FcConfigGetCurrent(), pattern, FcMatchPattern);
    pattern = FcFontMatch(FcConfigGetCurrent(), pattern, &result);
    face = cairo_ft_font_face_create_for_pattern(pattern);
    cairo_set_font_face(cr, face);

    status = cairo_scaled_font_text_to_glyphs(cairo_get_scaled_font(cr),
                                              x, y,
                                              utf8, -1,
                                              &glyphs, &num_glyphs,
                                              NULL, NULL,
                                              NULL);

    if (status == CAIRO_STATUS_SUCCESS) {
        printf("num_glyphs: %d (strlen: %zd)\n", num_glyphs, strlen(utf8));
        for (int i = 0; i < num_glyphs; i++)
            printf("index: %lu\n", glyphs[i].index);
        cairo_show_glyphs(cr, glyphs, num_glyphs);
        cairo_glyph_free(glyphs);
    }
    else {
        printf("cairo_scaled_font_text_to_glyphs: %s\n",  cairo_status_to_string(status));
    }

    cairo_surface_write_to_png(surface, "out.png");
    cairo_destroy(cr);
    cairo_surface_destroy(surface);
}

编译:

cc -o text `pkg-config --cflags cairo` main.c -lfontconfig `pkg-config --libs cairo`

执行:

./text ☃

结果应该在out.png

0 个答案:

没有答案