diff --git a/src/hb-ot-font.cc b/src/hb-ot-font.cc index 320b4b5c7..cc26f0624 100644 --- a/src/hb-ot-font.cc +++ b/src/hb-ot-font.cc @@ -293,9 +293,20 @@ hb_ot_get_glyph_v_origin (hb_font_t *font, const OT::VORG &VORG = *ot_face->VORG; if (VORG.has_data ()) { - *y = font->em_scale_y (VORG.get_y_origin (glyph)); + float delta = 0; + + const OT::vmtx_accelerator_t &vmtx = *ot_face->vmtx; + const OT::VVAR &VVAR = *vmtx.var_table; + if (font->num_coords && + !VVAR.get_vorg_var (glyph, + font->coords, font->num_coords, + &delta)) + goto out; + + *y = font->em_scale_y (VORG.get_y_origin (glyph) + delta); return true; } +out: hb_glyph_extents_t extents = {0}; if (ot_face->glyf->get_extents (font, glyph, &extents)) diff --git a/src/hb-ot-var-hvar-table.hh b/src/hb-ot-var-hvar-table.hh index 56efcdbee..436c54ac0 100644 --- a/src/hb-ot-var-hvar-table.hh +++ b/src/hb-ot-var-hvar-table.hh @@ -392,6 +392,16 @@ struct VVAR : HVARVVAR { bool subset (hb_subset_context_t *c) const { return HVARVVAR::_subset (c); } + bool get_vorg_var (hb_codepoint_t glyph, + const int *coords, unsigned int coord_count, + float *delta) const + { + if (!vorgMap) return false; + uint32_t varidx = (this+vorgMap).map (glyph); + *delta = (this+varStore).get_delta (varidx, coords, coord_count); + return true; + } + protected: Offset32To vorgMap; /* Offset to vertical-origin var-idx mapping. */