]> git.mxchange.org Git - flightgear.git/commitdiff
Remove FontCache from globals.
authorJames Turner <zakalawe@mac.com>
Fri, 1 Jan 2016 20:33:17 +0000 (14:33 -0600)
committerJames Turner <zakalawe@mac.com>
Sun, 3 Jan 2016 18:00:15 +0000 (12:00 -0600)
- access via a singleton instead.

src/Cockpit/panel.cxx
src/GUI/FGFontCache.cxx
src/GUI/FGFontCache.hxx
src/GUI/FGPUIDialog.cxx
src/GUI/gui.cxx
src/GUI/new_gui.cxx
src/Instrumentation/HUD/HUD.cxx
src/Main/globals.cxx
src/Main/globals.hxx
src/Viewer/splash.cxx

index 6123fab0cac88d363c193d122ad53a9c7cee7798..dd2c6c1541deacee49cede39626b2dadac0f6750 100644 (file)
@@ -1072,8 +1072,7 @@ FGTextLayer::draw (osg::State& state)
     glColor4fv(_color);
     transform();
 
-    FGFontCache *fc = globals->get_fontcache();
-    fntFont* font = fc->getTexFont(_font_name.c_str());
+    fntFont* font = FGFontCache::instance()->getTexFont(_font_name);
     if (!font) {
         return; // don't crash on missing fonts
     }
