Commit 94ed9110 authored by Jean-Baptiste Kempf's avatar Jean-Baptiste Kempf

Subtitle codecs: Use text_style_t instead of segment_style_t

Signed-off-by: default avatarJean-Baptiste Kempf <jb@videolan.org>
parent efbc00f7
...@@ -8,20 +8,13 @@ typedef struct ...@@ -8,20 +8,13 @@ typedef struct
typedef struct segment_t segment_t; typedef struct segment_t segment_t;
typedef struct
{
uint8_t i_fontsize;
uint32_t i_color; //ARGB
uint8_t i_flags;
} segment_style_t;
struct segment_t struct segment_t
{ {
char *psz_string; char *psz_string;
unsigned int i_size; unsigned int i_size;
segment_t *p_next; segment_t *p_next;
/* styles applied to that segment */ /* styles applied to that segment */
segment_style_t styles; text_style_t styles;
}; };
struct subpicture_updater_sys_t { struct subpicture_updater_sys_t {
...@@ -86,7 +79,7 @@ static void MakeHtmlNewLines( char **ppsz_src ) ...@@ -86,7 +79,7 @@ static void MakeHtmlNewLines( char **ppsz_src )
} }
static void HtmlAppend( char **ppsz_dst, const char *psz_src, static void HtmlAppend( char **ppsz_dst, const char *psz_src,
const segment_style_t *p_styles, const float f_scale ) const text_style_t *p_styles, const float f_scale )
{ {
if ( !ppsz_dst ) return; if ( !ppsz_dst ) return;
int i_return; int i_return;
...@@ -99,28 +92,28 @@ static void HtmlAppend( char **ppsz_dst, const char *psz_src, ...@@ -99,28 +92,28 @@ static void HtmlAppend( char **ppsz_dst, const char *psz_src,
MakeHtmlNewLines( &psz_encoded ); MakeHtmlNewLines( &psz_encoded );
if ( p_styles->i_color & 0xFF000000 ) //ARGB if ( p_styles->i_font_alpha > 0 ) //ARGB
{ {
i_return = asprintf( &psz_color, " color=\"#%6x\"", i_return = asprintf( &psz_color, " color=\"#%6x\"",
p_styles->i_color & 0x00FFFFFF ); p_styles->i_font_color & 0x00FFFFFF );
if ( i_return < 0 ) psz_color = NULL; if ( i_return < 0 ) psz_color = NULL;
} }
if ( p_styles->i_fontsize > 0 && f_scale > 0 ) if ( p_styles->i_font_size > 0 && f_scale > 0 )
{ {
i_return = asprintf( &psz_fontsize, " size=\"%u\"", i_return = asprintf( &psz_fontsize, " size=\"%u\"",
(unsigned) (f_scale * p_styles->i_fontsize) ); (unsigned) (f_scale * p_styles->i_font_size) );
if ( i_return < 0 ) psz_fontsize = NULL; if ( i_return < 0 ) psz_fontsize = NULL;
} }
i_return = asprintf( &psz_subtext, "%s%s%s%s%s%s%s", i_return = asprintf( &psz_subtext, "%s%s%s%s%s%s%s",
( p_styles->i_flags & STYLE_UNDERLINE ) ? "<u>" : "", ( p_styles->i_style_flags & STYLE_UNDERLINE ) ? "<u>" : "",
( p_styles->i_flags & STYLE_BOLD ) ? "<b>" : "", ( p_styles->i_style_flags & STYLE_BOLD ) ? "<b>" : "",
( p_styles->i_flags & STYLE_ITALIC ) ? "<i>" : "", ( p_styles->i_style_flags & STYLE_ITALIC ) ? "<i>" : "",
psz_encoded, psz_encoded,
( p_styles->i_flags & STYLE_ITALIC ) ? "</i>" : "", ( p_styles->i_style_flags & STYLE_ITALIC ) ? "</i>" : "",
( p_styles->i_flags & STYLE_BOLD ) ? "</b>" : "", ( p_styles->i_style_flags & STYLE_BOLD ) ? "</b>" : "",
( p_styles->i_flags & STYLE_UNDERLINE ) ? "</u>" : "" ( p_styles->i_style_flags & STYLE_UNDERLINE ) ? "</u>" : ""
); );
if ( i_return < 0 ) psz_subtext = NULL; if ( i_return < 0 ) psz_subtext = NULL;
......
...@@ -134,14 +134,14 @@ static void SegmentDoSplit( segment_t *p_segment, uint16_t i_start, uint16_t i_e ...@@ -134,14 +134,14 @@ static void SegmentDoSplit( segment_t *p_segment, uint16_t i_start, uint16_t i_e
{ {
p_segment_left = calloc( 1, sizeof(segment_t) ); p_segment_left = calloc( 1, sizeof(segment_t) );
if ( !p_segment_left ) goto error; if ( !p_segment_left ) goto error;
memcpy( &p_segment_left->styles, &p_segment->styles, sizeof(segment_style_t) ); memcpy( &p_segment_left->styles, &p_segment->styles, sizeof(text_style_t) );
p_segment_left->psz_string = str8indup( p_segment->psz_string, 0, i_start ); p_segment_left->psz_string = str8indup( p_segment->psz_string, 0, i_start );
p_segment_left->i_size = str8len( p_segment_left->psz_string ); p_segment_left->i_size = str8len( p_segment_left->psz_string );
} }
p_segment_middle = calloc( 1, sizeof(segment_t) ); p_segment_middle = calloc( 1, sizeof(segment_t) );
if ( !p_segment_middle ) goto error; if ( !p_segment_middle ) goto error;
memcpy( &p_segment_middle->styles, &p_segment->styles, sizeof(segment_style_t) ); memcpy( &p_segment_middle->styles, &p_segment->styles, sizeof(text_style_t) );
p_segment_middle->psz_string = str8indup( p_segment->psz_string, i_start, i_end - i_start + 1 ); p_segment_middle->psz_string = str8indup( p_segment->psz_string, i_start, i_end - i_start + 1 );
p_segment_middle->i_size = str8len( p_segment_middle->psz_string ); p_segment_middle->i_size = str8len( p_segment_middle->psz_string );
...@@ -149,7 +149,7 @@ static void SegmentDoSplit( segment_t *p_segment, uint16_t i_start, uint16_t i_e ...@@ -149,7 +149,7 @@ static void SegmentDoSplit( segment_t *p_segment, uint16_t i_start, uint16_t i_e
{ {
p_segment_right = calloc( 1, sizeof(segment_t) ); p_segment_right = calloc( 1, sizeof(segment_t) );
if ( !p_segment_right ) goto error; if ( !p_segment_right ) goto error;
memcpy( &p_segment_right->styles, &p_segment->styles, sizeof(segment_style_t) ); memcpy( &p_segment_right->styles, &p_segment->styles, sizeof(text_style_t) );
p_segment_right->psz_string = str8indup( p_segment->psz_string, i_end + 1, p_segment->i_size - i_end - 1 ); p_segment_right->psz_string = str8indup( p_segment->psz_string, i_end + 1, p_segment->i_size - i_end - 1 );
p_segment_right->i_size = str8len( p_segment_right->psz_string ); p_segment_right->i_size = str8len( p_segment_right->psz_string );
} }
...@@ -171,7 +171,7 @@ error: ...@@ -171,7 +171,7 @@ error:
static bool SegmentSplit( segment_t *p_prev, segment_t **pp_segment, static bool SegmentSplit( segment_t *p_prev, segment_t **pp_segment,
const uint16_t i_start, const uint16_t i_end, const uint16_t i_start, const uint16_t i_end,
const segment_style_t *p_styles ) const text_style_t *p_styles )
{ {
segment_t *p_segment_left = NULL, *p_segment_middle = NULL, *p_segment_right = NULL; segment_t *p_segment_left = NULL, *p_segment_middle = NULL, *p_segment_right = NULL;
...@@ -207,7 +207,7 @@ static bool SegmentSplit( segment_t *p_prev, segment_t **pp_segment, ...@@ -207,7 +207,7 @@ static bool SegmentSplit( segment_t *p_prev, segment_t **pp_segment,
/* Creates a new segment using the given style and split existing ones according /* Creates a new segment using the given style and split existing ones according
to the start & end offsets */ to the start & end offsets */
static void ApplySegmentStyle( segment_t **pp_segment, const uint16_t i_absstart, static void ApplySegmentStyle( segment_t **pp_segment, const uint16_t i_absstart,
const uint16_t i_absend, const segment_style_t *p_styles ) const uint16_t i_absend, const text_style_t *p_styles )
{ {
/* find the matching segment */ /* find the matching segment */
uint16_t i_curstart = 0; uint16_t i_curstart = 0;
...@@ -288,11 +288,11 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block ) ...@@ -288,11 +288,11 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block )
p_segment->i_size = str8len( psz_subtitle ); p_segment->i_size = str8len( psz_subtitle );
if ( p_dec->fmt_in.subs.p_style ) if ( p_dec->fmt_in.subs.p_style )
{ {
p_segment->styles.i_color = p_dec->fmt_in.subs.p_style->i_font_color; p_segment->styles.i_font_color = p_dec->fmt_in.subs.p_style->i_font_color;
p_segment->styles.i_color |= p_dec->fmt_in.subs.p_style->i_font_alpha << 24; p_segment->styles.i_font_alpha = p_dec->fmt_in.subs.p_style->i_font_alpha;
if ( p_dec->fmt_in.subs.p_style->i_style_flags ) if ( p_dec->fmt_in.subs.p_style->i_style_flags )
p_segment->styles.i_flags = p_dec->fmt_in.subs.p_style->i_style_flags; p_segment->styles.i_style_flags = p_dec->fmt_in.subs.p_style->i_style_flags;
p_segment->styles.i_fontsize = p_dec->fmt_in.subs.p_style->i_font_size; p_segment->styles.i_font_size = p_dec->fmt_in.subs.p_style->i_font_size;
} }
if ( !p_segment->psz_string ) if ( !p_segment->psz_string )
...@@ -333,11 +333,11 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block ) ...@@ -333,11 +333,11 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block )
uint16_t i_start = __MIN( GetWBE(p_buf), i_psz_bytelength - 1 ); uint16_t i_start = __MIN( GetWBE(p_buf), i_psz_bytelength - 1 );
uint16_t i_end = __MIN( GetWBE(p_buf + 2), i_psz_bytelength - 1 ); uint16_t i_end = __MIN( GetWBE(p_buf + 2), i_psz_bytelength - 1 );
segment_style_t style; text_style_t style;
style.i_flags = ConvertFlags( p_buf[6] ); style.i_style_flags = ConvertFlags( p_buf[6] );
style.i_fontsize = p_buf[7]; style.i_font_size = p_buf[7];
style.i_color = GetDWBE(p_buf+8) >> 8;// RGBA -> ARGB style.i_font_color = GetDWBE(p_buf+8) >> 8;// RGBA -> RGB
style.i_color |= (GetDWBE(p_buf+8) & 0xFF) << 24; style.i_font_alpha = GetDWBE(p_buf+8) & 0xFF;
ApplySegmentStyle( &p_segment, i_start, i_end, &style ); ApplySegmentStyle( &p_segment, i_start, i_end, &style );
if ( i_nbrecords == 1 ) if ( i_nbrecords == 1 )
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment