[ot-color/png] Consider strike ppem on scaling
authorEbrahim Byagowi <ebrahim@gnu.org>
Mon, 29 Oct 2018 05:11:13 +0000 (08:41 +0330)
committerBehdad Esfahbod <behdad@behdad.org>
Mon, 29 Oct 2018 05:40:40 +0000 (22:40 -0700)
src/hb-ot-color-cbdt-table.hh
src/hb-ot-color-sbix-table.hh
src/hb-ot-color.cc
src/hb-ot-font.cc
test/api/test-ot-color.c

index 467159c..cacabd0 100644 (file)
@@ -402,9 +402,10 @@ struct CBDT
       hb_blob_destroy (this->cbdt_blob);
     }
 
-    inline bool get_extents (hb_codepoint_t glyph, hb_glyph_extents_t *extents) const
+    inline bool get_extents (hb_font_t *font, hb_codepoint_t glyph,
+                            hb_glyph_extents_t *extents) const
     {
-      unsigned int x_ppem = upem, y_ppem = upem; /* TODO Use font ppem if available. */
+      unsigned int x_ppem = font->x_ppem, y_ppem = font->y_ppem;
 
       if (!cblc)
        return false;  // Not a color bitmap font.
index 40680ca..fbe48ec 100644 (file)
@@ -74,7 +74,8 @@ struct SBIXStrike
                                    hb_tag_t      file_type,
                                    int          *x_offset,
                                    int          *y_offset,
-                                   unsigned int  num_glyphs) const
+                                   unsigned int  num_glyphs,
+                                   unsigned int *strike_ppem) const
   {
     if (unlikely (!ppem)) return hb_blob_get_empty (); /* To get Null() object out of the way. */
 
@@ -109,6 +110,7 @@ struct SBIXStrike
     if (unlikely (file_type != glyph->graphicType))
       return hb_blob_get_empty ();
 
+    if (strike_ppem) *strike_ppem = ppem;
     if (x_offset) *x_offset = glyph->xOffset;
     if (y_offset) *y_offset = glyph->yOffset;
     return hb_blob_create_sub_blob (sbix_blob, glyph_offset, glyph_length);
@@ -167,12 +169,13 @@ struct sbix
     inline hb_blob_t *reference_png (hb_font_t      *font,
                                     hb_codepoint_t  glyph_id,
                                     int            *x_offset,
-                                    int            *y_offset) const
+                                    int            *y_offset,
+                                    unsigned int   *available_ppem) const
     {
       return get_strike (font).get_glyph_blob (glyph_id, sbix_blob,
                                               HB_TAG ('p','n','g',' '),
                                               x_offset, y_offset,
-                                              num_glyphs);
+                                              num_glyphs, available_ppem);
     }
 
     private:
@@ -236,7 +239,8 @@ struct sbix
         return false;
 
       int x_offset = 0, y_offset = 0;
-      hb_blob_t *blob = reference_png (font, glyph, &x_offset, &y_offset);
+      unsigned int strike_ppem = 0;
+      hb_blob_t *blob = reference_png (font, glyph, &x_offset, &y_offset, &strike_ppem);
 
       if (unlikely (blob->length < sizeof (PNGHeader)))
         return false;
@@ -247,6 +251,17 @@ struct sbix
       extents->y_bearing = y_offset;
       extents->width     = png.IHDR.width;
       extents->height    = png.IHDR.height;
+
+      /* Convert to the font units. */
+      if (strike_ppem)
+      {
+       unsigned int upem = font->face->upem;
+       extents->x_bearing *= upem / (float) strike_ppem;
+       extents->y_bearing *= upem / (float) strike_ppem;
+       extents->width *= upem / (float) strike_ppem;
+       extents->height *= upem / (float) strike_ppem;
+      }
+
       hb_blob_destroy (blob);
 
       return true;
index b38e67c..0cade5e 100644 (file)
@@ -318,7 +318,7 @@ hb_ot_color_glyph_reference_png (hb_font_t *font, hb_codepoint_t  glyph)
   hb_blob_t *blob = hb_blob_get_empty ();
 
   if (_get_sbix (font->face).has_data ())
-    blob = _get_sbix (font->face).reference_png (font, glyph, nullptr, nullptr);
+    blob = _get_sbix (font->face).reference_png (font, glyph, nullptr, nullptr, nullptr);
 
   if (!blob->length && _get_cbdt (font->face).has_data ())
     blob = _get_cbdt (font->face).reference_png (glyph, font->x_ppem, font->y_ppem);
index e9619c5..33a4388 100644 (file)
@@ -187,7 +187,7 @@ hb_ot_get_glyph_extents (hb_font_t *font,
   if (!ret)
     ret = ot_face->glyf->get_extents (glyph, extents);
   if (!ret)
-    ret = ot_face->CBDT->get_extents (glyph, extents);
+    ret = ot_face->CBDT->get_extents (font, glyph, extents);
   // TODO Hook up side-bearings variations.
   extents->x_bearing = font->em_scale_x (extents->x_bearing);
   extents->y_bearing = font->em_scale_y (extents->y_bearing);
index 9cc353b..ba3a0ab 100644 (file)
@@ -427,8 +427,8 @@ test_hb_ot_color_png (void)
   hb_font_get_glyph_extents (sbix_font, 1, &extents);
   g_assert_cmpint (extents.x_bearing, ==, 0);
   g_assert_cmpint (extents.y_bearing, ==, 0);
-  g_assert_cmpint (extents.width, ==, 300);
-  g_assert_cmpint (extents.height, ==, 300);
+  g_assert_cmpint (extents.width, ==, 800);
+  g_assert_cmpint (extents.height, ==, 800);
   hb_blob_destroy (blob);
   hb_font_destroy (sbix_font);