summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBehdad Esfahbod <behdad@behdad.org>2014-09-25 17:15:35 +0300
committerBehdad Esfahbod <behdad@behdad.org>2014-09-25 17:15:35 +0300
commitd7c160a1530adabbcf33725b105072293115a34c (patch)
tree4d730a0eee62a85c69e225d08968393121572089
parentbe1cca270257bfdfee3fbe821175269713acf408 (diff)
[ot-font] Handle missing vertical metrics tables
-rw-r--r--src/hb-ot-font.cc26
1 files changed, 19 insertions, 7 deletions
diff --git a/src/hb-ot-font.cc b/src/hb-ot-font.cc
index d629c410..24de830a 100644
--- a/src/hb-ot-font.cc
+++ b/src/hb-ot-font.cc
@@ -39,11 +39,15 @@ struct metrics_accel_t
{
unsigned int num_metrics;
unsigned int num_advances;
+ unsigned int default_advance;
const OT::_mtx *table;
hb_blob_t *blob;
- inline void init (hb_font_t *font, hb_tag_t _hea_tag, hb_tag_t _mtx_tag)
+ inline void init (hb_font_t *font,
+ hb_tag_t _hea_tag, hb_tag_t _mtx_tag,
+ unsigned int default_advance)
{
+ this->default_advance = default_advance;
this->num_metrics = font->face->get_num_glyphs ();
hb_blob_t *_hea_blob = OT::Sanitizer<OT::_hea>::sanitize (font->face->reference_table (_hea_tag));
@@ -55,6 +59,7 @@ struct metrics_accel_t
if (unlikely (!this->num_advances ||
2 * (this->num_advances + this->num_metrics) < hb_blob_get_length (this->blob)))
{
+ this->num_metrics = this->num_advances = 0;
hb_blob_destroy (this->blob);
this->blob = hb_blob_get_empty ();
}
@@ -69,7 +74,15 @@ struct metrics_accel_t
inline unsigned int get_advance (hb_codepoint_t glyph) const
{
if (unlikely (glyph >= this->num_metrics))
- return 0;
+ {
+ /* If this->num_metrics is zero, it means we don't have the metrics table
+ * for this direction: return one EM. Otherwise, it means that the glyph
+ * index is out of bound: return zero. */
+ if (this->num_metrics)
+ return 0;
+ else
+ return this->default_advance;
+ }
if (glyph >= this->num_advances)
glyph = this->num_advances - 1;
@@ -80,8 +93,6 @@ struct metrics_accel_t
struct hb_ot_font_t
{
- unsigned int num_glyphs;
-
metrics_accel_t h_metrics;
metrics_accel_t v_metrics;
@@ -99,11 +110,11 @@ _hb_ot_font_create (hb_font_t *font)
if (unlikely (!ot_font))
return NULL;
- ot_font->num_glyphs = font->face->get_num_glyphs ();
+ unsigned int upem = font->face->get_upem ();
- ot_font->h_metrics.init (font, HB_OT_TAG_hhea, HB_OT_TAG_hmtx);
+ ot_font->h_metrics.init (font, HB_OT_TAG_hhea, HB_OT_TAG_hmtx, upem>>1);
/* TODO Can we do this lazily? */
- ot_font->v_metrics.init (font, HB_OT_TAG_vhea, HB_OT_TAG_vmtx);
+ ot_font->v_metrics.init (font, HB_OT_TAG_vhea, HB_OT_TAG_vmtx, upem);
ot_font->cmap_blob = OT::Sanitizer<OT::cmap>::sanitize (font->face->reference_table (HB_OT_TAG_cmap));
const OT::cmap *cmap = OT::Sanitizer<OT::cmap>::lock_instance (ot_font->cmap_blob);
@@ -233,6 +244,7 @@ hb_ot_get_glyph_v_kerning (hb_font_t *font HB_UNUSED,
hb_codepoint_t bottom_glyph HB_UNUSED,
void *user_data HB_UNUSED)
{
+ /* OpenType doesn't have vertical-kerning other than GPOS. */
return 0;
}