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:
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
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue