Fixed handling of image colour space conversion when pixel format changes
This commit is contained in:
@@ -643,6 +643,31 @@ struct ReplaceAlphaWithLuminanceOperator
|
|||||||
|
|
||||||
osg::Image* colorSpaceConversion(ColorSpaceOperation op, osg::Image* image, const osg::Vec4& colour)
|
osg::Image* colorSpaceConversion(ColorSpaceOperation op, osg::Image* image, const osg::Vec4& colour)
|
||||||
{
|
{
|
||||||
|
GLenum requiredPixelFormat = image->getPixelFormat();
|
||||||
|
switch(op)
|
||||||
|
{
|
||||||
|
case (MODULATE_ALPHA_BY_LUMINANCE):
|
||||||
|
case (MODULATE_ALPHA_BY_COLOR):
|
||||||
|
case (REPLACE_ALPHA_WITH_LUMINANCE):
|
||||||
|
if (image->getPixelFormat()==GL_RGB || image->getPixelFormat()==GL_BGR) requiredPixelFormat = GL_RGBA;
|
||||||
|
break;
|
||||||
|
case (REPLACE_RGB_WITH_LUMINANCE):
|
||||||
|
if (image->getPixelFormat()==GL_RGB || image->getPixelFormat()==GL_BGR) requiredPixelFormat = GL_LUMINANCE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (requiredPixelFormat!=image->getPixelFormat())
|
||||||
|
{
|
||||||
|
osg::Image* newImage = new osg::Image;
|
||||||
|
newImage->allocateImage(image->s(), image->t(), image->r(), requiredPixelFormat, image->getDataType());
|
||||||
|
osg::copyImage(image, 0, 0, 0, image->s(), image->t(), image->r(),
|
||||||
|
newImage, 0, 0, 0, false);
|
||||||
|
|
||||||
|
image = newImage;
|
||||||
|
}
|
||||||
|
|
||||||
switch(op)
|
switch(op)
|
||||||
{
|
{
|
||||||
case (MODULATE_ALPHA_BY_LUMINANCE):
|
case (MODULATE_ALPHA_BY_LUMINANCE):
|
||||||
@@ -660,29 +685,14 @@ osg::Image* colorSpaceConversion(ColorSpaceOperation op, osg::Image* image, cons
|
|||||||
case (REPLACE_ALPHA_WITH_LUMINANCE):
|
case (REPLACE_ALPHA_WITH_LUMINANCE):
|
||||||
{
|
{
|
||||||
OSG_NOTICE<<"doing conversion REPLACE_ALPHA_WITH_LUMINANCE"<<std::endl;
|
OSG_NOTICE<<"doing conversion REPLACE_ALPHA_WITH_LUMINANCE"<<std::endl;
|
||||||
if (image->getPixelFormat()==GL_RGB || image->getPixelFormat()==GL_BGR)
|
osg::modifyImage(image, ReplaceAlphaWithLuminanceOperator());
|
||||||
{
|
|
||||||
osg::Image* newImage = new osg::Image;
|
|
||||||
newImage->allocateImage(image->s(), image->t(), image->r(), GL_RGBA, image->getDataType());
|
|
||||||
osg::copyImage(image, 0, 0, 0, image->s(), image->t(), image->r(),
|
|
||||||
newImage, 0, 0, 0, false);
|
|
||||||
osg::modifyImage(newImage, ReplaceAlphaWithLuminanceOperator());
|
|
||||||
return newImage;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
osg::modifyImage(image, ReplaceAlphaWithLuminanceOperator());
|
|
||||||
}
|
|
||||||
return image;
|
return image;
|
||||||
}
|
}
|
||||||
case (REPLACE_RGB_WITH_LUMINANCE):
|
case (REPLACE_RGB_WITH_LUMINANCE):
|
||||||
{
|
{
|
||||||
OSG_NOTICE<<"doing conversion REPLACE_RGB_WITH_LUMINANCE"<<std::endl;
|
OSG_NOTICE<<"doing conversion REPLACE_RGB_WITH_LUMINANCE"<<std::endl;
|
||||||
osg::Image* newImage = new osg::Image;
|
// no work here required to be done as it'll already be done by copyImage above.
|
||||||
newImage->allocateImage(image->s(), image->t(), image->r(), GL_LUMINANCE, image->getDataType());
|
return image;
|
||||||
osg::copyImage(image, 0, 0, 0, image->s(), image->t(), image->r(),
|
|
||||||
newImage, 0, 0, 0, false);
|
|
||||||
return newImage;
|
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
return image;
|
return image;
|
||||||
|
|||||||
Reference in New Issue
Block a user