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

  Program:   Visualization Toolkit
  Module:    vtkGDALRasterReprojection.h

  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.

=========================================================================*/
/**
 * @class   vtkGDALRasterReprojection
 *
 */

#ifndef vtkGDALRasterReprojection_h
#define vtkGDALRasterReprojection_h

// VTK Includes
#include "vtkGeovisGDALModule.h" // For export macro
#include "vtkObject.h"

class GDALDataset;

class VTKGEOVISGDAL_EXPORT vtkGDALRasterReprojection : public vtkObject
{
public:
  static vtkGDALRasterReprojection* New();
  vtkTypeMacro(vtkGDALRasterReprojection, vtkObject);
  void PrintSelf(ostream& os, vtkIndent indent) override;

  //@{
  /**
   * The maximum error measured in input pixels that is allowed
   * in approximating the reprojection transformation
   * (0.0 for exact calculations).
   */
  vtkSetClampMacro(MaxError, double, 0.0, VTK_DOUBLE_MAX);
  //@}

  //@{
  /**
   * Pixel resampling algorithm, between 0 and 6
   * 0 = Nearest Neighbor (default)
   * 1 = Bilinear
   * 2 = Cubic
   * 3 = CubicSpline
   * 4 = Lanczos
   * 5 = Average (GDAL 1.10)
   * 6 = Mode    (GDAL 1.10)
   */
  vtkSetClampMacro(ResamplingAlgorithm, int, 0, 6);
  //@}

  /**
   * Suggest image dimensions for specified projection
   * Internally calls GDALSuggestedWarpOutput()
   * The outputProjection parameter can be either the full "well known text"
   * definition, or shorter commonly-used names such as "EPSG:4326" or
   * "WGS84".
   * Returns boolean indicating if computed dimensions are valid.
   */
  bool SuggestOutputDimensions(GDALDataset* inputDataset,
                               const char* outputProjection,
                               double geoTransform[6],
                               int* nPixels,
                               int* nLines,
                               double maxError = 0.0);

  /**
   * Compute the reprojection of the input dataset.
   * The output dataset must have its projection initialized to the
   * desired result, as well as its raster dimensions.
   * Returns boolean indicating if the result is valid.
   */
  bool Reproject(GDALDataset* input, GDALDataset* output);

protected:
  vtkGDALRasterReprojection();
  ~vtkGDALRasterReprojection();

  double MaxError;
  int ResamplingAlgorithm;

private:
  vtkGDALRasterReprojection(const vtkGDALRasterReprojection&) = delete;
  void operator=(const vtkGDALRasterReprojection&) = delete;
};

#endif // vtkGDALRasterReprojection_h
