Avoid div-by-zero, validate upem
authorBehdad Esfahbod <behdad@behdad.org>
Fri, 1 Oct 2010 23:09:23 +0000 (19:09 -0400)
committerBehdad Esfahbod <behdad@behdad.org>
Fri, 1 Oct 2010 23:09:23 +0000 (19:09 -0400)
src/hb-ot-head-private.hh
src/hb-ot-layout-private.hh

index a3e87a9..56a5861 100644 (file)
@@ -42,12 +42,19 @@ struct head
 {
   static const hb_tag_t Tag    = HB_OT_TAG_head;
 
+  inline unsigned int get_upem (void) const {
+    unsigned int upem = unitsPerEm;
+    /* If no valid head table found, assume 1000, which matches typicaly Type1 usage. */
+    return 16 <= upem && upem <= 16384 ? upem : 1000;
+  }
+
   inline bool sanitize (hb_sanitize_context_t *c) {
     TRACE_SANITIZE ();
     /* Shall we check for magicNumber here?  Who cares? */
     return c->check_struct (this) && likely (version.major == 1);
   }
 
+  private:
   FixedVersion version;                /* Version of the head table--currently
                                         * 0x00010000 for version 1.0. */
   FixedVersion fontRevision;           /* Set by font manufacturer. */
index 8e041ba..c1ae99f 100644 (file)
@@ -77,9 +77,9 @@ struct hb_ot_layout_context_t
   } info;
 
   /* Convert from font-space to user-space */
-  /* XXX div-by-zero / speed up */
-  inline hb_position_t scale_x (int16_t v) { return (int64_t) this->font->x_scale * v / this->face->head_table->unitsPerEm; }
-  inline hb_position_t scale_y (int16_t v) { return (int64_t) this->font->y_scale * v / this->face->head_table->unitsPerEm; }
+  /* XXX speed up */
+  inline hb_position_t scale_x (int16_t v) { return (int64_t) this->font->x_scale * v / this->face->head_table->get_upem (); }
+  inline hb_position_t scale_y (int16_t v) { return (int64_t) this->font->y_scale * v / this->face->head_table->get_upem (); }
 };