protected override unsafe void ProcessFilter( UnmanagedImage sourceData, UnmanagedImage destinationData, Rectangle rect )
{
if ( ( rect.Width < 3 ) || ( rect.Height < 3 ) )
{
throw new InvalidImagePropertiesException( "Processing rectangle mast be at least 3x3 in size." );
}
// processing start and stop X,Y positions
int startX = rect.Left + 1;
int startY = rect.Top + 1;
int stopX = rect.Right - 1;
int stopY = rect.Bottom - 1;
int dstStride = destinationData.Stride;
int srcStride = sourceData.Stride;
int dstOffset = dstStride - rect.Width + 1;
int srcOffset = srcStride - rect.Width + 1;
// image pointers
byte* src = (byte*) sourceData.ImageData.ToPointer( );
byte* dst = (byte*) destinationData.ImageData.ToPointer( );
byte max;
// allign pointers by X and Y
src += ( startX - 1 ) + ( startY - 1 ) * srcStride;
dst += ( startX - 1 ) + ( startY - 1 ) * dstStride;
// --- process the first line
max = *src;
if ( src[1] > max )
max = src[1];
if ( src[srcStride] > max )
max = src[srcStride];
if ( src[srcStride + 1] > max )
max = src[srcStride + 1];
*dst = max;
src++;
dst++;
// for each pixel
for ( int x = startX; x < stopX; x++, src++, dst++ )
{
max = *src;
if ( src[-1] > max )
max = src[-1];
if ( src[1] > max )
max = src[1];
if ( src[srcStride - 1] > max )
max = src[srcStride - 1];
if ( src[srcStride] > max )
max = src[srcStride];
if ( src[srcStride + 1] > max )
max = src[srcStride + 1];
*dst = max;
}
max = *src;
if ( src[-1] > max )
max = src[-1];
if ( src[srcStride - 1] > max )
max = src[srcStride - 1];
if ( src[srcStride] > max )
max = src[srcStride];
*dst = max;
src += srcOffset;
dst += dstOffset;
// --- process all lines except the last one
for ( int y = startY; y < stopY; y++ )
{
max = *src;
if ( src[1] > max )
max = src[1];
if ( src[-srcStride] > max )
max = src[-srcStride];
if ( src[-srcStride + 1] > max )
max = src[-srcStride + 1];
if ( src[srcStride] > max )
max = src[srcStride];
if ( src[srcStride + 1] > max )
max = src[srcStride + 1];
*dst = max;
src++;
dst++;
// for each pixel
for ( int x = startX; x < stopX; x++, src++, dst++ )
{
max = *src;
if ( src[-1] > max )
max = src[-1];
if ( src[1] > max )
max = src[1];
if ( src[-srcStride - 1] > max )
max = src[-srcStride - 1];
if ( src[-srcStride] > max )
max = src[-srcStride];
if ( src[-srcStride + 1] > max )
max = src[-srcStride + 1];
if ( src[srcStride - 1] > max )
max = src[srcStride - 1];
if ( src[srcStride] > max )
max = src[srcStride];
if ( src[srcStride + 1] > max )
max = src[srcStride + 1];
*dst = max;
}
max = *src;
if ( src[-1] > max )
max = src[-1];
if ( src[-srcStride - 1] > max )
max = src[-srcStride - 1];
if ( src[-srcStride] > max )
max = src[-srcStride];
if ( src[srcStride - 1] > max )
max = src[srcStride - 1];
if ( src[srcStride] > max )
max = src[srcStride];
*dst = max;
src += srcOffset;
dst += dstOffset;
}
// --- process the last line
*dst = (byte) ( *src | src[1] | src[-srcStride] | src[-srcStride + 1] );
max = *src;
if ( src[1] > max )
max = src[1];
if ( src[-srcStride] > max )
max = src[-srcStride];
if ( src[-srcStride + 1] > max )
max = src[-srcStride + 1];
*dst = max;
src++;
dst++;
// for each pixel
for ( int x = startX; x < stopX; x++, src++, dst++ )
{
max = *src;
if ( src[-1] > max )
max = src[-1];
if ( src[1] > max )
max = src[1];
if ( src[-srcStride - 1] > max )
max = src[-srcStride - 1];
if ( src[-srcStride] > max )
max = src[-srcStride];
if ( src[-srcStride + 1] > max )
max = src[-srcStride + 1];
*dst = max;
}
max = *src;
if ( src[-1] > max )
max = src[-1];
if ( src[-srcStride - 1] > max )
max = src[-srcStride - 1];
if ( src[-srcStride] > max )
max = src[-srcStride];
*dst = max;
}
}