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( );
// allign pointers by X and Y
src += ( startX - 1 ) + ( startY - 1 ) * srcStride;
dst += ( startX - 1 ) + ( startY - 1 ) * dstStride;
// --- process the first line
*dst = (byte) ( *src | src[1] | src[srcStride] | src[srcStride + 1] );
src++;
dst++;
// for each pixel
for ( int x = startX; x < stopX; x++, src++, dst++ )
{
*dst = (byte) ( *src | src[-1] | src[1] |
src[srcStride] | src[srcStride - 1] | src[srcStride + 1] );
}
*dst = (byte) ( *src | src[-1] | src[srcStride] | src[srcStride - 1] );
src += srcOffset;
dst += dstOffset;
// --- process all lines except the last one
for ( int y = startY; y < stopY; y++ )
{
*dst = (byte) ( *src | src[1] |
src[-srcStride] | src[-srcStride + 1] |
src[srcStride] | src[srcStride + 1] );
src++;
dst++;
// for each pixel
for ( int x = startX; x < stopX; x++, src++, dst++ )
{
*dst = (byte) ( *src | src[-1] | src[1] |
src[-srcStride] | src[-srcStride - 1] | src[-srcStride + 1] |
src[ srcStride] | src[ srcStride - 1] | src[ srcStride + 1] );
}
*dst = (byte) ( *src | src[-1] |
src[-srcStride] | src[-srcStride - 1] |
src[srcStride] | src[srcStride - 1] );
src += srcOffset;
dst += dstOffset;
}
// --- process the last line
*dst = (byte) ( *src | src[1] | src[-srcStride] | src[-srcStride + 1] );
src++;
dst++;
// for each pixel
for ( int x = startX; x < stopX; x++, src++, dst++ )
{
*dst = (byte) ( *src | src[-1] | src[1] |
src[-srcStride] | src[-srcStride - 1] | src[-srcStride + 1] );
}
*dst = (byte) ( *src | src[-1] | src[-srcStride] | src[-srcStride - 1] );
}
}