// a generic multiplier for any type of color matrix private static void _multiplyBgr32(ColorMatrix matrix, byte[] pixels) { var M = matrix._cells; for (var i = 0; i < pixels.Length; i += 4) { byte R = pixels[i + 2], G = pixels[i + 1], B = pixels[i + 0], A = pixels[i + 3]; pixels[i + 2] = _clamp(R * M[0, 0] + G * M[1, 0] + B * M[2, 0] + M[3, 0]); pixels[i + 1] = _clamp(R * M[0, 1] + G * M[1, 1] + B * M[2, 1] + M[3, 1]); pixels[i + 0] = _clamp(R * M[0, 2] + G * M[1, 2] + B * M[2, 2] + M[3, 2]); pixels[i + 3] = _clamp(A * M[3, 3]); } }
// an optimized multiplier for Monochrome color matrix private static void _monochromeBgr32(ColorMatrix matrix, byte[] pixels) { var M = matrix._cells; var hasAlpha = (M[3, 3] != 1.0); for (var i = 0; i < pixels.Length; i += 4) { byte R = pixels[i + 2], G = pixels[i + 1], B = pixels[i + 0], A = pixels[i + 3]; pixels[i + 2] = (byte)M[3, 0]; pixels[i + 1] = (byte)M[3, 1]; pixels[i + 0] = (byte)M[3, 2]; if (hasAlpha) { pixels[i + 3] = _clamp(A * M[3, 3]); } } }
// converts a matrix to a known type private static ColorMatrix _cast(ColorMatrix matrix, KnownType knownType, object knownParam) { matrix._knownType = knownType; matrix._knownParam = knownParam; return matrix; }