Pinta.ImageManipulation.PixelBlendOperations.NormalBlendOp.Apply C# (CSharp) Method

Apply() public method

public Apply ( ColorBgra lhs, ColorBgra rhs ) : ColorBgra
lhs ColorBgra
rhs ColorBgra
return ColorBgra
		public override ColorBgra Apply (ColorBgra lhs, ColorBgra rhs)
		{
			int lhsA = lhs.A;
			int rhsA = rhs.A;

			int y = lhsA * (255 - rhsA) + 0x80;			
			y = ((y >> 8) + y) >> 8;

			int totalA = y + rhsA;
			uint ret;

			if (totalA == 0)
				return ColorBgra.FromUInt32 (0);

			int fB = rhs.B;
			int fG = rhs.G;
			int fR = rhs.R;

			int x = lhsA * rhsA + 0x80;
			x = ((x >> 8) + x) >> 8; 

			int z = rhsA - x;
			int masIndex = totalA * 3;

			uint taM = masTable[masIndex];
			uint taA = masTable[masIndex + 1];
			uint taS = masTable[masIndex + 2];

			uint b = (uint)((((long)((lhs.B * y) + (rhs.B * z) + (fB * x))) * taM) + taA) >> (int)taS;
			uint g = (uint)((((long)((lhs.G * y) + (rhs.G * z) + (fG * x))) * taM) + taA) >> (int)taS;
			uint r = (uint)((((long)((lhs.R * y) + (rhs.R * z) + (fR * x))) * taM) + taA) >> (int)taS;
			
			int a = (lhsA * (255 - rhsA) + 0x80);
			a = (((a >> 8) + a) >> 8);
			a += rhsA;

			ret = b + (g << 8) + (r << 16) + ((uint)a << 24);

			return ColorBgra.FromUInt32 (ret);
		}

Same methods

NormalBlendOp::Apply ( ColorBgra lhs, ColorBgra rhs, ColorBgra dst, int length ) : void
NormalBlendOp::Apply ( ColorBgra src, ColorBgra dst, int length ) : void

Usage Example

		public void NormalBlendOp2 ()
		{
			var lhs = GetSourceImage ("blend1.png");
			var rhs = GetSourceImage ("blend2.png");

			var lhs_wrap = new BitmapWrapper (lhs);
			var rhs_wrap = new BitmapWrapper (rhs);

			var op = new NormalBlendOp ();
			op.Apply (rhs_wrap, lhs_wrap);

			Compare (lhs, "normalblend2.png");
		}