public static class Interpolation
{
	private const int Mask4 = 16711680;

	private const int Mask2 = 65280;

	private const int Mask13 = 16711935;

	public static int Mix3To1(int c1, int c2)
	{
		if (c1 == c2)
		{
			return c1;
		}
		return (((c1 & 0xFF00) * 3 + (c2 & 0xFF00) >> 2) & 0xFF00) | (((c1 & 0xFF00FF) * 3 + (c2 & 0xFF00FF) >> 2) & 0xFF00FF) | ((((c1 & 0xFF0000) >> 2) * 3 + ((c2 & 0xFF0000) >> 2)) & 0xFF0000);
	}

	public static int Mix2To1To1(int c1, int c2, int c3)
	{
		return (((c1 & 0xFF00) * 2 + (c2 & 0xFF00) + (c3 & 0xFF00) >> 2) & 0xFF00) | (((c1 & 0xFF00FF) * 2 + (c2 & 0xFF00FF) + (c3 & 0xFF00FF) >> 2) & 0xFF00FF) | ((((c1 & 0xFF0000) >> 2) * 2 + ((c2 & 0xFF0000) >> 2) + ((c3 & 0xFF0000) >> 2)) & 0xFF0000);
	}

	public static int Mix7To1(int c1, int c2)
	{
		if (c1 == c2)
		{
			return c1;
		}
		return (((c1 & 0xFF00) * 7 + (c2 & 0xFF00) >> 3) & 0xFF00) | (((c1 & 0xFF00FF) * 7 + (c2 & 0xFF00FF) >> 3) & 0xFF00FF) | ((((c1 & 0xFF0000) >> 3) * 7 + ((c2 & 0xFF0000) >> 3)) & 0xFF0000);
	}

	public static int Mix2To7To7(int c1, int c2, int c3)
	{
		return (((c1 & 0xFF00) * 2 + (c2 & 0xFF00) * 7 + (c3 & 0xFF00) * 7 >> 4) & 0xFF00) | (((c1 & 0xFF00FF) * 2 + (c2 & 0xFF00FF) * 7 + (c3 & 0xFF00FF) * 7 >> 4) & 0xFF00FF) | ((((c1 & 0xFF0000) >> 4) * 2 + ((c2 & 0xFF0000) >> 4) * 7 + ((c3 & 0xFF0000) >> 4) * 7) & 0xFF0000);
	}

	public static int MixEven(int c1, int c2)
	{
		if (c1 == c2)
		{
			return c1;
		}
		return (((c1 & 0xFF00) + (c2 & 0xFF00) >> 1) & 0xFF00) | (((c1 & 0xFF00FF) + (c2 & 0xFF00FF) >> 1) & 0xFF00FF) | ((((c1 & 0xFF0000) >> 1) + ((c2 & 0xFF0000) >> 1)) & 0xFF0000);
	}

	public static int Mix4To2To1(int c1, int c2, int c3)
	{
		return (((c1 & 0xFF00) * 5 + (c2 & 0xFF00) * 2 + (c3 & 0xFF00) >> 3) & 0xFF00) | (((c1 & 0xFF00FF) * 5 + (c2 & 0xFF00FF) * 2 + (c3 & 0xFF00FF) >> 3) & 0xFF00FF) | ((((c1 & 0xFF0000) >> 3) * 5 + ((c2 & 0xFF0000) >> 3) * 2 + ((c3 & 0xFF0000) >> 3)) & 0xFF0000);
	}

	public static int Mix6To1To1(int c1, int c2, int c3)
	{
		return (((c1 & 0xFF00) * 6 + (c2 & 0xFF00) + (c3 & 0xFF00) >> 3) & 0xFF00) | (((c1 & 0xFF00FF) * 6 + (c2 & 0xFF00FF) + (c3 & 0xFF00FF) >> 3) & 0xFF00FF) | ((((c1 & 0xFF0000) >> 3) * 6 + ((c2 & 0xFF0000) >> 3) + ((c3 & 0xFF0000) >> 3)) & 0xFF0000);
	}

	public static int Mix5To3(int c1, int c2)
	{
		if (c1 == c2)
		{
			return c1;
		}
		return (((c1 & 0xFF00) * 5 + (c2 & 0xFF00) * 3 >> 3) & 0xFF00) | (((c1 & 0xFF00FF) * 5 + (c2 & 0xFF00FF) * 3 >> 3) & 0xFF00FF) | ((((c1 & 0xFF0000) >> 3) * 5 + ((c2 & 0xFF0000) >> 3) * 3) & 0xFF0000);
	}

	public static int Mix2To3To3(int c1, int c2, int c3)
	{
		return (((c1 & 0xFF00) * 2 + (c2 & 0xFF00) * 3 + (c3 & 0xFF00) * 3 >> 3) & 0xFF00) | (((c1 & 0xFF00FF) * 2 + (c2 & 0xFF00FF) * 3 + (c3 & 0xFF00FF) * 3 >> 3) & 0xFF00FF) | ((((c1 & 0xFF0000) >> 3) * 2 + ((c2 & 0xFF0000) >> 3) * 3 + ((c3 & 0xFF0000) >> 3) * 3) & 0xFF0000);
	}

	public static int Mix14To1To1(int c1, int c2, int c3)
	{
		return (((c1 & 0xFF00) * 14 + (c2 & 0xFF00) + (c3 & 0xFF00) >> 4) & 0xFF00) | (((c1 & 0xFF00FF) * 14 + (c2 & 0xFF00FF) + (c3 & 0xFF00FF) >> 4) & 0xFF00FF) | ((((c1 & 0xFF0000) >> 4) * 14 + ((c2 & 0xFF0000) >> 4) + ((c3 & 0xFF0000) >> 4)) & 0xFF0000);
	}
}
