/*******************************************************************************
 * Copyright (c) 2004, 2008 IBM Corporation and Others
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Junji MAEDA - initial API and implementation
 *******************************************************************************/

package org.eclipse.actf.visualization.engines.lowvision.operator;

import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
import java.awt.image.WritableRaster;
import java.util.HashMap;

import org.eclipse.actf.visualization.engines.lowvision.LowVisionException;
import org.eclipse.actf.visualization.engines.lowvision.color.ColorUtil;

public class GlareOp implements ILowVisionOperator {
	private float glareDegree = 0.0f;// [0,1] original-white

	public GlareOp() {
	}

	public GlareOp(float _deg) throws LowVisionException {
		if (!checkDegree(_deg)) {
			throw new LowVisionException("Glare Degree " + _deg
					+ " is out of range.");
		}
		glareDegree = _deg;
	}

	public float getGlareDegree() {
		return (glareDegree);
	}

	public void setGlareDegree(float _d) {
		glareDegree = _d;
	}

	public BufferedImage filter(BufferedImage _src, BufferedImage _dest)
			throws LowVisionException {
		WritableRaster srcRaster = _src.copyData(null);
		DataBufferInt srcBufInt = (DataBufferInt) (srcRaster.getDataBuffer());
		int[] srcArray = srcBufInt.getData();
		int srcSize = srcArray.length;

		BufferedImage destImage = _dest;
		if (_dest == null) {
			destImage = new BufferedImage(_src.getWidth(), _src.getHeight(),
					BufferedImage.TYPE_INT_RGB);
		}
		WritableRaster destRaster = destImage.copyData(null);
		DataBufferInt destBufInt = (DataBufferInt) (destRaster.getDataBuffer());
		int[] destArray = destBufInt.getData();
		int destSize = destArray.length;
		if (srcSize != destSize) {
			throw new LowVisionException("Sizes of src and dest images differ.");
		}

		HashMap<Integer, Integer> pixelMap = new HashMap<Integer, Integer>();
		for (int i = 0; i < srcSize; i++) {
			Integer srcPixel = new Integer(srcArray[i]);
			Integer destPixel = null;
			if ((destPixel = (Integer) (pixelMap.get(srcPixel))) == null) {
				destPixel = new Integer(convertColor(srcArray[i], glareDegree));
				pixelMap.put(srcPixel, destPixel);
			}
			destArray[i] = destPixel.intValue();
		}

		destImage.setData(destRaster);
		return (destImage);
	}

	public static int convertColor(int _color, float _degree)
			throws LowVisionException {
		if (!checkDegree(_degree)) {
			throw new LowVisionException("Glare Degree " + _degree
					+ " is out of range.");
		}
		int[] rgb = ColorUtil.intToRGB(_color);

		int r = convertColorComponent(rgb[0], _degree);
		int g = convertColorComponent(rgb[1], _degree);
		int b = convertColorComponent(rgb[2], _degree);

		return (ColorUtil.RGBToInt(r, g, b));
	}

	private static int convertColorComponent(int _component, float _degree) {
		int answer = _component + Math.round(_degree * (255 - _component));
		if (answer < 0)
			return (0);
		if (answer > 255)
			return (255);
		return (answer);
	}

	private static boolean checkDegree(float _degree) {
		if (0.0f <= _degree && _degree <= 1.0f) {
			return (true);
		} else {
			return (false);
		}
	}
}
