我正在渲染文字,我需要将字体的高度设置为一定数量的像素。例如,在下面的符号中,我需要将单词SPEED
和LIMIT
设置为相同的高度,在本例中为45 px,因此我将字体大小设置为45(我现在理解了)并不是一个好主意)并且得到了与我应该拥有的不同的边框(红色)。
所以我创建了字体对象
Text *t = (Text *)e;
cairo_surface_t *s = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 0, 0);
cairo_t *cr = cairo_create(s);
cairo_font_face_t *font = cairo_ft_font_face_create_for_ft_face(fonts[t->series], 0);
cairo_set_font_face(cr, font);
将字体大小设置为45,
cairo_set_font_size(cr, 1.5 * t->size);
然后计算边界框的范围,该边界框与文本的正确大小不对齐。
cairo_text_extents_t ext;
cairo_text_extents(cr, t->data, &ext);
t->geom->height = ext.height; // t->size;
t->geom->width = ext.width;
t->lsb = ext.x_bearing;
cairo_font_face_destroy(font);
cairo_destroy(cr);
cairo_surface_destroy(s);
我猜我必须使用FT_Set_Pixel_Sizes
或其他东西,但我并不确切知道如何使用它。
编辑:有没有办法使用Cairo设置上限?如果是这样,我宁愿使用 。
答案 0 :(得分:2)
使用@ Jongware的评论,我添加了一个scale
字段,用于计算此特定文本的缩放系数(对于某个特定的上限,它应该是一致的)。
cairo_text_extents_t ext, xext;
cairo_text_extents(cr, t->data, &ext);
cairo_text_extents(cr, "X", &xext);
t->scale = t->size / xext.height;
t->geom->height = t->size;
t->geom->width = ext.width * t->scale;
t->lsb = ext.x_bearing * t->scale;
现在效果很好。