protected override unsafe void ProcessFilter( UnmanagedImage image, Rectangle rect )
{
int pixelSize = Image.GetPixelFormatSize( image.PixelFormat ) / 8;
// processing width and height
int width = rect.Width;
int height = rect.Height;
// processing region's dimension
int widthToProcess = width;
int heightToProcess = height;
// if generator was specified, then generate a texture
// otherwise use provided texture
if ( textureGenerator != null )
{
texture = textureGenerator.Generate( width, height );
}
else
{
widthToProcess = Math.Min( width, texture.GetLength( 1 ) );
heightToProcess = Math.Min( height, texture.GetLength( 0 ) );
}
int offset = image.Stride - widthToProcess * pixelSize;
// do the job
byte* ptr = (byte*) image.ImageData.ToPointer( );
// allign pointer to the first pixel to process
ptr += ( rect.Top * image.Stride + rect.Left * pixelSize );
// texture
for ( int y = 0; y < heightToProcess; y++ )
{
for ( int x = 0; x < widthToProcess; x++ )
{
double t = texture[y, x];
// process each pixel
for ( int i = 0; i < pixelSize; i++, ptr++ )
{
*ptr = (byte) Math.Min( 255.0f, ( preserveLevel * ( *ptr ) ) + ( filterLevel * ( *ptr ) ) * t );
}
}
ptr += offset;
}
}
}