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
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
{
char *psz_string;
unsigned int i_size;
segment_t *p_next;
/* styles applied to that segment */
segment_style_t styles;
text_style_t styles;
};
struct subpicture_updater_sys_t {
......@@ -86,7 +79,7 @@ static void MakeHtmlNewLines( char **ppsz_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;
int i_return;
......@@ -99,28 +92,28 @@ static void HtmlAppend( char **ppsz_dst, const char *psz_src,
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\"",
p_styles->i_color & 0x00FFFFFF );
p_styles->i_font_color & 0x00FFFFFF );
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\"",
(unsigned) (f_scale * p_styles->i_fontsize) );
(unsigned) (f_scale * p_styles->i_font_size) );
if ( i_return < 0 ) psz_fontsize = NULL;
}
i_return = asprintf( &psz_subtext, "%s%s%s%s%s%s%s",
( p_styles->i_flags & STYLE_UNDERLINE ) ? "<u>" : "",
( p_styles->i_flags & STYLE_BOLD ) ? "<b>" : "",
( p_styles->i_flags & STYLE_ITALIC ) ? "<i>" : "",
( p_styles->i_style_flags & STYLE_UNDERLINE ) ? "<u>" : "",
( p_styles->i_style_flags & STYLE_BOLD ) ? "<b>" : "",
( p_styles->i_style_flags & STYLE_ITALIC ) ? "<i>" : "",
psz_encoded,
( p_styles->i_flags & STYLE_ITALIC ) ? "</i>" : "",
( p_styles->i_flags & STYLE_BOLD ) ? "</b>" : "",
( p_styles->i_flags & STYLE_UNDERLINE ) ? "</u>" : ""
( p_styles->i_style_flags & STYLE_ITALIC ) ? "</i>" : "",
( p_styles->i_style_flags & STYLE_BOLD ) ? "</b>" : "",
( p_styles->i_style_flags & STYLE_UNDERLINE ) ? "</u>" : ""
);
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
{
p_segment_left = calloc( 1, sizeof(segment_t) );
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->i_size = str8len( p_segment_left->psz_string );
}
p_segment_middle = calloc( 1, sizeof(segment_t) );
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->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
{
p_segment_right = calloc( 1, sizeof(segment_t) );
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->i_size = str8len( p_segment_right->psz_string );
}
......@@ -171,7 +171,7 @@ error:
static bool SegmentSplit( segment_t *p_prev, segment_t **pp_segment,
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;
......@@ -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
to the start & end offsets */
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 */
uint16_t i_curstart = 0;
......@@ -288,11 +288,11 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block )
p_segment->i_size = str8len( psz_subtitle );
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_color |= p_dec->fmt_in.subs.p_style->i_font_alpha << 24;
p_segment->styles.i_font_color = p_dec->fmt_in.subs.p_style->i_font_color;
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 )
p_segment->styles.i_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_style_flags = p_dec->fmt_in.subs.p_style->i_style_flags;
p_segment->styles.i_font_size = p_dec->fmt_in.subs.p_style->i_font_size;
}
if ( !p_segment->psz_string )
......@@ -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_end = __MIN( GetWBE(p_buf + 2), i_psz_bytelength - 1 );
segment_style_t style;
style.i_flags = ConvertFlags( p_buf[6] );
style.i_fontsize = p_buf[7];
style.i_color = GetDWBE(p_buf+8) >> 8;// RGBA -> ARGB
style.i_color |= (GetDWBE(p_buf+8) & 0xFF) << 24;
text_style_t style;
style.i_style_flags = ConvertFlags( p_buf[6] );
style.i_font_size = p_buf[7];
style.i_font_color = GetDWBE(p_buf+8) >> 8;// RGBA -> RGB
style.i_font_alpha = GetDWBE(p_buf+8) & 0xFF;
ApplySegmentStyle( &p_segment, i_start, i_end, &style );
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