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