<File
RelativePath="..\..\src\GUI\trackball.h">
</File>
+ <File
+ RelativePath="..\..\src\GUI\SafeTexFont.cxx">
+ </File>
+ <File
+ RelativePath="..\..\src\GUI\SafeTexFont.hxx">
+ </File>
+
</Filter>
<Filter
Name="Lib_Input"
trackball.c trackball.h \
AirportList.cxx AirportList.hxx \
property_list.cxx property_list.hxx \
- layout.cxx layout-props.cxx layout.hxx
+ layout.cxx layout-props.cxx layout.hxx \
+ SafeTexFont.cxx SafeTexFont.hxx
INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src
--- /dev/null
+// 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.
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+
+#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);
+}
--- /dev/null
+// 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 <string>
+
+#include <plib/fnt.h>
+
+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
#include "menubar.hxx"
#include "dialog.hxx"
+#include "SafeTexFont.hxx"
extern puFont FONT_HELVETICA_14;
extern puFont FONT_SANS_12B;
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;