Added Font::getVertical(float& ascender, float& descender) methods.

This commit is contained in:
Robert Osfield 2011-10-03 10:36:18 +00:00
parent db329cf943
commit bb48cef38c
3 changed files with 48 additions and 9 deletions

View File

@ -104,6 +104,10 @@ public:
/** Return true if this font provides vertical alignments and spacing or glyphs.*/ /** Return true if this font provides vertical alignments and spacing or glyphs.*/
virtual bool hasVertical() const; virtual bool hasVertical() const;
/** Get the ascender and descender sizes of the font where supported by the FontImplementation,
* return true on success, return false when not supported.*/
virtual bool getVerticalSize(float& ascender, float& descender) const { return _implementation ? _implementation->getVerticalSize(ascender, descender) : false; }
/** Set the margin around each glyph, /** Set the margin around each glyph,
* to ensure that texture filtering doesn't bleed adjacent glyph's into each other. * to ensure that texture filtering doesn't bleed adjacent glyph's into each other.
* Default margin is 1 texels.*/ * Default margin is 1 texels.*/
@ -236,6 +240,8 @@ public:
} }
Font* _facade; Font* _facade;
virtual bool getVerticalSize(float & ascender, float & descender) const { return false; }
}; };

View File

@ -299,7 +299,7 @@ osgText::Glyph* FreeTypeFont::getGlyph(const osgText::FontResolution& fontRes, u
setFontResolution(fontRes); setFontResolution(fontRes);
float coord_scale = 1.0f/(float(_currentRes.second)*64.0f); float coord_scale = getCoordScale();
// //
// GT: fix for symbol fonts (i.e. the Webdings font) as the wrong character are being // GT: fix for symbol fonts (i.e. the Webdings font) as the wrong character are being
@ -394,13 +394,15 @@ osgText::Glyph* FreeTypeFont::getGlyph(const osgText::FontResolution& fontRes, u
glyph->setVerticalAdvance((float)metrics->vertAdvance * coord_scale); glyph->setVerticalAdvance((float)metrics->vertAdvance * coord_scale);
#if 0 #if 0
OSG_NOTICE<<"getGlyph("<<charcode<<", "<<char(charcode)<<")"<<std::endl; OSG_NOTICE<<"getGlyph("<<charcode<<", "<<char(charcode)<<") _face="<<_face<<", _filename="<<_filename<<std::endl;
OSG_NOTICE<<" height="<<glyph->getHeight()<<std::endl; OSG_NOTICE<<" height="<<glyph->getHeight()<<std::endl;
OSG_NOTICE<<" width="<<glyph->getWidth()<<std::endl; OSG_NOTICE<<" width="<<glyph->getWidth()<<std::endl;
OSG_NOTICE<<" horizontalBearing="<<glyph->getHorizontalBearing()<<std::endl; OSG_NOTICE<<" horizontalBearing="<<glyph->getHorizontalBearing()<<std::endl;
OSG_NOTICE<<" horizontalAdvance="<<glyph->getHorizontalAdvance()<<std::endl; OSG_NOTICE<<" horizontalAdvance="<<glyph->getHorizontalAdvance()<<std::endl;
OSG_NOTICE<<" verticalBearing="<<glyph->getHorizontalBearing()<<std::endl; OSG_NOTICE<<" verticalBearing="<<glyph->getHorizontalBearing()<<std::endl;
OSG_NOTICE<<" verticalAdvance="<<glyph->getVerticalAdvance()<<std::endl; OSG_NOTICE<<" verticalAdvance="<<glyph->getVerticalAdvance()<<std::endl;
OSG_NOTICE<<" coord_scale = "<<coord_scale<<std::endl;
OSG_NOTICE<<" _face->units_per_EM = "<<_face->units_per_EM<<", scale="<<1.0f/float(_face->units_per_EM)<<std::endl;
#endif #endif
// cout << " in getGlyph() implementation="<<this<<" "<<_filename<<" facade="<<_facade<<endl; // cout << " in getGlyph() implementation="<<this<<" "<<_filename<<" facade="<<_facade<<endl;
@ -440,9 +442,7 @@ osgText::Glyph3D * FreeTypeFont::getGlyph3D(unsigned int charcode)
return 0; return 0;
} }
//float coord_scale = _freetype_scale/64.0f; float coord_scale = getCoordScale();
//float coord_scale = (1.0f/float(fontDPI))/64.0f;
float coord_scale = 1.0f/(float(_currentRes.second)*64.0f);
// ** init FreeType to describe the glyph // ** init FreeType to describe the glyph
FreeType::Char3DInfo char3d(_facade->getNumberCurveSamples()); FreeType::Char3DInfo char3d(_facade->getNumberCurveSamples());
@ -540,9 +540,7 @@ osg::Vec2 FreeTypeFont::getKerning(unsigned int leftcharcode,unsigned int rightc
return osg::Vec2(0.0f,0.0f); return osg::Vec2(0.0f,0.0f);
} }
//float coord_scale = _freetype_scale/64.0f; float coord_scale = getCoordScale();
//float coord_scale = 1.0f/64.0f;
float coord_scale = 1.0f/(float(_currentRes.second)*64.0f);
return osg::Vec2((float)kerning.x*coord_scale,(float)kerning.y*coord_scale); return osg::Vec2((float)kerning.x*coord_scale,(float)kerning.y*coord_scale);
} }
@ -552,3 +550,34 @@ bool FreeTypeFont::hasVertical() const
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(FreeTypeLibrary::instance()->getMutex()); OpenThreads::ScopedLock<OpenThreads::Mutex> lock(FreeTypeLibrary::instance()->getMutex());
return FT_HAS_VERTICAL(_face)!=0; return FT_HAS_VERTICAL(_face)!=0;
} }
bool FreeTypeFont::getVerticalSize(float & ascender, float & descender) const
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(FreeTypeLibrary::instance()->getMutex());
#if 1
if(_face->units_per_EM != 0)
{
float coord_scale = 1.0f/static_cast<float>(_face->units_per_EM);
ascender = static_cast<float>(_face->ascender) * coord_scale;
descender = static_cast<float>(_face->descender) * coord_scale;
return true;
}
else
{
return false;
}
#else
float coord_scale = getCoordScale();
ascender = static_cast<float>(_face->ascender) * coord_scale;
descender = static_cast<float>(_face->descender) * coord_scale;
return true;
#endif
}
float FreeTypeFont::getCoordScale() const
{
//float coord_scale = _freetype_scale/64.0f;
//float coord_scale = 1.0f/64.0f;
float coord_scale = 1.0f/(float(_currentRes.second)*64.0f);
return coord_scale;
}

View File

@ -41,6 +41,10 @@ public:
virtual bool hasVertical() const; virtual bool hasVertical() const;
virtual bool getVerticalSize(float & ascender, float & descender) const;
float getCoordScale() const;
protected: protected:
void init(); void init();