我正在尝试绘制雪人(☃)或山(⛰)等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
。