static FT_Face LoadFace( filter_t *p_filter, const char *psz_fontfile, int i_idx, const text_style_t *p_style ) { filter_sys_t *p_sys = p_filter->p_sys; char *psz_key = NULL; int i_font_size = ConvertToLiveSize( p_filter, p_style ); int i_font_width = p_style->i_style_flags & STYLE_HALFWIDTH ? i_font_size / 2 : i_font_size; if( asprintf( &psz_key, "%s - %d - %d - %d", psz_fontfile, i_idx, i_font_size, i_font_width ) < 0 ) return NULL; FT_Face p_face = vlc_dictionary_value_for_key( &p_sys->face_map, psz_key ); if( p_face != kVLCDictionaryNotFound ) goto done; if( psz_fontfile[0] == ':' && psz_fontfile[1] == '/' ) { int i_attach = atoi( psz_fontfile + 2 ); if( i_attach < 0 || i_attach >= p_sys->i_font_attachments ) { msg_Err( p_filter, "LoadFace: Invalid font attachment index" ); p_face = NULL; } else { input_attachment_t *p_attach = p_sys->pp_font_attachments[ i_attach ]; if( FT_New_Memory_Face( p_sys->p_library, p_attach->p_data, p_attach->i_data, i_idx, &p_face ) ) p_face = NULL; } } else if( FT_New_Face( p_sys->p_library, psz_fontfile, i_idx, &p_face ) ) { msg_Err( p_filter, "LoadFace: Error creating face for %s", psz_key ); p_face = NULL; } if( !p_face ) goto done; if( FT_Select_Charmap( p_face, ft_encoding_unicode ) ) { /* We've loaded a font face which is unhelpful for actually * rendering text - fallback to the default one. */ msg_Err( p_filter, "LoadFace: Error selecting charmap for %s", psz_key ); FT_Done_Face( p_face ); p_face = NULL; goto done; } if( FT_Set_Pixel_Sizes( p_face, i_font_width, i_font_size ) ) { msg_Err( p_filter, "LoadFace: Failed to set font size for %s", psz_key ); FT_Done_Face( p_face ); p_face = NULL; goto done; } vlc_dictionary_insert( &p_sys->face_map, psz_key, p_face ); done: free( psz_key ); return p_face; }
static FT_Face LoadFace( filter_t *p_filter, const char *psz_fontfile, int i_idx, const text_style_t *p_style ) { filter_sys_t *p_sys = p_filter->p_sys; char *psz_key = NULL; int i_font_size = ConvertToLiveSize( p_filter, p_style ); int i_font_width = p_style->i_style_flags & STYLE_HALFWIDTH ? i_font_size / 2 : i_font_size; if( asprintf( &psz_key, "%s - %d - %d - %d", psz_fontfile, i_idx, i_font_size, i_font_width ) < 0 ) return NULL; FT_Face p_face = vlc_dictionary_value_for_key( &p_sys->face_map, psz_key ); if( p_face != NULL ) goto done; if( psz_fontfile[0] == ':' && psz_fontfile[1] == '/' ) { int i_attach = atoi( psz_fontfile + 2 ); if( i_attach < 0 || i_attach >= p_sys->i_font_attachments ) msg_Err( p_filter, "LoadFace: Invalid font attachment index" ); else { input_attachment_t *p_attach = p_sys->pp_font_attachments[ i_attach ]; if( FT_New_Memory_Face( p_sys->p_library, p_attach->p_data, p_attach->i_data, i_idx, &p_face ) ) msg_Err( p_filter, "LoadFace: Error creating face for %s", psz_key ); } } #if defined( _WIN32 ) else if( !memcmp( psz_fontfile, ":dw/", 4 ) ) { int i_index = atoi( psz_fontfile + 4 ); FT_Stream p_stream; if( DWrite_GetFontStream( p_filter, i_index, &p_stream ) != VLC_SUCCESS ) msg_Err( p_filter, "LoadFace: Invalid font stream index" ); else { FT_Open_Args args = {0}; args.flags = FT_OPEN_STREAM; args.stream = p_stream; if( FT_Open_Face( p_sys->p_library, &args, i_idx, &p_face ) ) msg_Err( p_filter, "LoadFace: Error creating face for %s", psz_key ); } } #endif else if( FT_New_Face( p_sys->p_library, psz_fontfile, i_idx, &p_face ) ) msg_Err( p_filter, "LoadFace: Error creating face for %s", psz_key ); if( !p_face ) goto done; if( FT_Select_Charmap( p_face, ft_encoding_unicode ) ) { /* We've loaded a font face which is unhelpful for actually * rendering text - fallback to the default one. */ msg_Err( p_filter, "LoadFace: Error selecting charmap for %s", psz_key ); FT_Done_Face( p_face ); p_face = NULL; goto done; } if( FT_Set_Pixel_Sizes( p_face, i_font_width, i_font_size ) ) { msg_Err( p_filter, "LoadFace: Failed to set font size for %s", psz_key ); FT_Done_Face( p_face ); p_face = NULL; goto done; } vlc_dictionary_insert( &p_sys->face_map, psz_key, p_face ); done: free( psz_key ); return p_face; }