]> git.mxchange.org Git - flightgear.git/commitdiff
Bugfix #35 / denker #20F:
authorjmt <jmt>
Wed, 10 Feb 2010 19:28:35 +0000 (19:28 +0000)
committerTim Moore <timoore33@gmail.com>
Wed, 10 Feb 2010 23:20:59 +0000 (00:20 +0100)
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
src/GUI/new_gui.cxx

index e2caa87f0cc1d0bd963f7d34422e4e2e3dfb389f..be2f12570e8fb3d336e9e79d0c68ccee5b2a0155 100644 (file)
@@ -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);
+  }
 }
 
 
index ff9c7ad3c337c370a9ed1d79f66e50589fb83778..b17c0b021d10cd4fd84a5fb0e0ac056be5ea5450 100644 (file)
@@ -14,6 +14,8 @@
 #include <simgear/structure/exception.hxx>
 #include <simgear/props/props_io.hxx>
 
+#include <boost/algorithm/string/case_conv.hpp>
+
 #include <Main/fg_props.hxx>
 
 #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;
         }
     }