From 1784327c479d73b62623b151bb891e867422d816 Mon Sep 17 00:00:00 2001 From: Thomas Geymayer Date: Fri, 15 Feb 2013 12:32:31 +0100 Subject: [PATCH] CanvasImage: Use image/canvas size rather than texture size --- simgear/canvas/elements/CanvasImage.cxx | 44 +++++++++++++++++-------- 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/simgear/canvas/elements/CanvasImage.cxx b/simgear/canvas/elements/CanvasImage.cxx index c41c4897..ee8f204b 100644 --- a/simgear/canvas/elements/CanvasImage.cxx +++ b/simgear/canvas/elements/CanvasImage.cxx @@ -324,24 +324,42 @@ namespace canvas _node_src_rect->setFloatValue("right", 1); _node_src_rect->setFloatValue("bottom", 1); } + + if( !_region.width() || !_region.height() ) + { + // Default to image size. + // TODO handle showing only part of image? + const SGRect& dim = getTextureDimensions(); + _node->setFloatValue("size[0]", dim.width()); + _node->setFloatValue("size[1]", dim.height()); + } } //---------------------------------------------------------------------------- SGRect Image::getTextureDimensions() const { - osg::Texture2D *texture = !_src_canvas.expired() - ? _src_canvas.lock()->getTexture() - : _texture.get(); - - if( !texture ) - return SGRect(); - - return SGRect - ( - 0,0, - texture->getTextureWidth(), - texture->getTextureHeight() - ); + CanvasPtr canvas = _src_canvas.lock(); + SGRect dim(0,0); + + // Use canvas/image dimensions rather than texture dimensions, as they could + // be resized internally by OpenSceneGraph (eg. to nearest power of two). + if( canvas ) + { + dim.setRight( canvas->getViewWidth() ); + dim.setBottom( canvas->getViewHeight() ); + } + else if( _texture ) + { + osg::Image* img = _texture->getImage(); + + if( img ) + { + dim.setRight( img->s() ); + dim.setBottom( img->t() ); + } + } + + return dim; } } // namespace canvas -- 2.39.5