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); } } }
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); } } }