#include "calcfirstder.cl"

__kernel void processNineCellWindow( __global float *scanLine1,
                                     __global float *scanLine2,
                                     __global float *scanLine3,
                                     __global float *resultLine,
                                     __global float *rasterParams // mInputNodataValue, mOutputNodataValue, mZFactor, mCellSizeX, mCellSizeY
                                     )
{

  // Get the index of the current element
  const int i = get_global_id(0);

  if ( scanLine2[i+1] == rasterParams[0] )
  {
     resultLine[i] = rasterParams[1];
  }
  else
  {
    float derX = calcFirstDer( scanLine1[i], scanLine1[i+1], scanLine1[i+2],
                               scanLine2[i], scanLine2[i+1], scanLine2[i+2],
                               scanLine3[i], scanLine3[i+1], scanLine3[i+2],
                               rasterParams[0], rasterParams[1], rasterParams[2], rasterParams[3] );

    float derY = calcFirstDer( scanLine3[i],   scanLine2[i],   scanLine1[i],
                               scanLine3[i+1], scanLine2[i+1], scanLine1[i+1],
                               scanLine3[i+2], scanLine2[i+2], scanLine1[i+2],
                               rasterParams[0], rasterParams[1], rasterParams[2], rasterParams[4]);

    if ( derX == rasterParams[1] || derY == rasterParams[1] ||
         ( derX == 0.0f && derY == 0.0f) )
    {
      resultLine[i] = rasterParams[1];
    }
    else
    {
      resultLine[i] = 180.0f + atan2pi( derX, derY ) * 180.0f;
    }
  }
}
