From a00c5e3a200036102b36ecd23e27a457ebd966ce Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Tue, 11 Dec 2012 17:45:20 +0000 Subject: [PATCH] Fixed handling of image colour space conversion when pixel format changes --- src/osg/ImageUtils.cpp | 46 +++++++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/src/osg/ImageUtils.cpp b/src/osg/ImageUtils.cpp index b40c23b31..6c36c9337 100644 --- a/src/osg/ImageUtils.cpp +++ b/src/osg/ImageUtils.cpp @@ -643,6 +643,31 @@ struct ReplaceAlphaWithLuminanceOperator 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) { case (MODULATE_ALPHA_BY_LUMINANCE): @@ -660,29 +685,14 @@ osg::Image* colorSpaceConversion(ColorSpaceOperation op, osg::Image* image, cons case (REPLACE_ALPHA_WITH_LUMINANCE): { OSG_NOTICE<<"doing conversion REPLACE_ALPHA_WITH_LUMINANCE"<getPixelFormat()==GL_RGB || image->getPixelFormat()==GL_BGR) - { - 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()); - } + osg::modifyImage(image, ReplaceAlphaWithLuminanceOperator()); return image; } case (REPLACE_RGB_WITH_LUMINANCE): { OSG_NOTICE<<"doing conversion REPLACE_RGB_WITH_LUMINANCE"<allocateImage(image->s(), image->t(), image->r(), GL_LUMINANCE, image->getDataType()); - osg::copyImage(image, 0, 0, 0, image->s(), image->t(), image->r(), - newImage, 0, 0, 0, false); - return newImage; + // no work here required to be done as it'll already be done by copyImage above. + return image; } default: return image;