package ip.apurva;
public class SPxform {
public static short[][] transpose(short in[][]) {
int width = in.length;
int height = in[0].length;
short[][] output = new short[height][width];
for (int j = 0; j < width; j++)
for (int i = 0; i < height; i++)
output[j][i] = in[i][j];
return output;
}
public static void S_plus_P_Xform(short in[][]) {
for (int x = 0; x < in.length; x++)
SPxform(in[x], in.length);
in = transpose(in);
for (int x = 0; x < in.length; x++)
SPxform(in[x], in.length);
in = transpose(in);
}
public static void SPxform(short in[], int n) {
int i;
if (n < 2) return;
int nOn2 = n / 2;
short s[] = new short[nOn2];
short d[] = new short[nOn2];
short delta[] = new short[in.length];
for (i = 0; i < nOn2; i++) {
s[i] = in[2 * i];
d[i] = in[2 * i + 1];
}
for (i = 1; i < s.length; i++)
delta[i] = (short) (s[i - 1] - s[i]);
for (i = 1; i < s.length - 1; i++) {
d[i] = (short) (d[i] + 0 * delta[i - 1] + 1 / 4 * delta[i] + 3 / 8 * delta[i + 1] - 1 / 4 * d[i + 1]);
}
for (i = 0; i < s.length; i++) {
in[i] = s[i];
in[i + nOn2] = d[i];
}
SPxform(in, nOn2);
}
public static void inversXform(short in[][]) {
for (int x = 0; x < in.length; x++)
inverseform(in[x]);
in = transpose(in);
for (int x = 0; x < in.length; x++)
inverseform(in[x]);
in = transpose(in);
}
public static void inverseform(short in[]) {
int i;
int n = in.length;
if (n < 2) return;
int nOn2 = n / 2;
short s[] = new short[nOn2];
short delta[] = new short[nOn2];
for (i = 0; i < nOn2; i++)
s[i] = in[i];
inverseform(s);
nOn2 = in.length / 2;
short d[] = new short[nOn2];
for (i = 0; i < d.length; i++)
d[i] = in[i + nOn2];
for (i = 1; i < s.length; i++)
delta[i] = (short) (s[i - 1] - s[i]);
for (i = 1; i < s.length - 1; i++) {
d[i] = (short) (d[i] - 0 * delta[i - 1] - 1 / 4 * delta[i] - 3 / 8 * delta[i + 1] + 1 / 4 * d[i + 1]);
}
for (i = 0; i < s.length; i++) {
in[2 * i] = s[i];
in[2 * i + 1] = d[i];
}
}
}