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

  Program:   Visualization Toolkit
  Module:    vtkContourLineInterpolator.cxx

  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.

=========================================================================*/
#include "vtkContourLineInterpolator.h"

#include "vtkContourRepresentation.h"
#include "vtkIntArray.h"

//------------------------------------------------------------------------------
vtkContourLineInterpolator::vtkContourLineInterpolator() = default;

//------------------------------------------------------------------------------
vtkContourLineInterpolator::~vtkContourLineInterpolator() = default;

//------------------------------------------------------------------------------
int vtkContourLineInterpolator::UpdateNode(
  vtkRenderer*, vtkContourRepresentation*, double* vtkNotUsed(node), int vtkNotUsed(idx))
{
  return 0;
}

//------------------------------------------------------------------------------
void vtkContourLineInterpolator::GetSpan(
  int nodeIndex, vtkIntArray* nodeIndices, vtkContourRepresentation* rep)
{
  int start = nodeIndex - 1;
  int end = nodeIndex;
  int index[2];

  // Clear the array
  nodeIndices->Reset();
  nodeIndices->Squeeze();
  nodeIndices->SetNumberOfComponents(2);

  for (int i = 0; i < 3; i++)
  {
    index[0] = start++;
    index[1] = end++;

    if (rep->GetClosedLoop())
    {
      if (index[0] < 0)
      {
        index[0] += rep->GetNumberOfNodes();
      }
      if (index[1] < 0)
      {
        index[1] += rep->GetNumberOfNodes();
      }
      if (index[0] >= rep->GetNumberOfNodes())
      {
        index[0] -= rep->GetNumberOfNodes();
      }
      if (index[1] >= rep->GetNumberOfNodes())
      {
        index[1] -= rep->GetNumberOfNodes();
      }
    }

    if (index[0] >= 0 && index[0] < rep->GetNumberOfNodes() && index[1] >= 0 &&
      index[1] < rep->GetNumberOfNodes())
    {
      nodeIndices->InsertNextTypedTuple(index);
    }
  }
}

//------------------------------------------------------------------------------
void vtkContourLineInterpolator::PrintSelf(ostream& os, vtkIndent indent)
{
  this->Superclass::PrintSelf(os, indent);
}
