[vlc-commits] text_renderer: freetype: strip lines according to max_height

Francois Cartegnie git at videolan.org
Thu Jun 8 14:34:08 CEST 2017


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Wed Jun  7 18:02:41 2017 +0200| [f13716abf8903b743234fad13ec7c58db2990233] | committer: Francois Cartegnie

text_renderer: freetype: strip lines according to max_height

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

 modules/text_renderer/freetype/freetype.c    |  8 ++++++-
 modules/text_renderer/freetype/text_layout.c | 35 ++++++++++++++++++++++------
 modules/text_renderer/freetype/text_layout.h |  4 +++-
 3 files changed, 38 insertions(+), 9 deletions(-)

diff --git a/modules/text_renderer/freetype/freetype.c b/modules/text_renderer/freetype/freetype.c
index 2779a82279..b688391cdd 100644
--- a/modules/text_renderer/freetype/freetype.c
+++ b/modules/text_renderer/freetype/freetype.c
@@ -1138,9 +1138,15 @@ static int Render( filter_t *p_filter, subpicture_region_t *p_region_out,
     else if( p_region_in->i_x > 0 && (unsigned)p_region_in->i_x < i_max_width )
         i_max_width -= p_region_in->i_x;
 
+    unsigned i_max_height = p_filter->fmt_out.video.i_visible_height;
+    if( p_region_in->i_max_height > 0 && (unsigned) p_region_in->i_max_height < i_max_height )
+        i_max_height = p_region_in->i_max_height;
+    else if( p_region_in->i_y > 0 && (unsigned)p_region_in->i_y < i_max_height )
+        i_max_height -= p_region_in->i_y;
+
     rv = LayoutText( p_filter,
                      psz_text, pp_styles, pi_k_durations, i_text_length, p_region_in->b_gridmode,
-                     i_max_width, &p_lines, &bbox, &i_max_face_height );
+                     i_max_width, i_max_height, &p_lines, &bbox, &i_max_face_height );
 
     p_region_out->i_x = p_region_in->i_x;
     p_region_out->i_y = p_region_in->i_y;
diff --git a/modules/text_renderer/freetype/text_layout.c b/modules/text_renderer/freetype/text_layout.c
index a735148301..ff2bd98085 100644
--- a/modules/text_renderer/freetype/text_layout.c
+++ b/modules/text_renderer/freetype/text_layout.c
@@ -1460,15 +1460,17 @@ error:
 
 int LayoutText( filter_t *p_filter,
                 const uni_char_t *psz_text, text_style_t **pp_styles,
-                uint32_t *pi_k_dates, int i_len, bool b_grid, unsigned i_max_width,
+                uint32_t *pi_k_dates, int i_len, bool b_grid,
+                unsigned i_max_width, unsigned i_max_height,
                 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;
     paragraph_t *p_paragraph = 0;
     int i_paragraph_start = 0;
-    int i_max_height = 0;
+    unsigned i_total_height = 0;
     unsigned i_max_advance_x = 0;
+    int i_max_face_height = 0;
 
     for( int i = 0; i <= i_len; ++i )
     {
@@ -1528,9 +1530,28 @@ int LayoutText( filter_t *p_filter,
             FreeParagraph( p_paragraph );
             p_paragraph = 0;
 
-            for( ; *pp_line; pp_line = &( *pp_line )->p_next )
-                i_max_height = __MAX( i_max_height, ( *pp_line )->i_height );
-
+            for( ; *pp_line; pp_line = &(*pp_line)->p_next )
+            {
+                i_total_height += (*pp_line)->i_height;
+                if( i_max_height > 0 && i_total_height > i_max_height )
+                {
+                    i_total_height = i_max_height + 1;
+                    line_desc_t *p_todelete = *pp_line;
+                    while( p_todelete ) /* Drop extra lines */
+                    {
+                        line_desc_t *p_next = p_todelete->p_next;
+                        FreeLine( p_todelete );
+                        p_todelete = p_next;
+                    }
+                    *pp_line = NULL;
+                    i = i_len + 1; /* force no more paragraphs */
+                    break; /* ! no p_next ! */
+                }
+                else if( (*pp_line)->i_height > i_max_face_height )
+                {
+                    i_max_face_height = (*pp_line)->i_height;
+                }
+            }
             i_paragraph_start = i + 1;
         }
     }
@@ -1550,12 +1571,12 @@ int LayoutText( filter_t *p_filter,
         p_line->bbox.yMax -= i_base_line;
         BBoxEnlarge( &bbox, &p_line->bbox );
 
-        i_base_line += i_max_height;
+        i_base_line += i_max_face_height;
     }
 
+    *pi_max_face_height = i_max_face_height;
     *pp_lines = p_first_line;
     *p_bbox = bbox;
-    *pi_max_face_height = i_max_height;
     return VLC_SUCCESS;
 
 error:
diff --git a/modules/text_renderer/freetype/text_layout.h b/modules/text_renderer/freetype/text_layout.h
index 8834488de6..0cb3aca710 100644
--- a/modules/text_renderer/freetype/text_layout.h
+++ b/modules/text_renderer/freetype/text_layout.h
@@ -72,11 +72,13 @@ line_desc_t *NewLine( int i_count );
  * \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 i_max_width maximum available width to layout text [IN]
+ * \param i_max_height maximum available height to layout text [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 *psz_text, text_style_t **pp_styles,
-                uint32_t *pi_k_dates, int i_len, bool b_grid, unsigned i_max_width,
+                uint32_t *pi_k_dates, int i_len, bool b_grid,
+                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