From 73334cf61b097f1647c4bd0969f40db6eb5296e9 Mon Sep 17 00:00:00 2001 From: jmt Date: Wed, 10 Feb 2010 19:28:35 +0000 Subject: [PATCH] Bugfix #35 / denker #20F: Guard against invalid font names in panel XML files, and make font name comparisons case-insensitive so that 'helvetica', 'Helvetica' or 'HELVETICA' work as expected. --- src/Cockpit/panel.cxx | 12 +++++++++++- src/GUI/new_gui.cxx | 45 +++++++++++++++++++++++++++---------------- 2 files changed, 39 insertions(+), 18 deletions(-) diff --git a/src/Cockpit/panel.cxx b/src/Cockpit/panel.cxx index e2caa87f0..be2f12570 100644 --- a/src/Cockpit/panel.cxx +++ b/src/Cockpit/panel.cxx @@ -1109,7 +1109,12 @@ FGTextLayer::draw (osg::State& state) transform(); FGFontCache *fc = globals->get_fontcache(); - text_renderer.setFont(fc->getTexFont(_font_name.c_str())); + fntFont* font = fc->getTexFont(_font_name.c_str()); + if (!font) { + return; // don't crash on missing fonts + } + + text_renderer.setFont(font); text_renderer.setPointSize(_pointSize); text_renderer.begin(); @@ -1170,6 +1175,11 @@ void FGTextLayer::setFontName(const string &name) { _font_name = name + ".txf"; + FGFontCache *fc = globals->get_fontcache(); + fntFont* font = fc->getTexFont(_font_name.c_str()); + if (!font) { + SG_LOG(SG_GENERAL, SG_WARN, "unable to find font:" << name); + } } diff --git a/src/GUI/new_gui.cxx b/src/GUI/new_gui.cxx index ff9c7ad3c..b17c0b021 100644 --- a/src/GUI/new_gui.cxx +++ b/src/GUI/new_gui.cxx @@ -14,6 +14,8 @@ #include #include +#include + #include
#include "menubar.hxx" @@ -468,24 +470,29 @@ inline bool FGFontCache::FntParamsLess::operator()(const FntParams& f1, struct FGFontCache::fnt * FGFontCache::getfnt(const char *name, float size, float slant) { - string fontName(name); + string fontName = boost::to_lower_copy(string(name)); FntParams fntParams(fontName, size, slant); PuFontMap::iterator i = _puFonts.find(fntParams); - if (i != _puFonts.end()) + if (i != _puFonts.end()) { + // found in the puFonts map, all done return i->second; + } + // fntTexFont s are all preloaded into the _texFonts map TexFontMap::iterator texi = _texFonts.find(fontName); - fntTexFont* texfont = 0; - puFont* pufont = 0; + fntTexFont* texfont = NULL; + puFont* pufont = NULL; if (texi != _texFonts.end()) { texfont = texi->second; } else { + // check the built-in PUI fonts (in guifonts array) const GuiFont* guifont = std::find_if(&guifonts[0], guifontsEnd, GuiFont::Predicate(name)); if (guifont != guifontsEnd) { pufont = guifont->font; } } + fnt* f = new fnt; if (pufont) { f->pufont = pufont; @@ -527,16 +534,18 @@ FGFontCache::get(SGPropertyNode *node) void FGFontCache::init() { - if (!_initialized) { - char *envp = ::getenv("FG_FONTS"); - if (envp != NULL) { - _path.set(envp); - } else { - _path.set(globals->get_fg_root()); - _path.append("Fonts"); - } - _initialized = true; + if (_initialized) { + return; } + + char *envp = ::getenv("FG_FONTS"); + if (envp != NULL) { + _path.set(envp); + } else { + _path.set(globals->get_fg_root()); + _path.append("Fonts"); + } + _initialized = true; } SGPath @@ -552,7 +561,7 @@ FGFontCache::getfntpath(const char *name) path = SGPath(_path); path.append("Helvetica.txf"); - + SG_LOG(SG_GENERAL, SG_WARN, "Unknown font name '" << name << "', defaulting to Helvetica"); return path; } @@ -569,9 +578,11 @@ bool FGFontCache::initializeFonts() path.append(dirEntry->d_name); if (path.extension() == fontext) { fntTexFont* f = new fntTexFont; - if (f->load((char *)path.c_str())) - _texFonts[string(dirEntry->d_name)] = f; - else + if (f->load((char *)path.c_str())) { + // convert font names in the map to lowercase for matching + string fontName = boost::to_lower_copy(string(dirEntry->d_name)); + _texFonts[fontName] = f; + } else delete f; } }