From db841d161f0eb039b6bf7488ef235bcd7c02e2d5 Mon Sep 17 00:00:00 2001
From: Julien Michel <julien.michel@orfeo-toolbox.org>
Date: Mon, 14 Jun 2010 17:18:17 +0200
Subject: [PATCH] BUG: Adding a TFilterPrecision template parameter so that the
 type of the convolution filter does not depend on the type of the input pixel
 real numeric traits

---
 Code/BasicFilters/otbConvolutionImageFilter.h   |  6 ++++--
 Code/BasicFilters/otbConvolutionImageFilter.txx | 16 ++++++++--------
 2 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/Code/BasicFilters/otbConvolutionImageFilter.h b/Code/BasicFilters/otbConvolutionImageFilter.h
index da0db56ed9..8fb1048698 100644
--- a/Code/BasicFilters/otbConvolutionImageFilter.h
+++ b/Code/BasicFilters/otbConvolutionImageFilter.h
@@ -59,7 +59,8 @@ namespace otb
  * \ingroup MultiThreaded
  */
 template <class TInputImage, class TOutputImage, class TBoundaryCondition =
-            itk::ZeroFluxNeumannBoundaryCondition<TInputImage> >
+            itk::ZeroFluxNeumannBoundaryCondition<TInputImage>,
+          class TFilterPrecision = typename itk::NumericTraits<typename TInputImage::InternalPixelType>::RealType >
 class ITK_EXPORT ConvolutionImageFilter :
   public itk::ImageToImageFilter<TInputImage, TOutputImage>
 {
@@ -93,7 +94,8 @@ public:
   typedef typename InputImageType::RegionType                   InputImageRegionType;
   typedef typename OutputImageType::RegionType                  OutputImageRegionType;
   typedef typename InputImageType::SizeType                     InputSizeType;
-  typedef typename itk::Array<InputRealType>                    ArrayType;
+  typedef TFilterPrecision                                      FilterPrecisionType;
+  typedef typename itk::Array<FilterPrecisionType>              ArrayType;
   typedef TBoundaryCondition                                    BoundaryConditionType;
 
   /** Set the radius of the neighborhood of the filter */
diff --git a/Code/BasicFilters/otbConvolutionImageFilter.txx b/Code/BasicFilters/otbConvolutionImageFilter.txx
index 122d991136..85c1fe94f1 100644
--- a/Code/BasicFilters/otbConvolutionImageFilter.txx
+++ b/Code/BasicFilters/otbConvolutionImageFilter.txx
@@ -32,8 +32,8 @@
 namespace otb
 {
 
-template <class TInputImage, class TOutputImage, class TBoundaryCondition>
-ConvolutionImageFilter<TInputImage, TOutputImage, TBoundaryCondition>
+template <class TInputImage, class TOutputImage, class TBoundaryCondition, class TFilterPrecision>
+ConvolutionImageFilter<TInputImage, TOutputImage, TBoundaryCondition, TFilterPrecision>
 ::ConvolutionImageFilter()
 {
   m_Radius.Fill(1);
@@ -42,9 +42,9 @@ ConvolutionImageFilter<TInputImage, TOutputImage, TBoundaryCondition>
   m_NormalizeFilter = false;
 }
 
-template <class TInputImage, class TOutputImage, class TBoundaryCondition>
+template <class TInputImage, class TOutputImage, class TBoundaryCondition, class TFilterPrecision>
 void
-ConvolutionImageFilter<TInputImage, TOutputImage, TBoundaryCondition>
+ConvolutionImageFilter<TInputImage, TOutputImage, TBoundaryCondition, TFilterPrecision>
 ::GenerateInputRequestedRegion() throw (itk::InvalidRequestedRegionError)
   {
   // call the superclass' implementation of this method
@@ -93,9 +93,9 @@ ConvolutionImageFilter<TInputImage, TOutputImage, TBoundaryCondition>
     }
   }
 
-template<class TInputImage, class TOutputImage, class TBoundaryCondition>
+template<class TInputImage, class TOutputImage, class TBoundaryCondition, class TFilterPrecision>
 void
-ConvolutionImageFilter<TInputImage, TOutputImage, TBoundaryCondition>
+ConvolutionImageFilter<TInputImage, TOutputImage, TBoundaryCondition, TFilterPrecision>
 ::ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread,
                        int threadId)
 {
@@ -158,9 +158,9 @@ ConvolutionImageFilter<TInputImage, TOutputImage, TBoundaryCondition>
 /**
  * Standard "PrintSelf" method
  */
-template <class TInputImage, class TOutput, class TBoundaryCondition>
+template <class TInputImage, class TOutput, class TBoundaryCondition, class TFilterPrecision>
 void
-ConvolutionImageFilter<TInputImage, TOutput, TBoundaryCondition>
+ConvolutionImageFilter<TInputImage, TOutput, TBoundaryCondition, TFilterPrecision>
 ::PrintSelf(std::ostream& os, itk::Indent indent) const
 {
   Superclass::PrintSelf(os, indent);
-- 
GitLab