/*
 *  Brno University of Technology
 *
 *  Copyright (C) 2009-2010 by Brno University of Technology and the contributors
 *
 *  Complete list of developers available at our web site:
 *
 *       http://spl.utko.feec.vutbr.cz
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU Affero General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Affero General Public License for more details.
 *
 *  You should have received a copy of the GNU Affero General Public License
 *  along with this program.  If not, see http://www.gnu.org/licenses/.
 */
package cz.vutbr.feec.utko.opencv.operators.imageProcessing;

import java.util.List;

import com.googlecode.javacv.cpp.opencv_core.IplImage;
import com.rapidminer.operator.OperatorDescription;
import com.rapidminer.operator.OperatorException;
import com.rapidminer.parameter.ParameterType;
import com.rapidminer.parameter.ParameterTypeCategory;
import com.rapidminer.parameter.ParameterTypeInt;

import static com.googlecode.javacv.cpp.opencv_core.*;
import static com.googlecode.javacv.cpp.opencv_imgproc.*;
import static com.googlecode.javacv.cpp.opencv_highgui.*;


public class ThresholdingOperator extends BaseProcessingOperator
{
	
	private static final String PARAM_THRESHOLD = "Threshold";
	
	private static final String PARAM_MAX_VALUE = "Max value";
	
	private static final String PARAM_TYPE = "Type";
	
	private static final String[] PARAM_TYPES = new String[] {
	    	"Binary",
	    	"Binary inverse",
	    	"To zero",
	    	"To zero inverse",
	    	"Truncate"
	    };
	
	public ThresholdingOperator(OperatorDescription description)
	{
		super(description);
	}

	@Override
	public IplImage doWork(IplImage original) throws OperatorException
	{
		IplImage out = cvCreateImage( cvGetSize(original), IPL_DEPTH_8U, 3 );
		
		int threshold = getParameterAsInt(PARAM_THRESHOLD);
		int max = getParameterAsInt(PARAM_MAX_VALUE);
		int type = getParameterAsInt(PARAM_TYPE);
		int ttype = CV_THRESH_BINARY;
		switch (type)
		{
		case 0:
			ttype = CV_THRESH_BINARY;
			break;
		case 1:
			ttype = CV_THRESH_BINARY_INV;
			break;
		case 2:
			ttype = CV_THRESH_TOZERO;
			break;
		case 3:
			ttype = CV_THRESH_TOZERO_INV;
			break;
		case 4:
			ttype = CV_THRESH_TRUNC;
			break;
		default:
			break;
		}
		cvThreshold(original, out, threshold, max, ttype);
		
		return out;
	}

	@Override
	public List<ParameterType> getParameterTypes()
	{
		List<ParameterType> types = super.getParameterTypes();
		types.add(new ParameterTypeInt(PARAM_THRESHOLD, 
				"Threshold", 
				0, 255, 64));
		types.add(new ParameterTypeInt(PARAM_MAX_VALUE, 
				"Maximum value", 
				0, 255, 255));
		types.add(new ParameterTypeCategory(PARAM_TYPE, 
				"Type", PARAM_TYPES,0));
		
		return types;
	}

}
