osg::ref_ptr<osg::GraphicsContext>
createPixelBuffer(int aSize, int aNumSamples)
{
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
traits->x = 0;
traits->y = 0;
traits->width = aSize;
traits->height = aSize;
traits->red = 8;
traits->green = 8;
traits->blue = 8;
traits->alpha = 8;
traits->windowDecoration = false;
traits->pbuffer = true;
traits->doubleBuffer = true;
traits->sharedContext = 0;
traits->readDISPLAY();
traits->setUndefinedScreenDetailsToDefaultScreen();
if (aNumSamples != 0)
{
traits->sampleBuffers = 1;
traits->samples = aNumSamples;
}
return osg::GraphicsContext::createGraphicsContext(traits.get());
}
bool
generateThumbnail(const std::string & aFilePath,
const std::string & aThumbnailPath,
const std::string & aResourcesPath,
int aSize,
bool aTopDownView)
{
auto pixelBuffer = createPixelBuffer(aSize, 8);
if (!pixelBuffer)
{
pixelBuffer = createPixelBuffer(aSize, 0);
}
// const auto shape = loadShapeOrError(aFilePath);
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
auto camera = viewer->getCamera();
camera->setGraphicsContext(pixelBuffer.get());
camera->setViewport(new osg::Viewport(0, 0, aSize, aSize));
camera->setDrawBuffer(GL_BACK);
camera->setReadBuffer(GL_BACK);
// setupShapeViewer(viewer, shape.get(), aResourcesPath, aTopDownView);
// osg::ref_ptr<ImageGrabber> grabber = new ImageGrabber(aThumbnailPath);
// viewer.getCamera()->setPostDrawCallback(grabber.get());
viewer->realize();
viewer->frame();
return true;
};
If I call the above code repeatedly then it leaks and I cannot understand why since everything is in osg:ref_ptr<>.