#include "Stdafx.h"
#include "OperationsOnArrays.h"

#include <opencv\cv.h>

namespace Domination {
	namespace Unmanaged {
		namespace OpenCV 
		{
			void OperationsOnArrays::absdiff(Mat^ src1, Mat^ src2, Mat^ dst)
			{
				//cv::Mat lsrc1 = *src1->ref;
				pin_ptr<cv::Mat> plsrc1 = src1->ref;
				cv::Mat lsrc1 = *plsrc1;

				cv::Mat lsrc2 = *src2->ref;
				pin_ptr<cv::Mat> pldst = dst->ref;
				cv::Mat ldst = *pldst;
				cv::absdiff(lsrc1, lsrc2, ldst);
			}

			void OperationsOnArrays::add(Mat^ src1, Mat^ src2, Mat^ dst)
			{
				cv::Mat lsrc1 = *src1->ref;
				cv::Mat lsrc2 = *src2->ref;
				pin_ptr<cv::Mat> pldst = dst->ref;
				cv::Mat ldst = *pldst;
				cv::add(lsrc1, lsrc2, ldst);
			}

			void OperationsOnArrays::subtract(Mat^ src1, Mat^ src2, Mat^ dst)
			{
				cv::Mat lsrc1 = *src1->ref;
				cv::Mat lsrc2 = *src2->ref;
				pin_ptr<cv::Mat> pldst = dst->ref;
				cv::Mat ldst = *pldst;
				cv::subtract(lsrc1, lsrc2, ldst);
			}

			void OperationsOnArrays::flip(Mat^ src, Mat^ dst)
			{
				flip(src, dst, 0);
			}
			void OperationsOnArrays::flip(Mat^ src, Mat^ dst, int flipCode)
			{
				cv::Mat lsrc = *src->ref;
				pin_ptr<cv::Mat> pldst = dst->ref;
				cv::Mat ldst = *pldst;
				cv::flip(lsrc, ldst, flipCode);
			}

			void OperationsOnArrays::inRange(Mat^ src, System::Tuple<double, double, double>^ lowerb, System::Tuple<double, double, double>^ upperb, Mat^ dst)
			{
				cv::Mat lsrc = *src->ref;
				pin_ptr<cv::Mat> pldst = dst->ref;
				cv::Mat ldst = *pldst;
				cv::inRange(lsrc, 
					cv::Scalar(lowerb->Item1, lowerb->Item2, lowerb->Item3), 
					cv::Scalar(upperb->Item1, upperb->Item2, upperb->Item3),
					ldst);
			}
		}
	}
}