vlc | branch: master | Francois Cartegnie <[email protected]> | 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 ); _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
