From d5a36f620263f5856c510bd3e4c75e294960f3e1 Mon Sep 17 00:00:00 2001 From: Emmanuel Christophe <emmanuel.christophe@orfeo-toolbox.org> Date: Thu, 2 Apr 2009 09:59:36 +0800 Subject: [PATCH] ENH: add the switch to enable/disable hardware linear interpolation --- Code/Visualization/otbImageWidget.h | 22 +++++++++++-- Code/Visualization/otbImageWidget.txx | 31 ++++++++--------- Testing/Code/Visualization/otbImageWidget.cxx | 33 ++++++++++++++++++- 3 files changed, 67 insertions(+), 19 deletions(-) diff --git a/Code/Visualization/otbImageWidget.h b/Code/Visualization/otbImageWidget.h index 7cc1d1b3db..5aa8f8a71f 100644 --- a/Code/Visualization/otbImageWidget.h +++ b/Code/Visualization/otbImageWidget.h @@ -91,6 +91,19 @@ public: itkSetMacro(IsotropicZoom,double); itkGetMacro(IsotropicZoom,double); + /** Linear interpolation on or off*/ + void LinearInterpolationOn() + { + m_InterpolationMethod = GL_LINEAR; + this->Modified(); + } + + void LinearInterpolationOff() + { + m_InterpolationMethod = GL_NEAREST; + this->Modified(); + } + /** Set/Get the subsampling rate */ itkSetMacro(SubsamplingRate,unsigned int); itkGetMacro(SubsamplingRate,unsigned int); @@ -98,10 +111,10 @@ public: /** Get the image to screen transform */ itkGetObjectMacro(ImageToScreenTransform,AffineTransformType); itkGetObjectMacro(ScreenToImageTransform,AffineTransformType); - - /** Get The GlBuffered Region*/ + + /** Get The GlBuffered Region*/ itkGetMacro(OpenGlBufferedRegion, RegionType); - + /** Get the Extent region */ itkGetMacro(Extent, RegionType); @@ -176,6 +189,9 @@ private: /** OpenGl zoom factor */ double m_IsotropicZoom; + /** The interpolation method */ + GLint m_InterpolationMethod; + /** OpenGl buffer */ unsigned char * m_OpenGlBuffer; diff --git a/Code/Visualization/otbImageWidget.txx b/Code/Visualization/otbImageWidget.txx index 0ef83f58f3..880343e660 100644 --- a/Code/Visualization/otbImageWidget.txx +++ b/Code/Visualization/otbImageWidget.txx @@ -25,7 +25,8 @@ namespace otb { template <class TInputImage> ImageWidget<TInputImage> -::ImageWidget() : m_IsotropicZoom(1.0), m_OpenGlBuffer(NULL), m_OpenGlBufferedRegion(), + ::ImageWidget() : m_IsotropicZoom(1.0), m_InterpolationMethod(GL_LINEAR), + m_OpenGlBuffer(NULL), m_OpenGlBufferedRegion(), m_Extent(), m_SubsamplingRate(1), m_ImageToScreenTransform(), m_ScreenToImageTransform(), m_GlComponents() { @@ -186,15 +187,15 @@ ImageWidget<TInputImage> glDisable(GL_BLEND); // Check if there is somthing to draw if(m_OpenGlBuffer == NULL) - { + { return; - } + } // Update transforms this->UpdateTransforms(); if(!this->GetUseGlAcceleration()) - { + { // Set the pixel Zoom glRasterPos2f(m_Extent.GetIndex()[0],m_Extent.GetIndex()[1]); glPixelZoom(m_IsotropicZoom,m_IsotropicZoom); @@ -202,20 +203,20 @@ ImageWidget<TInputImage> // display the image glDrawPixels(m_OpenGlBufferedRegion.GetSize()[0], m_OpenGlBufferedRegion.GetSize()[1], - GL_RGB, - GL_UNSIGNED_BYTE, - m_OpenGlBuffer); - } + GL_RGB, + GL_UNSIGNED_BYTE, + m_OpenGlBuffer); + } else - { + { glEnable(GL_TEXTURE_2D); glColor4f(1.0,1.0,1.0,0.0); GLuint texture; glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_2D, texture); glTexImage2D(GL_TEXTURE_2D, 0, 3, m_OpenGlBufferedRegion.GetSize()[0], m_OpenGlBufferedRegion.GetSize()[1], 0, GL_RGB, GL_UNSIGNED_BYTE, m_OpenGlBuffer); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // Linear Filtering - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // Linear Filtering + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,m_InterpolationMethod); + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,m_InterpolationMethod); glBindTexture (GL_TEXTURE_2D, texture); glBegin (GL_QUADS); glTexCoord2f (0.0, 1.0); @@ -228,17 +229,17 @@ ImageWidget<TInputImage> glVertex3f (m_Extent.GetIndex()[0],m_Extent.GetIndex()[1]+m_Extent.GetSize()[1], 0.0); glEnd (); glDisable(GL_TEXTURE_2D); - } + } // Render additionnal GlComponents for(GlComponentIteratorType it = m_GlComponents->ReverseBegin(); it!=m_GlComponents->ReverseEnd();++it) - { + { if(it.Get()->GetVisible()) - { + { it.Get()->Render(m_Extent,m_ImageToScreenTransform); - } } + } } } #endif diff --git a/Testing/Code/Visualization/otbImageWidget.cxx b/Testing/Code/Visualization/otbImageWidget.cxx index 81fd9a0a85..9bcfc4ae33 100644 --- a/Testing/Code/Visualization/otbImageWidget.cxx +++ b/Testing/Code/Visualization/otbImageWidget.cxx @@ -29,7 +29,7 @@ int otbImageWidget( int argc, char * argv[] ) typedef otb::ImageWidget<> WidgetType; typedef WidgetType::InputImageType ImageType; typedef otb::ImageFileReader<ImageType> ReaderType; - + // Reading the input image ReaderType::Pointer reader = ReaderType::New(); reader->SetFileName(infname); @@ -47,12 +47,14 @@ int otbImageWidget( int argc, char * argv[] ) widget->show(); // Refresh display Fl::check(); + // Read the OpenGl buffer widget->ReadBuffer(reader->GetOutput(),region); // Redraw it widget->redraw(); // Refresh display Fl::check(); + // Read only a quater of the image ImageType::RegionType::SizeType size = region.GetSize(); size[0]/=2; @@ -63,6 +65,7 @@ int otbImageWidget( int argc, char * argv[] ) widget->redraw(); // Refresh display Fl::check(); + // Adding an offset ImageType::RegionType::IndexType index = region.GetIndex(); index[0]+=size[0]; @@ -73,6 +76,7 @@ int otbImageWidget( int argc, char * argv[] ) widget->redraw(); // Refresh display Fl::check(); + // Reading full image, but in half window region = reader->GetOutput()->GetLargestPossibleRegion(); widget->resize(0,0,region.GetSize()[0],region.GetSize()[1]/2); @@ -82,6 +86,7 @@ int otbImageWidget( int argc, char * argv[] ) widget->redraw(); // Refresh display Fl::check(); + // Reading full image, but in zoomed in widget widget->resize(0,0,region.GetSize()[0],region.GetSize()[1]); widget->SetIsotropicZoom(2.); @@ -91,6 +96,7 @@ int otbImageWidget( int argc, char * argv[] ) widget->redraw(); // Refresh display Fl::check(); + // Reading full image, but in zoomed out widget widget->resize(0,0,region.GetSize()[0],region.GetSize()[1]); widget->SetIsotropicZoom(0.5); @@ -100,6 +106,31 @@ int otbImageWidget( int argc, char * argv[] ) widget->redraw(); // Refresh display Fl::check(); + + // Use nearest neighbor interpolation +// widget->resize(0,0,region.GetSize()[0],region.GetSize()[1]); + widget->SetIsotropicZoom(10.0); + size = region.GetSize(); + size[0]/=10; + size[1]/=10; + region.SetSize(size); + index = region.GetIndex(); + index[0]+=100; + region.SetIndex(index); + widget->ReadBuffer(reader->GetOutput(),region); + widget->LinearInterpolationOff(); + // Redraw it + widget->redraw(); + // Refresh display + Fl::check(); + + // Use nearest neighbor interpolation + widget->LinearInterpolationOn(); + // Redraw it + widget->redraw(); + // Refresh display + Fl::check(); + // Print out widget status std::cout<<widget<<std::endl; -- GitLab