diff options
author | Manuel Reimer <manuel.reimer@gmx.de> | 2020-08-14 18:41:32 +0200 |
---|---|---|
committer | Manuel Reimer <manuel.reimer@gmx.de> | 2020-08-14 18:41:32 +0200 |
commit | be3007e0c05b9084344497d5279b611a8ee59c84 (patch) | |
tree | 240c9fadd36e134a243fdc59b743654cef28ff05 /glcdskin/font.c | |
parent | 6015f5c14f80ca4dd54ef96a6d5825caad9550bb (diff) | |
download | graphlcd-base-be3007e0c05b9084344497d5279b611a8ee59c84.tar.gz graphlcd-base-be3007e0c05b9084344497d5279b611a8ee59c84.tar.bz2 |
Fall back to system font directories if font file is missing
Diffstat (limited to 'glcdskin/font.c')
-rw-r--r-- | glcdskin/font.c | 44 |
1 files changed, 34 insertions, 10 deletions
diff --git a/glcdskin/font.c b/glcdskin/font.c index a8c22c8..bffdfe6 100644 --- a/glcdskin/font.c +++ b/glcdskin/font.c @@ -33,6 +33,12 @@ cSkinFont::~cSkinFont(void) { #endif } +bool cSkinFont::FileExists(const std::string& path) +{ + std::ifstream f(path.c_str()); + return (f.is_open()); +} + bool cSkinFont::ParseUrl(const std::string & url) { bool isFontconfig = false; @@ -143,16 +149,7 @@ bool cSkinFont::ParseUrl(const std::string & url) } mFile += "fonts/"; mFile += rawfont; -#if (__GNUC__ < 3) - std::ifstream f(mFile.c_str(), std::ios::in | std::ios::binary); -#else - std::ifstream f(mFile.c_str(), std::ios_base::in | std::ios_base::binary); -#endif - if (f.is_open()) - { - f.close(); - } - else + if (!FileExists(mFile)) { // then try generic font dir mFile = mSkin->Config().FontPath(); @@ -162,6 +159,33 @@ bool cSkinFont::ParseUrl(const std::string & url) mFile += '/'; } mFile += rawfont; + +#ifdef HAVE_FONTCONFIG + // If we have fontconfig, then at last search for the font file in + // all system default font directories + if (!FileExists(mFile)) + { + if (cSkinFont::FcInitCount <= 0) + { + FcInit(); + } + cSkinFont::FcInitCount++; + + FcStrList* dirlist = FcConfigGetFontDirs(NULL); + FcChar8* dir; + while ((dir = FcStrListNext(dirlist))) + { + mFile.assign((const char*)dir); + mFile += '/'; + mFile += rawfont; + if (FileExists(mFile)) + { + break; + } + } + FcStrListDone(dirlist); + } +#endif } } |