Careful: symbol fonts have no language.

Also a bit of clean up to shut up a false-positive in Coverity (and
clangd) on dereferencing a possibly (not) nullptr.
This commit is contained in:
Jeff Young 2022-01-09 11:32:37 +00:00
parent a170d3f006
commit 78cac128b7
4 changed files with 26 additions and 12 deletions

View File

@ -18,8 +18,6 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <iostream>
#include <sstream>
#include <font/fontconfig.h>
#include <pgm_base.h>
#include <wx/log.h>
@ -42,7 +40,7 @@ FONTCONFIG::FONTCONFIG()
};
FONTCONFIG& Fontconfig()
FONTCONFIG* Fontconfig()
{
if( !g_config )
{
@ -50,7 +48,7 @@ FONTCONFIG& Fontconfig()
g_config = new FONTCONFIG();
}
return *g_config;
return g_config;
}
@ -137,8 +135,14 @@ void FONTCONFIG::ListFonts( std::vector<std::string>& aFonts )
FcStrSet* langStrSet = FcLangSetGetLangs( langSet );
FcStrList* langStrList = FcStrListCreate( langStrSet );
FcChar8* langStr = FcStrListNext( langStrList );
while( FcChar8* langStr = FcStrListNext( langStrList ) )
if( !langStr )
{
// Symbol fonts (Wingdings, etc.) have no language
langSupported = true;
}
else while( langStr )
{
wxString langWxStr( reinterpret_cast<char *>( langStr ) );
const wxLanguageInfo* langInfo = wxLocale::FindLanguageInfo( langWxStr );
@ -148,6 +152,8 @@ void FONTCONFIG::ListFonts( std::vector<std::string>& aFonts )
langSupported = true;
break;
}
langStr = FcStrListNext( langStrList );
}
FcStrListDone( langStrList );
@ -156,9 +162,6 @@ void FONTCONFIG::ListFonts( std::vector<std::string>& aFonts )
if( !langSupported )
continue;
std::ostringstream s;
s << family;
std::string theFile( reinterpret_cast<char *>( file ) );
std::string theFamily( reinterpret_cast<char *>( family ) );
std::string theStyle( reinterpret_cast<char *>( style ) );
@ -167,7 +170,7 @@ void FONTCONFIG::ListFonts( std::vector<std::string>& aFonts )
if( theFamily.length() > 0 && theFamily.front() == '.' )
continue;
auto it = m_fonts.find( theFamily );
std::map<std::string, FONTINFO>::iterator it = m_fonts.find( theFamily );
if( it == m_fonts.end() )
m_fonts.insert( std::pair<std::string, FONTINFO>( theFamily, fontInfo ) );

View File

@ -82,7 +82,7 @@ OUTLINE_FONT* OUTLINE_FONT::LoadFont( const wxString& aFontName, bool aBold, boo
if( aItalic )
qualifiedFontName << ":Italic";
if( Fontconfig().FindFont( qualifiedFontName, fontFile ) )
if( Fontconfig()->FindFont( qualifiedFontName, fontFile ) )
(void) font->loadFace( fontFile );
font->m_fontName = aFontName; // Keep asked-for name, even if we substituted.

View File

@ -29,7 +29,7 @@ FONT_CHOICE::FONT_CHOICE( wxWindow* aParent, int aId, wxPoint aPosition, wxSize
m_systemFontCount = wxChoice::GetCount();
std::vector<std::string> fontNames;
Fontconfig().ListFonts( fontNames );
Fontconfig()->ListFonts( fontNames );
wxArrayString menuList;

View File

@ -35,8 +35,17 @@ class FONTCONFIG
public:
FONTCONFIG();
/**
* Given a fully-qualified font name ("Times:Bold:Italic") find the closest matching font
* and return its filepath in \a aFontFile.
*
* A return value of false indicates a serious error in the font system.
*/
bool FindFont( const wxString& aFontName, wxString& aFontFile );
/**
* List the current available font families.
*/
void ListFonts( std::vector<std::string>& aFonts );
private:
@ -45,6 +54,8 @@ private:
} // namespace fontconfig
fontconfig::FONTCONFIG& Fontconfig();
fontconfig::FONTCONFIG* Fontconfig();
#endif //KICAD_FONTCONFIG_H