[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[freetype2] anuj-distance-field 2f0d349 09/93: [sdf] Added functions to
From: |
Anuj Verma |
Subject: |
[freetype2] anuj-distance-field 2f0d349 09/93: [sdf] Added functions to de-allocate `SDF_' structs. |
Date: |
Sun, 2 Aug 2020 07:04:10 -0400 (EDT) |
branch: anuj-distance-field
commit 2f0d349d8cb81ef7416c9c76ea5d625c9d38f738
Author: Anuj Verma <anujv@iitbhilai.ac.in>
Commit: anujverma <anujv@iitbhilai.ac.in>
[sdf] Added functions to de-allocate `SDF_' structs.
---
[GSoC]ChangeLog | 12 +++++
src/sdf/ftsdf.c | 126 +++++++++++++++++++++++++++++++++++++++-------------
src/sdf/ftsdfrend.c | 6 +--
3 files changed, 109 insertions(+), 35 deletions(-)
diff --git a/[GSoC]ChangeLog b/[GSoC]ChangeLog
index 32edb69..cb5ec4f 100644
--- a/[GSoC]ChangeLog
+++ b/[GSoC]ChangeLog
@@ -1,3 +1,15 @@
+2020-06-26 Anuj Verma <anujv@iitbhilai.ac.in>
+
+ [sdf] Added functions to de-allocate `SDF_' structs.
+
+ * src/sdf/ftsdf.c (SDF_Contour, SDF_Shape): Use `FT_ListRec'
+ instead of `FT_List' to avoid a few extra allocations.
+
+ * src/sdf/ftsdf.c (SDF_Edge, SDF_Contour, SDF_Shape): Added
+ functions to de-allocate these structs and there members.
+
+ * src/sdf/ftsdfrenc.c: Typo.
+
2020-06-25 Anuj Verma <anujv@iitbhilai.ac.in>
[sdf] Decompose outline and store it in a temporary
diff --git a/src/sdf/ftsdf.c b/src/sdf/ftsdf.c
index 3b6e57f..97c39ef 100644
--- a/src/sdf/ftsdf.c
+++ b/src/sdf/ftsdf.c
@@ -54,7 +54,7 @@
typedef struct SDF_Contour_
{
FT_26D6_Vec last_pos; /* end position of the last edge */
- FT_List edges; /* list of all edges in the contour */
+ FT_ListRec edges; /* list of all edges in the contour */
} SDF_Contour;
@@ -62,8 +62,8 @@
/* glyph outline. */
typedef struct SDF_Shape_
{
- FT_Memory memory; /* used internally to allocate memory */
- FT_List contours; /* list of all contours in the outline */
+ FT_Memory memory; /* used internally to allocate memory */
+ FT_ListRec contours; /* list of all contours in the outline */
} SDF_Shape;
@@ -82,14 +82,10 @@
SDF_EDGE_UNDEFINED };
static
- const SDF_Contour null_contour = { { 0, 0 }, NULL };
+ const SDF_Contour null_contour = { { 0, 0 }, { NULL, NULL } };
static
- const SDF_Shape null_shape = { NULL, NULL };
-
- static
- const FT_ListRec empty_list = { NULL, NULL };
-
+ const SDF_Shape null_shape = { NULL, { NULL, NULL } };
/* Creates a new `SDF_Edge' on the heap and assigns the `edge' */
/* pointer to the newly allocated memory. */
@@ -118,6 +114,29 @@
return error;
}
+ /* Frees the allocated `edge' variable. */
+ static void
+ sdf_edge_done( FT_Memory memory,
+ SDF_Edge** edge )
+ {
+ if ( !memory || !edge || !*edge )
+ return;
+
+ FT_FREE( *edge );
+ }
+
+ /* Used in `FT_List_Finalize' */
+ static void
+ sdf_edge_destructor( FT_Memory memory,
+ void* data,
+ void* user )
+ {
+ SDF_Edge* edge = (SDF_Edge*)data;
+
+
+ sdf_edge_done( memory, &edge );
+ }
+
/* Creates a new `SDF_Contour' on the heap and assigns the `contour' */
/* pointer to the newly allocated memory. Note that the function also */
/* allocate the `contour.edges' list variable and sets to empty list. */
@@ -139,22 +158,45 @@
if ( error == FT_Err_Ok )
{
*ptr = null_contour;
- FT_QNEW( ptr->edges );
- if ( error == FT_Err_Ok )
- {
- *ptr->edges = empty_list;
- *contour = ptr;
- }
+ *contour = ptr;
}
Exit:
return error;
}
+ /* Frees the allocated `contour' variable and also frees */
+ /* the list of edges. */
+ static void
+ sdf_contour_done( FT_Memory memory,
+ SDF_Contour** contour )
+ {
+ if ( !memory || !contour || !*contour )
+ return;
+
+ /* */
+ FT_List_Finalize( &(*contour)->edges, sdf_edge_destructor,
+ memory, NULL );
+
+ FT_FREE( *contour );
+ }
+
+ /* Used in `FT_List_Finalize' */
+ static void
+ sdf_contour_destructor( FT_Memory memory,
+ void* data,
+ void* user )
+ {
+ SDF_Contour* contour = (SDF_Contour*)data;
+
+
+ sdf_contour_done( memory, &contour );
+ }
+
/* Creates a new `SDF_Shape' on the heap and assigns the `shape' */
/* pointer to the newly allocated memory. Note that the function also */
/* allocate the `shape.contours' list variable and sets to empty list. */
- static void
+ static FT_Error
sdf_shape_new( FT_Memory memory,
SDF_Shape** shape )
{
@@ -172,20 +214,31 @@
if ( error == FT_Err_Ok )
{
*ptr = null_shape;
- FT_QNEW( ptr->contours );
- if ( error == FT_Err_Ok )
- {
- *ptr->contours = empty_list;
- ptr->memory = memory;
- *shape = ptr;
- }
+ ptr->memory = memory;
+ *shape = ptr;
}
Exit:
return error;
}
-
+ /* Frees the allocated `shape' variable and also frees */
+ /* the list of contours. */
+ static void
+ sdf_shape_done( FT_Memory memory,
+ SDF_Shape** shape )
+ {
+ if ( !memory || !shape || !*shape )
+ return;
+
+ /* release the list of contours */
+ FT_List_Finalize( &(*shape)->contours, sdf_contour_destructor,
+ memory, NULL );
+
+ /* release the allocated shape struct */
+ FT_FREE( *shape );
+ }
+
/**************************************************************************
*
@@ -224,7 +277,7 @@
contour->last_pos = *to;
node->data = contour;
- FT_List_Add( shape->contours, node );
+ FT_List_Add( &shape->contours, node );
Exit:
return error;
@@ -249,7 +302,7 @@
goto Exit;
}
- contour = ( SDF_Contour* )shape->contours->tail->data;
+ contour = ( SDF_Contour* )shape->contours.tail->data;
if ( contour->last_pos.x == to->x &&
contour->last_pos.y == to->y )
@@ -270,7 +323,7 @@
contour->last_pos = *to;
node->data = edge;
- FT_List_Add( contour->edges, node );
+ FT_List_Add( &contour->edges, node );
Exit:
return error;
@@ -296,7 +349,7 @@
goto Exit;
}
- contour = ( SDF_Contour* )shape->contours->tail->data;
+ contour = ( SDF_Contour* )shape->contours.tail->data;
error = sdf_edge_new( memory, &edge );
if ( error != FT_Err_Ok )
@@ -314,7 +367,7 @@
contour->last_pos = *to;
node->data = edge;
- FT_List_Add( contour->edges, node );
+ FT_List_Add( &contour->edges, node );
Exit:
return error;
@@ -341,7 +394,7 @@
goto Exit;
}
- contour = ( SDF_Contour* )shape->contours->tail->data;
+ contour = ( SDF_Contour* )shape->contours.tail->data;
error = sdf_edge_new( memory, &edge );
if ( error != FT_Err_Ok )
@@ -360,7 +413,7 @@
contour->last_pos = *to;
node->data = edge;
- FT_List_Add( contour->edges, node );
+ FT_List_Add( &contour->edges, node );
Exit:
return error;
@@ -378,7 +431,7 @@
0 /* delta */
)
- /* function decomposes the outline and puts it into the `shape' object */
+ /* function decomposes the outline and puts it into the `shape' struct */
static FT_Error
sdf_outline_decompose( FT_Outline* outline,
SDF_Shape* shape )
@@ -453,6 +506,15 @@
FT_UNUSED( raster );
FT_UNUSED( params );
+ FT_Memory memory = (FT_Memory)((SDF_TRaster*)raster)->memory;
+
+ SDF_Shape * shape = NULL;
+ sdf_shape_new( memory, &shape );
+
+ sdf_outline_decompose( params->source, shape );
+
+ sdf_shape_done( memory, &shape );
+
return FT_THROW( Unimplemented_Feature );
}
diff --git a/src/sdf/ftsdfrend.c b/src/sdf/ftsdfrend.c
index b1bda92..2aaf812 100644
--- a/src/sdf/ftsdfrend.c
+++ b/src/sdf/ftsdfrend.c
@@ -196,9 +196,9 @@
slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
}
- /* preset the bitmap using the glyph's outline; */
- /* the sdf bitmap is similar to an antialiased bitmap */
- /* with a slighty bigger size and different pixel mode */
+ /* preset the bitmap using the glyph's outline; */
+ /* the sdf bitmap is similar to an antialiased bitmap */
+ /* with a slightly bigger size and different pixel mode */
if ( ft_glyphslot_preset_bitmap( slot, FT_RENDER_MODE_NORMAL, origin ) )
{
error = FT_THROW( Raster_Overflow );
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [freetype2] anuj-distance-field 2f0d349 09/93: [sdf] Added functions to de-allocate `SDF_' structs.,
Anuj Verma <=