diff options
author | Moazin Khatti <moazinkhatri@gmail.com> | 2021-12-25 19:46:46 -0800 |
---|---|---|
committer | Werner Lemberg <wl@gnu.org> | 2022-01-20 16:45:18 +0000 |
commit | 5cf01aa2b26727abd97ef202a3687cd7a43819c3 (patch) | |
tree | 329c7f1d7a47fd1a652bbaa4b09264832fd20b14 /src/cff | |
parent | f93a897afedf4a634c74d3d2871519e675ee0d83 (diff) | |
download | freetype2-5cf01aa2b26727abd97ef202a3687cd7a43819c3.tar.gz |
[truetype, cff] Add code to load SVG document.
* src/cff/cffgload.c (cff_slot_load): Add code to load SVG doc.
* src/truetype/ttgload.c (TT_Load_Glyph): Add code to load SVG doc.
Diffstat (limited to 'src/cff')
-rw-r--r-- | src/cff/cffgload.c | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/src/cff/cffgload.c b/src/cff/cffgload.c index 86b8ea5ed..2ef9c760c 100644 --- a/src/cff/cffgload.c +++ b/src/cff/cffgload.c @@ -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) */ |