protected override unsafe void ProcessFilter(UnmanagedImage sourceData, UnmanagedImage destinationData, Rectangle rect)
{
int pixelSize = Image.GetPixelFormatSize(sourceData.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 = sourceData.Stride;
int dstStride = destinationData.Stride;
int srcOffset = srcStride - rect.Width * pixelSize;
int dstOffset = dstStride - rect.Width * pixelSize;
byte* src = (byte*)sourceData.ImageData.ToPointer();
byte* dst = (byte*)destinationData.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 (destinationData.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 = destinationData.Stride / 2;
int srcStride = sourceData.Stride / 2;
// base pointers
ushort* baseSrc = (ushort*)sourceData.ImageData.ToPointer();
ushort* baseDst = (ushort*)destinationData.ImageData.ToPointer();
// allign pointers by X
baseSrc += (startX * pixelSize);
baseDst += (startX * pixelSize);
if (sourceData.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);
}
}
}
}