More vertical

Starting to get there, but not without yet another round of changes.

I think I know wheere to go now.
This commit is contained in:
Behdad Esfahbod 2011-05-19 13:08:00 -04:00
parent e609aeb1e2
commit 8b38faeede
4 changed files with 58 additions and 14 deletions

View File

@ -471,6 +471,34 @@ hb_font_get_glyph_origin_for_direction (hb_font_t *font,
} }
} }
void
hb_font_add_glyph_origin_for_direction (hb_font_t *font,
hb_codepoint_t glyph,
hb_direction_t direction,
hb_position_t *x, hb_position_t *y)
{
hb_position_t origin_x, origin_y;
hb_font_get_glyph_origin_for_direction (font, glyph, direction, &origin_x, &origin_y);
*x += origin_x;
*y += origin_y;
}
void
hb_font_subtract_glyph_origin_for_direction (hb_font_t *font,
hb_codepoint_t glyph,
hb_direction_t direction,
hb_position_t *x, hb_position_t *y)
{
hb_position_t origin_x, origin_y;
hb_font_get_glyph_origin_for_direction (font, glyph, direction, &origin_x, &origin_y);
*x -= origin_x;
*y -= origin_y;
}
void void
hb_font_get_glyph_kerning_for_direction (hb_font_t *font, hb_font_get_glyph_kerning_for_direction (hb_font_t *font,
hb_codepoint_t first_glyph, hb_codepoint_t second_glyph, hb_codepoint_t first_glyph, hb_codepoint_t second_glyph,
@ -502,12 +530,8 @@ hb_font_get_glyph_extents_for_direction (hb_font_t *font,
{ {
hb_bool_t ret = hb_font_get_glyph_extents (font, glyph, extents); hb_bool_t ret = hb_font_get_glyph_extents (font, glyph, extents);
if (ret) { if (ret)
hb_position_t origin_x, origin_y; hb_font_subtract_glyph_origin_for_direction (font, glyph, direction, &extents->x_bearing, &extents->y_bearing);
hb_font_get_glyph_origin_for_direction (font, glyph, direction, &origin_x, &origin_y);
extents->x_bearing += origin_x;
extents->y_bearing += origin_y;
}
} }
hb_bool_t hb_bool_t
@ -518,12 +542,8 @@ hb_font_get_glyph_contour_point_for_direction (hb_font_t *font,
{ {
hb_bool_t ret = hb_font_get_glyph_contour_point (font, glyph, point_index, x, y); hb_bool_t ret = hb_font_get_glyph_contour_point (font, glyph, point_index, x, y);
if (ret) { if (ret)
hb_position_t origin_x, origin_y; hb_font_subtract_glyph_origin_for_direction (font, glyph, direction, x, y);
hb_font_get_glyph_origin_for_direction (font, glyph, direction, &origin_x, &origin_y);
*x += origin_x;
*y += origin_y;
}
return ret; return ret;
} }

View File

@ -275,6 +275,16 @@ hb_font_get_glyph_origin_for_direction (hb_font_t *font,
hb_codepoint_t glyph, hb_codepoint_t glyph,
hb_direction_t direction, hb_direction_t direction,
hb_position_t *x, hb_position_t *y); hb_position_t *x, hb_position_t *y);
void
hb_font_add_glyph_origin_for_direction (hb_font_t *font,
hb_codepoint_t glyph,
hb_direction_t direction,
hb_position_t *x, hb_position_t *y);
void
hb_font_subtract_glyph_origin_for_direction (hb_font_t *font,
hb_codepoint_t glyph,
hb_direction_t direction,
hb_position_t *x, hb_position_t *y);
void void
hb_font_get_glyph_kerning_for_direction (hb_font_t *font, hb_font_get_glyph_kerning_for_direction (hb_font_t *font,

View File

@ -110,6 +110,8 @@ hb_ft_get_glyph_v_advance (hb_font_t *font HB_UNUSED,
if (unlikely (FT_Load_Glyph (ft_face, glyph, load_flags))) if (unlikely (FT_Load_Glyph (ft_face, glyph, load_flags)))
return FALSE; return FALSE;
/* Note: FreeType's vertical metrics grows downward while other FreeType coordinates
* have a Y growing upward. Hence the extra negation. */
*y = -ft_face->glyph->metrics.vertAdvance; *y = -ft_face->glyph->metrics.vertAdvance;
return TRUE; return TRUE;
} }
@ -140,7 +142,16 @@ hb_ft_get_glyph_v_origin (hb_font_t *font HB_UNUSED,
if (unlikely (FT_Load_Glyph (ft_face, glyph, load_flags))) if (unlikely (FT_Load_Glyph (ft_face, glyph, load_flags)))
return FALSE; return FALSE;
/* XXX */*y = ft_face->glyph->metrics.vertAdvance; /* Note: FreeType's vertical metrics grows downward while other FreeType coordinates
* have a Y growing upward. Hence the extra negation. */
*x = ft_face->glyph->metrics.horiBearingX - ft_face->glyph->metrics.vertBearingX;
*y = ft_face->glyph->metrics.horiBearingY - (-ft_face->glyph->metrics.vertBearingY);
/* TODO ??
if (glyph->format == FT_GLYPH_FORMAT_OUTLINE)
FT_Vector_Transform (&vector, &scaled_font->unscaled->Current_Shape);
*/
return TRUE; return TRUE;
} }
@ -190,7 +201,6 @@ hb_ft_get_glyph_extents (hb_font_t *font HB_UNUSED,
if (unlikely (FT_Load_Glyph (ft_face, glyph, load_flags))) if (unlikely (FT_Load_Glyph (ft_face, glyph, load_flags)))
return FALSE; return FALSE;
/* XXX: A few negations should be in order here, not sure. */
extents->x_bearing = ft_face->glyph->metrics.horiBearingX; extents->x_bearing = ft_face->glyph->metrics.horiBearingX;
extents->y_bearing = ft_face->glyph->metrics.horiBearingY; extents->y_bearing = ft_face->glyph->metrics.horiBearingY;
extents->width = ft_face->glyph->metrics.width; extents->width = ft_face->glyph->metrics.width;

View File

@ -262,6 +262,10 @@ hb_position_default (hb_ot_shape_context_t *c)
c->buffer->props.direction, c->buffer->props.direction,
&c->buffer->pos[i].x_advance, &c->buffer->pos[i].x_advance,
&c->buffer->pos[i].y_advance); &c->buffer->pos[i].y_advance);
hb_font_subtract_glyph_origin_for_direction (c->font, c->buffer->info[i].codepoint,
c->buffer->props.direction,
&c->buffer->pos[i].x_offset,
&c->buffer->pos[i].y_offset);
} }
} }