[vlc-commits] freetype: text_layout: keep track of visible chars bbox
Francois Cartegnie
git at videolan.org
Tue Nov 14 18:54:07 CET 2017
vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Mon Nov 13 17:03:26 2017 +0100| [43398aa5db0cdd40c88b7082e2a98d086b6367fa] | committer: Francois Cartegnie
freetype: text_layout: keep track of visible chars bbox
otherwise we're stuck with glyphs coordinates which
are insufficient for drawing a proper background
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=43398aa5db0cdd40c88b7082e2a98d086b6367fa
---
modules/text_renderer/freetype/freetype.h | 17 +++++++++++++++
modules/text_renderer/freetype/text_layout.c | 31 +++++++++-------------------
modules/text_renderer/freetype/text_layout.h | 1 +
3 files changed, 28 insertions(+), 21 deletions(-)
diff --git a/modules/text_renderer/freetype/freetype.h b/modules/text_renderer/freetype/freetype.h
index 7a4e496be7..b0ef9cf178 100644
--- a/modules/text_renderer/freetype/freetype.h
+++ b/modules/text_renderer/freetype/freetype.h
@@ -153,4 +153,21 @@ struct filter_sys_t
FT_Face SelectAndLoadFace( filter_t *p_filter, const text_style_t *p_style,
uni_char_t codepoint );
+static inline void BBoxInit( FT_BBox *p_box )
+{
+ p_box->xMin = INT_MAX;
+ p_box->yMin = INT_MAX;
+ p_box->xMax = INT_MIN;
+ p_box->yMax = INT_MIN;
+}
+
+static inline void BBoxEnlarge( FT_BBox *p_max, const FT_BBox *p )
+{
+ p_max->xMin = __MIN(p_max->xMin, p->xMin);
+ p_max->yMin = __MIN(p_max->yMin, p->yMin);
+ p_max->xMax = __MAX(p_max->xMax, p->xMax);
+ p_max->yMax = __MAX(p_max->yMax, p->yMax);
+}
+
+
#endif
diff --git a/modules/text_renderer/freetype/text_layout.c b/modules/text_renderer/freetype/text_layout.c
index b2991a8c9a..d6844b23d0 100644
--- a/modules/text_renderer/freetype/text_layout.c
+++ b/modules/text_renderer/freetype/text_layout.c
@@ -199,10 +199,7 @@ line_desc_t *NewLine( int i_count )
p_line->i_first_visible_char_index = -1;
p_line->i_last_visible_char_index = -2;
- p_line->bbox.xMin = INT_MAX;
- p_line->bbox.yMin = INT_MAX;
- p_line->bbox.xMax = INT_MIN;
- p_line->bbox.yMax = INT_MIN;
+ BBoxInit( &p_line->bbox );
p_line->p_character = calloc( i_count, sizeof(*p_line->p_character) );
if( !p_line->p_character )
@@ -232,14 +229,6 @@ static void FixGlyph( FT_Glyph glyph, FT_BBox *p_bbox,
}
}
-static void BBoxEnlarge( FT_BBox *p_max, const FT_BBox *p )
-{
- p_max->xMin = __MIN(p_max->xMin, p->xMin);
- p_max->yMin = __MIN(p_max->yMin, p->yMin);
- p_max->xMax = __MAX(p_max->xMax, p->xMax);
- p_max->yMax = __MAX(p_max->yMax, p->yMax);
-}
-
static paragraph_t *NewParagraph( filter_t *p_filter,
int i_size,
const uni_char_t *p_code_points,
@@ -1123,6 +1112,7 @@ static int LayoutLine( filter_t *p_filter,
if( !p_bitmaps->p_glyph )
{
+ BBoxInit( &p_ch->bbox );
--i_line_index;
continue;
}
@@ -1251,11 +1241,14 @@ static int LayoutLine( filter_t *p_filter,
p_ch->i_line_thickness = i_line_thickness;
p_ch->i_line_offset = i_line_offset;
- BBoxEnlarge( &p_line->bbox, &p_bitmaps->glyph_bbox );
+ /* Compute bounding box for all glyphs */
+ p_ch->bbox = p_bitmaps->glyph_bbox;
if( p_bitmaps->p_outline )
- BBoxEnlarge( &p_line->bbox, &p_bitmaps->outline_bbox );
+ BBoxEnlarge( &p_ch->bbox, &p_bitmaps->outline_bbox );
if( p_bitmaps->p_shadow )
- BBoxEnlarge( &p_line->bbox, &p_bitmaps->shadow_bbox );
+ BBoxEnlarge( &p_ch->bbox, &p_bitmaps->shadow_bbox );
+
+ BBoxEnlarge( &p_line->bbox, &p_ch->bbox );
pen.x += p_bitmaps->i_x_advance;
pen.y += p_bitmaps->i_y_advance;
@@ -1585,12 +1578,8 @@ int LayoutText( filter_t *p_filter,
}
int i_base_line = 0;
- FT_BBox bbox = {
- .xMin = INT_MAX,
- .yMin = INT_MAX,
- .xMax = INT_MIN,
- .yMax = INT_MIN
- };
+ FT_BBox bbox;
+ BBoxInit( &bbox );
for( line_desc_t *p_line = p_first_line; p_line; p_line = p_line->p_next )
{
diff --git a/modules/text_renderer/freetype/text_layout.h b/modules/text_renderer/freetype/text_layout.h
index b67674bf94..16ca48ef1e 100644
--- a/modules/text_renderer/freetype/text_layout.h
+++ b/modules/text_renderer/freetype/text_layout.h
@@ -38,6 +38,7 @@ typedef struct
FT_BitmapGlyph p_glyph;
FT_BitmapGlyph p_outline;
FT_BitmapGlyph p_shadow;
+ FT_BBox bbox;
const text_style_t *p_style;
int i_line_offset; /* underline/strikethrough offset */
int i_line_thickness; /* underline/strikethrough thickness */
More information about the vlc-commits
mailing list