/*
 * Pipeline.cpp
 *
 *  Created on: Jun 17, 2008
 *      Author: pete
 */
#include "Pipeline.hpp"
#include "wipemalloc.h"

Pipeline::Pipeline() : staticPerPixel(false),gx(0),gy(0),blur1n(1), blur2n(1), blur3n(1),
blur1x(1), blur2x(1), blur3x(1),
blur1ed(1){}

void Pipeline::setStaticPerPixel(int gx, int gy)
{
	 staticPerPixel = true;
	 this->gx = gx;
	 this->gy = gy;

		this->x_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
		for ( int x = 0; x < gx; x++ )
		{
			this->x_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
		}
		this->y_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
		for ( int x = 0; x < gx; x++ )
		{
			this->y_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
		}

}

Pipeline::~Pipeline()
{
if (staticPerPixel)
{
	for ( int x = 0; x < this->gx; x++ )
	{
		free(this->x_mesh[x]);
		free(this->y_mesh[x]);
	}
	free(x_mesh);
	free(y_mesh);
}
}

//void Pipeline::Render(const BeatDetect &music, const PipelineContext &context){}
PixelPoint Pipeline::PerPixel(PixelPoint p, const PerPixelContext context)
{return p;}
