forked from minhngoc25a/freetype2
[sdf] Added functions to de-allocate `SDF_' structs.
This commit is contained in:
parent
54ff90398a
commit
2f0d349d8c
|
@ -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>
|
2020-06-25 Anuj Verma <anujv@iitbhilai.ac.in>
|
||||||
|
|
||||||
[sdf] Decompose outline and store it in a temporary
|
[sdf] Decompose outline and store it in a temporary
|
||||||
|
|
126
src/sdf/ftsdf.c
126
src/sdf/ftsdf.c
|
@ -54,7 +54,7 @@
|
||||||
typedef struct SDF_Contour_
|
typedef struct SDF_Contour_
|
||||||
{
|
{
|
||||||
FT_26D6_Vec last_pos; /* end position of the last edge */
|
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;
|
} SDF_Contour;
|
||||||
|
|
||||||
|
@ -62,8 +62,8 @@
|
||||||
/* glyph outline. */
|
/* glyph outline. */
|
||||||
typedef struct SDF_Shape_
|
typedef struct SDF_Shape_
|
||||||
{
|
{
|
||||||
FT_Memory memory; /* used internally to allocate memory */
|
FT_Memory memory; /* used internally to allocate memory */
|
||||||
FT_List contours; /* list of all contours in the outline */
|
FT_ListRec contours; /* list of all contours in the outline */
|
||||||
|
|
||||||
} SDF_Shape;
|
} SDF_Shape;
|
||||||
|
|
||||||
|
@ -82,14 +82,10 @@
|
||||||
SDF_EDGE_UNDEFINED };
|
SDF_EDGE_UNDEFINED };
|
||||||
|
|
||||||
static
|
static
|
||||||
const SDF_Contour null_contour = { { 0, 0 }, NULL };
|
const SDF_Contour null_contour = { { 0, 0 }, { NULL, NULL } };
|
||||||
|
|
||||||
static
|
static
|
||||||
const SDF_Shape null_shape = { NULL, NULL };
|
const SDF_Shape null_shape = { NULL, { NULL, NULL } };
|
||||||
|
|
||||||
static
|
|
||||||
const FT_ListRec empty_list = { NULL, NULL };
|
|
||||||
|
|
||||||
|
|
||||||
/* Creates a new `SDF_Edge' on the heap and assigns the `edge' */
|
/* Creates a new `SDF_Edge' on the heap and assigns the `edge' */
|
||||||
/* pointer to the newly allocated memory. */
|
/* pointer to the newly allocated memory. */
|
||||||
|
@ -118,6 +114,29 @@
|
||||||
return error;
|
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' */
|
/* Creates a new `SDF_Contour' on the heap and assigns the `contour' */
|
||||||
/* pointer to the newly allocated memory. Note that the function also */
|
/* pointer to the newly allocated memory. Note that the function also */
|
||||||
/* allocate the `contour.edges' list variable and sets to empty list. */
|
/* allocate the `contour.edges' list variable and sets to empty list. */
|
||||||
|
@ -139,22 +158,45 @@
|
||||||
if ( error == FT_Err_Ok )
|
if ( error == FT_Err_Ok )
|
||||||
{
|
{
|
||||||
*ptr = null_contour;
|
*ptr = null_contour;
|
||||||
FT_QNEW( ptr->edges );
|
*contour = ptr;
|
||||||
if ( error == FT_Err_Ok )
|
|
||||||
{
|
|
||||||
*ptr->edges = empty_list;
|
|
||||||
*contour = ptr;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Exit:
|
Exit:
|
||||||
return error;
|
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' */
|
/* Creates a new `SDF_Shape' on the heap and assigns the `shape' */
|
||||||
/* pointer to the newly allocated memory. Note that the function also */
|
/* pointer to the newly allocated memory. Note that the function also */
|
||||||
/* allocate the `shape.contours' list variable and sets to empty list. */
|
/* allocate the `shape.contours' list variable and sets to empty list. */
|
||||||
static void
|
static FT_Error
|
||||||
sdf_shape_new( FT_Memory memory,
|
sdf_shape_new( FT_Memory memory,
|
||||||
SDF_Shape** shape )
|
SDF_Shape** shape )
|
||||||
{
|
{
|
||||||
|
@ -172,20 +214,31 @@
|
||||||
if ( error == FT_Err_Ok )
|
if ( error == FT_Err_Ok )
|
||||||
{
|
{
|
||||||
*ptr = null_shape;
|
*ptr = null_shape;
|
||||||
FT_QNEW( ptr->contours );
|
ptr->memory = memory;
|
||||||
if ( error == FT_Err_Ok )
|
*shape = ptr;
|
||||||
{
|
|
||||||
*ptr->contours = empty_list;
|
|
||||||
ptr->memory = memory;
|
|
||||||
*shape = ptr;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Exit:
|
Exit:
|
||||||
return error;
|
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;
|
contour->last_pos = *to;
|
||||||
|
|
||||||
node->data = contour;
|
node->data = contour;
|
||||||
FT_List_Add( shape->contours, node );
|
FT_List_Add( &shape->contours, node );
|
||||||
|
|
||||||
Exit:
|
Exit:
|
||||||
return error;
|
return error;
|
||||||
|
@ -249,7 +302,7 @@
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
contour = ( SDF_Contour* )shape->contours->tail->data;
|
contour = ( SDF_Contour* )shape->contours.tail->data;
|
||||||
|
|
||||||
if ( contour->last_pos.x == to->x &&
|
if ( contour->last_pos.x == to->x &&
|
||||||
contour->last_pos.y == to->y )
|
contour->last_pos.y == to->y )
|
||||||
|
@ -270,7 +323,7 @@
|
||||||
contour->last_pos = *to;
|
contour->last_pos = *to;
|
||||||
|
|
||||||
node->data = edge;
|
node->data = edge;
|
||||||
FT_List_Add( contour->edges, node );
|
FT_List_Add( &contour->edges, node );
|
||||||
|
|
||||||
Exit:
|
Exit:
|
||||||
return error;
|
return error;
|
||||||
|
@ -296,7 +349,7 @@
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
contour = ( SDF_Contour* )shape->contours->tail->data;
|
contour = ( SDF_Contour* )shape->contours.tail->data;
|
||||||
|
|
||||||
error = sdf_edge_new( memory, &edge );
|
error = sdf_edge_new( memory, &edge );
|
||||||
if ( error != FT_Err_Ok )
|
if ( error != FT_Err_Ok )
|
||||||
|
@ -314,7 +367,7 @@
|
||||||
contour->last_pos = *to;
|
contour->last_pos = *to;
|
||||||
|
|
||||||
node->data = edge;
|
node->data = edge;
|
||||||
FT_List_Add( contour->edges, node );
|
FT_List_Add( &contour->edges, node );
|
||||||
|
|
||||||
Exit:
|
Exit:
|
||||||
return error;
|
return error;
|
||||||
|
@ -341,7 +394,7 @@
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
contour = ( SDF_Contour* )shape->contours->tail->data;
|
contour = ( SDF_Contour* )shape->contours.tail->data;
|
||||||
|
|
||||||
error = sdf_edge_new( memory, &edge );
|
error = sdf_edge_new( memory, &edge );
|
||||||
if ( error != FT_Err_Ok )
|
if ( error != FT_Err_Ok )
|
||||||
|
@ -360,7 +413,7 @@
|
||||||
contour->last_pos = *to;
|
contour->last_pos = *to;
|
||||||
|
|
||||||
node->data = edge;
|
node->data = edge;
|
||||||
FT_List_Add( contour->edges, node );
|
FT_List_Add( &contour->edges, node );
|
||||||
|
|
||||||
Exit:
|
Exit:
|
||||||
return error;
|
return error;
|
||||||
|
@ -378,7 +431,7 @@
|
||||||
0 /* delta */
|
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
|
static FT_Error
|
||||||
sdf_outline_decompose( FT_Outline* outline,
|
sdf_outline_decompose( FT_Outline* outline,
|
||||||
SDF_Shape* shape )
|
SDF_Shape* shape )
|
||||||
|
@ -453,6 +506,15 @@
|
||||||
FT_UNUSED( raster );
|
FT_UNUSED( raster );
|
||||||
FT_UNUSED( params );
|
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 );
|
return FT_THROW( Unimplemented_Feature );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -196,9 +196,9 @@
|
||||||
slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
|
slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* preset the bitmap using the glyph's outline; */
|
/* preset the bitmap using the glyph's outline; */
|
||||||
/* the sdf bitmap is similar to an antialiased bitmap */
|
/* the sdf bitmap is similar to an antialiased bitmap */
|
||||||
/* with a slighty bigger size and different pixel mode */
|
/* with a slightly bigger size and different pixel mode */
|
||||||
if ( ft_glyphslot_preset_bitmap( slot, FT_RENDER_MODE_NORMAL, origin ) )
|
if ( ft_glyphslot_preset_bitmap( slot, FT_RENDER_MODE_NORMAL, origin ) )
|
||||||
{
|
{
|
||||||
error = FT_THROW( Raster_Overflow );
|
error = FT_THROW( Raster_Overflow );
|
||||||
|
|
Loading…
Reference in New Issue