protected override unsafe void ProcessFilter( UnmanagedImage source, UnmanagedImage destination, Rectangle rect )
{
int pixelSize = Image.GetPixelFormatSize( source.PixelFormat ) / 8;
// processing start and stop X,Y positions
int startX = rect.Left;
int startY = rect.Top;
int stopX = startX + rect.Width;
int stopY = startY + rect.Height;
// check pixel size to find if we deal with 8 or 16 bpp channels
if ( ( pixelSize <= 4 ) && ( pixelSize != 2 ) )
{
int srcStride = source.Stride;
int dstStride = destination.Stride;
int srcOffset = srcStride - rect.Width * pixelSize;
int dstOffset = dstStride - rect.Width * pixelSize;
byte* src = (byte*) source.ImageData.ToPointer( );
byte* dst = (byte*) destination.ImageData.ToPointer( );
// allign pointers to the first pixel to process
src += ( startY * srcStride + startX * pixelSize );
dst += ( startY * dstStride + startX * pixelSize );
// do the processing job
if ( destination.PixelFormat == PixelFormat.Format8bppIndexed )
{
// grayscale image
Process8bppImage( src, dst, srcStride, dstStride, srcOffset, dstOffset, startX, startY, stopX, stopY );
}
else
{
// RGB image
if ( ( pixelSize == 3 ) || ( !processAlpha ) )
{
Process24bppImage( src, dst, srcStride, dstStride, srcOffset, dstOffset, startX, startY, stopX, stopY, pixelSize );
}
else
{
Process32bppImage( src, dst, srcStride, dstStride, srcOffset, dstOffset, startX, startY, stopX, stopY );
}
}
}
else
{
pixelSize /= 2;
int dstStride = destination.Stride / 2;
int srcStride = source.Stride / 2;
// base pointers
ushort* baseSrc = (ushort*) source.ImageData.ToPointer( );
ushort* baseDst = (ushort*) destination.ImageData.ToPointer( );
// allign pointers by X
baseSrc += ( startX * pixelSize );
baseDst += ( startX * pixelSize );
if ( source.PixelFormat == PixelFormat.Format16bppGrayScale )
{
// 16 bpp grayscale image
Process16bppImage( baseSrc, baseDst, srcStride, dstStride, startX, startY, stopX, stopY );
}
else
{
// RGB image
if ( ( pixelSize == 3 ) || ( !processAlpha ) )
{
Process48bppImage( baseSrc, baseDst, srcStride, dstStride, startX, startY, stopX, stopY, pixelSize );
}
else
{
Process64bppImage( baseSrc, baseDst, srcStride, dstStride, startX, startY, stopX, stopY );
}
}
}
}