protected override unsafe void ProcessFilter( UnmanagedImage source, UnmanagedImage destination, Rectangle rect )
{
int kernelHalf = kernelSize / 2;
InitFilter( );
if ( ( rect.Width <= kernelSize ) || ( rect.Height <= kernelSize ) )
{
ProcessWithEdgeChecks( source, destination, rect );
}
else
{
Rectangle safeArea = rect;
safeArea.Inflate( -kernelHalf, -kernelHalf );
if ( ( Environment.ProcessorCount > 1 ) && ( enableParallelProcessing ) )
{
ProcessWithoutChecksParallel( source, destination, safeArea );
}
else
{
ProcessWithoutChecks( source, destination, safeArea );
}
// top
ProcessWithEdgeChecks( source, destination,
new Rectangle( rect.Left, rect.Top, rect.Width, kernelHalf ) );
// bottom
ProcessWithEdgeChecks( source, destination,
new Rectangle( rect.Left, rect.Bottom - kernelHalf, rect.Width, kernelHalf ) );
// left
ProcessWithEdgeChecks( source, destination,
new Rectangle( rect.Left, rect.Top + kernelHalf, kernelHalf, rect.Height - kernelHalf * 2 ) );
// right
ProcessWithEdgeChecks( source, destination,
new Rectangle( rect.Right - kernelHalf, rect.Top + kernelHalf, kernelHalf, rect.Height - kernelHalf * 2 ) );
}
}