[ot-svg] Create an SVG Document structure for use in `other' field

of `FT_GlyphSlot'.
This commit is contained in:
Moazin Khatti 2019-06-21 00:18:24 +05:00
parent 877736d057
commit 0bf6444911
4 changed files with 68 additions and 11 deletions

View File

@ -148,6 +148,38 @@ FT_BEGIN_HEADER
SVG_Lib_Free free_hook,
SVG_Lib_Render render_hook );
/**************************************************************************
*
* @struct:
* FT_SVG_DocumentRec_
*
* @description:
* A structure that models one SVG document.
*
* @fields:
* svg_document ::
* A pointer to the SVG document string.
*
* svg_document_length ::
* The length of the SVG document string.
*/
typedef struct FT_SVG_DocumentRec_
{
FT_Byte* svg_document;
FT_ULong svg_document_length;
} FT_SVG_DocumentRec;
/**************************************************************************
*
* @type:
* FT_SVG_Document
*
* @description:
* A handle to a FT_SVG_DocumentRec object.
*/
typedef struct FT_SVG_DocumentRec_* FT_SVG_Document;
FT_END_HEADER
#endif

View File

@ -838,6 +838,12 @@
if ( load_flags & FT_LOAD_BITMAP_METRICS_ONLY )
load_flags &= ~FT_LOAD_RENDER;
if ( ( load_flags & FT_LOAD_COLOR ) &&
( ((TT_Face)face)->svg ) )
{
FT_Load_Glyph( face, glyph_index, FT_LOAD_DEFAULT );
}
/*
* Determine whether we need to auto-hint or not.
* The general rules are:

View File

@ -347,6 +347,19 @@
if ( load_flags & FT_LOAD_SBITS_ONLY )
return FT_THROW( Invalid_Argument );
/* check for OT-SVG */
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( (FT_GlyphSlot)glyph, glyph_index );
if( error == FT_Err_Ok )
{
glyph->root.format = FT_GLYPH_FORMAT_SVG;
return error;
}
}
/* if we have a CID subfont, use its matrix (which has already */
/* been multiplied with the root matrix) */

View File

@ -28,6 +28,7 @@
#include FT_INTERNAL_STREAM_H
#include FT_TRUETYPE_TAGS_H
#include FT_GZIP_H
#include FT_SVG_RENDERER_H
#include "ttsvg.h"
@ -39,7 +40,7 @@
FT_UShort version; /* Table version (starting at 0) */
FT_UShort num_entries; /* Number of SVG document records */
/* Pointer to the starting of SVG Document List */
FT_Byte* svg_doc_list;
FT_Byte* svg_doc_list;
/* Memory that backs up SVG */
void* table;
FT_ULong table_size;
@ -68,7 +69,7 @@
if( FT_FRAME_EXTRACT( table_size, table ))
goto NoSVG;
/* Allocate the memory for the Svg object */
if( FT_NEW( svg ) )
goto NoSVG;
@ -114,7 +115,7 @@
{
FT_FRAME_RELEASE( svg->table );
FT_FREE( svg );
}
}
}
FT_Error
@ -159,12 +160,10 @@
}
FT_LOCAL_DEF(FT_Error)
tt_face_load_svg_doc( FT_GlyphSlot glyph_,
tt_face_load_svg_doc( FT_GlyphSlot glyph,
FT_UInt glyph_index )
{
TT_GlyphSlot glyph = (TT_GlyphSlot) glyph_;
/* TODO: (OT-SVG) properly clean stuff here on errors */
FT_Byte* doc_list; /* Pointer to the Svg Document List */
@ -179,10 +178,12 @@
FT_Bool is_gzip_encoded = FALSE;
FT_Error error = FT_Err_Ok;
TT_Face face = (TT_Face)glyph->root.face;
TT_Face face = (TT_Face)glyph->face;
FT_Memory memory = face->root.memory;
Svg* svg = face->svg;
FT_SVG_Document svg_document;
/* handle svg being 0x0 situation here */
doc_list = svg->svg_doc_list;
num_entries = FT_NEXT_USHORT( doc_list );
@ -221,12 +222,17 @@
return error;
}
glyph->svg_document = uncomp_buffer;
glyph->svg_document_length = uncomp_size;
doc_list = uncomp_buffer;
doc_length = uncomp_size;
return FT_Err_Ok;
}
glyph->svg_document = doc_list;
glyph->svg_document_length = doc_length;
if ( FT_NEW( svg_document ) )
return FT_THROW( Out_Of_Memory );
svg_document->svg_document = doc_list;
svg_document->svg_document_length = doc_length;
glyph->other = svg_document;
return FT_Err_Ok;
}