From db972c05681c7409462b85346e203423f5adc5c8 Mon Sep 17 00:00:00 2001 From: Moazin Khatti Date: Mon, 10 Jun 2019 00:18:20 +0500 Subject: [PATCH] Support OT-SVG fonts with CFF outlines --- include/freetype/internal/cffotypes.h | 3 +++ src/cff/cffgload.c | 15 +++++++++++++++ src/truetype/ttgload.c | 26 ++++++++------------------ 3 files changed, 26 insertions(+), 18 deletions(-) diff --git a/include/freetype/internal/cffotypes.h b/include/freetype/internal/cffotypes.h index b26893eab..aaf06687d 100644 --- a/include/freetype/internal/cffotypes.h +++ b/include/freetype/internal/cffotypes.h @@ -61,6 +61,9 @@ FT_BEGIN_HEADER { FT_GlyphSlotRec root; + FT_Byte* svg_document; + FT_ULong svg_document_length; + FT_Bool hint; FT_Bool scaled; diff --git a/src/cff/cffgload.c b/src/cff/cffgload.c index 36aa7d1b9..4db77971a 100644 --- a/src/cff/cffgload.c +++ b/src/cff/cffgload.c @@ -347,6 +347,21 @@ if ( load_flags & FT_LOAD_SBITS_ONLY ) return FT_THROW( Invalid_Argument ); + /* OpenType SVG Support Over here */ + if ( ( load_flags & FT_LOAD_COLOR ) && + ( ((TT_Face)glyph->root.face)->svg ) ) + { + SFNT_Service sfnt = (SFNT_Service)(((TT_Face)glyph->root.face)->sfnt); + error = sfnt->load_svg_doc( &(glyph->root), glyph_index ); + if( error == FT_Err_Ok ) + { + glyph->root.format = FT_GLYPH_FORMAT_SVG; + return error; + } + } + + /* OpenType SVG Support End */ + /* if we have a CID subfont, use its matrix (which has already */ /* been multiplied with the root matrix) */ diff --git a/src/truetype/ttgload.c b/src/truetype/ttgload.c index 5e676d8e6..850b0ab0c 100644 --- a/src/truetype/ttgload.c +++ b/src/truetype/ttgload.c @@ -2454,23 +2454,6 @@ #endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ - static FT_Error - load_svg_glyph( TT_GlyphSlot glyph, - FT_ULong glyph_index ) - { - FT_Error error; - TT_Face face; - SFNT_Service sfnt; - FT_Byte* doc_list; - - face = (TT_Face)(glyph->root).face; - sfnt = (SFNT_Service)face->sfnt; - - error = sfnt->load_svg_doc( (FT_GlyphSlot)glyph, glyph_index ); - return error; - } - - static FT_Error tt_loader_init( TT_Loader loader, TT_Size size, @@ -2813,6 +2796,7 @@ { FT_Error error; TT_LoaderRec loader; + SFNT_Service sfnt; FT_GlyphSlot glyph = (FT_GlyphSlot)glyph_; FT_TRACE1(( "TT_Load_Glyph: glyph index %d\n", glyph_index )); @@ -2920,7 +2904,13 @@ /* OT-SVG part here */ if ( ( load_flags & FT_LOAD_COLOR ) && ( ((TT_Face)glyph->face)->svg ) ) { - error = load_svg_glyph( glyph_, glyph_index ); + sfnt = (SFNT_Service)((TT_Face)glyph->face)->sfnt; + error = sfnt->load_svg_doc( glyph, glyph_index ); + if( error == FT_Err_Ok ) + { + glyph->format = FT_GLYPH_FORMAT_SVG; + return error; + } } if ( load_flags & FT_LOAD_SBITS_ONLY )