[cairo] Set scaled-font extents
This commit is contained in:
parent
d6ecda36bf
commit
dc2bf2664d
|
@ -342,18 +342,37 @@ hb_cairo_render_color_glyph (cairo_scaled_font_t *scaled_font,
|
||||||
|
|
||||||
static const cairo_user_data_key_t hb_cairo_font_user_data_key = {0};
|
static const cairo_user_data_key_t hb_cairo_font_user_data_key = {0};
|
||||||
|
|
||||||
|
static cairo_status_t
|
||||||
|
hb_cairo_init_scaled_font (cairo_scaled_font_t *scaled_font,
|
||||||
|
cairo_t *cr HB_UNUSED,
|
||||||
|
cairo_font_extents_t *extents)
|
||||||
|
{
|
||||||
|
hb_font_t *font = (hb_font_t *) cairo_font_face_get_user_data (cairo_scaled_font_get_font_face (scaled_font),
|
||||||
|
&hb_cairo_font_user_data_key);
|
||||||
|
|
||||||
|
hb_position_t x_scale, y_scale;
|
||||||
|
hb_font_get_scale (font, &x_scale, &y_scale);
|
||||||
|
|
||||||
|
hb_font_extents_t hb_extents;
|
||||||
|
hb_font_get_h_extents (font, &hb_extents);
|
||||||
|
|
||||||
|
extents->ascent = (double) hb_extents.ascender / y_scale;
|
||||||
|
extents->descent = (double) -hb_extents.descender / y_scale;
|
||||||
|
extents->height = extents->ascent + extents->descent;
|
||||||
|
|
||||||
|
return CAIRO_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static cairo_status_t
|
static cairo_status_t
|
||||||
hb_cairo_render_glyph (cairo_scaled_font_t *scaled_font,
|
hb_cairo_render_glyph (cairo_scaled_font_t *scaled_font,
|
||||||
unsigned long glyph,
|
unsigned long glyph,
|
||||||
cairo_t *cr,
|
cairo_t *cr,
|
||||||
cairo_text_extents_t *extents)
|
cairo_text_extents_t *extents)
|
||||||
{
|
{
|
||||||
hb_font_t *font;
|
hb_font_t *font = (hb_font_t *) cairo_font_face_get_user_data (cairo_scaled_font_get_font_face (scaled_font),
|
||||||
hb_position_t x_scale, y_scale;
|
|
||||||
|
|
||||||
font = (hb_font_t *) cairo_font_face_get_user_data (cairo_scaled_font_get_font_face (scaled_font),
|
|
||||||
&hb_cairo_font_user_data_key);
|
&hb_cairo_font_user_data_key);
|
||||||
|
|
||||||
|
hb_position_t x_scale, y_scale;
|
||||||
hb_font_get_scale (font, &x_scale, &y_scale);
|
hb_font_get_scale (font, &x_scale, &y_scale);
|
||||||
cairo_scale (cr, +1./x_scale, -1./y_scale);
|
cairo_scale (cr, +1./x_scale, -1./y_scale);
|
||||||
|
|
||||||
|
@ -372,23 +391,18 @@ hb_cairo_render_color_glyph (cairo_scaled_font_t *scaled_font,
|
||||||
cairo_t *cr,
|
cairo_t *cr,
|
||||||
cairo_text_extents_t *extents)
|
cairo_text_extents_t *extents)
|
||||||
{
|
{
|
||||||
hb_font_t *font;
|
hb_font_t *font = (hb_font_t *) cairo_font_face_get_user_data (cairo_scaled_font_get_font_face (scaled_font),
|
||||||
unsigned int palette = 0;
|
|
||||||
cairo_font_options_t *options;
|
|
||||||
hb_color_t color;
|
|
||||||
hb_position_t x_scale, y_scale;
|
|
||||||
|
|
||||||
font = (hb_font_t *) cairo_font_face_get_user_data (cairo_scaled_font_get_font_face (scaled_font),
|
|
||||||
&hb_cairo_font_user_data_key);
|
&hb_cairo_font_user_data_key);
|
||||||
|
|
||||||
|
unsigned int palette = 0;
|
||||||
#ifdef CAIRO_COLOR_PALETTE_DEFAULT
|
#ifdef CAIRO_COLOR_PALETTE_DEFAULT
|
||||||
options = cairo_font_options_create ();
|
cairo_font_options_t *options = cairo_font_options_create ();
|
||||||
cairo_scaled_font_get_font_options (scaled_font, options);
|
cairo_scaled_font_get_font_options (scaled_font, options);
|
||||||
palette = cairo_font_options_get_color_palette (options);
|
palette = cairo_font_options_get_color_palette (options);
|
||||||
cairo_font_options_destroy (options);
|
cairo_font_options_destroy (options);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
color = HB_COLOR (0, 0, 0, 255);
|
hb_color_t color = HB_COLOR (0, 0, 0, 255);
|
||||||
cairo_pattern_t *pattern = cairo_get_source (cr);
|
cairo_pattern_t *pattern = cairo_get_source (cr);
|
||||||
if (cairo_pattern_get_type (pattern) == CAIRO_PATTERN_TYPE_SOLID)
|
if (cairo_pattern_get_type (pattern) == CAIRO_PATTERN_TYPE_SOLID)
|
||||||
{
|
{
|
||||||
|
@ -397,6 +411,7 @@ hb_cairo_render_color_glyph (cairo_scaled_font_t *scaled_font,
|
||||||
color = HB_COLOR ((int)(b * 255.), (int)(g * 255.), (int) (r * 255.), (int)(a * 255.));
|
color = HB_COLOR ((int)(b * 255.), (int)(g * 255.), (int) (r * 255.), (int)(a * 255.));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hb_position_t x_scale, y_scale;
|
||||||
hb_font_get_scale (font, &x_scale, &y_scale);
|
hb_font_get_scale (font, &x_scale, &y_scale);
|
||||||
cairo_scale (cr, +1./x_scale, -1./y_scale);
|
cairo_scale (cr, +1./x_scale, -1./y_scale);
|
||||||
|
|
||||||
|
@ -413,6 +428,7 @@ user_font_face_create (hb_font_t *font)
|
||||||
cairo_font_face_t *cairo_face;
|
cairo_font_face_t *cairo_face;
|
||||||
|
|
||||||
cairo_face = cairo_user_font_face_create ();
|
cairo_face = cairo_user_font_face_create ();
|
||||||
|
cairo_user_font_face_set_init_func (cairo_face, hb_cairo_init_scaled_font);
|
||||||
cairo_user_font_face_set_render_glyph_func (cairo_face, hb_cairo_render_glyph);
|
cairo_user_font_face_set_render_glyph_func (cairo_face, hb_cairo_render_glyph);
|
||||||
#ifdef HAVE_CAIRO_USER_FONT_FACE_SET_RENDER_COLOR_GLYPH_FUNC
|
#ifdef HAVE_CAIRO_USER_FONT_FACE_SET_RENDER_COLOR_GLYPH_FUNC
|
||||||
hb_face_t *face = hb_font_get_face (font);
|
hb_face_t *face = hb_font_get_face (font);
|
||||||
|
|
Loading…
Reference in New Issue