package ip.gui;

import ip.vs.ColorUtils;
import ip.vs.ImageUtils;
import ip.gui.frames.FFTFrame;
import transforms.FFT;

public class FFTRadix2 {

    FFTFrame parent;

    private ColorUtils CU = new ColorUtils();
    private ImageUtils iUtil = new ImageUtils();
    private FFT imgFFT = new FFT();

    private short[] imageData_R;
    private short[] imageData_G;
    private short[] imageData_B;


    public FFTRadix2(FFTFrame _parent) {

        parent = _parent;
        initData();
    }

    private void initData() {
        imgFFT.DisplayLogPSD = true;
        int w = parent.getImageWidth();
        int h = parent.getImageHeight();
        // separated R,G,B values
        //System.out.println("getting the 1-D arrays");
        get1DArraysFromParent();
        //System.out.println("init complete");
    }

    public void get1DArraysFromParent() {
        if (parent == null)
            System.out.println(
                    "ER:get1DArraysFromParent, parent==null");
        if (parent.getImageWidth() != parent.getImageHeight())
            System.out.println("ComplexRgb:transforms.fft Non-square image detected");
        int N = parent.getImageWidth() * parent.getImageHeight();
        imageData_R = new short[N];
        imageData_G = new short[N];
        imageData_B = new short[N];

        for (int x = 0; x < parent.getImageWidth(); x++)
            for (int y = 0; y < parent.getImageHeight(); y++) {
                imageData_R[x + y * parent.getImageWidth()] = parent.getR()[x][y];
                imageData_G[x + y * parent.getImageWidth()] = parent.getG()[x][y];
                imageData_B[x + y * parent.getImageWidth()] = parent.getB()[x][y];
            }
    }

    public FFT fft = new FFT();

    public FFT getVsFft() {
        return fft;
    }

    public int[] fft() {
        fft.DisplayLogPSD = true;
        if (parent.getImageWidth() != parent.getImageHeight())
            System.out.println("ComplexRgb:transforms.fft ER! Non-square image");
        return fft.forward2dFFT(
                imageData_R,
                imageData_G,
                imageData_B,
                parent.getImageWidth(),
                parent.getImageHeight());
    }

    public int[] getPhaseImage() {
        fft.DisplayLogPSD = true;
        if (parent.getImageWidth() != parent.getImageHeight())
            System.out.println("ComplexRgb:transforms.fft ER! Non-square image");
        fft.forward2dFFT(
                imageData_R,
                imageData_G,
                imageData_B,
                parent.getImageWidth(),
                parent.getImageHeight());
        return fft.getPhaseImage();
    }

    public void complexMult(FFTRadix2 other) {
        fft.complexMult(other.getVsFft());
    }

    public int[] getPsd() {
        return fft.getPsd();
    }


    public int[] ifft() {
        return fft.reverse2dFFT();
    }


}