-
-
-\f
-////////////////////////////////////////////////////////////////////////
-// FGColor class.
-////////////////////////////////////////////////////////////////////////
-
-void
-FGColor::print() const {
- std::cerr << "red=" << _red << ", green=" << _green
- << ", blue=" << _blue << ", alpha=" << _alpha << std::endl;
-}
-
-bool
-FGColor::merge(const SGPropertyNode *node)
-{
- if (!node)
- return false;
-
- bool dirty = false;
- const SGPropertyNode * n;
- if ((n = node->getNode("red")))
- _red = n->getFloatValue(), dirty = true;
- if ((n = node->getNode("green")))
- _green = n->getFloatValue(), dirty = true;
- if ((n = node->getNode("blue")))
- _blue = n->getFloatValue(), dirty = true;
- if ((n = node->getNode("alpha")))
- _alpha = n->getFloatValue(), dirty = true;
- return dirty;
-}
-
-bool
-FGColor::merge(const FGColor *color)
-{
- bool dirty = false;
- if (color && color->_red >= 0.0)
- _red = color->_red, dirty = true;
- if (color && color->_green >= 0.0)
- _green = color->_green, dirty = true;
- if (color && color->_blue >= 0.0)
- _blue = color->_blue, dirty = true;
- if (color && color->_alpha >= 0.0)
- _alpha = color->_alpha, dirty = true;
- return dirty;
-}
-
-
-
-\f
-////////////////////////////////////////////////////////////////////////
-// FGFontCache class.
-////////////////////////////////////////////////////////////////////////
-
-namespace
-{
-struct GuiFont
-{
- const char *name;
- puFont *font;
- struct Predicate
- : public std::unary_function<const GuiFont, bool>
- {
- 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 },
- { "TIMES_10", &PUFONT_TIMES_ROMAN_10 },
- { "TIMES_24", &PUFONT_TIMES_ROMAN_24 },
- { "HELVETICA_10", &PUFONT_HELVETICA_10 },
- { "HELVETICA_12", &PUFONT_HELVETICA_12 },
- { "HELVETICA_14", &FONT_HELVETICA_14 },
- { "HELVETICA_18", &PUFONT_HELVETICA_18 },
- { "SANS_12B", &FONT_SANS_12B }
-};
-
-const GuiFont* guifontsEnd = &guifonts[sizeof(guifonts)/ sizeof(guifonts[0])];
-}
-
-FGFontCache::FGFontCache() :
- _initialized(false)
-{
-}
-
-FGFontCache::~FGFontCache()
-{
- 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)
-{
- 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<fntFont *>(f->texfont), size, slant);
- } else {
- f->pufont = guifonts[0].font;
- }
- _puFonts[fntParams] = f;
- return f;
-}
-
-puFont *
-FGFontCache::get(const char *name, float size, float slant)
-{
- return getfnt(name, size, slant)->pufont;
-}
-
-fntTexFont *
-FGFontCache::getTexFont(const char *name, float size, float slant)
-{
- return getfnt(name, size, slant)->texfont;
-}
-
-puFont *
-FGFontCache::get(SGPropertyNode *node)
-{
- if (!node)
- return get("Helvetica.txf", 15.0, 0.0);
-
- const char *name = node->getStringValue("name", "Helvetica.txf");
- float size = node->getFloatValue("size", 15.0);
- float slant = node->getFloatValue("slant", 0.0);
-
- return get(name, size, slant);
-}
-
-void FGFontCache::init()
-{
- 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);
- if (path.exists())
- return path;
- }
-
- 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;
-}
-