[ot-color/png] Consider strike ppem on scaling
This commit is contained in:
parent
a8c9facf7a
commit
c929ccfcea
|
@ -402,9 +402,10 @@ struct CBDT
|
||||||
hb_blob_destroy (this->cbdt_blob);
|
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)
|
if (!cblc)
|
||||||
return false; // Not a color bitmap font.
|
return false; // Not a color bitmap font.
|
||||||
|
|
|
@ -74,7 +74,8 @@ struct SBIXStrike
|
||||||
hb_tag_t file_type,
|
hb_tag_t file_type,
|
||||||
int *x_offset,
|
int *x_offset,
|
||||||
int *y_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. */
|
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))
|
if (unlikely (file_type != glyph->graphicType))
|
||||||
return hb_blob_get_empty ();
|
return hb_blob_get_empty ();
|
||||||
|
|
||||||
|
if (strike_ppem) *strike_ppem = ppem;
|
||||||
if (x_offset) *x_offset = glyph->xOffset;
|
if (x_offset) *x_offset = glyph->xOffset;
|
||||||
if (y_offset) *y_offset = glyph->yOffset;
|
if (y_offset) *y_offset = glyph->yOffset;
|
||||||
return hb_blob_create_sub_blob (sbix_blob, glyph_offset, glyph_length);
|
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,
|
inline hb_blob_t *reference_png (hb_font_t *font,
|
||||||
hb_codepoint_t glyph_id,
|
hb_codepoint_t glyph_id,
|
||||||
int *x_offset,
|
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,
|
return get_strike (font).get_glyph_blob (glyph_id, sbix_blob,
|
||||||
HB_TAG ('p','n','g',' '),
|
HB_TAG ('p','n','g',' '),
|
||||||
x_offset, y_offset,
|
x_offset, y_offset,
|
||||||
num_glyphs);
|
num_glyphs, available_ppem);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -236,7 +239,8 @@ struct sbix
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
int x_offset = 0, y_offset = 0;
|
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)))
|
if (unlikely (blob->length < sizeof (PNGHeader)))
|
||||||
return false;
|
return false;
|
||||||
|
@ -247,6 +251,17 @@ struct sbix
|
||||||
extents->y_bearing = y_offset;
|
extents->y_bearing = y_offset;
|
||||||
extents->width = png.IHDR.width;
|
extents->width = png.IHDR.width;
|
||||||
extents->height = png.IHDR.height;
|
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);
|
hb_blob_destroy (blob);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -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 ();
|
hb_blob_t *blob = hb_blob_get_empty ();
|
||||||
|
|
||||||
if (_get_sbix (font->face).has_data ())
|
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 ())
|
if (!blob->length && _get_cbdt (font->face).has_data ())
|
||||||
blob = _get_cbdt (font->face).reference_png (glyph, font->x_ppem, font->y_ppem);
|
blob = _get_cbdt (font->face).reference_png (glyph, font->x_ppem, font->y_ppem);
|
||||||
|
|
|
@ -187,7 +187,7 @@ hb_ot_get_glyph_extents (hb_font_t *font,
|
||||||
if (!ret)
|
if (!ret)
|
||||||
ret = ot_face->glyf->get_extents (glyph, extents);
|
ret = ot_face->glyf->get_extents (glyph, extents);
|
||||||
if (!ret)
|
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.
|
// TODO Hook up side-bearings variations.
|
||||||
extents->x_bearing = font->em_scale_x (extents->x_bearing);
|
extents->x_bearing = font->em_scale_x (extents->x_bearing);
|
||||||
extents->y_bearing = font->em_scale_y (extents->y_bearing);
|
extents->y_bearing = font->em_scale_y (extents->y_bearing);
|
||||||
|
|
|
@ -427,8 +427,8 @@ test_hb_ot_color_png (void)
|
||||||
hb_font_get_glyph_extents (sbix_font, 1, &extents);
|
hb_font_get_glyph_extents (sbix_font, 1, &extents);
|
||||||
g_assert_cmpint (extents.x_bearing, ==, 0);
|
g_assert_cmpint (extents.x_bearing, ==, 0);
|
||||||
g_assert_cmpint (extents.y_bearing, ==, 0);
|
g_assert_cmpint (extents.y_bearing, ==, 0);
|
||||||
g_assert_cmpint (extents.width, ==, 300);
|
g_assert_cmpint (extents.width, ==, 800);
|
||||||
g_assert_cmpint (extents.height, ==, 300);
|
g_assert_cmpint (extents.height, ==, 800);
|
||||||
hb_blob_destroy (blob);
|
hb_blob_destroy (blob);
|
||||||
hb_font_destroy (sbix_font);
|
hb_font_destroy (sbix_font);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue