Mercurial > mplayer.hg
changeset 19208:99d6ca895c46
Avoid large amounts of data on the stack (> 900k on 64 bit systems).
Patch by Tobias Diedrich (ranma at tdiedrich de) with minor modifications by me.
author | reimar |
---|---|
date | Fri, 28 Jul 2006 13:50:08 +0000 |
parents | c636a4e9565a |
children | bda941219736 |
files | libvo/font_load_ft.c |
diffstat | 1 files changed, 24 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- a/libvo/font_load_ft.c Fri Jul 28 13:39:11 2006 +0000 +++ b/libvo/font_load_ft.c Fri Jul 28 13:50:08 2006 +0000 @@ -955,12 +955,12 @@ font_desc_t* read_font_desc_ft(const char *fname, int movie_width, int movie_height) { - font_desc_t *desc; + font_desc_t *desc = NULL; FT_Face face; - FT_ULong my_charset[MAX_CHARSET_SIZE]; /* characters we want to render; Unicode */ - FT_ULong my_charcodes[MAX_CHARSET_SIZE]; /* character codes in 'encoding' */ + FT_ULong *my_charset = malloc(MAX_CHARSET_SIZE * sizeof(FT_ULong)); /* characters we want to render; Unicode */ + FT_ULong *my_charcodes = malloc(MAX_CHARSET_SIZE * sizeof(FT_ULong)); /* character codes in 'encoding' */ char *charmap = "ucs-4"; int err; @@ -973,6 +973,11 @@ float subtitle_font_ppem; float osd_font_ppem; + if (my_charset == NULL || my_charcodes == NULL) { + mp_msg(MSGT_OSD, MSGL_ERR, "subtitle font: malloc failed.\n"); + goto err_out; + } + switch (subtitle_autoscale) { case 1: movie_size = movie_height; @@ -1005,7 +1010,7 @@ } desc = init_font_desc(); - if(!desc) return NULL; + if(!desc) goto err_out; // t=GetTimer(); @@ -1030,11 +1035,10 @@ if (charset_size < 0) { mp_msg(MSGT_OSD, MSGL_ERR, "subtitle font: prepare_charset failed.\n"); - free_font_desc(desc); - return NULL; + goto err_out; } #else - return NULL; + goto err_out; #endif // fprintf(stderr, "fg: prepare t = %lf\n", GetTimer()-t); @@ -1045,8 +1049,7 @@ if (err) { mp_msg(MSGT_OSD, MSGL_ERR, "Cannot prepare subtitle font.\n"); - free_font_desc(desc); - return NULL; + goto err_out; } gen_osd: @@ -1054,8 +1057,7 @@ /* generate the OSD font */ err = load_osd_face(&face); if (err) { - free_font_desc(desc); - return NULL; + goto err_out; } desc->face_cnt++; @@ -1065,16 +1067,14 @@ if (err) { mp_msg(MSGT_OSD, MSGL_ERR, "Cannot prepare OSD font.\n"); - free_font_desc(desc); - return NULL; + goto err_out; } err = generate_tables(desc, subtitle_font_thickness, subtitle_font_radius); if (err) { mp_msg(MSGT_OSD, MSGL_ERR, "Cannot generate tables.\n"); - free_font_desc(desc); - return NULL; + goto err_out; } // final cleanup @@ -1092,7 +1092,16 @@ desc->font[i] = desc->font[j]; } } + free(my_charset); + free(my_charcodes); return desc; + +err_out: + if (desc) + free_font_desc(desc); + free(my_charset); + free(my_charcodes); + return NULL; } int init_freetype(void)