Accord.Imaging.Filters.Convolution.Process8bppImage C# (CSharp) Method

Process8bppImage() private method

private Process8bppImage ( byte src, byte dst, int srcStride, int dstStride, int srcOffset, int dstOffset, int startX, int startY, int stopX, int stopY ) : void
src byte
dst byte
srcStride int
dstStride int
srcOffset int
dstOffset int
startX int
startY int
stopX int
stopY int
return void
        private unsafe void Process8bppImage(byte* src, byte* dst,
                                              int srcStride, int dstStride, int srcOffset, int dstOffset,
                                              int startX, int startY, int stopX, int stopY)
        {
            // loop and array indexes
            int i, j, t, k, ir, jr;
            // kernel's radius
            int radius = size >> 1;
            // color sums
            long g, div;

            // kernel size
            int kernelSize = size * size;
            // number of kernel elements taken into account
            int processedKernelSize;

            // for each line
            for (int y = startY; y < stopY; y++)
            {
                // for each pixel
                for (int x = startX; x < stopX; x++, src++, dst++)
                {
                    g = div = processedKernelSize = 0;

                    // for each kernel row
                    for (i = 0; i < size; i++)
                    {
                        ir = i - radius;
                        t = y + ir;

                        // skip row
                        if (t < startY)
                            continue;
                        // break
                        if (t >= stopY)
                            break;

                        // for each kernel column
                        for (j = 0; j < size; j++)
                        {
                            jr = j - radius;
                            t = x + jr;

                            // skip column
                            if (t < startX)
                                continue;

                            if (t < stopX)
                            {
                                k = kernel[i, j];

                                div += k;
                                g += k * src[ir * srcStride + jr];
                                processedKernelSize++;
                            }
                        }
                    }

                    // check if all kernel elements were processed
                    if (processedKernelSize == kernelSize)
                    {
                        // all kernel elements are processed - we are not on the edge
                        div = divisor;
                    }
                    else
                    {
                        // we are on edge. do we need to use dynamic divisor or not?
                        if (!dynamicDivisorForEdges)
                        {
                            // do
                            div = divisor;
                        }
                    }

                    // check divider
                    if (div != 0)
                    {
                        g /= div;
                    }
                    g += threshold;
                    *dst = (byte)((g > 255) ? 255 : ((g < 0) ? 0 : g));
                }
                src += srcOffset;
                dst += dstOffset;
            }
        }