【问题标题】:FreeType: sizing fonts based on cap height?FreeType:根据大写高度调整字体大小?
【发布时间】:2014-04-23 18:24:00
【问题描述】:

我正在渲染文本,我需要字体的大写高度达到一定数量的像素。例如,在下面的标志中,我需要让 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 设置上限高度?如果是这样,我宁愿使用 that。

【问题讨论】:

  • Cairo 能否返回给定字符串的测量值?如果是这样,请询问x 任意磅值的高度。将此值除以磅值,就得到了您的比率。

标签: c fonts cairo freetype


【解决方案1】:

使用@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;

现在完美运行。

【讨论】:

  • 执行得非常好!这正是我的想法。
猜你喜欢
  • 2015-08-28
  • 1970-01-01
  • 2013-08-28
  • 2012-11-11
  • 2019-09-18
  • 2014-07-15
  • 2016-05-12
  • 2021-12-28
  • 2012-11-01
相关资源
最近更新 更多