OpenSceneGraph/src/osgText/Font.cpp

394 lines
7.6 KiB
C++
Raw Normal View History

2001-11-12 18:04:57 +08:00
/* --------------------------------------------------------------------------
*
* openscenegraph textLib / FTGL
2001-11-12 18:04:57 +08:00
*
* --------------------------------------------------------------------------
*
* prog: max rheiner;mrn@paus.ch
* date: 4/25/2001 (m/d/y)
2001-11-12 18:04:57 +08:00
*
* ----------------------------------------------------------------------------
*
* --------------------------------------------------------------------------
*/
#include <osgText/Font>
#include <osg/Notify>
2001-11-12 18:04:57 +08:00
#include <osgDB/FileUtils>
#include "FTFace.h"
#include "FTGLBitmapFont.h"
#include "FTGLPixmapFont.h"
#include "FTGLOutlineFont.h"
#include "FTGLPolygonFont.h"
#include "FTGLTextureFont.h"
using namespace osg;
using namespace osgText;
std::string findFontFile(const std::string& str)
{
// try looking in OSGFILEPATH etc first for fonts.
std::string filename = osgDB::findDataFile(str);
if (!filename.empty()) return std::string(filename);
2001-11-12 18:04:57 +08:00
2002-05-10 23:42:27 +08:00
static osgDB::FilePathList s_FontFilePath;
static bool initialized = false;
if (!initialized)
2001-11-12 18:04:57 +08:00
{
initialized = true;
#if defined(WIN32)
osgDB::Registry::convertStringPathIntoFilePathList(
".;C:/winnt/fonts;C:/windows/fonts",
s_FontFilePath);
char *ptr;
if ((ptr = getenv( "windir" )))
{
s_FontFilePath.push_back(ptr);
}
#else
osgDB::Registry::convertStringPathIntoFilePathList(
".:/usr/share/fonts/ttf:/usr/share/fonts/ttf/western:/usr/share/fonts/ttf/decoratives",
s_FontFilePath);
#endif
2001-11-12 18:04:57 +08:00
}
filename = osgDB::findFileInPath(str,s_FontFilePath);
if (!filename.empty()) return filename;
2001-12-24 22:12:38 +08:00
osg::notify(osg::WARN)<<"Warning: font file \""<<str<<"\" not found."<<std::endl;
2001-11-12 18:04:57 +08:00
return std::string();
}
///////////////////////////////////////////////////////////////////////////////
// Font
Font::
Font()
{
_init=false;
_font=NULL;
_created=false;
2001-11-12 18:04:57 +08:00
_pointSize=14;
_textureSize=0;
_res=72;
2001-11-12 18:04:57 +08:00
}
bool Font::
init(const std::string& font)
{
_font=NULL;
_created=false;
2001-11-12 18:04:57 +08:00
open(font);
2001-11-12 18:04:57 +08:00
if(_font!=NULL)
return true;
else
return false;
2001-11-12 18:04:57 +08:00
}
Font::
~Font()
{
clear();
2001-11-12 18:04:57 +08:00
}
void Font::copyAndInvalidate(Font &dest)
{
// delete destination's font object
delete dest._font;
// copy local data to destination object
dest._init = _init;
dest._created = _created;
dest._font = _font;
dest._fontName = _fontName;
dest._pointSize = _pointSize;
dest._res = _res;
dest._textureSize = _textureSize;
// invalidate this object
_init = false;
_created = false;
_font = 0;
_fontName = std::string();
}
2001-11-12 18:04:57 +08:00
bool Font::
open(const std::string& font)
{
clear();
2001-11-12 18:04:57 +08:00
std::string filename = findFontFile(font);
if (filename.empty()) return false;
2001-11-12 18:04:57 +08:00
_font=createFontObj();
if( _font!=NULL && _font->Open(filename.c_str()) )
{
_init=true;
_fontName=font;
return true;
}
else
return false;
2001-11-12 18:04:57 +08:00
}
bool Font::open(const char* font)
{
return open(std::string(font));
}
2001-11-12 18:04:57 +08:00
bool Font::
create(osg::State& state,int pointSize,unsigned int res)
2001-11-12 18:04:57 +08:00
{
_pointSize=pointSize;
_res=res;
2001-11-12 18:04:57 +08:00
return create(state);
2001-11-12 18:04:57 +08:00
}
bool Font::create(osg::State& state)
2001-11-12 18:04:57 +08:00
{
if(_init)
{
if(_font->Created(state.getContextID()))
return true;
if(_font->FaceSize(_pointSize,_res,state.getContextID()))
{
_created=true;
return true;
}
else
return false;
}
else
return false;
2001-11-12 18:04:57 +08:00
}
void Font::output(osg::State& state,const char* text) const
2001-11-12 18:04:57 +08:00
{
if(_created)
_font->render(text,state.getContextID());
else
{
// ahhhh, this is bit doddy, the draw is potentially
// modifying the text object, this isn't thread safe.
Font* this_non_const = const_cast<Font*>(this);
this_non_const->create(state,_pointSize);
}
2001-11-12 18:04:57 +08:00
}
void Font::clear()
2001-11-12 18:04:57 +08:00
{
_init=false;
if(_font)
{
osgDelete _font;
_font=NULL;
}
_fontName="";
2001-11-12 18:04:57 +08:00
}
float Font::
getWidth(const char* text) const
{
if(_init && _created)
return _font->Advance(text);
else
return -1;
2001-11-12 18:04:57 +08:00
}
int Font::
getHeight() const
{
if(_init && _created)
return _pointSize;
else
return -1;
2001-11-12 18:04:57 +08:00
}
int Font::
getDescender() const
{
if(_init && _created)
return _font->Descender();
else
return -1;
2001-11-12 18:04:57 +08:00
}
int Font::
getAscender() const
{
if(_init && _created)
return _font->Ascender();
else
return -1;
2001-11-12 18:04:57 +08:00
}
// Font
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// BitmapFont
BitmapFont::
BitmapFont(const std::string& font,
int point_size):
2001-11-12 18:04:57 +08:00
RasterFont()
{
if(init(font))
{
}
_pointSize=point_size;
2001-11-12 18:04:57 +08:00
}
FTFont* BitmapFont::
createFontObj(void)
{
return (FTFont*)(osgNew FTGLBitmapFont);
2001-11-12 18:04:57 +08:00
}
2001-11-12 18:04:57 +08:00
// BitmapFont
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// PixmapFont
PixmapFont::
PixmapFont(const std::string& font,
int point_size):
2001-11-12 18:04:57 +08:00
RasterFont(font)
{
if(init(font))
{
}
_pointSize=point_size;
2001-11-12 18:04:57 +08:00
}
2001-11-12 18:04:57 +08:00
FTFont* PixmapFont::
createFontObj(void)
{
return (FTFont*)(osgNew FTGLPixmapFont);
2001-11-12 18:04:57 +08:00
}
2001-11-12 18:04:57 +08:00
// PixmapFont
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// TextureFont
2001-11-12 18:04:57 +08:00
TextureFont::
TextureFont(const std::string& font,
int point_size):
2001-11-12 18:04:57 +08:00
RasterFont(font)
{
_textureSize=0;
if(init(font))
{
}
_pointSize=point_size;
}
TextureFont::
TextureFont(const std::string& font,
int point_size,
int textureSize ):
RasterFont(font)
{
_textureSize=textureSize;
if(init(font))
{
}
_pointSize=point_size;
2001-11-12 18:04:57 +08:00
}
2001-11-12 18:04:57 +08:00
2001-11-12 18:04:57 +08:00
FTFont* TextureFont::
createFontObj(void)
{
return (FTFont*)(osgNew FTGLTextureFont(_textureSize));
2001-11-12 18:04:57 +08:00
}
// TextureFont
2001-11-12 18:04:57 +08:00
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// _FTGLOutlineFont
OutlineFont::
OutlineFont(const std::string& font,
int point_size,
double precision):
2001-11-12 18:04:57 +08:00
VectorFont(font)
{
if(init(font))
{
}
_pointSize=point_size;
_precision=precision;
2001-11-12 18:04:57 +08:00
}
2001-11-12 18:04:57 +08:00
FTFont* OutlineFont::
createFontObj(void)
{
return (FTFont*)(osgNew FTGLOutlineFont);
2001-11-12 18:04:57 +08:00
}
2001-11-12 18:04:57 +08:00
// _FTGLOutlineFont
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// PolygonFont
PolygonFont::
PolygonFont(const std::string& font,
int point_size,
double precision):
2001-11-12 18:04:57 +08:00
VectorFont(font)
{
if(init(font))
{
}
_pointSize=point_size;
_precision=precision;
2001-11-12 18:04:57 +08:00
}
PolygonFont::
PolygonFont(const char* font,
int point_size,
double precision):
VectorFont(std::string(font))
{
if(init(font))
{
}
_pointSize=point_size;
_precision=precision;
}
2001-11-12 18:04:57 +08:00
FTFont* PolygonFont::
createFontObj(void)
{
return (FTFont*)(osgNew FTGLPolygonFont);
2001-11-12 18:04:57 +08:00
}
2001-11-12 18:04:57 +08:00
// PolygonFont
///////////////////////////////////////////////////////////////////////////////