summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMoazin Khatti <moazinkhatri@gmail.com>2019-06-15 10:17:47 +0500
committerMoazin Khatti <moazinkhatri@gmail.com>2019-07-11 14:09:42 +0500
commit8f256de2d83f1b887672e59e15b252a3498650aa (patch)
tree90a18a7692a264f231174104ddf7dfab9ff97ef2
parent7915e5e102e1c2b77f786c87bc0b43fbc93ac359 (diff)
downloadfreetype2-8f256de2d83f1b887672e59e15b252a3498650aa.tar.gz
[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.
-rw-r--r--include/freetype/config/ftheader.h13
-rw-r--r--include/freetype/svgrenderer.h153
-rw-r--r--src/base/ftobjs.c15
-rw-r--r--src/svg/ftsvg.c36
-rw-r--r--src/svg/svgtypes.c11
5 files changed, 217 insertions, 11 deletions
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
@@ -550,6 +550,19 @@
/**************************************************************************
*
* @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:
* FT_BBOX_H
*
* @description:
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 <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
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 <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,
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 <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_