From f7a2567bca835b355ab16f80d9797c117d37b742 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Thu, 1 Nov 2001 15:13:31 +0000 Subject: [PATCH] Updates to osgText to fix a crash on ikart.tff font available under Linux, the bug was related to texel padding of the height not be accounted for in texture size calculation, but was used during populating the image data causing a mismatch. --- src/osgText/FTGLTextureFont.cpp | 20 ++++++------ src/osgText/FTGlyphContainer.cpp | 7 +++-- src/osgText/Text.cpp | 52 ++++++++++++++++---------------- 3 files changed, 41 insertions(+), 38 deletions(-) diff --git a/src/osgText/FTGLTextureFont.cpp b/src/osgText/FTGLTextureFont.cpp index 353708200..226e95d8d 100644 --- a/src/osgText/FTGLTextureFont.cpp +++ b/src/osgText/FTGLTextureFont.cpp @@ -46,14 +46,14 @@ bool FTGLTextureFont::MakeGlyphList() GetSize(); GLuint totalMem; - - if( textureHeight > maxTextSize) + + if( textureHeight > (maxTextSize-padding*2)) { - numTextures = static_cast( textureHeight / maxTextSize) + 1; + numTextures = static_cast( textureHeight / (maxTextSize-padding*2)) + 1; if( numTextures > 15) // FIXME numTextures = 15; - GLsizei heightRemain = NextPowerOf2( textureHeight % maxTextSize); + GLsizei heightRemain = NextPowerOf2( textureHeight % (maxTextSize-padding*2)); totalMem = ((maxTextSize * ( numTextures - 1)) + heightRemain) * textureWidth; glGenTextures( numTextures, (GLuint*)&glTextureID[0]); @@ -79,7 +79,8 @@ bool FTGLTextureFont::MakeGlyphList() } else { - textureHeight = NextPowerOf2( textureHeight); + + textureHeight = NextPowerOf2( textureHeight+padding*2); totalMem = textureWidth * textureHeight; glGenTextures( numTextures, (GLuint*)&glTextureID[0]); @@ -95,7 +96,6 @@ bool FTGLTextureFont::MakeGlyphList() return !err; } - unsigned int FTGLTextureFont::FillGlyphs( unsigned int glyphStart, GLuint id, GLsizei width, GLsizei height, unsigned char* textdata) { int currentTextX = padding; @@ -105,7 +105,7 @@ unsigned int FTGLTextureFont::FillGlyphs( unsigned int glyphStart, GLuint id, GL float currTextV = (float)padding / (float)height; unsigned int n; - + for( n = glyphStart; n <= numGlyphs; ++n) { FT_Glyph* ftGlyph = face.Glyph( n, FT_LOAD_NO_HINTING); @@ -136,6 +136,7 @@ unsigned int FTGLTextureFont::FillGlyphs( unsigned int glyphStart, GLuint id, GL } } + return n; } @@ -143,13 +144,14 @@ unsigned int FTGLTextureFont::FillGlyphs( unsigned int glyphStart, GLuint id, GL void FTGLTextureFont::GetSize() { //work out the max width. Most likely maxTextSize - textureWidth = NextPowerOf2( numGlyphs * glyphWidth); + textureWidth = NextPowerOf2( (numGlyphs * glyphWidth) + padding*2); if( textureWidth > maxTextSize) { textureWidth = maxTextSize; } - int h = static_cast( textureWidth / glyphWidth); + int h = static_cast( (textureWidth-padding*2) / glyphWidth); + textureHeight = (( numGlyphs / h) + 1) * glyphHeight; } diff --git a/src/osgText/FTGlyphContainer.cpp b/src/osgText/FTGlyphContainer.cpp index 53a95f79d..e46ed971b 100644 --- a/src/osgText/FTGlyphContainer.cpp +++ b/src/osgText/FTGlyphContainer.cpp @@ -33,14 +33,15 @@ bool FTGlyphContainer::Add( FTGlyph* tempGlyph) return true; } - float FTGlyphContainer::Advance( unsigned int index, unsigned int next) { unsigned int left = face->CharIndex( index); unsigned int right = face->CharIndex( next); + + float width = face->KernAdvance( left, right).x; - width += glyphs[left]->Advance(); + if (leftAdvance(); return width; } @@ -57,7 +58,7 @@ FT_Vector& FTGlyphContainer::render( unsigned int index, unsigned int next, FT_V if( !face->Error()) { - advance = glyphs[left]->Render( pen); + if (leftRender( pen); } kernAdvance.x = advance + kernAdvance.x; diff --git a/src/osgText/Text.cpp b/src/osgText/Text.cpp index 7ac139682..3ca1af5ac 100644 --- a/src/osgText/Text.cpp +++ b/src/osgText/Text.cpp @@ -30,9 +30,9 @@ using namespace osgText; // define the default paths to look for fonts. // note delimator is : for unix, ; for windows. #if defined(__linux) || defined(__FreeBSD__) || defined (__sgi) - static char* s_FontFilePath = "/usr/share/fonts/ttf:/usr/share/fonts/ttf/western:/usr/share/fonts/ttf/decoratives"; + static char* s_FontFilePath = ".:/usr/share/fonts/ttf:/usr/share/fonts/ttf/western:/usr/share/fonts/ttf/decoratives"; #elif defined(WIN32) - static char* s_FontFilePath = ".;"; + static char* s_FontFilePath = ".;C:/windows/fonts"; #else static char* s_FontFilePath = ".:"; #endif @@ -528,9 +528,9 @@ calcBounds(Vec3* min,Vec3* max) const if(!_init) return; - int h=_font->getHeight(); - int w=_font->getWidth(_text.c_str()); - int descender=_font->getDescender(); + float h=_font->getHeight(); + float w=_font->getWidth(_text.c_str()); + float descender=_font->getDescender(); min->set(0,descender,0); max->set(w,h + descender ,0); @@ -577,9 +577,9 @@ initAlignement(Vec3* min,Vec3* max) if(!_init) return; - int h=_font->getHeight(); - int w=_font->getWidth(_text.c_str()); - int descender=_font->getDescender(); + float h=_font->getHeight(); + float w=_font->getWidth(_text.c_str()); + float descender=_font->getDescender(); min->set(0,descender,0); max->set(w,h + descender ,0); @@ -591,33 +591,33 @@ initAlignement(Vec3* min,Vec3* max) switch(_alignement) { case LEFT_TOP: - _alignementPos.set(0,h,0); + _alignementPos.set(0.0,h,0.0); break; case LEFT_CENTER: - _alignementPos.set(0,h/2,0); + _alignementPos.set(0.0,h/2.0,0.0); break; case LEFT_BOTTOM: - _alignementPos.set(0,0,0); + _alignementPos.set(0.0,0.0,0.0); break; case CENTER_TOP: - _alignementPos.set(w/2,h,0); + _alignementPos.set(w/2.0,h,0.0); break; case CENTER_CENTER: - _alignementPos.set(w/2,h/2,0); + _alignementPos.set(w/2.0,h/2.0,0.0); break; case CENTER_BOTTOM: - _alignementPos.set(w/2,0,0); + _alignementPos.set(w/2.0,0.0,0.0); break; case RIGHT_TOP: - _alignementPos.set(w,h,0); + _alignementPos.set(w,h,0.0); break; case RIGHT_CENTER: - _alignementPos.set(w,h/2,0); + _alignementPos.set(w,h/2.0,0.0); break; case RIGHT_BOTTOM: - _alignementPos.set(w,0,0); + _alignementPos.set(w,0.0,0.0); break; }; _alignementPos=-_alignementPos; @@ -630,33 +630,33 @@ initAlignement(Vec3* min,Vec3* max) switch(_alignement) { case LEFT_TOP: - _alignementPos.set(0,h + descender,0); + _alignementPos.set(0.0,h + descender,0.0); break; case LEFT_CENTER: - _alignementPos.set(0,(max->y()-min->y()) /2 + descender,0); + _alignementPos.set(0.0,(max->y()-min->y()) /2.0 + descender,0.0); break; case LEFT_BOTTOM: - _alignementPos.set(0,descender,0); + _alignementPos.set(0.0,descender,0.0); break; case CENTER_TOP: - _alignementPos.set(w/2,h + descender,0); + _alignementPos.set(w/2.0,h + descender,0.0); break; case CENTER_CENTER: - _alignementPos.set(w/2,(max->y()-min->y()) /2 + descender,0); + _alignementPos.set(w/2.0,(max->y()-min->y()) /2.0 + descender,0.0); break; case CENTER_BOTTOM: - _alignementPos.set(w/2,descender,0); + _alignementPos.set(w/2.0,descender,0.0); break; case RIGHT_TOP: - _alignementPos.set(w,h + descender,0); + _alignementPos.set(w,h + descender,0.0); break; case RIGHT_CENTER: - _alignementPos.set(w,(max->y()-min->y()) /2 + descender,0); + _alignementPos.set(w,(max->y()-min->y()) /2.0 + descender,0.0); break; case RIGHT_BOTTOM: - _alignementPos.set(w,descender,0); + _alignementPos.set(w,descender,0.0); break; }; _alignementPos=-_alignementPos;