[ot-svg] Creates hooks mechanism in SVG Renderer.

* include/freetype/config/ftheader.h: New macro `FT_SVG_RENDERER_H'
for `freetype/svgrenderer.h'.

* include/freetype/svgrenderer.h: New file to store SVG specific
function types, SVG interface and `FT_Set_Svg_Hooks'.

* src/base/ftobjs.c: Adds implementation of `FT_Set_Svg_Hooks'.

* src/svg/ftsvg.c: Creates `svg_renderer_interface'.

* src/svg/svgtypes.c: Moves hook function types to
`FT_SVG_RENDERER_H'. Adds a hook for svg rendering. Temporary.
This commit is contained in:
Moazin Khatti 2019-06-15 10:17:47 +05:00
parent f1db18a464
commit 4d59b8535e
5 changed files with 217 additions and 11 deletions

View File

@ -547,6 +547,19 @@
#define FT_BITMAP_H <freetype/ftbitmap.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 <freetype/svgrenderer.h>
/**************************************************************************
*
* @macro:

View File

@ -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 <ft2build.h>
#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

View File

@ -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 */

View File

@ -16,6 +16,8 @@
*/
#include <ft2build.h>
#include FT_SVG_RENDERER_H
#include <stdio.h>
#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,

View File

@ -19,17 +19,14 @@
#include <ft2build.h>
#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_