/*******************************************************************************
 * 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:
 *    Junji MAEDA - initial API and implementation
 *******************************************************************************/

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

import org.eclipse.actf.visualization.engines.lowvision.image.ConnectedComponent;
import org.eclipse.actf.visualization.engines.lowvision.image.Container;
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.PageComponent;
import org.eclipse.actf.visualization.engines.lowvision.image.PageImage;
import org.eclipse.actf.visualization.engines.lowvision.image.Topology;

/*
 * Character (multi fg color/single bg color)
 */
public class CharacterMS extends PageComponent {
	private int backgroundColor = -1; // container.color

	private int foregroundColor = -1; // average color

	private Topology topology = null;

	private int[][] image = null;

	public CharacterMS(PageImage _pi, ConnectedComponent _cc, Container _cont,
			int[][] _pixel) throws ImageException {
		super(MS_CHARACTER_TYPE, _pi);
		cc = _cc;
		container = _cont;
		backgroundColor = _cont.getColor();
		topology = new Topology(cc.thinning());
		if (_pixel != null) {
			int w = cc.getShape().getWidth();
			int h = cc.getShape().getHeight();
			int offsetX = cc.getLeft();
			int offsetY = cc.getTop();
			image = new int[h][w];
			int sumR = 0;
			int sumG = 0;
			int sumB = 0;
			byte[][] data = cc.getShape().getData();
			for (int j = 0; j < h; j++) {
				for (int i = 0; i < w; i++) {
					image[j][i] = _pixel[j + offsetY][i + offsetX];
					if (data[j][i] != 0) {
						int color = image[j][i];
						sumR += (color >> 16) & 0xff;
						sumG += (color >> 8) & 0xff;
						sumB += color & 0xff;
					}
				}
			}
			sumR /= cc.getCount();
			sumG /= cc.getCount();
			sumB /= cc.getCount();
			foregroundColor = (sumR << 16) | (sumG << 8) | (sumB);
		}
	}

	public CharacterMS(PageImage _pi, ConnectedComponent _cc, Container _cont,
			Int2D _pixel) throws ImageException {
		this(_pi, _cc, _cont, _pixel.data);
	}

	public int getBackgroundColor() {
		return (backgroundColor);
	}

	public int getForegroundColor() {
		return (foregroundColor);
	}

	public Int2D getInt2D() throws ImageException {
		return (new Int2D(cc.getShape().getWidth(), cc.getShape().getHeight(), image));
	}

	public Int2D makeMarginedImage(int _margin) throws ImageException {
		if (_margin == 0) {
			return (getInt2D());
		}
		if (_margin < 0) {
			throw new ImageException("The margin must be non-negative.");
		}
		Int2D i2d = new Int2D(cc.getShape().getWidth() + 2 * _margin, cc.getShape().getHeight() + 2
				* _margin);
		i2d.fill(backgroundColor);
		for (int j = 0; j < cc.getShape().getHeight(); j++) {
			for (int i = 0; i < cc.getShape().getWidth(); i++) {
				i2d.data[j + _margin][i + _margin] = image[j][i];
			}
		}
		return (i2d);
	}

	public Topology getTopology() {
		return topology;
	}
}
