Select correct face from a .ttc file.
Fixes https://gitlab.com/kicad/code/kicad/issues/13314
This commit is contained in:
parent
0fb1ccff21
commit
7b3e01ce52
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 )
|
||||||
{
|
{
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue