Select correct face from a .ttc file.

Fixes https://gitlab.com/kicad/code/kicad/issues/13314
This commit is contained in:
Jeff Young 2023-03-13 16:35:28 +00:00
parent 0fb1ccff21
commit 7b3e01ce52
4 changed files with 14 additions and 9 deletions

View File

@ -152,7 +152,7 @@ std::string FONTCONFIG::getFamilyStringByLang( FONTCONFIG_PAT& aPat, const wxStr
FONTCONFIG::FF_RESULT FONTCONFIG::FindFont( const wxString &aFontName, wxString &aFontFile, FONTCONFIG::FF_RESULT FONTCONFIG::FindFont( const wxString &aFontName, wxString &aFontFile,
bool aBold, bool aItalic ) int& aFaceIndex, bool aBold, bool aItalic )
{ {
FF_RESULT retval = FF_RESULT::FF_ERROR; FF_RESULT retval = FF_RESULT::FF_ERROR;
wxString qualifiedFontName = aFontName; wxString qualifiedFontName = aFontName;
@ -184,6 +184,8 @@ FONTCONFIG::FF_RESULT FONTCONFIG::FindFont( const wxString &aFontName, wxString
if( FcPatternGetString( font, FC_FILE, 0, &file ) == FcResultMatch ) if( FcPatternGetString( font, FC_FILE, 0, &file ) == FcResultMatch )
{ {
aFontFile = wxString::FromUTF8( (char*) file ); aFontFile = wxString::FromUTF8( (char*) file );
aFaceIndex = 0;
wxString styleStr; wxString styleStr;
FcChar8* family = nullptr; FcChar8* family = nullptr;
FcChar8* style = nullptr; FcChar8* style = nullptr;
@ -192,9 +194,13 @@ FONTCONFIG::FF_RESULT FONTCONFIG::FindFont( const wxString &aFontName, wxString
std::unordered_map<std::string, std::string> famStrings; std::unordered_map<std::string, std::string> famStrings;
FONTCONFIG_PAT patHolder{ font }; FONTCONFIG_PAT patHolder{ font };
getAllFamilyStrings( patHolder, famStrings ); getAllFamilyStrings( patHolder, famStrings );
if( FcPatternGetString( font, FC_FAMILY, 0, &family ) == FcResultMatch ) if( FcPatternGetString( font, FC_FAMILY, 0, &family ) == FcResultMatch )
{ {
FcPatternGetInteger( font, FC_INDEX, 0, &aFaceIndex );
fontName = wxString::FromUTF8( (char*) family ); fontName = wxString::FromUTF8( (char*) family );
if( FcPatternGetString( font, FC_STYLE, 0, &style ) == FcResultMatch ) if( FcPatternGetString( font, FC_STYLE, 0, &style ) == FcResultMatch )
@ -248,8 +254,6 @@ FONTCONFIG::FF_RESULT FONTCONFIG::FindFont( const wxString &aFontName, wxString
break; break;
} }
} }
} }
} }

View File

@ -98,9 +98,10 @@ OUTLINE_FONT* OUTLINE_FONT::LoadFont( const wxString& aFontName, bool aBold, boo
std::unique_ptr<OUTLINE_FONT> font = std::make_unique<OUTLINE_FONT>(); std::unique_ptr<OUTLINE_FONT> font = std::make_unique<OUTLINE_FONT>();
wxString fontFile; wxString fontFile;
int faceIndex;
using fc = fontconfig::FONTCONFIG; using fc = fontconfig::FONTCONFIG;
fc::FF_RESULT retval = Fontconfig()->FindFont( aFontName, fontFile, aBold, aItalic ); fc::FF_RESULT retval = Fontconfig()->FindFont( aFontName, fontFile, faceIndex, aBold, aItalic );
if( retval == fc::FF_RESULT::FF_ERROR ) if( retval == fc::FF_RESULT::FF_ERROR )
return nullptr; return nullptr;
@ -111,7 +112,7 @@ OUTLINE_FONT* OUTLINE_FONT::LoadFont( const wxString& aFontName, bool aBold, boo
if( retval == fc::FF_RESULT::FF_MISSING_ITAL || retval == fc::FF_RESULT::FF_MISSING_BOLD_ITAL ) if( retval == fc::FF_RESULT::FF_MISSING_ITAL || retval == fc::FF_RESULT::FF_MISSING_BOLD_ITAL )
font->SetFakeItal(); font->SetFakeItal();
if( font->loadFace( fontFile ) != 0 ) if( font->loadFace( fontFile, faceIndex ) != 0 )
return nullptr; return nullptr;
font->m_fontName = aFontName; // Keep asked-for name, even if we substituted. font->m_fontName = aFontName; // Keep asked-for name, even if we substituted.
@ -121,13 +122,13 @@ OUTLINE_FONT* OUTLINE_FONT::LoadFont( const wxString& aFontName, bool aBold, boo
} }
FT_Error OUTLINE_FONT::loadFace( const wxString& aFontFileName ) FT_Error OUTLINE_FONT::loadFace( const wxString& aFontFileName, int aFaceIndex )
{ {
std::lock_guard<std::mutex> guard( m_freeTypeMutex ); std::lock_guard<std::mutex> guard( m_freeTypeMutex );
// TODO: check that going from wxString to char* with UTF-8 // TODO: check that going from wxString to char* with UTF-8
// conversion for filename makes sense on any/all platforms // conversion for filename makes sense on any/all platforms
FT_Error e = FT_New_Face( m_freeType, aFontFileName.mb_str( wxConvUTF8 ), 0, &m_face ); FT_Error e = FT_New_Face( m_freeType, aFontFileName.mb_str( wxConvUTF8 ), aFaceIndex, &m_face );
if( !e ) if( !e )
{ {

View File

@ -57,7 +57,7 @@ public:
* *
* A return value of false indicates a serious error in the font system. * A return value of false indicates a serious error in the font system.
*/ */
FF_RESULT FindFont( const wxString& aFontName, wxString& aFontFile, bool aBold, bool aItalic ); FF_RESULT FindFont( const wxString& aFontName, wxString& aFontFile, int& aFaceIndex, bool aBold, bool aItalic );
/** /**
* List the current available font families. * List the current available font families.

View File

@ -124,7 +124,7 @@ public:
#endif #endif
protected: protected:
FT_Error loadFace( const wxString& aFontFileName ); FT_Error loadFace( const wxString& aFontFileName, int aFaceIndex );
double getOverbarOffset( int ascender, int height, int thickness ) const; double getOverbarOffset( int ascender, int height, int thickness ) const;