freetype-commit
[Top][All Lists]
Advanced

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

[freetype2] anuj-distance-field bcba693: [sdf] Added functionality to se


From: Anuj Verma
Subject: [freetype2] anuj-distance-field bcba693: [sdf] Added functionality to set and get module properties.
Date: Tue, 23 Jun 2020 01:52:23 -0400 (EDT)

branch: anuj-distance-field
commit bcba6935a101f6b028a104cc3c42a507d2674d4f
Author: Anuj Verma <anujv@iitbhilai.ac.in>
Commit: Anuj Verma <anujv@iitbhilai.ac.in>

    [sdf] Added functionality to set and get module properties.
---
 [GSoC]ChangeLog                     |  20 +++++
 include/freetype/internal/fttrace.h |   1 +
 src/sdf/ftsdf.c                     |  20 ++---
 src/sdf/ftsdfrend.c                 | 163 ++++++++++++++++++++++++++++++++++--
 src/sdf/ftsdfrend.h                 |  21 +++++
 5 files changed, 207 insertions(+), 18 deletions(-)

diff --git a/[GSoC]ChangeLog b/[GSoC]ChangeLog
index cc028a8..8e10431 100644
--- a/[GSoC]ChangeLog
+++ b/[GSoC]ChangeLog
@@ -1,3 +1,23 @@
+2020-06-23  Anuj Verma  <anujv@iitbhilai.ac.in>
+
+       [sdf] Added functionality to set and get module properties.
+       Also added a `spread' property.
+
+       * src/freetype/internal/fttrace.h: Added sdf module trace
+         define.
+
+       * src/sdf/ftsdf.c (sdf_TRaster => SDF_TRaster): Use capital
+         character for structs.
+
+       * src/sdf/ftsdfrend.h (SDF_Renderer_Module): Added a struct
+         which extends the `FT_RendererRec' and added the `spread'
+         property.
+
+       * src/sdf/ftsdfrend.c: Synchronized the code to use the new
+         `SDF_Renderer_Module' and added functions to get/set the
+         properties.
+
+
 2020-06-20  Anuj Verma  <anujv@iitbhilai.ac.in>
 
        [sdf] Implemented a few functions required by a renderer
diff --git a/include/freetype/internal/fttrace.h 
b/include/freetype/internal/fttrace.h
index 58bd774..6caadd3 100644
--- a/include/freetype/internal/fttrace.h
+++ b/include/freetype/internal/fttrace.h
@@ -40,6 +40,7 @@ FT_TRACE_DEF( psprops )   /* PS driver properties    
(ftpsprop.c) */
 FT_TRACE_DEF( raccess )   /* resource fork accessor  (ftrfork.c)  */
 FT_TRACE_DEF( raster )    /* monochrome rasterizer   (ftraster.c) */
 FT_TRACE_DEF( smooth )    /* anti-aliasing raster    (ftgrays.c)  */
+FT_TRACE_DEF( sdf )              /* signed distance raster  (ftsdf.c)    */
 FT_TRACE_DEF( synth )     /* bold/slant synthesizer  (ftsynth.c)  */
 
   /* Cache sub-system */
diff --git a/src/sdf/ftsdf.c b/src/sdf/ftsdf.c
index 30eb184..af18e6b 100644
--- a/src/sdf/ftsdf.c
+++ b/src/sdf/ftsdf.c
@@ -11,10 +11,10 @@
    *
    */
 
-  typedef struct  sdf_TRaster_
+  typedef struct  SDF_TRaster_
   {
     FT_Memory  memory; /* used internally to allocate memory */
-  } sdf_TRaster;
+  } SDF_TRaster;
 
   /**************************************************************************
    *
@@ -22,16 +22,16 @@
    *
    */
 
-  static int
+  static FT_Error
   sdf_raster_new( FT_Memory   memory,
                   FT_Raster*  araster)
   {
     FT_Error      error  = FT_Err_Ok;
-    sdf_TRaster*  raster = NULL;
+    SDF_TRaster*  raster = NULL;
 
 
     *araster = 0;
-    if ( !FT_ALLOC( raster, sizeof( sdf_TRaster ) ) )
+    if ( !FT_ALLOC( raster, sizeof( SDF_TRaster ) ) )
     {
       raster->memory = memory;
       *araster = (FT_Raster)raster;
@@ -51,7 +51,7 @@
     FT_UNUSED( pool_size );
   }
 
-  static int
+  static FT_Error
   sdf_raster_set_mode( FT_Raster      raster,
                        unsigned long  mode,
                        void*          args )
@@ -63,10 +63,10 @@
     FT_UNUSED( args );
 
 
-    return 0;
+    return FT_THROW( Unimplemented_Feature );
   }
 
-  static int
+  static FT_Error
   sdf_raster_render( FT_Raster                raster,
                      const FT_Raster_Params*  params )
   {
@@ -74,13 +74,13 @@
     FT_UNUSED( params );
 
 
-    return 0;
+    return FT_THROW( Unimplemented_Feature );
   }
 
   static void
   sdf_raster_done( FT_Raster  raster )
   {
-    FT_Memory  memory = (FT_Memory)((sdf_TRaster*)raster)->memory;
+    FT_Memory  memory = (FT_Memory)((SDF_TRaster*)raster)->memory;
 
 
     FT_FREE( raster );
diff --git a/src/sdf/ftsdfrend.c b/src/sdf/ftsdfrend.c
index 62268df..14fb489 100644
--- a/src/sdf/ftsdfrend.c
+++ b/src/sdf/ftsdfrend.c
@@ -1,16 +1,157 @@
 
 #include <freetype/internal/ftdebug.h>
 #include <freetype/internal/ftobjs.h>
+#include <freetype/internal/services/svprop.h>
 #include <freetype/ftoutln.h>
 #include "ftsdfrend.h"
 #include "ftsdf.h"
 
 #include "ftsdferrs.h"
 
+  /**************************************************************************
+   *
+   * The macro FT_COMPONENT is used in trace mode.  It is an implicit
+   * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log
+   * messages during execution.
+   */
+  #undef  FT_COMPONENT
+  #define FT_COMPONENT  sdf
+
+  /**************************************************************************
+   *
+   * macros and default property values
+   *
+   */
+
+  #define DEFAULT_SPREAD  8
+  #define MAX_SPREAD      32
+
+  #define SDF_RENDERER( rend ) ( (SDF_Renderer)rend )
+
+  /**************************************************************************
+   *
+   * for setting properties
+   *
+   */
+
+  static FT_Error
+  sdf_property_set( FT_Module    module,
+                    const char*  property_name,
+                    const void*  value,
+                    FT_Bool      value_is_string )
+  {
+    FT_UNUSED( value_is_string );
+
+    FT_Error      error = FT_Err_Ok;
+    SDF_Renderer  render = SDF_RENDERER( FT_RENDERER( module ) );
+
+
+    if ( ft_strcmp( property_name, "spread" ) == 0 )
+    {
+      FT_UInt  val = *(const FT_UInt*)value;
+
+
+      if ( val > MAX_SPREAD )
+      {
+        FT_TRACE0(( "[sdf module] sdf_property_set: "
+                    "the `spread' property can have a "
+                    "maximum value of %d\n", MAX_SPREAD ));
+        error = FT_THROW( Invalid_Argument );
+        goto Exit;
+      }
+      render->spread = val;
+      FT_TRACE7(( "[sdf module] sdf_property_set: "
+                  "updated property `spread' to %d\n", val ));
+    }
+    else
+    {
+      FT_TRACE0(( "[sdf module] sdf_property_set: "
+                  "missing property `%s'\n", property_name ));
+      error = FT_THROW( Missing_Property );
+      goto Exit;
+    }
+
+  Exit:
+    return error;
+  }
+
+  static FT_Error
+  sdf_property_get( FT_Module    module,
+                    const char*  property_name,
+                    void*        value )
+  {
+    FT_Error      error = FT_Err_Ok;
+    SDF_Renderer  render = SDF_RENDERER( FT_RENDERER( module ) );
+
+
+    if ( ft_strcmp( property_name, "spread" ) == 0 )
+    {
+      FT_UInt*  val = (FT_UInt*)value;
+
+
+      *val = render->spread;
+    }
+    else
+    {
+      FT_TRACE0(( "[sdf module] sdf_property_get: "
+                  "missing property `%s'\n", property_name ));
+      error = FT_THROW( Missing_Property );
+      goto Exit;
+    }
+
+  Exit:
+    return error;
+  }
+
+  FT_DEFINE_SERVICE_PROPERTIESREC(
+    sdf_service_properties,
+
+    (FT_Properties_SetFunc)sdf_property_set,        /* set_property */
+    (FT_Properties_GetFunc)sdf_property_get )       /* get_property */
+
+
+  FT_DEFINE_SERVICEDESCREC1(
+    sdf_services,
+
+    FT_SERVICE_ID_PROPERTIES, &sdf_service_properties )
+
+  static FT_Module_Interface
+  ft_sdf_requester ( FT_Renderer  render,
+                     const char*  module_interface )
+  {
+    FT_UNUSED( render );
+
+    return ft_service_list_lookup( sdf_services, module_interface );
+  }
+
+  /**************************************************************************
+   *
+   * interface functions
+   *
+   */
+
+  static FT_Error
+  ft_sdf_init ( FT_Renderer  render )
+  {
+    SDF_Renderer  sdf_render = SDF_RENDERER( render );
+
+
+    sdf_render->spread = DEFAULT_SPREAD;
+
+    return FT_Err_Ok;
+  }
+
+  static FT_Error
+  ft_sdf_done ( FT_Renderer  render )
+  {
+    FT_UNUSED( render );
+
+    return FT_Err_Ok;
+  }
 
   /* generate signed distance field from a glyph's slot image */
   static FT_Error
