[vlc-commits] Move segment to characters & style array conversion function
Hugo Beauzée-Luyssen
git at videolan.org
Tue Jul 28 16:01:59 CEST 2015
vlc | branch: master | Hugo Beauzée-Luyssen <hugo at beauzee.fr> | Tue Jul 28 15:41:29 2015 +0200| [cd7f55d44709f5beaedb942c0fc341fd64c9e8b8] | committer: Jean-Baptiste Kempf
Move segment to characters & style array conversion function
Also, fix it.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=cd7f55d44709f5beaedb942c0fc341fd64c9e8b8
---
modules/text_renderer/freetype.c | 99 ++++++++++++++++++++++++++++++++---
modules/text_renderer/text_layout.c | 45 ----------------
modules/text_renderer/text_layout.h | 2 -
3 files changed, 93 insertions(+), 53 deletions(-)
diff --git a/modules/text_renderer/freetype.c b/modules/text_renderer/freetype.c
index bc975af..0ede10e 100644
--- a/modules/text_renderer/freetype.c
+++ b/modules/text_renderer/freetype.c
@@ -43,6 +43,7 @@
#include <vlc_dialog.h> /* FcCache dialog */
#include <vlc_filter.h> /* filter_sys_t */
#include <vlc_text_style.h> /* text_style_t*/
+#include <vlc_charset.h>
/* Freetype */
#include <ft2build.h>
@@ -907,6 +908,96 @@ static xml_reader_t *GetXMLReader( filter_t *p_filter, stream_t *p_sub )
return p_xml_reader;
}
+static text_style_t* ApplyDefaultStyle( filter_sys_t *p_sys, text_style_t* p_original_style )
+{
+ text_style_t *p_style = p_original_style;
+ if ( !p_style )
+ {
+ p_style = text_style_New();
+ if ( unlikely( !p_style ) )
+ return NULL;
+ p_style->i_font_color = p_sys->style.i_font_color & 0x00FFFFFF;
+ p_style->i_font_alpha = (p_sys->style.i_font_alpha & 0xFF000000) >> 24;
+ p_style->i_karaoke_background_color = p_sys->style.i_karaoke_background_color;
+ p_style->i_karaoke_background_alpha = p_sys->style.i_karaoke_background_alpha;
+ p_style->i_style_flags = p_sys->style.i_style_flags;
+ }
+ if ( !p_style->psz_fontname )
+ p_style->psz_fontname = strdup( p_sys->style.psz_fontname );
+ if ( !p_style->psz_monofontname )
+ p_style->psz_monofontname = strdup( p_sys->style.psz_monofontname );
+ if ( !p_style->psz_fontname || !p_style->psz_monofontname )
+ {
+ free( p_style->psz_fontname );
+ free( p_style->psz_monofontname );
+ if ( !p_original_style )
+ free( p_style );
+ return NULL;
+ }
+ if ( !p_style->i_font_size )
+ p_style->i_font_size = p_sys->style.i_font_size;
+ return p_style;
+}
+
+static uni_char_t* SegmentsToTextAndStyles( filter_sys_t *p_sys, const text_segment_t *p_segment, size_t *pi_string_length, text_style_t ***ppp_styles)
+{
+ text_style_t **pp_styles = NULL;
+ uni_char_t *psz_uni = NULL;
+ size_t i_size = 0;
+ size_t i_nb_char = 0;
+ for ( const text_segment_t *s = p_segment; s != NULL; s = s->p_next )
+ {
+ //FIXME: This is missing a space in between segments.
+ if ( !s->psz_text )
+ continue;
+ size_t i_string_bytes = 0;
+ uni_char_t *psz_tmp = ToCharset( FREETYPE_TO_UCS, s->psz_text, &i_string_bytes );
+ if ( !psz_tmp )
+ {
+ free( psz_uni );
+ free( pp_styles );
+ return NULL;
+ }
+ uni_char_t *psz_realloc = realloc(psz_uni, i_size + i_string_bytes);
+ if ( unlikely( !psz_realloc ) )
+ {
+ free( pp_styles );
+ free( psz_uni );
+ free( psz_tmp );
+ return NULL;
+ }
+ psz_uni = psz_realloc;
+ memcpy( psz_uni + i_nb_char, psz_tmp, i_string_bytes );
+ free( psz_tmp );
+ // 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
+ text_style_t **pp_styles_realloc = realloc( pp_styles, ( (i_size + i_string_bytes) / sizeof( *psz_uni ) * sizeof( *pp_styles ) ) );
+ if ( unlikely( !pp_styles_realloc ) )
+ {
+ free( pp_styles );
+ free( psz_uni );
+ return NULL;
+ }
+ pp_styles = pp_styles_realloc;
+ // We're actually writing to a read only object, something's wrong with the conception.
+ text_style_t *p_style = ApplyDefaultStyle( p_sys, s->style );
+ if ( p_style == NULL )
+ {
+ free( pp_styles );
+ free( psz_uni );
+ return NULL;
+ }
+ // i_string_bytes is a number of bytes, while here we're going to assign pointer by pointer
+ for ( size_t i = 0; i < i_string_bytes / sizeof( *psz_uni ); ++i )
+ pp_styles[i_nb_char + i] = p_style;
+ i_size += i_string_bytes;
+ i_nb_char = i_size / sizeof( *psz_uni );
+ }
+ *pi_string_length = i_nb_char;
+ *ppp_styles = pp_styles;
+ return psz_uni;
+}
+
/**
* This function renders a text subpicture region into another one.
* It also calculates the size needed for this string, and renders the
@@ -925,7 +1016,7 @@ static int Render( filter_t *p_filter, subpicture_region_t *p_region_out,
text_style_t **pp_styles = NULL;
size_t i_text_length = 0;
- uni_char_t *psz_text = SegmentsToTextAndStyles( p_region_in->p_text, &i_text_length, &pp_styles );
+ uni_char_t *psz_text = SegmentsToTextAndStyles( p_sys, p_region_in->p_text, &i_text_length, &pp_styles );
if( !psz_text || !pp_styles )
{
@@ -1003,11 +1094,7 @@ static int Render( filter_t *p_filter, subpicture_region_t *p_region_out,
FreeLines( p_lines );
free( psz_text );
- for( size_t i = 0; i < i_text_length; i++ )
- {
- if( pp_styles[i] && ( i + 1 == i_text_length || pp_styles[i] != pp_styles[i + 1] ) )
- text_style_Delete( pp_styles[i] );
- }
+ // Let the styles themselves be freed by the text_segment's release
free( pp_styles );
free( pi_k_durations );
diff --git a/modules/text_renderer/text_layout.c b/modules/text_renderer/text_layout.c
index 1156184..a639fbc 100644
--- a/modules/text_renderer/text_layout.c
+++ b/modules/text_renderer/text_layout.c
@@ -1316,48 +1316,3 @@ error:
return VLC_EGENERIC;
}
-uni_char_t* SegmentsToTextAndStyles(const text_segment_t *p_segment, size_t *pi_string_length, text_style_t ***ppp_styles)
-{
- text_style_t **pp_styles = NULL;
- uni_char_t *psz_uni = NULL;
- size_t i_size = 0;
- for ( const text_segment_t *s = p_segment; s != NULL; s = s->p_next )
- {
- //FIXME: This is missing a space in between segments.
- if ( !s->psz_text )
- continue;
- size_t i_string_bytes = 0;
- uni_char_t *psz_tmp = ToCharset( FREETYPE_TO_UCS, s->psz_text, &i_string_bytes );
- if ( !psz_tmp )
- {
- free( psz_uni );
- free( pp_styles );
- return NULL;
- }
- uni_char_t *psz_realloc = realloc(psz_uni, i_size + i_string_bytes);
- if ( unlikely( !psz_realloc ) )
- {
- free( pp_styles );
- free( psz_uni );
- free( psz_tmp );
- return NULL;
- }
- psz_uni = psz_realloc;
- memcpy( psz_uni + i_size, psz_tmp, i_string_bytes );
- free( psz_tmp );
- text_style_t **pp_styles_realloc = realloc( pp_styles, i_size + i_string_bytes);
- if ( unlikely( !pp_styles_realloc ) )
- {
- free( pp_styles );
- free( psz_uni );
- return NULL;
- }
- pp_styles = pp_styles_realloc;
- for ( size_t i = i_size; i < (i_size + i_string_bytes) / sizeof(*psz_uni); i++ )
- pp_styles[i] = s->style;
- i_size += i_string_bytes;
- }
- *pi_string_length = i_size / sizeof( *psz_uni );
- *ppp_styles = pp_styles;
- return psz_uni;
-}
diff --git a/modules/text_renderer/text_layout.h b/modules/text_renderer/text_layout.h
index d9a159e..d2a116a 100644
--- a/modules/text_renderer/text_layout.h
+++ b/modules/text_renderer/text_layout.h
@@ -55,5 +55,3 @@ 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, text_style_t **pp_styles,
uint32_t *pi_k_dates, int i_len );
-
-uni_char_t *SegmentsToTextAndStyles(const text_segment_t *p_segment, size_t *pi_string_length, text_style_t ***ppp_styles );
More information about the vlc-commits
mailing list