From 6cd9794b0cc9a5fd8310cfff31f7c36351936000 Mon Sep 17 00:00:00 2001 From: timoore Date: Tue, 6 May 2008 21:31:01 +0000 Subject: [PATCH] Add a subclass of fntTexFont that defers font loading Loading is deferred until the first render so that it has a chance of happening in the proper graphics context. --- projects/VC7.1/FlightGear.vcproj | 7 +++ src/GUI/Makefile.am | 3 +- src/GUI/SafeTexFont.cxx | 76 ++++++++++++++++++++++++++++++++ src/GUI/SafeTexFont.hxx | 64 +++++++++++++++++++++++++++ src/GUI/new_gui.cxx | 3 +- 5 files changed, 151 insertions(+), 2 deletions(-) create mode 100644 src/GUI/SafeTexFont.cxx create mode 100644 src/GUI/SafeTexFont.hxx diff --git a/projects/VC7.1/FlightGear.vcproj b/projects/VC7.1/FlightGear.vcproj index 8dd557f5d..5d26d2f29 100755 --- a/projects/VC7.1/FlightGear.vcproj +++ b/projects/VC7.1/FlightGear.vcproj @@ -1806,6 +1806,13 @@ + + + + + +#include +#include + +#include "SafeTexFont.hxx" + +using namespace flightgear; + +int SafeTexFont::load(const char *fname, GLenum mag, GLenum min) +{ + struct stat buf; + if (stat(fname, &buf) == -1) { + _status = ERROR; + return FNT_FALSE; + } + _name = fname; + _mag = mag; + _min = min; + return FNT_TRUE; +} + +bool SafeTexFont::ensureTextureLoaded() +{ + if (_status != ERROR) { + if (_status == LOADED) { + return true; + } else { + int loadStatus = fntTexFont::load(_name.c_str(), _mag, _min); + if (loadStatus == FNT_TRUE) { + _status = LOADED; + return true; + } else { + _status = ERROR; + _error = ulGetError(); + return false; + } + } + } else { + return false; + } +} + +void SafeTexFont::begin() +{ + if (ensureTextureLoaded()) + fntTexFont::begin(); +} + +void SafeTexFont::putch(sgVec3 curpos, float pointsize, float italic, char c) +{ + if (ensureTextureLoaded()) + fntTexFont::putch(curpos, pointsize, italic, c); +} + +void SafeTexFont::puts(sgVec3 curpos, float pointsize, float italic, + const char *s) +{ + if (ensureTextureLoaded()) + fntTexFont::puts(curpos, pointsize, italic, s); +} diff --git a/src/GUI/SafeTexFont.hxx b/src/GUI/SafeTexFont.hxx new file mode 100644 index 000000000..c1ca71801 --- /dev/null +++ b/src/GUI/SafeTexFont.hxx @@ -0,0 +1,64 @@ +// Copyright (C) 2008 Tim Moore +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +#ifndef FLIGHTGEAR_SAFETEXFONT_HXX +#define FLIGHTGEAR_SAFETEXFONT_HXX 1 + +#include + +#include + +namespace flightgear +{ +/** + * Subclass of plib's fntTexFont that defers the loading of the font + * texture until just before rendering, insuring that it happens in + * the proper graphics context. + */ +class SafeTexFont : public fntTexFont +{ +public: + SafeTexFont() : _status(NOT_LOADED) {} + /** Load the texture for this font. + * @param mag OpenGL texture magnification; default is GL_NEAREST + * @param min OpenGL texture minification; default is + * GL_LINEAR_MIPMAP_LINEAR. + * @return the plib value FNT_FALSE if the font file doesn't + * exist; otherwise returns FNT_TRUE. + */ + int load(const char *fname, GLenum mag = GL_NEAREST, + GLenum min = GL_LINEAR_MIPMAP_LINEAR); + void begin(); + void putch(sgVec3 curpos, float pointsize, float italic, char c); + void puts(sgVec3 curpos, float pointsize, float italic, const char *s); + enum FontStatus + { + ERROR = -1, + NOT_LOADED = 0, + LOADED = 1 + }; + FontStatus getStatus() { return _status; } + std::string& fntError() { return _error; } +protected: + bool ensureTextureLoaded(); + std::string _name; + std::string _error; + GLenum _mag; + GLenum _min; + FontStatus _status; +}; +} +#endif diff --git a/src/GUI/new_gui.cxx b/src/GUI/new_gui.cxx index 633d32b3e..ce98f5eb7 100644 --- a/src/GUI/new_gui.cxx +++ b/src/GUI/new_gui.cxx @@ -12,6 +12,7 @@ #include "menubar.hxx" #include "dialog.hxx" +#include "SafeTexFont.hxx" extern puFont FONT_HELVETICA_14; extern puFont FONT_SANS_12B; @@ -432,7 +433,7 @@ FGFontCache::getfnt(const char *name, float size, float slant) SGPath path = getfntpath(name); fnt *f = new fnt(); - f->texfont = new fntTexFont; + f->texfont = new flightgear::SafeTexFont; if (f->texfont->load((char *)path.c_str())) { f->pufont = new puFont; -- 2.39.5