@@ -1139,8 +1138,7 @@ void
 FGTextLayer::setFontName(const std::string &name)
 {
   _font_name = name + ".txf";
-  FGFontCache *fc = globals->get_fontcache();
-  fntFont* font = fc->getTexFont(_font_name.c_str());
+    fntFont* font = FGFontCache::instance()->getTexFont(_font_name);
   if (!font) {
       SG_LOG(SG_COCKPIT, SG_WARN, "unable to find font:" << name);
   }
index 937eaeb78936480d186383a4fd31e387260b7c99..e5a0752a3bf25f21d84ab8ffce049566c235efb5 100644 (file)
@@ -34,6 +34,9 @@
 // FGFontCache class.
 ////////////////////////////////////////////////////////////////////////
 
+static std::auto_ptr<FGFontCache> global_fontCacheInstance;
+
+
 extern puFont FONT_HELVETICA_14;
 extern puFont FONT_SANS_12B;
 extern puFont FONT_HELVETICA_12;
@@ -42,17 +45,17 @@ namespace
 {
 struct GuiFont
 {
-    const char *name;
+    const charname;
     puFont *font;
     struct Predicate
         : public std::unary_function<const GuiFont, bool>
     {
-        Predicate(const char* name_) : name(name_) {}
+        Predicate(const std::string& name_) : name(name_) {}
         bool operator() (const GuiFont& f1) const
         {
-            return ::strcmp(f1.name, name) == 0;
+            return (name == f1.name);
         }
-        const char* name;
+        const std::string name;
     };
 };
 
@@ -73,6 +76,15 @@ const GuiFont guifonts[] = {
 const GuiFont* guifontsEnd = &guifonts[sizeof(guifonts)/ sizeof(guifonts[0])-1];
 }
 
+FGFontCache* FGFontCache::instance()
+{
+    if (!global_fontCacheInstance.get()) {
+        global_fontCacheInstance.reset(new FGFontCache);
+    }
+
+    return global_fontCacheInstance.get();
+}
+
 FGFontCache::FGFontCache() :
     _initialized(false)
 {
@@ -101,9 +113,8 @@ inline bool FGFontCache::FntParamsLess::operator()(const FntParams& f1,
 }
 
 struct FGFontCache::fnt *
-FGFontCache::getfnt(const char *name, float size, float slant)
+FGFontCache::getfnt(const std::string& fontName, float size, float slant)
 {
-    std::string fontName(name);
     FntParams fntParams(fontName, size, slant);
     PuFontMap::iterator i = _puFonts.find(fntParams);
     if (i != _puFonts.end())
@@ -116,7 +127,7 @@ FGFontCache::getfnt(const char *name, float size, float slant)
         texfont = texi->second;
     } else {
         const GuiFont* guifont = std::find_if(&guifonts[0], guifontsEnd,
-                                              GuiFont::Predicate(name));
+                                              GuiFont::Predicate(fontName));
         if (guifont != guifontsEnd) {
             pufont = guifont->font;
         }
@@ -136,13 +147,13 @@ FGFontCache::getfnt(const char *name, float size, float slant)
 }
 
 puFont *
-FGFontCache::get(const char *name, float size, float slant)
+FGFontCache::get(const std::string& name, float size, float slant)
 {
     return getfnt(name, size, slant)->pufont;
 }
 
 fntTexFont *
-FGFontCache::getTexFont(const char *name, float size, float slant)
+FGFontCache::getTexFont(const std::string& name, float size, float slant)
 {
     init();
     return getfnt(name, size, slant)->texfont;
@@ -176,11 +187,11 @@ void FGFontCache::init()
 }
 
 SGPath
-FGFontCache::getfntpath(const char *name)
+FGFontCache::getfntpath(const std::string& name)
 {
     init();
     SGPath path(_path);
-    if (name && std::string(name) != "") {
+    if (name != "") {
         path.append(name);
         if (path.exists())
             return path;
index a07aa7b44b4f45deb10b7f01ab1f2d8438af6eda..77bab6b5b92a0b7223f364bd1e7828ff7da4ac76 100644 (file)
@@ -31,6 +31,8 @@ class fntTexFont;
  */
 class FGFontCache {
 private:
+    FGFontCache(); // private constructor, use singleton instance() accessor
+
     // The parameters of a request to the cache.
     struct FntParams
     {
@@ -70,19 +72,21 @@ private:
     PuFontMap _puFonts;
 
     bool _initialized;
-    struct fnt *getfnt(const char *name, float size, float slant);
+    struct fnt *getfnt(const std::string& name, float size, float slant);
     void init();
 
 public:
-    FGFontCache();
+    // note this accesor is NOT thread-safe
+    static FGFontCache* instance();
+
     ~FGFontCache();
 
-    puFont *get(const char *name, float size=15.0, float slant=0.0);
+    puFont *get(const std::string& name, float size=15.0, float slant=0.0);
     puFont *get(SGPropertyNode *node);
 
-    fntTexFont *getTexFont(const char *name, float size=15.0, float slant=0.0);
+    fntTexFont *getTexFont(const std::string& name, float size=15.0, float slant=0.0);
 
-    SGPath getfntpath(const char *name);
+    SGPath getfntpath(const std::string& name);
     /**
      * Preload all the fonts in the FlightGear font directory. It is
      * important to load the font textures early, with the proper
index ead9cc91c50c93075adc1c3ddb9b5de15686f593..30cbef75dd1706ca8f668f3803b0979c77f8aeab 100644 (file)
@@ -796,8 +796,7 @@ FGPUIDialog::display (SGPropertyNode *props)
 
     SGPropertyNode *fontnode = props->getNode("font");
     if (fontnode) {
-        FGFontCache *fc = globals->get_fontcache();
-        _font = fc->get(fontnode);
+        _font = FGFontCache::instance()->get(fontnode);
     } else {
         _font = _gui->getDefaultFont();
     }
@@ -1092,8 +1091,7 @@ FGPUIDialog::setupObject (puObject *object, SGPropertyNode *props)
         object->setBorderThickness( props->getIntValue("border", 2) );
 
     if (SGPropertyNode *nft = props->getNode("font", false)) {
-       FGFontCache *fc = globals->get_fontcache();
-       puFont *lfnt = fc->get(nft);
+       puFont *lfnt = FGFontCache::instance()->get(nft);
        object->setLabelFont(*lfnt);
        object->setLegendFont(*lfnt);
     } else {
index 2c5ae23459b09da63609cb9e9ed53acca6e2a9b1..b8a8f333a5a612f561084011f964540236e92d91 100644 (file)
@@ -79,7 +79,7 @@ public:
         puSetDefaultStyle         ( PUSTYLE_SMALL_SHADED ); //PUSTYLE_DEFAULT
         puSetDefaultColourScheme  (0.8, 0.8, 0.9, 1);
 
-        FGFontCache *fc = globals->get_fontcache();
+        FGFontCache *fc = FGFontCache::instance();
         fc->initializeFonts();
         puFont *GuiFont
             = fc->get(globals->get_locale()->getDefaultFont("typewriter.txf"),
index d2eb8b14024b180b6464cab10619e9ff0cb5967b..bb8eb52dba624941d88c664b9c1f198935811ff4 100644 (file)
@@ -415,7 +415,7 @@ NewGUI::setStyle (void)
 void
 NewGUI::setupFont (SGPropertyNode *node)
 {
-    _font = globals->get_fontcache()->get(node);
+    _font = FGFontCache::instance()->get(node);
     puSetDefaultFonts(*_font, *_font);
     return;
 }
index 766b0fed17420eebe788b27b13009bccb0b8c49f..545042e956cbf192ccf1bc022cb8f9785d5a13db 100644 (file)
@@ -130,11 +130,10 @@ HUD::~HUD()
 
 void HUD::init()
 {
-    const char* fontName = 0;
-    _font_cache = globals->get_fontcache();
+    std::string fontName;
     if (!_font) {
         fontName = fgGetString("/sim/hud/font/name", "Helvetica.txf");
-        _font = _font_cache->getTexFont(fontName);
+        _font = FGFontCache::instance()->getTexFont(fontName);
     }
     if (!_font)
         throw sg_io_exception("/sim/hud/font/name is not a texture font",
index 8e8a346a705a911bf371d1fdd21ff510fc252d80..42a27bd46b74782d45028b6169dac8da078c5c7f 100644 (file)
@@ -48,7 +48,6 @@
 #include <Aircraft/controls.hxx>
 #include <Airports/runways.hxx>
 #include <Autopilot/route_mgr.hxx>
-#include <GUI/FGFontCache.hxx>
 #include <GUI/gui.h>
 #include <Scenery/scenery.hxx>
 #include <Scenery/tilemgr.hxx>
@@ -160,7 +159,6 @@ FGGlobals::FGGlobals() :
     commands( SGCommandMgr::instance() ),
     channel_options_list( NULL ),
     initial_waypoints( NULL ),
-    fontcache ( new FGFontCache ),
     channellist( NULL ),
     haveUserSettings(false),
     _chatter_queue(NULL)
@@ -237,7 +235,6 @@ FGGlobals::~FGGlobals()
 
     delete channel_options_list;
     delete initial_waypoints;
-    delete fontcache;
     delete channellist;
 
     simgear::PropertyObjectBase::setDefaultRoot(NULL);
index 5c82b364a88c6fa2c2997b1b41a68cf73ca780a3..4951792c98ba77b59883300b8dbe70c813284d60 100644 (file)
@@ -63,7 +63,6 @@ class FGTileMgr;
 class FGViewMgr;
 class FGViewer;
 class FGRenderer;
-class FGFontCache;
 class FGSampleQueue;
 
 namespace simgear { namespace pkg {
@@ -124,8 +123,6 @@ private:
     // and or flight-plan file during initialization
     string_list *initial_waypoints;
 
-    FGFontCache *fontcache;
-
     // Navigational Aids
     FGTACANList *channellist;
 
@@ -330,8 +327,6 @@ public:
     FGScenery * get_scenery () const;
 
     FGTileMgr * get_tile_mgr () const;
-
-    inline FGFontCache *get_fontcache() const { return fontcache; }
   
     inline FGTACANList *get_channellist() const { return channellist; }
     inline void set_channellist( FGTACANList *c ) { channellist = c; }
index 159eeeb114fb01d2aa946cb2e6cc2fba9a998920..bfb4d3625db7bcbd26b7abe1ae814be681fac440 100644 (file)
@@ -315,10 +315,10 @@ static osg::Node* fgCreateSplashCamera()
   stateSet->setTextureAttribute(0, splashTexture);
   geode->addDrawable(geometry);
 
-
+    FGFontCache* fontCache = FGFontCache::instance();
   osgText::Text* text = new osgText::Text;
   std::string fn = style->getStringValue("fonts/splash", "");
-  text->setFont(globals->get_fontcache()->getfntpath(fn.c_str()).str());
+  text->setFont(fontCache->getfntpath(fn).str());
   text->setCharacterSize(0.06);
   text->setColor(osg::Vec4(1, 1, 1, 1));
   text->setPosition(osg::Vec3(0, -0.92, 0));
@@ -329,7 +329,7 @@ static osg::Node* fgCreateSplashCamera()
   geode->addDrawable(text);
 
   osgText::Text* spinnertext = new osgText::Text;
-  spinnertext->setFont(globals->get_fontcache()->getfntpath(fn.c_str()).str());
+  spinnertext->setFont(fontCache->getfntpath(fn).str());
   spinnertext->setCharacterSize(0.06);
   spinnertext->setColor(osg::Vec4(1, 1, 1, 1));
   spinnertext->setPosition(osg::Vec3(0, -0.97, 0));
@@ -340,7 +340,7 @@ static osg::Node* fgCreateSplashCamera()
   geode->addDrawable(spinnertext);
 
   text = new osgText::Text;
-  text->setFont(globals->get_fontcache()->getfntpath(fn.c_str()).str());
+  text->setFont(fontCache->getfntpath(fn).str());
   text->setCharacterSize(0.08);
   text->setColor(osg::Vec4(1, 1, 1, 1));
   text->setPosition(osg::Vec3(0, 0.92, 0));
@@ -351,7 +351,7 @@ static osg::Node* fgCreateSplashCamera()
 
 
   text = new osgText::Text;
-  text->setFont(globals->get_fontcache()->getfntpath(fn.c_str()).str());
+  text->setFont(fontCache->getfntpath(fn).str());
   text->setCharacterSize(0.06);
   text->setColor(osg::Vec4(1, 1, 1, 1));
   text->setPosition(osg::Vec3(0, 0.82, 0));