freetype-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[freetype2] GSoC-2019-moazin 4d59b85 08/66: [ot-svg] Creates hooks mecha


From: Moazin Khatti
Subject: [freetype2] GSoC-2019-moazin 4d59b85 08/66: [ot-svg] Creates hooks mechanism in SVG Renderer.
Date: Sat, 17 Aug 2019 11:36:40 -0400 (EDT)

branch: GSoC-2019-moazin
commit 4d59b8535edc8521c05a7cc275e17ca120a677a0
Author: Moazin Khatti <address@hidden>
Commit: Moazin Khatti <address@hidden>

    [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.
---
 include/freetype/config/ftheader.h |  13 ++++
 include/freetype/svgrenderer.h     | 153 +++++++++++++++++++++++++++++++++++++
 src/base/ftobjs.c                  |  15 ++++
 src/svg/ftsvg.c                    |  36 ++++++++-
 src/svg/svgtypes.c                 |  11 +--
 5 files changed, 217 insertions(+), 11 deletions(-)

diff --git a/include/freetype/config/ftheader.h 
b/include/freetype/config/ftheader.h
index 696d6ba..239c7cf 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 0000000..e74e245
--- /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 697066b..09c97ab 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 2f1570a..1b92259 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 f3f7010..889d964 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_



reply via email to

[Prev in Thread] Current Thread [Next in Thread]