/*******************************************************************************
 * 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.image;

/*
 * x4 x3 x2 x5 x0 x1 x6 x7 x8
 * 
 * x9 = x1
 */
public class Neighbor {
	int[] x = new int[10];

	public Neighbor() {
	}

	public Neighbor(BinaryImage _bi, int _i, int _j) {
		int width = _bi.width;
		int height = _bi.height;
		if (_bi.data[_j][_i] != 0) {
			x[0] = 1;
		}
		if (_i > 0) {
			if (_j > 0 && _bi.data[_j - 1][_i - 1] != 0)
				x[4] = 1;
			if (_bi.data[_j][_i - 1] != 0)
				x[5] = 1;
			if (_j < height - 1 && _bi.data[_j + 1][_i - 1] != 0)
				x[6] = 1;
		}
		if (_j > 0 && _bi.data[_j - 1][_i] != 0)
			x[3] = 1;
		if (_j < height - 1 && _bi.data[_j + 1][_i] != 0)
			x[7] = 1;
		if (_i < width - 1) {
			if (_j > 0 && _bi.data[_j - 1][_i + 1] != 0)
				x[2] = 1;
			if (_bi.data[_j][_i + 1] != 0) {
				x[1] = 1;
				x[9] = 1;
			}
			if (_j < height - 1 && _bi.data[_j + 1][_i + 1] != 0)
				x[8] = 1;
		}
	}

	public Neighbor deepCopy() {
		Neighbor nei = new Neighbor();
		for (int i = 0; i < 10; i++) {
			nei.x[i] = this.x[i];
		}
		return (nei);
	}

	public int numForeground4() {
		return (x[1] + x[3] + x[5] + x[7]);
	}

	public int numForeground8() {
		return (x[1] + x[2] + x[3] + x[4] + x[5] + x[6] + x[7] + x[8]);
	}

	public int numBackground4() {
		return (4 - (x[1] + x[3] + x[5] + x[7]));
	}

	public int numBackground8() {
		return (8 - (x[1] + x[2] + x[3] + x[4] + x[5] + x[6] + x[7] + x[8]));
	}

	// -1 -> target pixel = bg
	public int connectivityNumber4() {
		if (x[0] == 0)
			return (-1);
		int num = 0;
		for (int i = 1; i <= 7; i += 2) { // i = 1,3,5,7
			num += (x[i] - x[i] * x[i + 1] * x[i + 2]);
		}
		return (num);
	}

	// -1 -> target pixel = bg
	public int connectivityNumber8() {
		if (x[0] == 0)
			return (-1);
		int num = 0;
		for (int i = 1; i <= 7; i += 2) { // i = 1,3,5,7
			num += ((1 - x[i]) - (1 - x[i]) * (1 - x[i + 1]) * (1 - x[i + 2]));
		}
		return (num);
	}

	// -1 -> target pixel = bg
	public int crossingNumber() {
		if (x[0] == 0)
			return (-1);
		int num = 0;
		for (int i = 1; i < 9; i++) {
			num += x[i] * (1 - x[i + 1]);
		}
		return (num);
	}
}
