static void ApplyInPlaceFourierTransform( GenericImage<P>& image, FFTDirection::value_type dir, bool parallel, int maxProcessors ) { int w = FFTC::OptimizedLength( image.Width() ); int h = FFTC::OptimizedLength( image.Height() ); if ( w != image.Width() || h != image.Height() ) { StatusCallback* s = image.GetStatusCallback(); // don't update status here image.SetStatusCallback( 0 ); image.ShiftToCenter( w, h ); image.SetStatusCallback( s ); } bool statusInitialized = false; if ( image.Status().IsInitializationEnabled() ) { image.Status().Initialize( (dir == FFTDirection::Backward) ? "Inverse FFT" : "FFT", image.NumberOfSelectedChannels()*size_type( w + h ) ); image.Status().DisableInitialization(); statusInitialized = true; } try { FFTC F( h, w, image.Status() ); F.EnableParallelProcessing( parallel, maxProcessors ); for ( int c = image.FirstSelectedChannel(); c <= image.LastSelectedChannel(); ++c ) F( image[c], image[c], (dir == FFTDirection::Backward) ? PCL_FFT_BACKWARD : PCL_FFT_FORWARD ); if ( statusInitialized ) image.Status().EnableInitialization(); } catch ( ... ) { if ( statusInitialized ) image.Status().EnableInitialization(); throw; } }