Commit 85eabd74 authored by Stefano Sabatini's avatar Stefano Sabatini

lavfi/drawtext: do not allocate FT_Glyph, but keep it in the Glyph structure

Slightly simplify.
parent d5818c37
...@@ -261,7 +261,7 @@ struct ft_error ...@@ -261,7 +261,7 @@ struct ft_error
#define FT_ERRMSG(e) ft_errors[e].err_msg #define FT_ERRMSG(e) ft_errors[e].err_msg
typedef struct Glyph { typedef struct Glyph {
FT_Glyph *glyph; FT_Glyph glyph;
FT_Glyph border_glyph; FT_Glyph border_glyph;
uint32_t code; uint32_t code;
FT_Bitmap bitmap; ///< array holding bitmaps of font FT_Bitmap bitmap; ///< array holding bitmaps of font
...@@ -294,20 +294,19 @@ static int load_glyph(AVFilterContext *ctx, Glyph **glyph_ptr, uint32_t code) ...@@ -294,20 +294,19 @@ static int load_glyph(AVFilterContext *ctx, Glyph **glyph_ptr, uint32_t code)
if (FT_Load_Char(s->face, code, s->ft_load_flags)) if (FT_Load_Char(s->face, code, s->ft_load_flags))
return AVERROR(EINVAL); return AVERROR(EINVAL);
/* save glyph */ glyph = av_mallocz(sizeof(*glyph));
if (!(glyph = av_mallocz(sizeof(*glyph))) || if (!glyph) {
!(glyph->glyph = av_mallocz(sizeof(*glyph->glyph)))) {
ret = AVERROR(ENOMEM); ret = AVERROR(ENOMEM);
goto error; goto error;
} }
glyph->code = code; glyph->code = code;
if (FT_Get_Glyph(s->face->glyph, glyph->glyph)) { if (FT_Get_Glyph(s->face->glyph, &glyph->glyph)) {
ret = AVERROR(EINVAL); ret = AVERROR(EINVAL);
goto error; goto error;
} }
if (s->borderw) { if (s->borderw) {
glyph->border_glyph = *glyph->glyph; glyph->border_glyph = glyph->glyph;
if (FT_Glyph_StrokeBorder(&glyph->border_glyph, s->stroker, 0, 0) || if (FT_Glyph_StrokeBorder(&glyph->border_glyph, s->stroker, 0, 0) ||
FT_Glyph_To_Bitmap(&glyph->border_glyph, FT_RENDER_MODE_NORMAL, 0, 1)) { FT_Glyph_To_Bitmap(&glyph->border_glyph, FT_RENDER_MODE_NORMAL, 0, 1)) {
ret = AVERROR_EXTERNAL; ret = AVERROR_EXTERNAL;
...@@ -316,11 +315,11 @@ static int load_glyph(AVFilterContext *ctx, Glyph **glyph_ptr, uint32_t code) ...@@ -316,11 +315,11 @@ static int load_glyph(AVFilterContext *ctx, Glyph **glyph_ptr, uint32_t code)
bitmapglyph = (FT_BitmapGlyph) glyph->border_glyph; bitmapglyph = (FT_BitmapGlyph) glyph->border_glyph;
glyph->border_bitmap = bitmapglyph->bitmap; glyph->border_bitmap = bitmapglyph->bitmap;
} }
if (FT_Glyph_To_Bitmap(glyph->glyph, FT_RENDER_MODE_NORMAL, 0, 1)) { if (FT_Glyph_To_Bitmap(&glyph->glyph, FT_RENDER_MODE_NORMAL, 0, 1)) {
ret = AVERROR_EXTERNAL; ret = AVERROR_EXTERNAL;
goto error; goto error;
} }
bitmapglyph = (FT_BitmapGlyph) *glyph->glyph; bitmapglyph = (FT_BitmapGlyph) glyph->glyph;
glyph->bitmap = bitmapglyph->bitmap; glyph->bitmap = bitmapglyph->bitmap;
glyph->bitmap_left = bitmapglyph->left; glyph->bitmap_left = bitmapglyph->left;
...@@ -328,7 +327,7 @@ static int load_glyph(AVFilterContext *ctx, Glyph **glyph_ptr, uint32_t code) ...@@ -328,7 +327,7 @@ static int load_glyph(AVFilterContext *ctx, Glyph **glyph_ptr, uint32_t code)
glyph->advance = s->face->glyph->advance.x >> 6; glyph->advance = s->face->glyph->advance.x >> 6;
/* measure text height to calculate text_height (or the maximum text height) */ /* measure text height to calculate text_height (or the maximum text height) */
FT_Glyph_Get_CBox(*glyph->glyph, ft_glyph_bbox_pixels, &glyph->bbox); FT_Glyph_Get_CBox(glyph->glyph, ft_glyph_bbox_pixels, &glyph->bbox);
/* cache the newly created glyph */ /* cache the newly created glyph */
if (!(node = av_tree_node_alloc())) { if (!(node = av_tree_node_alloc())) {
...@@ -585,9 +584,8 @@ static int glyph_enu_free(void *opaque, void *elem) ...@@ -585,9 +584,8 @@ static int glyph_enu_free(void *opaque, void *elem)
{ {
Glyph *glyph = elem; Glyph *glyph = elem;
FT_Done_Glyph(*glyph->glyph); FT_Done_Glyph(glyph->glyph);
FT_Done_Glyph(glyph->border_glyph); FT_Done_Glyph(glyph->border_glyph);
av_freep(&glyph->glyph);
av_free(elem); av_free(elem);
return 0; return 0;
} }
......
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