VSE: Allow Wingdings and Symbol Fonts

This patch makes us less restrictive on the allowed types of FreeType
font character maps we allow, rather than primarily unicode-only. This
allows us to use some legacy, symbol, specialty, and proprietary fonts
like Wingdings. Note we were a little less restrictive with vfonts,
used for 3D Text Objects, so this patch primarily helps VSE.

See D12124 for details and examples.

Differential Revision: https://developer.blender.org/D12124

Reviewed by Brecht Van Lommel
This commit is contained in:
Harley Acheson 2021-08-04 09:31:01 -07:00
parent b5bfb5f34c
commit ae920d789e
Notes: blender-bot 2023-02-14 02:22:07 +01:00
Referenced by issue #101481, Regression: Wingding type font doesn't load
2 changed files with 22 additions and 25 deletions

View File

@ -1359,9 +1359,15 @@ FontBLF *blf_font_new(const char *name, const char *filename)
return NULL;
}
err = FT_Select_Charmap(font->face, ft_encoding_unicode);
err = FT_Select_Charmap(font->face, FT_ENCODING_UNICODE);
if (err) {
printf("Can't set the unicode character map!\n");
err = FT_Select_Charmap(font->face, FT_ENCODING_APPLE_ROMAN);
}
if (err && font->face->num_charmaps > 0) {
err = FT_Select_Charmap(font->face, font->face->charmaps[0]->encoding);
}
if (err) {
printf("Can't set a character map!\n");
FT_Done_Face(font->face);
MEM_freeN(font);
return NULL;

View File

@ -305,32 +305,23 @@ static VFontData *objfnt_to_ftvfontdata(PackedFile *pf)
BLI_utf8_invalid_strip(vfd->name, strlen(vfd->name));
}
/* Select a character map. */
err = FT_Select_Charmap(face, FT_ENCODING_UNICODE);
if (err) {
err = FT_Select_Charmap(face, FT_ENCODING_APPLE_ROMAN);
}
if (err && face->num_charmaps > 0) {
err = FT_Select_Charmap(face, face->charmaps[0]->encoding);
}
if (err) {
FT_Done_Face(face);
MEM_freeN(vfd);
return NULL;
}
/* Extract the first 256 character from TTF */
lcode = charcode = FT_Get_First_Char(face, &glyph_index);
/* No `charmap` found from the TTF so we need to figure it out. */
if (glyph_index == 0) {
FT_CharMap found = NULL;
FT_CharMap charmap;
int n;
for (n = 0; n < face->num_charmaps; n++) {
charmap = face->charmaps[n];
if (charmap->encoding == FT_ENCODING_APPLE_ROMAN) {
found = charmap;
break;
}
}
err = FT_Set_Charmap(face, found);
if (err) {
return NULL;
}
lcode = charcode = FT_Get_First_Char(face, &glyph_index);
}
/* Blender default BFont is not "complete". */
const bool complete_font = (face->ascender != 0) && (face->descender != 0) &&
(face->ascender != face->descender);