freetype-commit
[Top][All Lists]
Advanced

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

[freetype2] anuj-distance-field 628196d 72/95: [sdf -> bsdf renderer] Ho


From: Anuj Verma
Subject: [freetype2] anuj-distance-field 628196d 72/95: [sdf -> bsdf renderer] Hold a refrence to `FT_Memory'.
Date: Sun, 2 Aug 2020 01:10:39 -0400 (EDT)

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

    [sdf -> bsdf renderer] Hold a refrence to `FT_Memory'.
    
    Due to the way the 8SED algorithm works we need to keep
    a track of distances and nearest point of all the pixels/
    grid points.
    
    * src/sdf/ftbsdf.c (BSDF_TRaster): Added struct to
      hold the `FT_Memory' reference, to be used to allocate
      memory.
    
    * src/sdf/ftbsdf.c (ED, BSDF_Worker): Added few more
      essential struct. `ED' contains infomation about the
      nearest point. `BSDF_Worker' is used to combine all
      the essentail parameters to functions.
    
    * src/sdf/ftbsdf.c (bsdf_copy_source_to_target =>
      bsdf_init_distance_map): Renamed.
    
    * src/sdf/ftbsdf.c (*): Various minor changes.
    
    * src/sdf/sdf.c: Change the order of source include
      because `ftsdf.c' change some internal freetype
      defines which are required in `ftbsdf.c'.
---
 [GSoC]ChangeLog  |  26 +++++++++
 src/sdf/ftbsdf.c | 157 ++++++++++++++++++++++++++++++++++++++++---------------
 src/sdf/sdf.c    |   2 +-
 3 files changed, 141 insertions(+), 44 deletions(-)

diff --git a/[GSoC]ChangeLog b/[GSoC]ChangeLog
index 493e708..833adb6 100644
--- a/[GSoC]ChangeLog
+++ b/[GSoC]ChangeLog
@@ -1,5 +1,31 @@
 2020-07-25  Anuj Verma  <anujv@iitbhilai.ac.in>
 
+       [sdf -> bsdf renderer] Hold a refrence to `FT_Memory'.
+
+       Due to the way the 8SED algorithm works we need to keep
+       a track of distances and nearest point of all the pixels/
+       grid points.
+
+       * src/sdf/ftbsdf.c (BSDF_TRaster): Added struct to
+         hold the `FT_Memory' reference, to be used to allocate
+         memory.
+
+       * src/sdf/ftbsdf.c (ED, BSDF_Worker): Added few more
+         essential struct. `ED' contains infomation about the
+         nearest point. `BSDF_Worker' is used to combine all
+         the essentail parameters to functions.
+
+       * src/sdf/ftbsdf.c (bsdf_copy_source_to_target => 
+         bsdf_init_distance_map): Renamed.
+
+       * src/sdf/ftbsdf.c (*): Various minor changes.
+
+       * src/sdf/sdf.c: Change the order of source include
+         because `ftsdf.c' change some internal freetype
+         defines which are required in `ftbsdf.c'.
+
+2020-07-25  Anuj Verma  <anujv@iitbhilai.ac.in>
+
        [sdf -> bsdf renderer] Convert 8bit bitmap to 16bit.
 
        * src/sdf/ftbsdf.c (bsdf_copy_source_to_target): Added
diff --git a/src/sdf/ftbsdf.c b/src/sdf/ftbsdf.c
index e6931b6..7b33165 100644
--- a/src/sdf/ftbsdf.c
+++ b/src/sdf/ftbsdf.c
@@ -1,6 +1,7 @@
 
 #include <freetype/internal/ftobjs.h>
 #include <freetype/internal/ftdebug.h>
+#include <freetype/internal/ftmemory.h>
 
 #include "ftsdf.h"
 #include "ftsdferrs.h"
@@ -26,7 +27,41 @@
    *
    */
 
-  typedef  FT_Short FT_6D10; /* 6.10 fixed point representation */
+  typedef  FT_Vector FT_16D16_Vec;  /* with 16.16 fixed point components */
+
+  typedef  FT_Short FT_6D10;        /* 6.10 fixed point representation   */
+  typedef  FT_Fixed FT_16D16;       /* 6.10 fixed point representation   */
+
+  /**************************************************************************
+   *
+   * structs
+   *
+   */
+
+  typedef struct  BSDF_TRaster_
+  {
+    FT_Memory  memory; /* used internally to allocate memory */
+
+  } BSDF_TRaster;
+
+  /* euclidean distance used for euclidean distance transform */
+  typedef struct  ED_
+  {
+    FT_16D16      dist; /* distance at `near' */
+    FT_16D16_Vec  near; /* nearest point */
+
+  } ED;
+
+  typedef struct  BSDF_Worker_
+  {
+    ED*                distance_map;
+
+    FT_Int             width;
+    FT_Int             rows;
+
+    SDF_Raster_Params  params;
+
+  } BSDF_Worker;
 
   /**************************************************************************
    *
@@ -34,13 +69,24 @@
    *
    */
 
