[beyond-64k/subset] Fetch lsb from glyph table if not available
The beyond-64k hmtx table doesn't encode LSB. If subsetting brings the glyph under 64k (which currently is the only mode we support), then we need to encode the LSB, which wasn't available. We need to fetch xMin from glyf table and set it as LSB.
This commit is contained in:
parent
1111c7578e
commit
000a3c5dca
|
@ -515,6 +515,7 @@ struct Glyph
|
||||||
|
|
||||||
hb_bytes_t get_bytes () const { return bytes; }
|
hb_bytes_t get_bytes () const { return bytes; }
|
||||||
glyph_type_t get_type () const { return type; }
|
glyph_type_t get_type () const { return type; }
|
||||||
|
const GlyphHeader *get_header () const { return header; }
|
||||||
|
|
||||||
Glyph () : bytes (),
|
Glyph () : bytes (),
|
||||||
header (bytes.as<GlyphHeader> ()),
|
header (bytes.as<GlyphHeader> ()),
|
||||||
|
|
|
@ -346,6 +346,15 @@ struct glyf_accelerator_t
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
bool get_leading_bearing_without_var_unscaled (hb_codepoint_t gid, bool is_vertical, int *lsb) const
|
||||||
|
{
|
||||||
|
if (unlikely (gid >= num_glyphs)) return false;
|
||||||
|
if (is_vertical) return false; // TODO Humm, what to do here?
|
||||||
|
|
||||||
|
*lsb = glyph_for_gid (gid).get_header ()->xMin;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
bool get_extents (hb_font_t *font, hb_codepoint_t gid, hb_glyph_extents_t *extents) const
|
bool get_extents (hb_font_t *font, hb_codepoint_t gid, hb_glyph_extents_t *extents) const
|
||||||
{
|
{
|
||||||
|
|
|
@ -633,20 +633,4 @@ hb_ot_font_set_funcs (hb_font_t *font)
|
||||||
_hb_ot_font_destroy);
|
_hb_ot_font_destroy);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef HB_NO_VAR
|
|
||||||
bool
|
|
||||||
_glyf_get_leading_bearing_with_var_unscaled (hb_font_t *font, hb_codepoint_t glyph, bool is_vertical,
|
|
||||||
int *lsb)
|
|
||||||
{
|
|
||||||
return font->face->table.glyf->get_leading_bearing_with_var_unscaled (font, glyph, is_vertical, lsb);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned
|
|
||||||
_glyf_get_advance_with_var_unscaled (hb_font_t *font, hb_codepoint_t glyph, bool is_vertical)
|
|
||||||
{
|
|
||||||
return font->face->table.glyf->get_advance_with_var_unscaled (font, glyph, is_vertical);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -50,6 +50,9 @@ _glyf_get_leading_bearing_with_var_unscaled (hb_font_t *font, hb_codepoint_t gly
|
||||||
HB_INTERNAL unsigned
|
HB_INTERNAL unsigned
|
||||||
_glyf_get_advance_with_var_unscaled (hb_font_t *font, hb_codepoint_t glyph, bool is_vertical);
|
_glyf_get_advance_with_var_unscaled (hb_font_t *font, hb_codepoint_t glyph, bool is_vertical);
|
||||||
|
|
||||||
|
HB_INTERNAL bool
|
||||||
|
_glyf_get_leading_bearing_without_var_unscaled (hb_face_t *face, hb_codepoint_t gid, bool is_vertical, int *lsb);
|
||||||
|
|
||||||
|
|
||||||
namespace OT {
|
namespace OT {
|
||||||
|
|
||||||
|
@ -208,7 +211,8 @@ struct hmtxvmtx
|
||||||
if (!c->plan->old_gid_for_new_gid (_, &old_gid))
|
if (!c->plan->old_gid_for_new_gid (_, &old_gid))
|
||||||
return hb_pair (0u, 0);
|
return hb_pair (0u, 0);
|
||||||
int lsb = 0;
|
int lsb = 0;
|
||||||
(void) _mtx.get_leading_bearing_without_var_unscaled (old_gid, &lsb);
|
if (!_mtx.get_leading_bearing_without_var_unscaled (old_gid, &lsb))
|
||||||
|
(void) _glyf_get_leading_bearing_without_var_unscaled (c->plan->source, old_gid, !T::is_horizontal, &lsb);
|
||||||
return hb_pair (_mtx.get_advance_without_var_unscaled (old_gid), +lsb);
|
return hb_pair (_mtx.get_advance_without_var_unscaled (old_gid), +lsb);
|
||||||
}
|
}
|
||||||
return mtx_map->get (_);
|
return mtx_map->get (_);
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
#include "OT/Color/COLR/COLR.hh"
|
#include "OT/Color/COLR/COLR.hh"
|
||||||
#include "hb-ot-glyf-table.hh"
|
#include "hb-ot-glyf-table.hh"
|
||||||
#include "hb-ot-head-table.hh"
|
#include "hb-ot-head-table.hh"
|
||||||
|
#include "hb-ot-hmtx-table.hh"
|
||||||
#include "hb-ot-maxp-table.hh"
|
#include "hb-ot-maxp-table.hh"
|
||||||
|
|
||||||
#ifndef HB_NO_VISIBILITY
|
#ifndef HB_NO_VISIBILITY
|
||||||
|
@ -108,4 +109,26 @@ hb_face_t::load_upem () const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef HB_NO_VAR
|
||||||
|
bool
|
||||||
|
_glyf_get_leading_bearing_with_var_unscaled (hb_font_t *font, hb_codepoint_t glyph, bool is_vertical,
|
||||||
|
int *lsb)
|
||||||
|
{
|
||||||
|
return font->face->table.glyf->get_leading_bearing_with_var_unscaled (font, glyph, is_vertical, lsb);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned
|
||||||
|
_glyf_get_advance_with_var_unscaled (hb_font_t *font, hb_codepoint_t glyph, bool is_vertical)
|
||||||
|
{
|
||||||
|
return font->face->table.glyf->get_advance_with_var_unscaled (font, glyph, is_vertical);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
bool
|
||||||
|
_glyf_get_leading_bearing_without_var_unscaled (hb_face_t *face, hb_codepoint_t gid, bool is_vertical, int *lsb)
|
||||||
|
{
|
||||||
|
return face->table.glyf->get_leading_bearing_without_var_unscaled (gid, is_vertical, lsb);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue