I spent a few moments digging into the crash I was having...looks like
a race condition in DefaultFont* DefaultFont::instance(). I wasn't
sure about the best course, but I thought the simplest solution was to
wrap that call with a mutex, which I did. After doing that, no more
crashes when I run --mt 10 in Release mode. I've attached the changes
defaultfont.h/.cpp.
BUT...I still get crashes in debug mode @ --mt 10 The crashes are
easily reproduced. I left the code running for quite a while in
Release mode, didn't crash. Debug dies immediatly.
I've attached the changes defaultfont.h/.cpp.
Here's a call stack from the new crashes...in void
Font::GlyphTexture::apply(osg::State& state) I noticed that the
elements in the _glyphs container had bad _font objects...these _font
objects had addresses of 0xcdcdcdcd. Not sure at what point things
went off into the weeds.
Stack trace from most recent crash:
>
> osgTextd.dll!std::_Vector_const_iterator<osg::ref_ptr<osgText::Font::Glyph>,std::allocator<osg::ref_ptr<osgText::Font::Glyph>
> >::operator++() Line 117 + 0x33 bytes C++
osgTextd.dll!osgText::Font::GlyphTexture::apply(osg::State &
state={...}) Line 653 + 0x8 bytes C++
osgd.dll!osg::State::applyAttribute(const osg::StateAttribute *
attribute=0x0195c730, osg::State::AttributeStack & as={...}) Line
1158 + 0x13 bytes C++
osgd.dll!osg::State::applyTextureAttribute(unsigned int unit=0,
const osg::StateAttribute * attribute=0x0195c730) Line 337 + 0x10
bytes C++
osgTextd.dll!osgText::Text::renderOnlyForegroundText(osg::State &
state={...}, const osg::Vec4f & colorMultiplier={...}) Line 1971 +
0x1d bytes C++
osgTextd.dll!osgText::Text::drawImplementation(osg::State &
state={...}, const osg::Vec4f & colorMultiplier={...}) Line 1587 C++
osgTextd.dll!osgText::Text::drawImplementation(osg::RenderInfo &
renderInfo={...}) Line 1471 C++
osgd.dll!osg::Drawable::draw(osg::RenderInfo & renderInfo={...})
Line 868 + 0x13 bytes C++
osgUtild.dll!osgUtil::RenderLeaf::render(osg::RenderInfo &
renderInfo={...}, osgUtil::RenderLeaf * previous=0x09837b28) Line 60
+ 0x19 bytes C++
osgUtild.dll!osgUtil::RenderBin::drawImplementation(osg::RenderInfo
& renderInfo={...}, osgUtil::RenderLeaf * & previous=0x09837b28) Line
408 + 0x19 bytes C++
osgUtild.dll!osgUtil::RenderBin::draw(osg::RenderInfo &
renderInfo={...}, osgUtil::RenderLeaf * & previous=0x09837b28) Line
373 + 0x17 bytes C++
osgUtild.dll!osgUtil::RenderBin::drawImplementation(osg::RenderInfo
& renderInfo={...}, osgUtil::RenderLeaf * & previous=0x09837b28) Line
458 + 0x35 bytes C++
osgUtild.dll!osgUtil::RenderStage::drawImplementation(osg::RenderInfo
& renderInfo={...}, osgUtil::RenderLeaf * & previous=0x09837b28) Line
1053 C++
osgUtild.dll!osgUtil::RenderBin::draw(osg::RenderInfo &
renderInfo={...}, osgUtil::RenderLeaf * & previous=0x09837b28) Line
373 + 0x17 bytes C++
osgUtild.dll!osgUtil::RenderStage::drawInner(osg::RenderInfo &
renderInfo={...}, osgUtil::RenderLeaf * & previous=0x09837b28, bool &
doCopyTexture=false) Line 722 C++
osgUtild.dll!osgUtil::RenderStage::draw(osg::RenderInfo &
renderInfo={...}, osgUtil::RenderLeaf * & previous=0x09837b28) Line
913 + 0x1b bytes C++
osgUtild.dll!osgUtil::SceneView::draw() Line 1456 + 0x34 bytes C++
osgViewerd.dll!osgViewer::Renderer::draw() Line 382 + 0xf bytes
C++
osgViewerd.dll!osgViewer::Renderer::operator()(osg::GraphicsContext
* context=0x01926430) Line 573 C++
osgd.dll!osg::GraphicsContext::runOperations() Line 671 + 0x33 bytes
C++
osgd.dll!osg::RunOperations::operator()(osg::GraphicsContext *
context=0x01926430) Line 135 C++
osgd.dll!osg::GraphicsOperation::operator()(osg::Object *
object=0x01926430) Line 50 + 0x19 bytes C++
osgd.dll!osg::OperationThread::run() Line 413 + 0x26 bytes C++
osgd.dll!osg::GraphicsThread::run() Line 40 C++
OpenThreadsd.dll!OpenThreads::ThreadPrivateActions::StartThread(void
* data=0x018f9740) Line 106 + 0xf bytes C++
msvcr80d.dll!__beginthreadex() + 0x221 bytes
msvcr80d.dll!__beginthreadex() + 0x1c7 bytes
[EMAIL PROTECTED]@12() + 0xe bytes
[EMAIL PROTECTED]() + 0x23 bytes
Here's the debug call stack of the original crash:
osgTextd.dll!osg::ref_ptr<osg::StateSet>::get() Line 71 + 0x11 bytes C++
osgTextd.dll!osgText::Font::getStateSet() Line 97 + 0x19 bytes C++
> osgTextd.dll!osgText::Text::Text() Line 61 + 0xc bytes C++
osgtest.exe!UpdateTextOperation::load() Line 556 + 0x2e bytes C++
osgtest.exe!UpdateTextOperation::operator()(osg::Object *
callingObject=0x00000000) Line 499 C++
osgd.dll!osg::OperationThread::run() Line 413 + 0x26 bytes C++
OpenThreadsd.dll!OpenThreads::ThreadPrivateActions::StartThread(void *
data=0x0174cdb8) Line 106 + 0xf bytes C++
msvcr80d.dll!_callthreadstartex() Line 348 + 0xf bytes C
msvcr80d.dll!_threadstartex(void * ptd=0x0174da48) Line 331 C
kernel32.dll!7c80b683()
[Frames below may be incorrect and/or missing, no symbols loaded for
kernel32.dll]
On 9/2/07, Robert Osfield <[EMAIL PROTECTED]> wrote:
> Hi Sherman,
>
> On 9/1/07, sherman wilcox <[EMAIL PROTECTED]> wrote:
> > If I run with --mt 1 it runs for a bit....however if I change that to --mt
> > 10 it crashes immediately. Tried this on an old dual-proc and a new
> > quad-core system. Here's the stack from the quad-core:
> >
> > > osgText.dll!osgText::Text::Text() Line 61 + 0x5 bytes C++
> > osgtest.exe!UpdateTextOperation::load() Line 556 + 0x24
> > bytes C++
> > osgtest.exe!UpdateTextOperation::operator()(osg::Object *
> > callingObject=0x00000000) Line 498 + 0x5 bytes C++
> > osg.dll!osg::OperationThread::run() Line 416 C++
> >
> > OpenThreads.dll!OpenThreads::ThreadPrivateActions::StartThread(void
> > * data=0x00f7cda8) Line 120 C++
> > msvcr80.dll!__endthreadex() + 0x3b bytes
> > msvcr80.dll!__endthreadex () + 0xc7 bytes
> > [EMAIL PROTECTED]@12() + 0xe bytes
> > [EMAIL PROTECTED] () + 0x23 bytes
> >
> > I'm grabbed a copy out of SVN about 30 minutes after you posted. So, I
> > believe I have the right code. If you want me to perform any further
> > testing/changes just yell.
>
> Originally I was getting crashes in the Text constructor to the lack
> of thread safety on Node,Drawable and StateSet addParent. This is now
> mutexed so "shouldn't" be giving problems.. at least I don't get
> problems with it any more.
>
> I'll test it once again to see if I can knock it over. Perhaps its a
> different problems to the addParent. Could you try with a debug
> version so we can get where abouts within the Text constructor its
> crashing.
>
> Thanks,
> Robert.
> _______________________________________________
> osg-users mailing list
> [email protected]
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library 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
* OpenSceneGraph Public License for more details.
*/
#include "DefaultFont.h"
#include <osg/Notify>
using namespace osgText;
OpenThreads::Mutex DefaultFont::_mutex;
DefaultFont::DefaultFont()
{
_minFilterHint = osg::Texture::LINEAR_MIPMAP_LINEAR;
_magFilterHint = osg::Texture::NEAREST;
constructGlyphs();
}
DefaultFont::~DefaultFont()
{
}
DefaultFont* DefaultFont::instance()
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
static osg::ref_ptr<DefaultFont> s_defaultFont = new DefaultFont;
return s_defaultFont.get();
}
void DefaultFont::setSize(unsigned int, unsigned int)
{
osg::notify(osg::INFO)<<"DefaultFont::setSize(,) call is
ignored."<<std::endl;
}
Font::Glyph* DefaultFont::getGlyph(unsigned int charcode)
{
if (_sizeGlyphMap.empty()) return 0;
SizeGlyphMap::iterator itr = _sizeGlyphMap.find(SizePair(_width,_height));
if (itr==_sizeGlyphMap.end())
{
// no font found of correct size, will need to find the nearest.
itr = _sizeGlyphMap.begin();
int mindeviation = abs((int)_width-(int)itr->first.first)+
abs((int)_height-(int)itr->first.second);
SizeGlyphMap::iterator sitr=itr;
++sitr;
for(;
sitr!=_sizeGlyphMap.end();
++sitr)
{
int deviation = abs((int)_width-(int)sitr->first.first)+
abs((int)_height-(int)sitr->first.second);
if (deviation<mindeviation)
{
mindeviation = deviation;
itr = sitr;
}
}
}
// new find the glyph for the required charcode.
GlyphMap& glyphmap = itr->second;
GlyphMap::iterator gitr = glyphmap.find(charcode);
if (gitr!=glyphmap.end()) return gitr->second.get();
else return 0;
}
osg::Vec2 DefaultFont::getKerning(unsigned int,unsigned int, KerningType)
{
// no kerning on default font.
return osg::Vec2(0.0f,0.0f);
}
bool DefaultFont::hasVertical() const
{
return true;
}
void DefaultFont::constructGlyphs()
{
static GLubyte rasters[][12] = { // ascii symbols 32-127, small font
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00},
{0x00, 0x00, 0x08, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14,
0x00},
{0x00, 0x00, 0x28, 0x28, 0x7e, 0x14, 0x14, 0x14, 0x3f, 0x0a, 0x0a,
0x00},
{0x00, 0x00, 0x08, 0x1c, 0x22, 0x02, 0x1c, 0x20, 0x22, 0x1c, 0x08,
0x00},
{0x00, 0x00, 0x02, 0x45, 0x22, 0x10, 0x08, 0x04, 0x22, 0x51, 0x20,
0x00},
{0x00, 0x00, 0x3b, 0x44, 0x4a, 0x49, 0x30, 0x10, 0x20, 0x20, 0x18,
0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08,
0x00},
{0x04, 0x08, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x04,
0x00},
{0x10, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x10,
0x00},
{0x00, 0x00, 0x00, 0x00, 0x36, 0x1c, 0x7f, 0x1c, 0x36, 0x00, 0x00,
0x00},
{0x00, 0x00, 0x08, 0x08, 0x08, 0x7f, 0x08, 0x08, 0x08, 0x00, 0x00,
0x00},
{0x00, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00},
{0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00},
{0x00, 0x00, 0x00, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00,
0x00},
{0x00, 0x00, 0x1c, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x1c,
0x00},
{0x00, 0x00, 0x3e, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x38, 0x08,
0x00},
{0x00, 0x00, 0x3e, 0x20, 0x10, 0x08, 0x04, 0x02, 0x02, 0x22, 0x1c,
0x00},
{0x00, 0x00, 0x1c, 0x22, 0x02, 0x02, 0x0c, 0x02, 0x02, 0x22, 0x1c,
0x00},
{0x00, 0x00, 0x0e, 0x04, 0x3e, 0x24, 0x14, 0x14, 0x0c, 0x0c, 0x04,
0x00},
{0x00, 0x00, 0x1c, 0x22, 0x02, 0x02, 0x3c, 0x20, 0x20, 0x20, 0x3e,
0x00},
{0x00, 0x00, 0x1c, 0x22, 0x22, 0x22, 0x3c, 0x20, 0x20, 0x10, 0x0c,
0x00},
{0x00, 0x00, 0x10, 0x10, 0x08, 0x08, 0x04, 0x04, 0x02, 0x22, 0x3e,
0x00},
{0x00, 0x00, 0x1c, 0x22, 0x22, 0x22, 0x1c, 0x22, 0x22, 0x22, 0x1c,
0x00},
{0x00, 0x00, 0x18, 0x04, 0x02, 0x02, 0x1e, 0x22, 0x22, 0x22, 0x1c,
0x00},
{0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
0x00},
{0x00, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
0x00},
{0x00, 0x00, 0x04, 0x08, 0x10, 0x20, 0x10, 0x08, 0x04, 0x00, 0x00,
0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x00, 0x00,
0x00},
{0x00, 0x00, 0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x00, 0x00,
0x00},
{0x00, 0x00, 0x08, 0x00, 0x08, 0x08, 0x04, 0x02, 0x02, 0x22, 0x1c,
0x00},
{0x00, 0x00, 0x1c, 0x20, 0x4e, 0x55, 0x55, 0x55, 0x4d, 0x21, 0x1e,
0x00},
{0x00, 0x00, 0x77, 0x22, 0x3e, 0x22, 0x14, 0x14, 0x08, 0x08, 0x18,
0x00},
{0x00, 0x00, 0x7e, 0x21, 0x21, 0x21, 0x3e, 0x21, 0x21, 0x21, 0x7e,
0x00},
{0x00, 0x00, 0x1e, 0x21, 0x40, 0x40, 0x40, 0x40, 0x40, 0x21, 0x1e,
0x00},
{0x00, 0x00, 0x7c, 0x22, 0x21, 0x21, 0x21, 0x21, 0x21, 0x22, 0x7c,
0x00},
{0x00, 0x00, 0x7f, 0x21, 0x20, 0x24, 0x3c, 0x24, 0x20, 0x21, 0x7f,
0x00},
{0x00, 0x00, 0x78, 0x20, 0x20, 0x24, 0x3c, 0x24, 0x20, 0x21, 0x7f,
0x00},
{0x00, 0x00, 0x1e, 0x21, 0x41, 0x47, 0x40, 0x40, 0x40, 0x21, 0x1e,
0x00},
{0x00, 0x00, 0x77, 0x22, 0x22, 0x22, 0x3e, 0x22, 0x22, 0x22, 0x77,
0x00},
{0x00, 0x00, 0x3e, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x3e,
0x00},
{0x00, 0x00, 0x38, 0x44, 0x44, 0x04, 0x04, 0x04, 0x04, 0x04, 0x1e,
0x00},
{0x00, 0x00, 0x73, 0x22, 0x24, 0x38, 0x28, 0x24, 0x24, 0x22, 0x73,
0x00},
{0x00, 0x00, 0x7f, 0x11, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7c,
0x00},
{0x00, 0x00, 0x77, 0x22, 0x22, 0x2a, 0x2a, 0x36, 0x36, 0x22, 0x63,
0x00},
{0x00, 0x00, 0x72, 0x22, 0x26, 0x26, 0x2a, 0x32, 0x32, 0x22, 0x67,
0x00},
{0x00, 0x00, 0x1c, 0x22, 0x41, 0x41, 0x41, 0x41, 0x41, 0x22, 0x1c,
0x00},
{0x00, 0x00, 0x78, 0x20, 0x20, 0x20, 0x3e, 0x21, 0x21, 0x21, 0x7e,
0x00},
{0x00, 0x1b, 0x1c, 0x22, 0x41, 0x41, 0x41, 0x41, 0x41, 0x22, 0x1c,
0x00},
{0x00, 0x00, 0x73, 0x22, 0x24, 0x24, 0x3e, 0x21, 0x21, 0x21, 0x7e,
0x00},
{0x00, 0x00, 0x3e, 0x41, 0x01, 0x01, 0x3e, 0x40, 0x40, 0x41, 0x3e,
0x00},
{0x00, 0x00, 0x1c, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x49, 0x7f,
0x00},
{0x00, 0x00, 0x1c, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x77,
0x00},
{0x00, 0x00, 0x08, 0x08, 0x14, 0x14, 0x14, 0x22, 0x22, 0x22, 0x77,
0x00},
{0x00, 0x00, 0x14, 0x14, 0x2a, 0x2a, 0x2a, 0x22, 0x22, 0x22, 0x77,
0x00},
{0x00, 0x00, 0x77, 0x22, 0x14, 0x14, 0x08, 0x14, 0x14, 0x22, 0x77,
0x00},
{0x00, 0x00, 0x1c, 0x08, 0x08, 0x08, 0x14, 0x14, 0x22, 0x22, 0x77,
0x00},
{0x00, 0x00, 0x7f, 0x21, 0x10, 0x10, 0x08, 0x04, 0x04, 0x42, 0x7f,
0x00},
{0x1c, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1c,
0x00},
{0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x00,
0x00},
{0x1c, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x1c,
0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x14,
0x08},
{0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10,
0x00},
{0x00, 0x00, 0x3d, 0x42, 0x42, 0x3e, 0x02, 0x3c, 0x00, 0x00, 0x00,
0x00},
{0x00, 0x00, 0x7e, 0x21, 0x21, 0x21, 0x21, 0x3e, 0x20, 0x20, 0x60,
0x00},
{0x00, 0x00, 0x3e, 0x41, 0x40, 0x40, 0x41, 0x3e, 0x00, 0x00, 0x00,
0x00},
{0x00, 0x00, 0x3f, 0x42, 0x42, 0x42, 0x42, 0x3e, 0x02, 0x02, 0x06,
0x00},
{0x00, 0x00, 0x3e, 0x41, 0x40, 0x7f, 0x41, 0x3e, 0x00, 0x00, 0x00,
0x00},
{0x00, 0x00, 0x3c, 0x10, 0x10, 0x10, 0x10, 0x3c, 0x10, 0x10, 0x0c,
0x00},
{0x3c, 0x02, 0x02, 0x3e, 0x42, 0x42, 0x42, 0x3f, 0x00, 0x00, 0x00,
0x00},
{0x00, 0x00, 0x77, 0x22, 0x22, 0x22, 0x32, 0x2c, 0x20, 0x20, 0x60,
0x00},
{0x00, 0x00, 0x3e, 0x08, 0x08, 0x08, 0x08, 0x38, 0x00, 0x00, 0x08,
0x00},
{0x38, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x3c, 0x00, 0x00, 0x04,
0x00},
{0x00, 0x00, 0x63, 0x24, 0x38, 0x28, 0x24, 0x26, 0x20, 0x20, 0x60,
0x00},
{0x00, 0x00, 0x3e, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x18,
0x00},
{0x00, 0x00, 0x6b, 0x2a, 0x2a, 0x2a, 0x2a, 0x74, 0x00, 0x00, 0x00,
0x00},
{0x00, 0x00, 0x77, 0x22, 0x22, 0x22, 0x32, 0x6c, 0x00, 0x00, 0x00,
0x00},
{0x00, 0x00, 0x3e, 0x41, 0x41, 0x41, 0x41, 0x3e, 0x00, 0x00, 0x00,
0x00},
{0x70, 0x20, 0x3e, 0x21, 0x21, 0x21, 0x21, 0x7e, 0x00, 0x00, 0x00,
0x00},
{0x07, 0x02, 0x3e, 0x42, 0x42, 0x42, 0x42, 0x3f, 0x00, 0x00, 0x00,
0x00},
{0x00, 0x00, 0x7c, 0x10, 0x10, 0x10, 0x19, 0x76, 0x00, 0x00, 0x00,
0x00},
{0x00, 0x00, 0x3e, 0x41, 0x06, 0x38, 0x41, 0x3e, 0x00, 0x00, 0x00,
0x00},
{0x00, 0x00, 0x0c, 0x12, 0x10, 0x10, 0x10, 0x3c, 0x10, 0x10, 0x00,
0x00},
{0x00, 0x00, 0x1b, 0x26, 0x22, 0x22, 0x22, 0x66, 0x00, 0x00, 0x00,
0x00},
{0x00, 0x00, 0x08, 0x14, 0x14, 0x22, 0x22, 0x77, 0x00, 0x00, 0x00,
0x00},
{0x00, 0x00, 0x14, 0x14, 0x2a, 0x2a, 0x22, 0x77, 0x00, 0x00, 0x00,
0x00},
{0x00, 0x00, 0x77, 0x22, 0x1c, 0x1c, 0x22, 0x77, 0x00, 0x00, 0x00,
0x00},
{0x30, 0x08, 0x08, 0x14, 0x14, 0x22, 0x22, 0x77, 0x00, 0x00, 0x00,
0x00},
{0x00, 0x00, 0x7e, 0x22, 0x10, 0x08, 0x44, 0x7e, 0x00, 0x00, 0x00,
0x00},
{0x06, 0x08, 0x08, 0x08, 0x08, 0x30, 0x08, 0x08, 0x08, 0x08, 0x06,
0x00},
{0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
0x08},
{0x30, 0x08, 0x08, 0x08, 0x08, 0x06, 0x08, 0x08, 0x08, 0x08, 0x30,
0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x49, 0x31, 0x00,
0x00},
{0x00, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x00, 0x00}
};
unsigned int sourceWidth = 8;
unsigned int sourceHeight = 12;
_width = sourceWidth;
_height = sourceHeight;
// populate the glyph mp
for(unsigned int i=32;i<127;i++)
{
osg::ref_ptr<Glyph> glyph = new Glyph;
unsigned int dataSize = _width*_height;
unsigned char* data = new unsigned char[dataSize];
// clear the image to zeros.
for(unsigned char* p=data;p<data+dataSize;) { *p++ = 0; }
glyph->setImage(_width,_height,1,
GL_ALPHA,
GL_ALPHA,GL_UNSIGNED_BYTE,
data,
osg::Image::USE_NEW_DELETE,
1);
glyph->setInternalTextureFormat(GL_ALPHA);
// now populate data arry by converting bitmap into a luminance_alpha
map.
unsigned char* ptr = rasters[i-32];
unsigned char value_on = 255;
unsigned char value_off = 0;
for(unsigned int row=0;row<sourceHeight;++row,++ptr)
{
(*data++)=((*ptr)&128)?value_on:value_off;
(*data++)=((*ptr)&64)?value_on:value_off;
(*data++)=((*ptr)&32)?value_on:value_off;
(*data++)=((*ptr)&16)?value_on:value_off;
(*data++)=((*ptr)&8)?value_on:value_off;
(*data++)=((*ptr)&4)?value_on:value_off;
(*data++)=((*ptr)&2)?value_on:value_off;
(*data++)=((*ptr)&1)?value_on:value_off;
}
glyph->setHorizontalBearing(osg::Vec2(0.0f,0.0f)); // bottom left.
glyph->setHorizontalAdvance((float)_width);
glyph->setVerticalBearing(osg::Vec2((float)_width*0.5f,(float)_height)); // top
middle.
glyph->setVerticalAdvance((float)_height);
addGlyph(_width,_height,i,glyph.get());
}
}
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library 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
* OpenSceneGraph Public License for more details.
*/
#ifndef NEWTEXT_DEFAULTFONT_H
#define NEWTEXT_DEFAULTFONT_H 1
#include <map>
#include <osg/ref_ptr>
#include <osgText/Font>
namespace osgText {
class DefaultFont : public Font
{
public:
static DefaultFont* instance();
virtual std::string getFileName() const { return ""; }
/** NOP with DefaultFont since it only supports a single fixed sized font.
*/
virtual void setSize(unsigned int width, unsigned int height);
virtual Font::Glyph* getGlyph(unsigned int charcode);
virtual osg::Vec2 getKerning(unsigned int leftcharcode,unsigned int
rightcharcode, KerningType kerningType);
virtual bool hasVertical() const;
protected:
DefaultFont();
virtual ~DefaultFont();
void constructGlyphs();
static OpenThreads::Mutex _mutex;
};
}
#endif
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org