-  /* This function copy the `source' bitmap on top of */
-  /* `target' bitmap's center. It also converts the   */
-  /* values to 16bpp in a fixed point format.         */
+  /**************************************************************************
+   *
+   * @Function:
+   *   bsdf_init_distance_map
+   *
+   * @Description:
+   *   This function initialize the distance map according to
+   *   algorithm '8-point sequential Euclidean distance mapping' (8SED).
+   *
+   * @Input:
+   *   [TODO]
+   *
+   * @Return:
+   *   [TODO]
+   */
   static FT_Error
-  bsdf_copy_source_to_target( const FT_Bitmap*  source,
-                              FT_Bitmap*        target,
-                              FT_Bool           flip_y )
+  bsdf_init_distance_map( const FT_Bitmap*  source,
+                          BSDF_Worker*      worker )
   {
     FT_Error  error         = FT_Err_Ok;
     FT_Bool   is_monochrome = 0;
@@ -49,10 +95,10 @@
     FT_Int    num_channels;
     FT_Int    t_i, t_j, s_i, s_j;
     FT_Byte*  s;
-    FT_6D10*  t;
+    ED*       t;
 
     /* again check the parameters (probably unnecessary) */
-    if ( !source || !target )
+    if ( !source || !worker )
     {
       error = FT_THROW( Invalid_Argument );
       goto Exit;
@@ -62,8 +108,8 @@
     /* i.e. aligning the source to the center of the   */
     /* target, the target's width/rows must be checked */
     /* before copying.                                 */
-    if ( target->width < source->width ||
-         target->rows  < source->rows )
+    if ( worker->width < source->width ||
+         worker->rows  < source->rows )
     {
       error = FT_THROW( Invalid_Argument );
       goto Exit;
@@ -78,15 +124,6 @@
       goto Exit;
     }
 
-    /* make sure target bitmap is 16bpp */
-    if ( target->pixel_mode != FT_PIXEL_MODE_GRAY16 )
-    {
-      FT_ERROR(( "[bsdf] bsdf_copy_source_to_target: "
-                 "Invalid pixel mode of target bitmap" ));
-      error = FT_THROW( Invalid_Argument );
-      goto Exit;
-    }
-
   #ifdef FT_DEBUG_LEVEL_TRACE
     if ( source->pixel_mode == FT_PIXEL_MODE_MONO )
     {
@@ -100,13 +137,13 @@
 
     /* Calculate the difference in width and rows */
     /* of the target and source.                  */
-    x_diff = target->width - source->width;
-    y_diff = target->rows - source->rows;
+    x_diff = worker->width - source->width;
+    y_diff = worker->rows - source->rows;
 
     x_diff /= 2;
     y_diff /= 2;
 
-    t = (FT_6D10*)target->buffer;
+    t = (ED*)worker->distance_map;
     s = source->buffer;
 
     /* For now we only support pixel mode `FT_PIXEL_MODE_MONO'  */
@@ -129,8 +166,8 @@
       break;
     case FT_PIXEL_MODE_GRAY:
     {
-      FT_Int  t_width = target->width;
-      FT_Int  t_rows  = target->rows;
+      FT_Int  t_width = worker->width;
+      FT_Int  t_rows  = worker->rows;
       FT_Int  s_width = source->width;
       FT_Int  s_rows  = source->rows;
 
@@ -149,15 +186,15 @@
           s_i = t_i - x_diff;
           s_j = t_j - y_diff;
 
-          /* assign 0 to the padding */
+          /* assign INT_MAX to the padding */
           if ( s_i < 0 || s_i >= s_width ||
                s_j < 0 || s_j >= s_rows )
           {
-            t[t_index] = 0;
+            t[t_index].dist = FT_INT_MAX;
             continue;
           }
 
-          if ( flip_y )
+          if ( worker->params.flip_y )
             s_index = ( s_rows - s_j - 1 ) * s_width + s_i;
           else
             s_index = s_j * s_width + s_i;
@@ -169,12 +206,12 @@
           if ( pixel_value == 255 )
             pixel_value = 256;
 
-          /* Assume that 256 is fractional value with */
-          /* 0.8 representation, to make it 6.10 left */
-          /* shift the value by 2.                    */
-          pixel_value <<= 2;
+          /* Assume that 256 is fractional value with  */
+          /* 0.8 representation, to make it 16.16 left */
+          /* shift the value by 8.                     */
+          pixel_value <<= 8;
 
-          t[t_index] = pixel_value;
+          t[t_index].dist = pixel_value;
         }
       }
 
@@ -202,10 +239,18 @@
   bsdf_raster_new( FT_Memory   memory,
                    FT_Raster*  araster)
   {
-    FT_UNUSED( memory );
-    FT_UNUSED( araster );
+    FT_Error       error  = FT_Err_Ok;
+    BSDF_TRaster*  raster = NULL;
 
-    return FT_Err_Ok;
+
+    *araster = 0;
+    if ( !FT_ALLOC( raster, sizeof( SDF_TRaster ) ) )
+    {
+      raster->memory = memory;
+      *araster = (FT_Raster)raster;
+    }
+
+    return error;
   }
 
   static void
@@ -236,9 +281,12 @@
   bsdf_raster_render( FT_Raster                raster,
                       const FT_Raster_Params*  params )
   {
-    FT_Error    error  = FT_Err_Ok;
-    FT_Bitmap*  source = NULL;
-    FT_Bitmap*  target = NULL;
+    FT_Error       error       = FT_Err_Ok;
+    FT_Bitmap*     source      = NULL;
+    FT_Bitmap*     target      = NULL;
+    FT_Memory      memory      = NULL;
+    BSDF_TRaster*  bsdf_raster = (SDF_TRaster*)raster;
+    BSDF_Worker    worker;
 
     const SDF_Raster_Params*  sdf_params = (const SDF_Raster_Params*)params;
 
@@ -246,7 +294,7 @@
     FT_UNUSED( raster );
 
     /* check for valid parameters */
-    if ( !params )
+    if ( !raster || !params )
     {
       error = FT_THROW( Invalid_Argument );
       goto Exit;
@@ -269,6 +317,16 @@
       goto Exit; 
     }
 
+    memory = bsdf_raster->memory;
+    if ( !memory )
+    {
+      FT_TRACE0(( "[bsdf] bsdf_raster_render:\n"
+                  "      Raster not setup properly, "
+                  "unable to find memory handle.\n" ));
+      error = FT_THROW( Invalid_Handle );
+      goto Exit;
+    }
+
     /* check if spread is set properly */
     if ( sdf_params->spread > MAX_SPREAD ||
          sdf_params->spread < MIN_SPREAD )
@@ -285,8 +343,18 @@
       goto Exit;
     }
 
-    FT_CALL( bsdf_copy_source_to_target( source, target,
-                                         sdf_params->flip_y ) );
+    /* setup the worker */
+
+    /* allocate the distance map */
+    if ( !FT_QALLOC_MULT( worker.distance_map, target->rows,
+                          target->width * sizeof( *worker.distance_map ) ) )
+      goto Exit;
+
+    worker.width  = target->width;
+    worker.rows   = target->rows;
+    worker.params = *sdf_params;
+
+    FT_CALL( bsdf_init_distance_map( source, &worker ) );
 
   Exit:
     return error;
@@ -295,7 +363,10 @@
   static void
   bsdf_raster_done( FT_Raster  raster )
   {
-    FT_UNUSED( raster );
+    FT_Memory  memory = (FT_Memory)((SDF_TRaster*)raster)->memory;
+
+
+    FT_FREE( raster );
   }
 
   FT_DEFINE_RASTER_FUNCS(
diff --git a/src/sdf/sdf.c b/src/sdf/sdf.c
index 7428758..6f881c0 100644
--- a/src/sdf/sdf.c
+++ b/src/sdf/sdf.c
@@ -3,8 +3,8 @@
 #define FT_MAKE_OPTION_SINGLE_OBJECT
 
 #include "ftsdfrend.c"
-#include "ftsdf.c"
 #include "ftbsdf.c"
+#include "ftsdf.c"
 
 
 /* END */



reply via email to

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