diff --git a/src/hb-ot-color-cbdt-table.hh b/src/hb-ot-color-cbdt-table.hh index 467159c7c..cacabd075 100644 --- a/src/hb-ot-color-cbdt-table.hh +++ b/src/hb-ot-color-cbdt-table.hh @@ -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. diff --git a/src/hb-ot-color-sbix-table.hh b/src/hb-ot-color-sbix-table.hh index 40680ca22..fbe48ec02 100644 --- a/src/hb-ot-color-sbix-table.hh +++ b/src/hb-ot-color-sbix-table.hh @@ -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; diff --git a/src/hb-ot-color.cc b/src/hb-ot-color.cc index b38e67c45..0cade5e76 100644 --- a/src/hb-ot-color.cc +++ b/src/hb-ot-color.cc @@ -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); diff --git a/src/hb-ot-font.cc b/src/hb-ot-font.cc index e9619c54f..33a4388ce 100644 --- a/src/hb-ot-font.cc +++ b/src/hb-ot-font.cc @@ -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); diff --git a/test/api/test-ot-color.c b/test/api/test-ot-color.c index 9cc353bad..ba3a0abcd 100644 --- a/test/api/test-ot-color.c +++ b/test/api/test-ot-color.c @@ -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);