AForge.Imaging.Filters.Dilatation3x3.ProcessFilter C# (CSharp) Method

ProcessFilter() protected method

Process the filter on the specified image.
Processing rectangle mast be at least 3x3 in size.
protected ProcessFilter ( UnmanagedImage sourceData, UnmanagedImage destinationData, Rectangle rect ) : void
sourceData UnmanagedImage Source image data.
destinationData UnmanagedImage Destination image data.
rect System.Drawing.Rectangle Image rectangle for processing by the filter.
return void
        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;
        }
    }