[vlc-commits] freetype: correctly release temporary styles
Francois Cartegnie
git at videolan.org
Sat Aug 29 16:33:14 CEST 2015
vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Sat Aug 29 16:30:07 2015 +0200| [197e370e38f84db35fb3cffc83d3ffc368e99400] | committer: Francois Cartegnie
freetype: correctly release temporary styles
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=197e370e38f84db35fb3cffc83d3ffc368e99400
---
modules/text_renderer/freetype.c | 41 +++++++++++++++++++++++++----------
modules/text_renderer/text_layout.c | 6 ++---
modules/text_renderer/text_layout.h | 2 +-
3 files changed, 33 insertions(+), 16 deletions(-)
diff --git a/modules/text_renderer/freetype.c b/modules/text_renderer/freetype.c
index 4ccafc3..53f86a6 100644
--- a/modules/text_renderer/freetype.c
+++ b/modules/text_renderer/freetype.c
@@ -875,13 +875,29 @@ static void FillDefaultStyles( filter_t *p_filter )
/* Apply forced styles to defaults, if any */
text_style_Merge( p_sys->p_default_style, p_sys->p_forced_style, true );
}
+__attribute__((optimize(0)))
+static void FreeStylesArray( text_style_t **pp_styles, size_t i_styles )
+{
+ text_style_t *p_style = NULL;
+ for( size_t i = 0; i< i_styles; i++ )
+ {
+ if( p_style != pp_styles[i] )
+ {
+ p_style = pp_styles[i];
+ text_style_Delete( p_style );
+ }
+ }
+ free( pp_styles );
+}
-static uni_char_t* SegmentsToTextAndStyles( filter_t *p_filter, const text_segment_t *p_segment, size_t *pi_string_length, const text_style_t ***ppp_styles)
+static uni_char_t* SegmentsToTextAndStyles( filter_t *p_filter, const text_segment_t *p_segment, size_t *pi_string_length,
+ text_style_t ***ppp_styles, size_t *pi_styles )
{
- const text_style_t **pp_styles = NULL;
+ text_style_t **pp_styles = NULL;
uni_char_t *psz_uni = NULL;
size_t i_size = 0;
size_t i_nb_char = 0;
+ *pi_styles = 0;
for( const text_segment_t *s = p_segment; s != NULL; s = s->p_next )
{
if( !s->psz_text )
@@ -891,13 +907,13 @@ static uni_char_t* SegmentsToTextAndStyles( filter_t *p_filter, const text_segme
if( !psz_tmp )
{
free( psz_uni );
- free( pp_styles );
+ FreeStylesArray( pp_styles, *pi_styles );
return NULL;
}
uni_char_t *psz_realloc = realloc(psz_uni, i_size + i_string_bytes);
if( unlikely( !psz_realloc ) )
{
- free( pp_styles );
+ FreeStylesArray( pp_styles, *pi_styles );
free( psz_uni );
free( psz_tmp );
return NULL;
@@ -908,20 +924,21 @@ static uni_char_t* SegmentsToTextAndStyles( filter_t *p_filter, const text_segme
// We want one text_style_t* per character. The amount of characters is the number of bytes divided by
// the size of one glyph, in byte
- const text_style_t **pp_styles_realloc = realloc( pp_styles, ( (i_size + i_string_bytes) / sizeof( *psz_uni ) * sizeof( *pp_styles ) ) );
+ const size_t i_newsize = (i_size + i_string_bytes) / sizeof( *psz_uni );
+ text_style_t **pp_styles_realloc = realloc( pp_styles, i_newsize * sizeof( *pp_styles ));
if ( unlikely( !pp_styles_realloc ) )
{
- free( pp_styles );
+ FreeStylesArray( pp_styles, *pi_styles );
free( psz_uni );
return NULL;
}
pp_styles = pp_styles_realloc;
+ *pi_styles = i_newsize;
- // We're actually writing to a read only object, something's wrong with the conception.
text_style_t *p_style = text_style_Duplicate( p_filter->p_sys->p_default_style );
if ( p_style == NULL )
{
- free( pp_styles );
+ FreeStylesArray( pp_styles, *pi_styles );
free( psz_uni );
return NULL;
}
@@ -957,9 +974,10 @@ static int Render( filter_t *p_filter, subpicture_region_t *p_region_out,
if( !p_region_in )
return VLC_EGENERIC;
- const text_style_t **pp_styles = NULL;
+ text_style_t **pp_styles = NULL;
size_t i_text_length = 0;
- uni_char_t *psz_text = SegmentsToTextAndStyles( p_filter, p_region_in->p_text, &i_text_length, &pp_styles );
+ size_t i_styles = 0;
+ uni_char_t *psz_text = SegmentsToTextAndStyles( p_filter, p_region_in->p_text, &i_text_length, &pp_styles, &i_styles );
if( !psz_text || !pp_styles )
{
return VLC_EGENERIC;
@@ -1033,8 +1051,7 @@ static int Render( filter_t *p_filter, subpicture_region_t *p_region_out,
FreeLines( p_lines );
free( psz_text );
- // Let the styles themselves be freed by the text_segment's release
- free( pp_styles );
+ FreeStylesArray( pp_styles, i_styles );
free( pi_k_durations );
return rv;
diff --git a/modules/text_renderer/text_layout.c b/modules/text_renderer/text_layout.c
index 2b399d3..f028502 100644
--- a/modules/text_renderer/text_layout.c
+++ b/modules/text_renderer/text_layout.c
@@ -104,7 +104,7 @@ typedef struct paragraph_t
{
uni_char_t *p_code_points; //Unicode code points
int *pi_glyph_indices; //Glyph index values within the run's font face
- const text_style_t **pp_styles;
+ text_style_t **pp_styles;
int *pi_run_ids; //The run to which each glyph belongs
glyph_bitmaps_t *p_glyph_bitmaps;
uint8_t *pi_karaoke_bar;
@@ -210,7 +210,7 @@ static void BBoxEnlarge( FT_BBox *p_max, const FT_BBox *p )
static paragraph_t *NewParagraph( filter_t *p_filter,
int i_size,
const uni_char_t *p_code_points,
- const text_style_t **pp_styles,
+ text_style_t **pp_styles,
uint32_t *pi_k_dates,
int i_runs_size )
{
@@ -1243,7 +1243,7 @@ error:
int LayoutText( filter_t *p_filter, line_desc_t **pp_lines,
FT_BBox *p_bbox, int *pi_max_face_height,
- const uni_char_t *psz_text, const text_style_t **pp_styles,
+ const uni_char_t *psz_text, text_style_t **pp_styles,
uint32_t *pi_k_dates, int i_len, bool b_grid )
{
line_desc_t *p_first_line = 0;
diff --git a/modules/text_renderer/text_layout.h b/modules/text_renderer/text_layout.h
index ff55830..17c7bff 100644
--- a/modules/text_renderer/text_layout.h
+++ b/modules/text_renderer/text_layout.h
@@ -58,5 +58,5 @@ line_desc_t *NewLine( int i_count );
int LayoutText(filter_t *p_filter, line_desc_t **pp_lines,
FT_BBox *p_bbox, int *pi_max_face_height,
- const uni_char_t *psz_text, const text_style_t **pp_styles,
+ const uni_char_t *psz_text, text_style_t **pp_styles,
uint32_t *pi_k_dates, int i_len, bool );
More information about the vlc-commits
mailing list