package vtk.test;

/*=========================================================================

 Program:   Visualization Toolkit
 Module:    Regression.java

 Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
 All rights reserved.
 See Copyright.txt or http://www.kitware.com/Copyright.htm for details.

 This software is distributed WITHOUT ANY WARRANTY; without even
 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
 PURPOSE.  See the above copyright notice for more information.

 =========================================================================*/
import vtk.vtkActor;
import vtk.vtkConeSource;
import vtk.vtkImageData;
import vtk.vtkImageDifference;
import vtk.vtkJavaTesting;
import vtk.vtkObject;
import vtk.vtkPNGWriter;
import vtk.vtkPolyDataMapper;
import vtk.vtkRenderWindow;
import vtk.vtkRenderWindowInteractor;
import vtk.vtkRenderer;
import vtk.vtkShortArray;
import vtk.vtkUnsignedCharArray;
import vtk.vtkUnsignedShortArray;
import vtk.vtkWindowToImageFilter;

public class Regression {
    public static void main(String[] args) {
        vtkJavaTesting.Initialize(args, true);

        vtkShortArray array = new vtkShortArray();
        array.InsertNextTuple1(3.0);
        array.InsertNextTuple1(1.0);
        array.InsertNextTuple1(4.0);
        array.InsertNextTuple1(1.0);
        array.InsertNextTuple1(5.0);
        array.InsertNextTuple1(9.0);
        array.InsertNextTuple1(2.0);
        array.InsertNextTuple1(6.0);
        array.InsertNextTuple1(5.0);
        array.InsertNextTuple1(3.0);
        array.InsertNextTuple1(5.0);
        array.InsertNextTuple1(8.0);
        array.InsertNextTuple1(9.0);
        array.InsertNextTuple1(7.0);
        array.InsertNextTuple1(9.0);
        array.InsertNextTuple1(3.0);
        array.InsertNextTuple1(1.0);
        short[] carray = array.GetJavaArray();
        int cc;
        System.out.print("[");
        for (cc = 0; cc < carray.length; cc++) {
            short i = carray[cc];
            System.out.print(i);
        }
        System.out.println("]");

        vtkUnsignedShortArray narray = new vtkUnsignedShortArray();
        narray.SetJavaArray(carray);
        System.out.print("[");
        for (cc = 0; cc <= narray.GetMaxId(); cc++) {
            int i = narray.GetValue(cc);
            System.out.print(i);
        }
        System.out.println("]");

        vtkRenderWindow renWin = new vtkRenderWindow();
        vtkRenderer ren1 = new vtkRenderer();
        renWin.AddRenderer(ren1);
        vtkRenderWindowInteractor iren = new vtkRenderWindowInteractor();
        iren.SetRenderWindow(renWin);
        vtkConeSource cone = new vtkConeSource();
        cone.SetResolution(8);
        vtkPolyDataMapper coneMapper = new vtkPolyDataMapper();
        coneMapper.SetInputConnection(cone.GetOutputPort());

        vtkActor coneActor = new vtkActor();
        coneActor.SetMapper(coneMapper);

        ren1.AddActor(coneActor);
        renWin.Render();
        vtkWindowToImageFilter w2i = new vtkWindowToImageFilter();
        w2i.SetInput(renWin);
        w2i.Modified();
        renWin.Render();
        w2i.Update();
        vtkImageData image = w2i.GetOutput();

        vtkUnsignedCharArray da = (vtkUnsignedCharArray) image.GetPointData().GetScalars();
        byte[] barray = da.GetJavaArray();

        System.out.println("Length of array: " + barray.length);

        vtkUnsignedCharArray nda = new vtkUnsignedCharArray();
        nda.SetJavaArray(barray);

        vtkImageData nimage = new vtkImageData();
        nimage.SetDimensions(image.GetDimensions());
        nimage.SetSpacing(image.GetSpacing());
        nimage.SetOrigin(image.GetOrigin());
        nimage.AllocateScalars(image.GetScalarType(), image.GetNumberOfScalarComponents());
        vtkUnsignedCharArray nida = (vtkUnsignedCharArray) nimage.GetPointData().GetScalars();
        nida.SetJavaArray(barray);

        int retVal0 = vtkJavaTesting.PASSED;

        for (cc = 0; cc <= da.GetMaxId(); cc++) {
            int v1 = 0, v2 = 0, v3 = 0;
            v1 = da.GetValue(cc);
            if (cc <= nda.GetMaxId()) {
                v2 = nda.GetValue(cc);
            } else {
                System.out.println("Cannot find point " + cc + " in nda");
                retVal0 = vtkJavaTesting.FAILED;
            }
            if (cc <= nida.GetMaxId()) {
                v3 = nida.GetValue(cc);
            } else {
                System.out.println("Cannot find point " + cc + " in nida");
                retVal0 = vtkJavaTesting.FAILED;
            }
            if (v1 != v2 || v1 != v3) {
                System.out.println("Wrong point: " + v1 + " <> " + v2 + " <> " + v3);
                retVal0 = vtkJavaTesting.FAILED;
            }
        }

        vtkImageDifference imgDiff = new vtkImageDifference();
        imgDiff.SetInputData(nimage);
        imgDiff.SetImageConnection(w2i.GetOutputPort());
        imgDiff.Update();

        int retVal1 = vtkJavaTesting.PASSED;
        if (imgDiff.GetThresholdedError() != 0) {
            System.out.println("Problem with array conversion. Image difference is: " + imgDiff.GetThresholdedError());
            vtkPNGWriter wr = new vtkPNGWriter();
            wr.SetInputConnection(w2i.GetOutputPort());
            wr.SetFileName("im1.png");
            wr.Write();
            wr.SetInputData(nimage);
            wr.SetFileName("im2.png");
            wr.Write();
            wr.SetInputConnection(imgDiff.GetOutputPort());
            wr.SetFileName("diff.png");
            wr.Write();
            retVal1 = vtkJavaTesting.FAILED;
        }

        int retVal2 = vtkJavaTesting.PASSED;
        if (vtkJavaTesting.IsInteractive()) {
            iren.Start();
        } else {
            retVal2 = vtkJavaTesting.RegressionTest(renWin, 10);
        }

        vtkObject.JAVA_OBJECT_MANAGER.deleteAll();

        if (retVal0 != vtkJavaTesting.PASSED) {
            vtkJavaTesting.Exit(retVal0);
        }
        if (retVal1 != vtkJavaTesting.PASSED) {
            vtkJavaTesting.Exit(retVal1);
        }
        vtkJavaTesting.Exit(retVal2);
    }
}
