freetype-commit
[Top][All Lists]
Advanced

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

[freetype2] GSoC-2020-anuj 44e9d12 2/3: [bsdf] Added function to find ed


From: Anuj Verma
Subject: [freetype2] GSoC-2020-anuj 44e9d12 2/3: [bsdf] Added function to find edge pixels given a grid of alpha values.
Date: Thu, 20 Aug 2020 00:01:57 -0400 (EDT)

branch: GSoC-2020-anuj
commit 44e9d12f0f39f910f2be0653b1bc91be48d40f72
Author: Anuj Verma <anujv@iitbhilai.ac.in>
Commit: Anuj Verma <anujv@iitbhilai.ac.in>

    [bsdf] Added function to find edge pixels given a grid of alpha values.
    
    * src/sdf/ftbsdf.c (bsdf_is_edge): The function find the edge pixel in a 
distance map
      which is basically a 2D array of alpha values which represent coverage in 
the
      original input bitmap.
---
 src/sdf/ftbsdf.c | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 111 insertions(+)

diff --git a/src/sdf/ftbsdf.c b/src/sdf/ftbsdf.c
index db95e7c..1a33331 100644
--- a/src/sdf/ftbsdf.c
+++ b/src/sdf/ftbsdf.c
@@ -123,5 +123,116 @@
   static
   const ED  zero_ed = { 0, { 0, 0 }, 0 };
 
+  /**************************************************************************
+   *
+   * rasterizer functions
+   *
+   */
+
+  #ifdef CHECK_NEIGHBOR
+  #undef CHECK_NEIGHBOR
+  #endif
+
+  /* Use the macro only in `bsdf_is_edge' function. */
+  #define CHECK_NEIGHBOR( x_offset, y_offset )     \
+    if ( x + x_offset >= 0 && x + x_offset < w &&  \
+         y + y_offset >= 0 && y + y_offset < r )   \
+    {                                              \
+      num_neighbour++;                             \
+      to_check = dm + y_offset * w + x_offset;     \
+      if ( to_check->alpha == 0 )                  \
+      {                                            \
+        is_edge = 1;                               \
+        goto Done;                                 \
+      }                                            \
+    }
+
+  /**************************************************************************
+   *
+   * @Function:
+   *   bsdf_is_edge
+   *
+   * @Description:
+   *   This function checks weather a pixel is an edge pixel. A pixel
+   *   is edge bixel if it surrounded by a completely black pixel ( 0
+   *   alpha ) and the current pixel is not a completely black pixel.
+   *
+   * @Input:
+   *   dm ::
+   *     Array of distances. The parameter must point to the current
+   *     pixel i.e. the pixel that is to be checked for edge.
+   *
+   *   x ::
+   *     The x position of the current pixel.
+   *
+   *   y ::
+   *     The y position of the current pixel.
+   *
+   *   w ::
+   *     Width of the bitmap.
+   *
+   *   r ::
+   *     Number of rows in the bitmap.
+   *
+   * @Return:
+   *   FT_Bool ::
+   *     1 if the current pixel is an edge pixel, 0 otherwise.
+   *
+   */
+  static FT_Bool
+  bsdf_is_edge( ED*       dm,   /* distance map              */
+                FT_Int    x,    /* x index of point to check */
+                FT_Int    y,    /* y index of point to check */
+                FT_Int    w,    /* width                     */
+                FT_Int    r )   /* rows                      */
+  {
+    FT_Bool   is_edge       = 0; 
+    ED*       to_check      = NULL;
+    FT_Int    num_neighbour = 0;
+
+
+    if ( dm->alpha == 0 )
+      goto Done;
+
+    if ( dm->alpha > 0 && dm->alpha < 255 )
+    {
+      is_edge = 1;
+      goto Done;
+    }
+
+    /* up */
+    CHECK_NEIGHBOR(  0, -1 );
+
+    /* down */
+    CHECK_NEIGHBOR(  0,  1 );
+
+    /* left */
+    CHECK_NEIGHBOR( -1,  0 );
+
+    /* right */
+    CHECK_NEIGHBOR(  1,  0 );
+
+    /* up left */
+    CHECK_NEIGHBOR( -1, -1 );
+
+    /* up right */
+    CHECK_NEIGHBOR(  1, -1 );
+
+    /* down left */
+    CHECK_NEIGHBOR( -1,  1 );
+
+    /* down right */
+    CHECK_NEIGHBOR(  1,  1 );
+
+    if ( num_neighbour != 8 )
+      is_edge = 1;
+
+  Done:
+    return is_edge;
+
+  }
+
+  #undef CHECK_NEIGHBOR
+
 
 /* END */



reply via email to

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