X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FGUI%2Fnew_gui.cxx;h=b17c0b021d10cd4fd84a5fb0e0ac056be5ea5450;hb=474789269b7656509f62339c17e62a55b6157d43;hp=ce98f5eb78128a6e1f4bf306f287bd5e57d64f52;hpb=6cd9794b0cc9a5fd8310cfff31f7c36351936000;p=flightgear.git diff --git a/src/GUI/new_gui.cxx b/src/GUI/new_gui.cxx index ce98f5eb7..b17c0b021 100644 --- a/src/GUI/new_gui.cxx +++ b/src/GUI/new_gui.cxx @@ -1,4 +1,9 @@ // new_gui.cxx: implementation of XML-configurable GUI support. +#include +#include +#include +#include +#include #include "new_gui.hxx" @@ -7,12 +12,14 @@ #include #include +#include + +#include #include
#include "menubar.hxx" #include "dialog.hxx" -#include "SafeTexFont.hxx" extern puFont FONT_HELVETICA_14; extern puFont FONT_SANS_12B; @@ -352,6 +359,12 @@ NewGUI::setupFont (SGPropertyNode *node) // FGColor class. //////////////////////////////////////////////////////////////////////// +void +FGColor::print() const { + std::cerr << "red=" << _red << ", green=" << _green + << ", blue=" << _blue << ", alpha=" << _alpha << std::endl; +} + bool FGColor::merge(const SGPropertyNode *node) { @@ -393,10 +406,25 @@ FGColor::merge(const FGColor *color) // FGFontCache class. //////////////////////////////////////////////////////////////////////// -static const struct { +namespace +{ +struct GuiFont +{ const char *name; puFont *font; -} guifonts[] = { + struct Predicate + : public std::unary_function + { + Predicate(const char* name_) : name(name_) {} + bool operator() (const GuiFont& f1) const + { + return std::strcmp(f1.name, name) == 0; + } + const char* name; + }; +}; + +const GuiFont guifonts[] = { { "default", &FONT_HELVETICA_14 }, { "FIXED_8x13", &PUFONT_8_BY_13 }, { "FIXED_9x15", &PUFONT_9_BY_15 }, @@ -406,10 +434,11 @@ static const struct { { "HELVETICA_12", &PUFONT_HELVETICA_12 }, { "HELVETICA_14", &FONT_HELVETICA_14 }, { "HELVETICA_18", &PUFONT_HELVETICA_18 }, - { "SANS_12B", &FONT_SANS_12B }, - { 0, 0 } + { "SANS_12B", &FONT_SANS_12B } }; +const GuiFont* guifontsEnd = &guifonts[sizeof(guifonts)/ sizeof(guifonts[0])]; +} FGFontCache::FGFontCache() : _initialized(false) @@ -418,31 +447,64 @@ FGFontCache::FGFontCache() : FGFontCache::~FGFontCache() { - map::iterator it, end = _fonts.end(); - for (it = _fonts.begin(); it != end; ++it) + PuFontMap::iterator it, end = _puFonts.end(); + for (it = _puFonts.begin(); it != end; ++it) delete it->second; } +inline bool FGFontCache::FntParamsLess::operator()(const FntParams& f1, + const FntParams& f2) const +{ + int comp = f1.name.compare(f2.name); + if (comp < 0) + return true; + else if (comp > 0) + return false; + if (f1.size < f2.size) + return true; + else if (f1.size > f2.size) + return false; + return f1.slant < f2.slant; +} + struct FGFontCache::fnt * FGFontCache::getfnt(const char *name, float size, float slant) { - _itt_t it; - if ((it = _fonts.find(name)) != _fonts.end()) - return it->second; - - SGPath path = getfntpath(name); - - fnt *f = new fnt(); - f->texfont = new flightgear::SafeTexFont; - - if (f->texfont->load((char *)path.c_str())) { + string fontName = boost::to_lower_copy(string(name)); + FntParams fntParams(fontName, size, slant); + PuFontMap::iterator i = _puFonts.find(fntParams); + 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 = 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; + } else if (texfont) { + f->texfont = texfont; f->pufont = new puFont; f->pufont->initialize(static_cast(f->texfont), size, slant); - return _fonts[name] = f; + } else { + f->pufont = guifonts[0].font; } - - delete f; - return _fonts["default"]; + _puFonts[fntParams] = f; + return f; } puFont * @@ -470,24 +532,26 @@ FGFontCache::get(SGPropertyNode *node) return get(name, size, slant); } -SGPath -FGFontCache::getfntpath(const char *name) +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"); - } - - for (int i = 0; guifonts[i].name; i++) - _fonts[guifonts[i].name] = new fnt(guifonts[i].font); - - _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 +FGFontCache::getfntpath(const char *name) +{ + init(); SGPath path(_path); if (name && std::string(name) != "") { path.append(name); @@ -497,8 +561,33 @@ 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; } +bool FGFontCache::initializeFonts() +{ + static string fontext("txf"); + init(); + ulDir* fontdir = ulOpenDir(_path.c_str()); + if (!fontdir) + return false; + const ulDirEnt *dirEntry; + while ((dirEntry = ulReadDir(fontdir)) != 0) { + SGPath path(_path); + path.append(dirEntry->d_name); + if (path.extension() == fontext) { + fntTexFont* f = new fntTexFont; + 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; + } + } + ulCloseDir(fontdir); + return true; +} + // end of new_gui.cxx