|
|
|
@ -346,6 +346,76 @@ |
|
|
|
|
if ( load_flags & FT_LOAD_SBITS_ONLY ) |
|
|
|
|
return FT_THROW( Invalid_Argument ); |
|
|
|
|
|
|
|
|
|
#ifdef FT_CONFIG_OPTION_SVG |
|
|
|
|
/* check for OT-SVG */ |
|
|
|
|
if ( ( load_flags & FT_LOAD_COLOR ) && |
|
|
|
|
( (TT_Face)glyph->root.face )->svg ) |
|
|
|
|
{ |
|
|
|
|
/*
|
|
|
|
|
* We load the SVG document and try to grab the advances from the |
|
|
|
|
* table. For the bearings we rely on the presetting hook to do that. |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
FT_Short dummy; |
|
|
|
|
FT_UShort advanceX; |
|
|
|
|
FT_UShort advanceY; |
|
|
|
|
SFNT_Service sfnt; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ( size->root.metrics.x_ppem < 1 || |
|
|
|
|
size->root.metrics.y_ppem < 1 ) |
|
|
|
|
{ |
|
|
|
|
error = FT_THROW( Invalid_Size_Handle ); |
|
|
|
|
return error; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
FT_TRACE3(( "Trying to load SVG glyph\n" )); |
|
|
|
|
|
|
|
|
|
sfnt = (SFNT_Service)((TT_Face)glyph->root.face)->sfnt; |
|
|
|
|
error = sfnt->load_svg_doc( (FT_GlyphSlot)glyph, glyph_index ); |
|
|
|
|
if ( !error ) |
|
|
|
|
{ |
|
|
|
|
FT_TRACE3(( "Successfully loaded SVG glyph\n" )); |
|
|
|
|
|
|
|
|
|
glyph->root.format = FT_GLYPH_FORMAT_SVG; |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* If horizontal or vertical advances are not present in the table, |
|
|
|
|
* this is a problem with the font since the standard requires them. |
|
|
|
|
* However, we are graceful and calculate the values by ourselves |
|
|
|
|
* for the vertical case. |
|
|
|
|
*/ |
|
|
|
|
sfnt->get_metrics( face, |
|
|
|
|
FALSE, |
|
|
|
|
glyph_index, |
|
|
|
|
&dummy, |
|
|
|
|
&advanceX ); |
|
|
|
|
sfnt->get_metrics( face, |
|
|
|
|
TRUE, |
|
|
|
|
glyph_index, |
|
|
|
|
&dummy, |
|
|
|
|
&advanceY ); |
|
|
|
|
|
|
|
|
|
advanceX = |
|
|
|
|
(FT_UShort)FT_MulDiv( advanceX, |
|
|
|
|
glyph->root.face->size->metrics.x_ppem, |
|
|
|
|
glyph->root.face->units_per_EM ); |
|
|
|
|
advanceY = |
|
|
|
|
(FT_UShort)FT_MulDiv( advanceY, |
|
|
|
|
glyph->root.face->size->metrics.y_ppem, |
|
|
|
|
glyph->root.face->units_per_EM ); |
|
|
|
|
|
|
|
|
|
glyph->root.metrics.horiAdvance = advanceX << 6; |
|
|
|
|
glyph->root.metrics.vertAdvance = advanceY << 6; |
|
|
|
|
|
|
|
|
|
return error; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
FT_TRACE3(( "Failed to load SVG glyph\n" )); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#endif /* FT_CONFIG_OPTION_SVG */ |
|
|
|
|
|
|
|
|
|
/* if we have a CID subfont, use its matrix (which has already */ |
|
|
|
|
/* been multiplied with the root matrix) */ |
|
|
|
|
|
|
|
|
|