]> Creatis software - cpPlugins.git/blobdiff - lib/cpPlugins/Plugins/BasicFilters/FloodFillImageFilter.cxx
Widget integration (step 6/6): Interactive architecture finished. Needs to be tested...
[cpPlugins.git] / lib / cpPlugins / Plugins / BasicFilters / FloodFillImageFilter.cxx
index 07fc9393ec14f52b2a41faaa8542ce38995c9e37..71f90cc70e8876b1bf374f5daaddf533a1cb900c 100644 (file)
@@ -9,12 +9,13 @@ cpPlugins::BasicFilters::FloodFillImageFilter::
 FloodFillImageFilter( )
   : Superclass( )
 {
-  this->SetNumberOfInputs( 1 );
-  this->SetNumberOfOutputs( 1 );
-  this->_MakeOutput< cpPlugins::Interface::Image >( 0 );
+  this->_AddInput( "Input" );
+  this->_MakeOutput< cpPlugins::Interface::Image >( "Output" );
 
   double seed[ 3 ] = { double( 0 ) };
   this->m_Parameters->ConfigureAsPoint( "Seed", 3, seed );
+  this->m_Parameters->ConfigureAsReal( "Window", 0 );
+  this->m_Parameters->ConfigureAsReal( "Level", 0 );
   this->m_Parameters->ConfigureAsUint( "InsideValue", 0 );
   this->m_Parameters->ConfigureAsUint( "OutsideValue", 255 );
 }
@@ -30,7 +31,7 @@ std::string cpPlugins::BasicFilters::FloodFillImageFilter::
 _GenerateData( )
 {
   cpPlugins::Interface::Image* image =
-    this->GetInput< cpPlugins::Interface::Image >( 0 );
+    this->GetInput< cpPlugins::Interface::Image >( "Input" );
   if( image == NULL )
     return( "FloodFillImageFilter: No input image." );
 
@@ -76,6 +77,9 @@ public:
     itkImageFunction
     );
 
+  itkSetMacro( Window, double );
+  itkSetMacro( Level, double );
+
 public:
   virtual bool Evaluate( const TPoint& point ) const
     {
@@ -83,7 +87,29 @@ public:
     }
   virtual bool EvaluateAtIndex( const TIndex& index ) const
     {
-      return( true );
+      if( !( this->IsInsideBuffer( index ) ) )
+        return( false );
+
+      const I* image = this->GetInputImage( );
+      double w2 = this->m_Window / double( 2 );
+      double min = this->m_Level - w2;
+      double max = this->m_Level + w2;
+      unsigned char val = double( 0 );
+      double x = double( image->GetPixel( index ) );
+      double m = double( 100 ) / this->m_Window;
+      double b = ( this->m_Window - ( double( 2 ) * this->m_Level ) );
+      b *= double( 50 ) / this->m_Window;
+      if( x > min && x < max )
+        val = ( unsigned char )( ( m * x ) + b );
+
+      if( this->m_Start )
+      {
+        this->m_StartValue = val;
+        this->m_Start = false;
+        return( true );
+      }
+      else
+        return( std::abs( this->m_StartValue - val ) <= 2 );
     }
   virtual bool EvaluateAtContinuousIndex( const TCIndex& index ) const
     {
@@ -92,7 +118,10 @@ public:
 
 protected:
   cpPlugins_BasicFilters_FloodFillImageFilter_Function( )
-    : Superclass( )
+    : Superclass( ),
+      m_Window( double( 0 ) ),
+      m_Level( double( 0 ) ),
+      m_Start( true )
     {
     }
   virtual ~cpPlugins_BasicFilters_FloodFillImageFilter_Function( )
@@ -103,6 +132,12 @@ private:
   // Purposely not implemented
   cpPlugins_BasicFilters_FloodFillImageFilter_Function( const Self& other );
   Self& operator=( const Self& other );
+
+protected:
+  double m_Window;
+  double m_Level;
+  mutable unsigned char m_StartValue;
+  mutable bool m_Start;
 };
 
 // -------------------------------------------------------------------------
@@ -118,6 +153,8 @@ _RealGD( itk::DataObject* image )
   pseed = this->m_Parameters->GetPoint< typename I::PointType >(
     "Seed", I::ImageDimension
     );
+  double window = this->m_Parameters->GetReal( "Window" );
+  double level = this->m_Parameters->GetReal( "Level" );
   _OP in_val = _OP( this->m_Parameters->GetUint( "InsideValue" ) );
   _OP out_val = _OP( this->m_Parameters->GetUint( "OutsideValue" ) );
 
@@ -136,6 +173,9 @@ _RealGD( itk::DataObject* image )
   out->FillBuffer( out_val );
 
   typename _F::Pointer f = _F::New( );
+  f->SetInputImage( in );
+  f->SetWindow( window );
+  f->SetLevel( level );
   _It i( in, f );
   i.AddSeed( seed );
 
@@ -144,7 +184,7 @@ _RealGD( itk::DataObject* image )
 
   // Connect output
   cpPlugins::Interface::Image* out_port =
-    this->GetOutput< cpPlugins::Interface::Image >( 0 );
+    this->GetOutput< cpPlugins::Interface::Image >( "Output" );
   if( out_port != NULL )
   {
     out_port->SetITK< O >( out );