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