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

  Program:   Visualization Toolkit
  Module:    vtkImageMapper.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   vtkImageMapper
 * @brief   2D image display
 *
 * vtkImageMapper provides 2D image display support for vtk.
 * It is a Mapper2D subclass that can be associated with an Actor2D
 * and placed within a RenderWindow or ImageWindow.
 * The vtkImageMapper is a 2D mapper, which means that it displays images
 * in display coordinates. In display coordinates, one image pixel is
 * always one screen pixel.
 *
 * @sa
 * vtkMapper2D vtkActor2D
 */

#ifndef vtkImageMapper_h
#define vtkImageMapper_h

#include "vtkMapper2D.h"
#include "vtkRenderingCoreModule.h" // For export macro

class vtkWindow;
class vtkViewport;
class vtkActor2D;
class vtkImageData;

class VTKRENDERINGCORE_EXPORT vtkImageMapper : public vtkMapper2D
{
public:
  vtkTypeMacro(vtkImageMapper, vtkMapper2D);
  static vtkImageMapper* New();
  void PrintSelf(ostream& os, vtkIndent indent) override;

  /**
   * Override Modifiedtime as we have added a lookuptable
   */
  vtkMTimeType GetMTime() override;

  //@{
  /**
   * Set/Get the window value for window/level
   */
  vtkSetMacro(ColorWindow, double);
  vtkGetMacro(ColorWindow, double);
  //@}

  //@{
  /**
   * Set/Get the level value for window/level
   */
  vtkSetMacro(ColorLevel, double);
  vtkGetMacro(ColorLevel, double);
  //@}

  //@{
  /**
   * Set/Get the current slice number. The axis Z in ZSlice does not
   * necessarily have any relation to the z axis of the data on disk.
   * It is simply the axis orthogonal to the x,y, display plane.
   * GetWholeZMax and Min are convenience methods for obtaining
   * the number of slices that can be displayed. Again the number
   * of slices is in reference to the display z axis, which is not
   * necessarily the z axis on disk. (due to reformatting etc)
   */
  vtkSetMacro(ZSlice, int);
  vtkGetMacro(ZSlice, int);
  int GetWholeZMin();
  int GetWholeZMax();
  //@}

  /**
   * Draw the image to the screen.
   */
  void RenderStart(vtkViewport* viewport, vtkActor2D* actor);

  /**
   * Function called by Render to actually draw the image to to the screen
   */
  virtual void RenderData(vtkViewport*, vtkImageData*, vtkActor2D*) = 0;

  //@{
  /**
   * Methods used internally for performing the Window/Level mapping.
   */
  double GetColorShift();
  double GetColorScale();
  //@}

  // Public for templated functions. * *  Should remove this * *
  int DisplayExtent[6];

  //@{
  /**
   * Set the Input of a filter.
   */
  virtual void SetInputData(vtkImageData* input);
  vtkImageData* GetInput();
  //@}

  //@{
  /**
   * If RenderToRectangle is set (by default not), then the imagemapper
   * will render the image into the rectangle supplied by the Actor2D's
   * PositionCoordinate and Position2Coordinate
   */
  vtkSetMacro(RenderToRectangle, vtkTypeBool);
  vtkGetMacro(RenderToRectangle, vtkTypeBool);
  vtkBooleanMacro(RenderToRectangle, vtkTypeBool);
  //@}

  //@{
  /**
   * Usually, the entire image is displayed, if UseCustomExtents
   * is set (by default not), then the region supplied in the
   * CustomDisplayExtents is used in preference.
   * Note that the Custom extents are x,y only and the zslice is still
   * applied
   */
  vtkSetMacro(UseCustomExtents, vtkTypeBool);
  vtkGetMacro(UseCustomExtents, vtkTypeBool);
  vtkBooleanMacro(UseCustomExtents, vtkTypeBool);
  //@}

  //@{
  /**
   * The image extents which should be displayed with UseCustomExtents
   * Note that the Custom extents are x,y only and the zslice is still
   * applied
   */
  vtkSetVectorMacro(CustomDisplayExtents, int, 4);
  vtkGetVectorMacro(CustomDisplayExtents, int, 4);
  //@}

protected:
  vtkImageMapper();
  ~vtkImageMapper() override;

  double ColorWindow;
  double ColorLevel;

  int PositionAdjustment[2];
  int ZSlice;
  vtkTypeBool UseCustomExtents;
  int CustomDisplayExtents[4];
  vtkTypeBool RenderToRectangle;

  int FillInputPortInformation(int, vtkInformation*) override;

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

#endif
