From Laurens Voerman, "attached is OpenSceneGraph\src\osgViewer\GraphicsWindowWin32.cpp
I've added the code to get the osgViewer working on windows displays with less than 32 bit color. Only tested with 16 bit color."
This commit is contained in:
parent
31ac332b1f
commit
511bc9d571
@ -232,6 +232,10 @@ class Win32WindowingSystem : public osg::GraphicsContext::WindowingSystemInterfa
|
||||
// (0,0) is returned if screen is unknown
|
||||
virtual void getScreenResolution( const osg::GraphicsContext::ScreenIdentifier& si, unsigned int& width, unsigned int& height );
|
||||
|
||||
// Return the bits per pixel of specified screen
|
||||
// (0) is returned if screen is unknown
|
||||
virtual void getScreenColorDepth( const osg::GraphicsContext::ScreenIdentifier& si, unsigned int& dmBitsPerPel );
|
||||
|
||||
// Set the resolution for given screen
|
||||
virtual bool setScreenResolution( const osg::GraphicsContext::ScreenIdentifier& si, unsigned int width, unsigned int height );
|
||||
|
||||
@ -852,6 +856,21 @@ void Win32WindowingSystem::getScreenResolution( const osg::GraphicsContext::Scre
|
||||
}
|
||||
}
|
||||
|
||||
void Win32WindowingSystem::getScreenColorDepth( const osg::GraphicsContext::ScreenIdentifier& si, unsigned int& dmBitsPerPel )
|
||||
{
|
||||
DISPLAY_DEVICE displayDevice;
|
||||
DEVMODE deviceMode;
|
||||
|
||||
if (getScreenInformation(si, displayDevice, deviceMode))
|
||||
{
|
||||
dmBitsPerPel = deviceMode.dmBitsPerPel;
|
||||
}
|
||||
else
|
||||
{
|
||||
dmBitsPerPel = 0;
|
||||
}
|
||||
}
|
||||
|
||||
bool Win32WindowingSystem::changeScreenSettings( const osg::GraphicsContext::ScreenIdentifier& si, DISPLAY_DEVICE& displayDevice, DEVMODE& deviceMode )
|
||||
{
|
||||
//
|
||||
@ -1380,6 +1399,24 @@ bool GraphicsWindowWin32::setPixelFormat()
|
||||
|
||||
int pixelFormatIndex = ::ChooseMatchingPixelFormat(openGLContext.deviceContext(), _traits->screenNum, formatSpecs);
|
||||
if (pixelFormatIndex<0)
|
||||
{
|
||||
unsigned int bpp;
|
||||
Win32WindowingSystem::getInterface()->getScreenColorDepth(*_traits.get(), bpp);
|
||||
if (bpp < 32) {
|
||||
osg::notify(osg::INFO) << "GraphicsWindowWin32::setPixelFormat() - Display setting is not 32 bit colors, "
|
||||
<< bpp
|
||||
<< " bits per pixel on screen #"
|
||||
<< _traits->screenNum
|
||||
<< std::endl;
|
||||
|
||||
_traits->red = bpp / 4; //integer devide, determine minimum number of bits we will accept
|
||||
_traits->green = bpp / 4;
|
||||
_traits->blue = bpp / 4;
|
||||
::PreparePixelFormatSpecifications(*_traits, formatSpecs, true);// try again with WGL_SWAP_METHOD_ARB
|
||||
pixelFormatIndex = ::ChooseMatchingPixelFormat(openGLContext.deviceContext(), _traits->screenNum, formatSpecs);
|
||||
}
|
||||
}
|
||||
if (pixelFormatIndex<0)
|
||||
{
|
||||
::PreparePixelFormatSpecifications(*_traits, formatSpecs, false);
|
||||
pixelFormatIndex = ::ChooseMatchingPixelFormat(openGLContext.deviceContext(), _traits->screenNum, formatSpecs);
|
||||
|
Loading…
Reference in New Issue
Block a user