diff --git a/include/freetype/config/ftheader.h b/include/freetype/config/ftheader.h index 696d6ba90..239c7cf01 100644 --- a/include/freetype/config/ftheader.h +++ b/include/freetype/config/ftheader.h @@ -547,6 +547,19 @@ #define FT_BITMAP_H + /************************************************************************** + * + * @macro: + * FT_SVG_RENDERER_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * API of the SVG Renderer Module. + * + */ +#define FT_SVG_RENDERER_H + + /************************************************************************** * * @macro: diff --git a/include/freetype/svgrenderer.h b/include/freetype/svgrenderer.h new file mode 100644 index 000000000..e74e24528 --- /dev/null +++ b/include/freetype/svgrenderer.h @@ -0,0 +1,153 @@ +/**************************************************************************** + * + * svgrenderer.h + * + * Interface for SVG Renderer Module (specification). + * + * Copyright (C) 2004-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTSVG_RENDERER_H_ +#define FTSVG_RENDERER_H_ + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + +FT_BEGIN_HEADER + + /************************************************************************** + * + * @functype: + * SVG_Lib_Init + * + * @description: + * A callback used to initiate the SVG Rendering port + * + * @return: + * FreeType error code. 0 means success. + */ + + typedef FT_Error + (*SVG_Lib_Init)( ); + + + /************************************************************************** + * + * @functype: + * SVG_Lib_Free + * + * @description: + * A callback used to free the SVG Rendering port. Calling this callback + * shall do all cleanups that the SVG Rendering port wants to do. + * + * @return: + * FreeType error code. 0 means success. + */ + + typedef FT_Error + (*SVG_Lib_Free)( ); + + + /************************************************************************** + * + * @functype: + * SVG_Lib_Render + * + * @description: + * A callback used to render the glyph loaded in the slot. + * + * @input: + * svg_doc:: + * A pointer to the svg document + * + * @return: + * FreeType error code. 0 means success. + */ + + typedef FT_Error + (*SVG_Lib_Render)( FT_GlyphSlot slot ); + + + /************************************************************************** + * + * @functype: + * SVG_Set_Hooks + * + * @description: + * A function that is used set SVG Hooks. Part of the SVG Renderer + * Interface. + * + * @input: + * library:: + * FT_Library instance. + * + * init_hook:: + * A function pointer of the type `SVG_Lib_Init'. Read the documentation + * of `SVG_Lib_Init' + * + * free_hook:: + * A function pointer of the type `SVG_Lib_Free'. Read the documentation + * of `SVG_Lib_Free'. + * + * render_hook:: + * A function pointer of the type `SVG_Lib_Render'. Read the + * documentation of `SVG_Lib_Render'. + * + * @return: + * FreeType error code. 0 means success. + */ + + typedef FT_Error + (*SVG_Set_Hooks)( FT_Library library, + SVG_Lib_Init init_hook, + SVG_Lib_Free free_hook, + SVG_Lib_Render render_hook ); + + /************************************************************************** + * + * @struct: + * SVG_Renderer_Interface + * + * @description: + * An interface structure that function needed to inject external SVG + * rendering library hooks. + * + * @fields: + * set_hooks:: + * A function that can be called to set the hooks. + * + * @return: + * FreeType error code. 0 means success. + */ + + typedef struct SVG_Renderer_Interface_ + { + SVG_Set_Hooks set_hooks; + } SVG_Renderer_Interface; + + + /* TODO: to document */ + FT_Error + FT_Set_Svg_Hooks( FT_Library library, + SVG_Lib_Init init_hook, + SVG_Lib_Free free_hook, + SVG_Lib_Render render_hook ); + +FT_END_HEADER + +#endif diff --git a/src/base/ftobjs.c b/src/base/ftobjs.c index 697066b41..09c97ab26 100644 --- a/src/base/ftobjs.c +++ b/src/base/ftobjs.c @@ -40,6 +40,7 @@ #include FT_SERVICE_TT_CMAP_H #include FT_SERVICE_KERNING_H #include FT_SERVICE_TRUETYPE_ENGINE_H +#include FT_SVG_RENDERER_H #include FT_DRIVER_H @@ -5549,5 +5550,19 @@ return 0; } + FT_EXPORT_DEF( FT_Error ) + FT_Set_Svg_Hooks( FT_Library library, + SVG_Lib_Init init_hook, + SVG_Lib_Free free_hook, + SVG_Lib_Render render_hook ) + { + FT_Module renderer; + SVG_Renderer_Interface *svg; + + renderer = FT_Get_Module( library, "ot-svg" ); + svg = (SVG_Renderer_Interface*)renderer->clazz->module_interface; + svg->set_hooks(library, init_hook, free_hook, render_hook); + return FT_Err_Ok; + } /* END */ diff --git a/src/svg/ftsvg.c b/src/svg/ftsvg.c index 2f1570aaf..1b922594e 100644 --- a/src/svg/ftsvg.c +++ b/src/svg/ftsvg.c @@ -16,6 +16,8 @@ */ #include +#include FT_SVG_RENDERER_H + #include #include "ftsvg.h" @@ -24,7 +26,9 @@ FT_Error tmp_svg_lib_init() { - FT_Error error = FT_Err_Ok; + FT_Error error; + + error = FT_Err_Ok; printf("Init svg\n"); return error; } @@ -49,12 +53,36 @@ FT_Render_Mode mode, const FT_Vector* origin ) { - SVG_Renderer renderer_ = (SVG_Renderer)renderer; + SVG_Renderer renderer_ = (SVG_Renderer)renderer; + if( renderer_->loaded == FALSE ) renderer_->loaded = TRUE; + renderer_->hooks.svg_lib_init(); + return FT_Err_Ok; } + static FT_Error + ft_svg_set_hooks( FT_Module renderer_, + SVG_Lib_Init init_hook, + SVG_Lib_Free free_hook, + SVG_Lib_Render render_hook ) + { + SVG_Renderer renderer; + + renderer = (SVG_Renderer)renderer_; + renderer->hooks.svg_lib_init = init_hook; + renderer->hooks.svg_lib_free = free_hook; + renderer->hooks.svg_lib_render = render_hook; + + return FT_Err_Ok; + } + + + static const SVG_Renderer_Interface svg_renderer_interface = + { + (SVG_Set_Hooks)ft_svg_set_hooks + }; FT_DEFINE_RENDERER( @@ -66,12 +94,12 @@ "ot-svg", 0x10000L, 0x20000L, - NULL, /* module specific interface */ + (const void*)&svg_renderer_interface, /* module specific interface */ (FT_Module_Constructor)ft_svg_init, /* module_init */ NULL, NULL, FT_GLYPH_FORMAT_SVG, - NULL, + (FT_Renderer_RenderFunc)ft_svg_render, NULL, NULL, NULL, diff --git a/src/svg/svgtypes.c b/src/svg/svgtypes.c index f3f70105e..889d96458 100644 --- a/src/svg/svgtypes.c +++ b/src/svg/svgtypes.c @@ -19,17 +19,14 @@ #include #include FT_INTERNAL_OBJECTS_H #include FT_RENDER_H - - - /* Function Pointer definitions for SVG_RendererHooks */ - typedef FT_Error (*SVG_Lib_Init)(); /* initialize the external lib */ - typedef FT_Error (*SVG_Lib_Free)(); /* destroy the external lib */ +#include FT_SVG_RENDERER_H typedef struct SVG_RendererHooks_ { /* Api Hooks for OT-SVG Rendering */ - SVG_Lib_Init svg_lib_init; - SVG_Lib_Free svg_lib_free; + SVG_Lib_Init svg_lib_init; + SVG_Lib_Free svg_lib_free; + SVG_Lib_Render svg_lib_render; } SVG_RendererHooks; typedef struct SVG_RendererRec_