Commit e82cde4e authored by François Cartegnie's avatar François Cartegnie 🤞

text_renderer: freetype: use structure as parameter for layout

parent 96d37380
......@@ -1119,11 +1119,12 @@ static int Render( filter_t *p_filter, subpicture_region_t *p_region_out,
return VLC_EGENERIC;
}
text_style_t **pp_styles = NULL;
uni_char_t *p_uchars = NULL;
size_t i_uchars = SegmentsToTextAndStyles( p_filter, p_region_in->p_text,
&p_uchars, &pp_styles );
if( i_uchars == 0 )
layout_text_block_t text_block = { 0 };
text_block.b_balanced = p_region_in->b_balanced_text;
text_block.b_grid = p_region_in->b_gridmode;
text_block.i_count = SegmentsToTextAndStyles( p_filter, p_region_in->p_text,
&text_block.p_uchars, &text_block.pp_styles );
if( text_block.i_count == 0 )
return VLC_EGENERIC;
/* */
......@@ -1132,7 +1133,6 @@ static int Render( filter_t *p_filter, subpicture_region_t *p_region_out,
int i_max_face_height;
line_desc_t *p_lines = NULL;
uint32_t *pi_k_durations = NULL;
unsigned i_max_width = p_filter->fmt_out.video.i_visible_width;
if( p_region_in->i_max_width > 0 && (unsigned) p_region_in->i_max_width < i_max_width )
i_max_width = p_region_in->i_max_width;
......@@ -1152,14 +1152,13 @@ static int Render( filter_t *p_filter, subpicture_region_t *p_region_out,
if( (unsigned)i_margin * 2 >= i_max_width || (unsigned)i_margin * 2 >= i_max_height )
i_margin = 0;
rv = LayoutText( p_filter,
p_uchars, pp_styles, pi_k_durations, i_uchars,
p_region_in->b_gridmode, p_region_in->b_balanced_text,
i_max_width, i_max_height, &p_lines, &bbox, &i_max_face_height );
text_block.i_max_width = i_max_width;
text_block.i_max_height = i_max_height;
rv = LayoutTextBlock( p_filter, &text_block, &p_lines, &bbox, &i_max_face_height );
/* Don't attempt to render text that couldn't be layed out
* properly. */
if( !rv && i_uchars > 0 && bbox.xMin < bbox.xMax && bbox.yMin < bbox.yMax )
if( !rv && text_block.i_count > 0 && bbox.xMin < bbox.xMax && bbox.yMin < bbox.yMax )
{
const vlc_fourcc_t p_chroma_list_yuvp[] = { VLC_CODEC_YUVP, 0 };
const vlc_fourcc_t p_chroma_list_rgba[] = { VLC_CODEC_RGBA, 0 };
......@@ -1275,15 +1274,15 @@ static int Render( filter_t *p_filter, subpicture_region_t *p_region_out,
/* With karaoke, we're going to have to render the text a number
* of times to show the progress marker on the text.
*/
if( pi_k_durations )
if( text_block.pi_k_durations )
var_SetBool( p_filter, "text-rerender", true );
}
FreeLines( p_lines );
free( p_uchars );
FreeStylesArray( pp_styles, i_uchars );
free( pi_k_durations );
free( text_block.p_uchars );
FreeStylesArray( text_block.pp_styles, text_block.i_count );
free( text_block.pi_k_durations );
return rv;
}
......
......@@ -1531,12 +1531,10 @@ error:
return NULL;
}
int LayoutText( filter_t *p_filter,
const uni_char_t *p_uchars, text_style_t **pp_styles,
uint32_t *pi_k_dates, int i_len,
bool b_grid, bool b_balance,
unsigned i_max_width, unsigned i_max_height,
line_desc_t **pp_lines, FT_BBox *p_bbox, int *pi_max_face_height )
int LayoutTextBlock( filter_t *p_filter,
const layout_text_block_t *p_textblock,
line_desc_t **pp_lines, FT_BBox *p_bbox,
int *pi_max_face_height )
{
line_desc_t *p_first_line = 0;
line_desc_t **pp_line = &p_first_line;
......@@ -1545,9 +1543,9 @@ int LayoutText( filter_t *p_filter,
unsigned i_max_advance_x = 0;
int i_max_face_height = 0;
for( int i = 0; i <= i_len; ++i )
for( int i = 0; i <= p_textblock->i_count; ++i )
{
if( i == i_len || p_uchars[ i ] == '\n' )
if( i == p_textblock->i_count || p_textblock->p_uchars[ i ] == '\n' )
{
if( i_paragraph_start == i )
{
......@@ -1558,10 +1556,10 @@ int LayoutText( filter_t *p_filter,
paragraph_t *p_paragraph =
BuildParagraph( p_filter,
i - i_paragraph_start,
&p_uchars[i_paragraph_start],
&pp_styles[i_paragraph_start],
pi_k_dates ?
&pi_k_dates[i_paragraph_start] : NULL,
&p_textblock->p_uchars[i_paragraph_start],
&p_textblock->pp_styles[i_paragraph_start],
p_textblock->pi_k_durations ?
&p_textblock->pi_k_durations[i_paragraph_start] : NULL,
20, &i_max_advance_x );
if( !p_paragraph )
{
......@@ -1570,8 +1568,9 @@ int LayoutText( filter_t *p_filter,
}
if( LayoutParagraph( p_filter, p_paragraph,
i_max_width, i_max_advance_x, pp_line,
b_grid, b_balance ) )
p_textblock->i_max_width,
i_max_advance_x, pp_line,
p_textblock->b_grid, p_textblock->b_balanced ) )
{
FreeParagraph( p_paragraph );
if( p_first_line ) FreeLines( p_first_line );
......@@ -1584,9 +1583,9 @@ int LayoutText( filter_t *p_filter,
{
/* only cut at max i_max_height + 1 line due to
* approximate font sizing vs region size */
if( i_max_height > 0 && i_total_height > i_max_height )
if( p_textblock->i_max_height > 0 && i_total_height > p_textblock->i_max_height )
{
i_total_height = i_max_height + 1;
i_total_height = p_textblock->i_max_height + 1;
line_desc_t *p_todelete = *pp_line;
while( p_todelete ) /* Drop extra lines */
{
......@@ -1595,7 +1594,7 @@ int LayoutText( filter_t *p_filter,
p_todelete = p_next;
}
*pp_line = NULL;
i = i_len + 1; /* force no more paragraphs */
i = p_textblock->i_count + 1; /* force no more paragraphs */
break; /* ! no p_next ! */
}
else if( (*pp_line)->i_height > i_max_face_height )
......
......@@ -63,24 +63,31 @@ struct line_desc_t
void FreeLines( line_desc_t *p_lines );
line_desc_t *NewLine( int i_count );
/**
* \struct layout_text_block_t
* \brief LayoutText parameters
*/
typedef struct
{
uni_char_t *p_uchars; /*!< array of size \p i_count character codepoints */
text_style_t **pp_styles; /*!< array of size \p i_count character styles */
uint32_t *pi_k_durations; /*!< array of size \p i_count karaoke timestamps */
size_t i_count; /*!< length of the arrays */
bool b_balanced; /*!< true for grid-mode text */
bool b_grid; /*!< true for balanced wrapped lines */
unsigned i_max_width; /*!< maximum available width to layout text */
unsigned i_max_height; /*!< maximum available height to layout text */
} layout_text_block_t;
/**
* Layout the text with shaping, bidirectional support, and font fallback if available.
*
* \param p_filter the FreeType module object [IN]
* \param p_uchars array of size \p i_len containing character codepoints [IN]
* \param pp_styles array of size \p i_len containing character styles [IN]
* \param pi_k_dates array of size \p i_len containing karaoke timestamps for characters [IN]
* \param i_len length of the arrays \p psz_text, \p pp_styles, and \p pi_k_dates [IN]
* \param b_grid true for grid-mode text [IN]
* \param b_balance true for balanced wrapped lines [IN]
* \param i_max_width maximum available width to layout text [IN]
* \param i_max_height maximum available height to layout text [IN]
* \param p_textblock layout_text_block_t describing text to layout [IN]
* \param pp_lines the list of line_desc_t's with rendered glyphs [OUT]
* \param p_bbox the bounding box of all the lines [OUT]
* \param pi_max_face_height maximum line height [OUT]
*/
int LayoutText( filter_t *p_filter,
const uni_char_t *p_uchars, text_style_t **pp_styles,
uint32_t *pi_k_dates, int i_len, bool b_grid, bool b_balance,
unsigned i_max_width, unsigned i_max_height,
line_desc_t **pp_lines, FT_BBox *p_bbox, int *pi_max_face_height );
int LayoutTextBlock( filter_t *p_filter, const layout_text_block_t *p_textblock,
line_desc_t **pp_lines, FT_BBox *p_bbox, int *pi_max_face_height );
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