/*******************************************************************************
 * Copyright (c) 2003, 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:
 *    Kentarou FUKUDA - initial API and implementation
 *******************************************************************************/
package org.eclipse.actf.visualization.presentation.util;

import org.eclipse.actf.visualization.engines.lowvision.image.ImageException;
import org.eclipse.actf.visualization.engines.lowvision.image.Int2D;
import org.eclipse.actf.visualization.engines.lowvision.image.PageImage;
import org.eclipse.actf.visualization.engines.lowvision.image.SimulatedPageImage;
import org.eclipse.actf.visualization.engines.lowvision.io.ImageDumpUtil;
import org.eclipse.actf.visualization.engines.lowvision.io.LowVisionIOException;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.ImageLoader;
import org.eclipse.swt.widgets.Display;



public class SimulateRoom {


	public static synchronized Int2D getSimulatedInt2D(PageImage target, ParamRoom currentSetting) {

		Int2D result = new Int2D(0, 0);

		try {
			SimulatedPageImage simulatedPageImage;
			simulatedPageImage = new SimulatedPageImage(target, currentSetting.getLowVisionType());
			result = simulatedPageImage.getInt2D();
		} catch (ImageException ie) {
			ie.printStackTrace();
		}

		return result;
	}

	public static synchronized ImageData[] doSimulate(PageImage target, ParamRoom currentSetting, String fileName) {

		ImageData[] imageDataArray = new ImageData[0];

		// TODO use memory
		try {
			Int2D int2d_sim = getSimulatedInt2D(target, currentSetting);
			if (ImageDumpUtil.isLV16BIT()) {
				int2d_sim.writeToBMPFile(fileName, 16);
			} else {
				int2d_sim.writeToBMPFile(fileName);
			}
			ImageLoader loaderAfterSimulate = new ImageLoader();
			imageDataArray = loaderAfterSimulate.load(fileName);
		} catch (LowVisionIOException lvioe) {
			lvioe.printStackTrace();
		}

		return imageDataArray;
	}

	public static synchronized Image doSimulate(PageImage target, ParamRoom currentSetting, Display display, String fileS) {

		Image image = null;

		try {
			SimulatedPageImage simulatedPageImage;
			simulatedPageImage = new SimulatedPageImage(target, currentSetting.getLowVisionType());
			Int2D int2d_sim = simulatedPageImage.getInt2D();

			// TODO use memory

			if (ImageDumpUtil.isLV16BIT()) {
				int2d_sim.writeToBMPFile(fileS, 16);
			} else {
				int2d_sim.writeToBMPFile(fileS);
			}

			image = new Image(display, fileS);

		} catch (ImageException ie) {
			ie.printStackTrace();
		} catch (LowVisionIOException lvioe) {
			lvioe.printStackTrace();
		}

		return image;
	}

	public static PageImage getPageImage(String fileName, boolean withoutFrame) {

		PageImage pageImage = null;

		try {
			Int2D int2d = Int2D.readFromBMPFile(fileName);
			pageImage = new PageImage(int2d, withoutFrame);
		} catch (LowVisionIOException lvioe) {
			lvioe.printStackTrace();
		}

		return pageImage;
	}
}
