[vlc-commits] text_renderer: freetype: refactor paragraph

Francois Cartegnie git at videolan.org
Thu Feb 15 10:14:47 CET 2018


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Fri Feb  9 00:27:23 2018 +0100| [3b33674ee802046cc8fef5dd1b2e58884133df10] | committer: Francois Cartegnie

text_renderer: freetype: refactor paragraph

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=3b33674ee802046cc8fef5dd1b2e58884133df10
---

 modules/text_renderer/freetype/text_layout.c | 113 ++++++++++++++++-----------
 modules/text_renderer/freetype/text_layout.h |   4 +-
 2 files changed, 70 insertions(+), 47 deletions(-)

diff --git a/modules/text_renderer/freetype/text_layout.c b/modules/text_renderer/freetype/text_layout.c
index bcdc2474ae..9d8a4fceab 100644
--- a/modules/text_renderer/freetype/text_layout.c
+++ b/modules/text_renderer/freetype/text_layout.c
@@ -1478,8 +1478,61 @@ error:
     return VLC_EGENERIC;
 }
 
+static paragraph_t * BuildParagraph( filter_t *p_filter,
+                                     int i_size,
+                                     const uni_char_t *p_uchars,
+                                     text_style_t **pp_styles,
+                                     uint32_t *pi_k_dates,
+                                     int i_runs_size,
+                                     unsigned *pi_max_advance_x )
+{
+    paragraph_t *p_paragraph = NewParagraph( p_filter, i_size,
+                                p_uchars,
+                                pp_styles,
+                                pi_k_dates,
+                                i_runs_size );
+    if( !p_paragraph )
+        return NULL;
+
+#ifdef HAVE_FRIBIDI
+    if( AnalyzeParagraph( p_paragraph ) )
+        goto error;
+#endif
+
+    if( ItemizeParagraph( p_filter, p_paragraph ) )
+        goto error;
+
+#if defined HAVE_HARFBUZZ
+    if( ShapeParagraphHarfBuzz( p_filter, &p_paragraph ) )
+        goto error;
+
+    if( LoadGlyphs( p_filter, p_paragraph, true, false, pi_max_advance_x ) )
+        goto error;
+
+#elif defined HAVE_FRIBIDI
+    if( ShapeParagraphFriBidi( p_filter, p_paragraph ) )
+        goto error;
+    if( LoadGlyphs( p_filter, p_paragraph, false, true, pi_max_advance_x ) )
+        goto error;
+    if( RemoveZeroWidthCharacters( p_paragraph ) )
+        goto error;
+    if( ZeroNsmAdvance( p_paragraph ) )
+        goto error;
+#else
+    if( LoadGlyphs( p_filter, p_paragraph, false, true, pi_max_advance_x ) )
+        goto error;
+#endif
+    return p_paragraph;
+
+error:
+    if( p_paragraph )
+        FreeParagraph( p_paragraph );
+
+    return NULL;
+}
+
 int LayoutText( filter_t *p_filter,
-                const uni_char_t *psz_text, text_style_t **pp_styles,
+                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,
@@ -1487,7 +1540,6 @@ int LayoutText( filter_t *p_filter,
 {
     line_desc_t *p_first_line = 0;
     line_desc_t **pp_line = &p_first_line;
-    paragraph_t *p_paragraph = 0;
     int i_paragraph_start = 0;
     unsigned i_total_height = 0;
     unsigned i_max_advance_x = 0;
@@ -1495,7 +1547,7 @@ int LayoutText( filter_t *p_filter,
 
     for( int i = 0; i <= i_len; ++i )
     {
-        if( i == i_len || psz_text[ i ] == '\n' )
+        if( i == i_len || p_uchars[ i ] == '\n' )
         {
             if( i_paragraph_start == i )
             {
@@ -1503,54 +1555,30 @@ int LayoutText( filter_t *p_filter,
                 continue;
             }
 
-            p_paragraph = NewParagraph( p_filter, i - i_paragraph_start,
-                                        psz_text + i_paragraph_start,
-                                        pp_styles + i_paragraph_start,
-                                        pi_k_dates ?
-                                        pi_k_dates + i_paragraph_start : 0,
-                                        20 );
+            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,
+                                    20, &i_max_advance_x );
             if( !p_paragraph )
             {
                 if( p_first_line ) FreeLines( p_first_line );
                 return VLC_ENOMEM;
             }
 
-#ifdef HAVE_FRIBIDI
-            if( AnalyzeParagraph( p_paragraph ) )
-                goto error;
-#endif
-
-            if( ItemizeParagraph( p_filter, p_paragraph ) )
-                goto error;
-
-#if defined HAVE_HARFBUZZ
-            if( ShapeParagraphHarfBuzz( p_filter, &p_paragraph ) )
-                goto error;
-
-            if( LoadGlyphs( p_filter, p_paragraph, true, false, &i_max_advance_x ) )
-                goto error;
-
-#elif defined HAVE_FRIBIDI
-            if( ShapeParagraphFriBidi( p_filter, p_paragraph ) )
-                goto error;
-            if( LoadGlyphs( p_filter, p_paragraph, false, true, &i_max_advance_x ) )
-                goto error;
-            if( RemoveZeroWidthCharacters( p_paragraph ) )
-                goto error;
-            if( ZeroNsmAdvance( p_paragraph ) )
-                goto error;
-#else
-            if( LoadGlyphs( p_filter, p_paragraph, false, true, &i_max_advance_x ) )
-                goto error;
-#endif
-
             if( LayoutParagraph( p_filter, p_paragraph,
                                  i_max_width, i_max_advance_x, pp_line,
                                  b_grid, b_balance ) )
-                goto error;
+            {
+                FreeParagraph( p_paragraph );
+                if( p_first_line ) FreeLines( p_first_line );
+                return VLC_EGENERIC;
+            }
 
             FreeParagraph( p_paragraph );
-            p_paragraph = 0;
 
             for( ; *pp_line; pp_line = &(*pp_line)->p_next )
             {
@@ -1598,10 +1626,5 @@ int LayoutText( filter_t *p_filter,
     *pp_lines = p_first_line;
     *p_bbox = bbox;
     return VLC_SUCCESS;
-
-error:
-    if( p_first_line ) FreeLines( p_first_line );
-    if( p_paragraph ) FreeParagraph( p_paragraph );
-    return VLC_EGENERIC;
 }
 
diff --git a/modules/text_renderer/freetype/text_layout.h b/modules/text_renderer/freetype/text_layout.h
index 16ca48ef1e..cd5f0499d8 100644
--- a/modules/text_renderer/freetype/text_layout.h
+++ b/modules/text_renderer/freetype/text_layout.h
@@ -67,7 +67,7 @@ line_desc_t *NewLine( int i_count );
  * Layout the text with shaping, bidirectional support, and font fallback if available.
  *
  * \param p_filter the FreeType module object [IN]
- * \param psz_text array of size \p i_len containing character codepoints [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]
@@ -80,7 +80,7 @@ line_desc_t *NewLine( int i_count );
  * \param pi_max_face_height maximum line height [OUT]
  */
 int LayoutText( filter_t *p_filter,
-                const uni_char_t *psz_text, text_style_t **pp_styles,
+                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 );



More information about the vlc-commits mailing list