Exemplo n.º 1
0
        internal unsafe void Vertical(BitmapBase src, BitmapBase dest, BlurEdgeMode edgeMode)
        {
            for (int x = 0; x < src.Width; x++)
            {
                byte *colSource = src.Data + x * 4;
                byte *colResult = dest.Data + x * 4;
                for (int y = 0; y < src.Height; y++)
                {
                    int rSum = 0, gSum = 0, bSum = 0, aSum = 0;
                    for (int k = 0, ySrc = y - _kernel.Length / 2; k < _kernel.Length; k++, ySrc++)
                    {
                        int yRead = ySrc;
                        if (yRead < 0 || yRead >= src.Height)
                        {
                            switch (edgeMode)
                            {
                            case BlurEdgeMode.Transparent:
                                continue;

                            case BlurEdgeMode.Same:
                                yRead = yRead < 0 ? 0 : src.Height - 1;
                                break;

                            case BlurEdgeMode.Wrap:
                                yRead = Ut.ModPositive(yRead, src.Height);
                                break;

                            case BlurEdgeMode.Mirror:
                                if (yRead < 0)
                                {
                                    yRead = -yRead - 1;
                                }
                                yRead = yRead % (2 * src.Height);
                                if (yRead >= src.Height)
                                {
                                    yRead = 2 * src.Height - yRead - 1;
                                }
                                break;
                            }
                        }
                        yRead *= src.Stride;
                        bSum  += _kernel[k] * colSource[yRead + 0];
                        gSum  += _kernel[k] * colSource[yRead + 1];
                        rSum  += _kernel[k] * colSource[yRead + 2];
                        aSum  += _kernel[k] * colSource[yRead + 3];
                    }

                    int yWrite = y * dest.Stride;
                    colResult[yWrite + 0] = (byte)(bSum / _kernelSum);
                    colResult[yWrite + 1] = (byte)(gSum / _kernelSum);
                    colResult[yWrite + 2] = (byte)(rSum / _kernelSum);
                    colResult[yWrite + 3] = (byte)(aSum / _kernelSum);
                }
            }
        }
Exemplo n.º 2
0
        internal unsafe void Horizontal(BitmapBase src, BitmapBase dest, BlurEdgeMode edgeMode)
        {
            for (int y = 0; y < src.Height; y++)
            {
                byte *rowSource = src.Data + y * src.Stride;
                byte *rowResult = dest.Data + y * dest.Stride;
                for (int x = 0; x < src.Width; x++)
                {
                    int rSum = 0, gSum = 0, bSum = 0, aSum = 0;
                    for (int k = 0, xSrc = x - _kernel.Length / 2; k < _kernel.Length; k++, xSrc++)
                    {
                        int xRead = xSrc;
                        if (xRead < 0 || xRead >= src.Width)
                        {
                            switch (edgeMode)
                            {
                            case BlurEdgeMode.Transparent:
                                continue;

                            case BlurEdgeMode.Same:
                                xRead = xRead < 0 ? 0 : src.Width - 1;
                                break;

                            case BlurEdgeMode.Wrap:
                                xRead = Ut.ModPositive(xRead, src.Width);
                                break;

                            case BlurEdgeMode.Mirror:
                                if (xRead < 0)
                                {
                                    xRead = -xRead - 1;
                                }
                                xRead = xRead % (2 * src.Width);
                                if (xRead >= src.Width)
                                {
                                    xRead = 2 * src.Width - xRead - 1;
                                }
                                break;
                            }
                        }
                        xRead <<= 2; // * 4
                        bSum   += _kernel[k] * rowSource[xRead + 0];
                        gSum   += _kernel[k] * rowSource[xRead + 1];
                        rSum   += _kernel[k] * rowSource[xRead + 2];
                        aSum   += _kernel[k] * rowSource[xRead + 3];
                    }

                    int xWrite = x << 2; // * 4
                    rowResult[xWrite + 0] = (byte)(bSum / _kernelSum);
                    rowResult[xWrite + 1] = (byte)(gSum / _kernelSum);
                    rowResult[xWrite + 2] = (byte)(rSum / _kernelSum);
                    rowResult[xWrite + 3] = (byte)(aSum / _kernelSum);
                }
            }
        }