import Wavelet;

public class FourFourWavelet implements Wavelet
{
	public static void FWT(int data[], int depth)
	{
		for(int skip = 2; skip <= (2 << (depth - 1)); skip <<= 1)
		{
			fwt_odd(data, skip);
			fwt_even(data, skip);
		}
	}
	
	public static void IFWT(int data[], int depth)
	{
		for(int skip = (2 << (depth - 1)); skip >= 2; skip >>= 1)
		{
			iwt_even(data, skip);
			iwt_odd(data, skip);
		}
	}

	//(4,4) Wavelet from Calderbank, Daubechies, Sweldens, and Yeo
	public static void fwt_even(int data[], int skip)
	{
		for(int el = skip * 2; el < data.length - skip * 2; el += skip)
		{
			data[el] += (9 * (data[el - skip / 2] + data[el + skip / 2]) - (data[el - skip / 2 * 3] + data[el + skip / 2 * 3]) + 16) / 32;
		}
	}

	public static void fwt_odd(int data[], int skip)
	{
		for(int el = skip / 2 * 5; el < data.length - skip *3 /2; el += skip)
		{
			data[el] -= (9 * (data[el - skip / 2] + data[el + skip / 2]) - (data[el - skip / 2 * 3] + data[el + skip / 2 * 3]) + 8) / 16;
		}
	}

	public static void iwt_even(int data[], int skip)
	{
		for(int el = skip * 2; el < data.length - skip * 2; el += skip)
		{
			data[el] -= (9 * (data[el - skip / 2] + data[el + skip / 2]) - (data[el - skip / 2 * 3] + data[el + skip / 2 * 3]) + 16) / 32;
		}
	}

	public static void iwt_odd(int data[], int skip)
	{
		for(int el = skip / 2 * 5; el < data.length - skip * 3 /2; el += skip)
		{
			data[el] += (9 * (data[el - skip / 2] + data[el + skip / 2]) - (data[el - skip / 2 * 3] + data[el + skip / 2 * 3]) + 8) / 16;
		}
	}
}