-  ft_sdf_render( FT_Renderer       render,
+  ft_sdf_render( FT_Renderer       module,
                  FT_GlyphSlot      slot,
                  FT_Render_Mode    mode,
                  const FT_Vector*  origin )
@@ -18,15 +159,21 @@
     FT_Error     error   = FT_Err_Ok;
     FT_Outline*  outline = &slot->outline;
     FT_Bitmap*   bitmap  = &slot->bitmap;
-    FT_Memory    memory  = render->root.memory;
+    FT_Memory    memory  = NULL;
+    FT_Renderer  render  = NULL;
     FT_Pos       x_shift = 0;
     FT_Pos       y_shift = 0;
-    
+
     /* use hardcoded padding for now */
     FT_UInt      x_pad   = 10;
     FT_UInt      y_pad   = 10;
 
     FT_Raster_Params  params;
+    SDF_Renderer      sdf_module = SDF_RENDERER( module );
+
+
+    render = &sdf_module->root;
+    memory = render->root.memory;
 
     /* check if slot format is correct before rendering */
     if ( slot->format != render->glyph_format )
@@ -52,7 +199,7 @@
     }
 
     /* preset the bitmap using the glyph's outline;        */
-    /* the sdf bitmap is similar to a antialiased bitmap   */
+    /* the sdf bitmap is similar to an antialiased bitmap  */
     /* with a slighty bigger size and different pixel mode */
     if ( ft_glyphslot_preset_bitmap( slot, FT_RENDER_MODE_NORMAL, origin ) )
     {
@@ -172,7 +319,7 @@
     ft_sdf_renderer_class,
 
     FT_MODULE_RENDERER,
-    sizeof( FT_RendererRec ),
+    sizeof( SDF_Renderer_Module ),
 
     "sdf",
     0x10000L,
@@ -180,9 +327,9 @@
 
     NULL,
 
-    (FT_Module_Constructor) NULL,
-    (FT_Module_Destructor)  NULL,
-    (FT_Module_Requester)   NULL,
+    (FT_Module_Constructor) ft_sdf_init,
+    (FT_Module_Destructor)  ft_sdf_done,
+    (FT_Module_Requester)   ft_sdf_requester,
 
     FT_GLYPH_FORMAT_OUTLINE,
 
diff --git a/src/sdf/ftsdfrend.h b/src/sdf/ftsdfrend.h
index 3ea7619..47071a3 100644
--- a/src/sdf/ftsdfrend.h
+++ b/src/sdf/ftsdfrend.h
@@ -4,10 +4,31 @@
 
 
 #include <freetype/ftrender.h>
+#include <freetype/ftmodapi.h>
+#include <freetype/internal/ftobjs.h>
 
 
 FT_BEGIN_HEADER
 
+  /**************************************************************************
+   *
+   * @struct:
+   *   SDF_Renderer_Module
+   *
+   * @description:
+   *   [TODO]
+   *
+   * @fields:
+   *   [TODO]
+   *
+   */
+  typedef struct  SDF_Renderer_Module_
+  {
+    FT_RendererRec  root;
+    FT_UInt         spread;
+
+  } SDF_Renderer_Module, *SDF_Renderer;
+
 
   FT_DECLARE_RENDERER( ft_sdf_renderer_class )
 



reply via email to

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