Fix vertical font metrics
authorBehdad Esfahbod <behdad@behdad.org>
Wed, 26 Oct 2016 15:19:07 +0000 (17:19 +0200)
committerBehdad Esfahbod <behdad@behdad.org>
Wed, 26 Oct 2016 16:01:20 +0000 (18:01 +0200)
Ouch!

src/hb-font-private.hh
src/hb-ot-font.cc

index 6d5012e..99a8656 100644 (file)
@@ -303,14 +303,14 @@ struct hb_font_t {
       if (!get_font_h_extents (extents))
       {
        extents->ascender = y_scale * .8;
-       extents->descender = y_scale - extents->ascender;
+       extents->descender = extents->ascender - y_scale;
        extents->line_gap = 0;
       }
     } else {
       if (!get_font_v_extents (extents))
       {
        extents->ascender = x_scale / 2;
-       extents->descender = x_scale - extents->ascender;
+       extents->descender = extents->ascender - x_scale;
        extents->line_gap = 0;
       }
     }
index 0b7e31b..9fd8d05 100644 (file)
@@ -47,6 +47,7 @@ struct hb_ot_face_metrics_accelerator_t
   unsigned short ascender;
   unsigned short descender;
   unsigned short line_gap;
+  bool has_font_extents;
 
   const OT::_mtx *table;
   hb_blob_t *blob;
@@ -82,9 +83,12 @@ struct hb_ot_face_metrics_accelerator_t
       this->ascender = _hea->ascender;
       this->descender = _hea->descender;
       this->line_gap = _hea->lineGap;
+      got_font_extents = (this->ascender | this->descender) != 0;
     }
     hb_blob_destroy (_hea_blob);
 
+    this->has_font_extents = got_font_extents;
+
     this->blob = OT::Sanitizer<OT::_mtx>::sanitize (face->reference_table (_mtx_tag));
 
     /* Cap num_metrics() and num_advances() based on table length. */
@@ -475,7 +479,7 @@ hb_ot_get_font_h_extents (hb_font_t *font HB_UNUSED,
   metrics->ascender = font->em_scale_y (ot_font->h_metrics.ascender);
   metrics->descender = font->em_scale_y (ot_font->h_metrics.descender);
   metrics->line_gap = font->em_scale_y (ot_font->h_metrics.line_gap);
-  return true;
+  return ot_font->h_metrics.has_font_extents;
 }
 
 static hb_bool_t
@@ -488,7 +492,7 @@ hb_ot_get_font_v_extents (hb_font_t *font HB_UNUSED,
   metrics->ascender = font->em_scale_x (ot_font->v_metrics.ascender);
   metrics->descender = font->em_scale_x (ot_font->v_metrics.descender);
   metrics->line_gap = font->em_scale_x (ot_font->v_metrics.line_gap);
-  return true;
+  return ot_font->v_metrics.has_font_extents;
 }
 
 static hb_font_funcs_t *static_ot_funcs = NULL;