forked from minhngoc25a/freetype2
[sdf] Fix memory leaks.
* src/sdf/ftsdf.c (sdf_generate_with_overlaps): Deallocate the temporary bitmaps, and all the rest of the arrays. And also handle the `shape' appropriately so as to not cause memory leaks.
This commit is contained in:
parent
b457aeee67
commit
d2796ed059
|
@ -1,3 +1,12 @@
|
||||||
|
2020-08-12 Anuj Verma <anujv@iitbhilai.ac.in>
|
||||||
|
|
||||||
|
[sdf] Fix memory leaks.
|
||||||
|
|
||||||
|
* src/sdf/ftsdf.c (sdf_generate_with_overlaps): Deallocate
|
||||||
|
the temporary bitmaps, and all the rest of the arrays.
|
||||||
|
And also handle the `shape' appropriately so as to not
|
||||||
|
cause memory leaks.
|
||||||
|
|
||||||
2020-08-12 Anuj Verma <anujv@iitbhilai.ac.in>
|
2020-08-12 Anuj Verma <anujv@iitbhilai.ac.in>
|
||||||
|
|
||||||
[sdf] Handle Post-Script fonts for overlap.
|
[sdf] Handle Post-Script fonts for overlap.
|
||||||
|
|
|
@ -3203,8 +3203,9 @@
|
||||||
FT_Int i, j; /* iterators */
|
FT_Int i, j; /* iterators */
|
||||||
FT_Bitmap* bitmaps; /* seperate bitmaps for contours */
|
FT_Bitmap* bitmaps; /* seperate bitmaps for contours */
|
||||||
SDF_Contour* contour; /* temporary variable to iterate */
|
SDF_Contour* contour; /* temporary variable to iterate */
|
||||||
SDF_Shape temp_shape; /* temporary shape */
|
|
||||||
SDF_Contour* temp_contour; /* temporary contour */
|
SDF_Contour* temp_contour; /* temporary contour */
|
||||||
|
SDF_Contour* head; /* head of the contour list */
|
||||||
|
SDF_Shape temp_shape; /* temporary shape */
|
||||||
FT_Memory memory; /* to allocate memory */
|
FT_Memory memory; /* to allocate memory */
|
||||||
FT_6D10* t; /* target bitmap buffer */
|
FT_6D10* t; /* target bitmap buffer */
|
||||||
FT_Bool flip_sign; /* filp sign? */
|
FT_Bool flip_sign; /* filp sign? */
|
||||||
|
@ -3213,6 +3214,10 @@
|
||||||
SDF_Contour_Orientation* orientations;
|
SDF_Contour_Orientation* orientations;
|
||||||
|
|
||||||
|
|
||||||
|
bitmaps = NULL;
|
||||||
|
orientations = NULL;
|
||||||
|
head = NULL;
|
||||||
|
|
||||||
if ( !shape || !bitmap || !shape->memory )
|
if ( !shape || !bitmap || !shape->memory )
|
||||||
{
|
{
|
||||||
error = FT_THROW( Invalid_Argument );
|
error = FT_THROW( Invalid_Argument );
|
||||||
|
@ -3236,10 +3241,16 @@
|
||||||
if ( SDF_ALLOC( bitmaps, num_contours * sizeof( *bitmaps ) ) )
|
if ( SDF_ALLOC( bitmaps, num_contours * sizeof( *bitmaps ) ) )
|
||||||
goto Exit;
|
goto Exit;
|
||||||
|
|
||||||
|
/* zero the memory */
|
||||||
|
ft_memset( bitmaps, 0, num_contours * sizeof( *bitmaps ) );
|
||||||
|
|
||||||
/* allocate array to hold orientation for all contours */
|
/* allocate array to hold orientation for all contours */
|
||||||
if ( SDF_ALLOC( orientations, num_contours * sizeof( *orientations ) ) )
|
if ( SDF_ALLOC( orientations, num_contours * sizeof( *orientations ) ) )
|
||||||
goto Exit;
|
goto Exit;
|
||||||
|
|
||||||
|
/* zero the memory */
|
||||||
|
ft_memset( orientations, 0, num_contours * sizeof( *orientations ) );
|
||||||
|
|
||||||
/* Disable the flip_sign to avoid extra complication */
|
/* Disable the flip_sign to avoid extra complication */
|
||||||
/* during the combination phase. */
|
/* during the combination phase. */
|
||||||
flip_sign = internal_params.flip_sign;
|
flip_sign = internal_params.flip_sign;
|
||||||
|
@ -3264,23 +3275,8 @@
|
||||||
if ( SDF_ALLOC( bitmaps[i].buffer, bitmap->rows * bitmap->pitch ) )
|
if ( SDF_ALLOC( bitmaps[i].buffer, bitmap->rows * bitmap->pitch ) )
|
||||||
goto Exit;
|
goto Exit;
|
||||||
|
|
||||||
/* Allocate a temporary contour to pass to the */
|
|
||||||
/* generation function. This is done because */
|
|
||||||
/* `split_sdf_shape' deallocate the contour, */
|
|
||||||
/* so we cannot pass a static memory. */
|
|
||||||
if ( SDF_ALLOC( temp_contour, sizeof( *temp_contour ) ) )
|
|
||||||
goto Exit;
|
|
||||||
|
|
||||||
/* initialize the new contour */
|
|
||||||
temp_contour->edges = contour->edges;
|
|
||||||
temp_contour->next = NULL;
|
|
||||||
|
|
||||||
/* Use the `temp_shape' to hold the new contour. */
|
|
||||||
/* Now, the `temp_shape' has only one contour. */
|
|
||||||
temp_shape.contours = temp_contour;
|
|
||||||
|
|
||||||
/* determine the orientation */
|
/* determine the orientation */
|
||||||
orientations[i] = get_contour_orientation( temp_contour );
|
orientations[i] = get_contour_orientation( contour );
|
||||||
|
|
||||||
/* The `overload_sign; property is specific to */
|
/* The `overload_sign; property is specific to */
|
||||||
/* sdf_generate_bounding_box. This basically */
|
/* sdf_generate_bounding_box. This basically */
|
||||||
|
@ -3296,12 +3292,32 @@
|
||||||
else
|
else
|
||||||
internal_params.overload_sign = 0;
|
internal_params.overload_sign = 0;
|
||||||
|
|
||||||
|
/* Make `contour->next' NULL so that there is */
|
||||||
|
/* one contour in the list. Also hold the next */
|
||||||
|
/* contour in a temporary variable so as to */
|
||||||
|
/* restore the original value. */
|
||||||
|
temp_contour = contour->next;
|
||||||
|
contour->next = NULL;
|
||||||
|
|
||||||
|
/* Use the `temp_shape' to hold the new contour. */
|
||||||
|
/* Now, the `temp_shape' has only one contour. */
|
||||||
|
temp_shape.contours = contour;
|
||||||
|
|
||||||
/* finally generate the SDF */
|
/* finally generate the SDF */
|
||||||
FT_CALL( sdf_generate_subdivision( internal_params,
|
FT_CALL( sdf_generate_subdivision( internal_params,
|
||||||
&temp_shape,
|
&temp_shape,
|
||||||
spread,
|
spread,
|
||||||
&bitmaps[i] ) );
|
&bitmaps[i] ) );
|
||||||
|
|
||||||
|
/* Restore the original next variable. */
|
||||||
|
contour->next = temp_contour;
|
||||||
|
|
||||||
|
/* Since `slpit_sdf_shape' deallocated the original */
|
||||||
|
/* contours list, we need to assign the new value to */
|
||||||
|
/* the shape's contour. */
|
||||||
|
temp_shape.contours->next = head;
|
||||||
|
head = temp_shape.contours;
|
||||||
|
|
||||||
/* Simply flip the orientation in case of post-scritp fonts, */
|
/* Simply flip the orientation in case of post-scritp fonts, */
|
||||||
/* so as to avoid modificatons in the combining phase. */
|
/* so as to avoid modificatons in the combining phase. */
|
||||||
if ( internal_params.orientation == FT_ORIENTATION_FILL_LEFT )
|
if ( internal_params.orientation == FT_ORIENTATION_FILL_LEFT )
|
||||||
|
@ -3315,6 +3331,9 @@
|
||||||
contour = contour->next;
|
contour = contour->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* assign the new contour list to `shape->contours' */
|
||||||
|
shape->contours = head;
|
||||||
|
|
||||||
/* cast the output bitmap buffer */
|
/* cast the output bitmap buffer */
|
||||||
t = (FT_6D10*)bitmap->buffer;
|
t = (FT_6D10*)bitmap->buffer;
|
||||||
|
|
||||||
|
@ -3357,6 +3376,25 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
Exit:
|
Exit:
|
||||||
|
|
||||||
|
/* deallocate the orientations array */
|
||||||
|
if ( orientations )
|
||||||
|
SDF_FREE( orientations );
|
||||||
|
|
||||||
|
/* deallocate the temporary bitmaps */
|
||||||
|
if ( bitmaps )
|
||||||
|
{
|
||||||
|
if ( num_contours == 0 )
|
||||||
|
error = FT_THROW( Raster_Corrupted );
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for ( i = 0; i < num_contours; i++ )
|
||||||
|
SDF_FREE( bitmaps[i].buffer );
|
||||||
|
|
||||||
|
SDF_FREE( bitmaps );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3765,8 +3803,8 @@
|
||||||
shape, sdf_params->spread,
|
shape, sdf_params->spread,
|
||||||
sdf_params->root.target ) );
|
sdf_params->root.target ) );
|
||||||
|
|
||||||
//if ( shape )
|
if ( shape )
|
||||||
// sdf_shape_done( &shape );
|
sdf_shape_done( &shape );
|
||||||
|
|
||||||
/* restore the memory->user */
|
/* restore the memory->user */
|
||||||
SDF_MEMORY_TRACKER_DONE();
|
SDF_MEMORY_TRACKER_DONE();
|
||||||
|
|
Loading…
Reference in New Issue