// Path: app/src/main/java/se/embargo/retroboy/color/MonochromePalette.java
// public class MonochromePalette implements IIndexedPalette {
// 	private final int _bits, _mask;
// 	private int[] _colors;
// 		
// 	public MonochromePalette(int bits) {
// 		_bits = bits;
// 		_mask = ~((1 << (8 - _bits)) - 1);
// 		_colors = new int[1 << bits];
// 		
// 		for (int i = 0; i < _colors.length; i++) {
// 			final int lum = i << (8 - bits);
// 			_colors[i] = 0xff000000 | (lum << 16) | (lum << 8) | lum;
// 		}
// 	}
// 	
// 	@Override
// 	public int getNearestColor(int r1, int g1, int b1) {
// 		return ((b1 & _mask) << 16) | ((g1 & _mask) << 8) | (r1 & _mask);
// 	}
// 
// 	@Override
// 	public int getColorCount() {
// 		return _colors.length;
// 	}
// 
// 	@Override
// 	public int[] getColors() {
// 		return _colors;
// 	}
// 
// 	@Override
// 	public int getIndex(int color) {
// 		return (color & 0xff) >> (8 - _bits);
// 	}
// }
// 
// Path: app/src/main/java/se/embargo/retroboy/graphic/GaussianBlur.java
// public class GaussianBlur {
// 	/**
// 	 * Creates a Gaussian kernel.
// 	 * @link			http://www.swageroo.com/wordpress/how-to-program-a-gaussian-blur-without-using-3rd-party-libraries/
// 	 * @param	sigma	Blurriness factor, e.g. 1.5
// 	 * @param	width	Width of kernel in pixels
// 	 * @param	height	Height of kernel in pixels
// 	 * @return			A matrix of weights to apply to neighboring pixels, size is width * height
// 	 */
// 	public static float[] createKernel(double sigma, int width, int height) {
// 		if (width % 2 == 0 || height % 2 == 0) {
// 			throw new IllegalArgumentException("Width and height must be odd numbers");
// 		}
// 		
// 		float[] result = new float[width * height];
// 		int xoffset = width / 2, yoffset = height / 2;
// 		
// 		double base = 1 / (2 * Math.PI * sigma * sigma);
// 		double sum = 0;
// 		
// 		// Calculate all the weights
// 		for (int y = -yoffset, i = 0; y <= yoffset; y++) {
// 			for (int x = -xoffset; x <= xoffset; x++) {
// 				double weight = base * Math.exp(-((x * x + y * y) / (2 * sigma * sigma)));
// 				sum += weight;
// 				result[i++] = (float)weight;
// 			}
// 		}
// 		
// 		// Normalize all the weights so the sum is 1
// 		for (int i = 0; i < result.length; i++) {
// 			result[i] = (float)((double)result[i] * (1 / sum)); 
// 		}
// 		
// 		return result;
// 	}
// }


import java.util.Arrays;
import se.embargo.core.concurrent.IForBody;
import se.embargo.core.concurrent.Parallel;
import se.embargo.core.graphic.color.IIndexedPalette;
import se.embargo.core.graphic.color.IPalette;
import se.embargo.retroboy.color.MonochromePalette;
import se.embargo.retroboy.graphic.GaussianBlur;

package se.embargo.retroboy.filter;



/**
 * @link	http://fox-gieg.com/tutorials/2008/fake-pxl2000-effect/
 */
public class Pxl2000Filter extends AbstractFilter {
	private final double _bordersize = 0.125d;
	private final FilterBody _body = new FilterBody();

// Path: app/src/main/java/se/embargo/retroboy/color/MonochromePalette.java
// public class MonochromePalette implements IIndexedPalette {
// 	private final int _bits, _mask;
// 	private int[] _colors;
// 		
// 	public MonochromePalette(int bits) {
// 		_bits = bits;
// 		_mask = ~((1 << (8 - _bits)) - 1);
// 		_colors = new int[1 << bits];
// 		
// 		for (int i = 0; i < _colors.length; i++) {
// 			final int lum = i << (8 - bits);
// 			_colors[i] = 0xff000000 | (lum << 16) | (lum << 8) | lum;
// 		}
// 	}
// 	
// 	@Override
// 	public int getNearestColor(int r1, int g1, int b1) {
// 		return ((b1 & _mask) << 16) | ((g1 & _mask) << 8) | (r1 & _mask);
// 	}
// 
// 	@Override
// 	public int getColorCount() {
// 		return _colors.length;
// 	}
// 
// 	@Override
// 	public int[] getColors() {
// 		return _colors;
// 	}
// 
// 	@Override
// 	public int getIndex(int color) {
// 		return (color & 0xff) >> (8 - _bits);
// 	}
// }
// 
// Path: app/src/main/java/se/embargo/retroboy/graphic/GaussianBlur.java
// public class GaussianBlur {
// 	/**
// 	 * Creates a Gaussian kernel.
// 	 * @link			http://www.swageroo.com/wordpress/how-to-program-a-gaussian-blur-without-using-3rd-party-libraries/
// 	 * @param	sigma	Blurriness factor, e.g. 1.5
// 	 * @param	width	Width of kernel in pixels
// 	 * @param	height	Height of kernel in pixels
// 	 * @return			A matrix of weights to apply to neighboring pixels, size is width * height
// 	 */
// 	public static float[] createKernel(double sigma, int width, int height) {
// 		if (width % 2 == 0 || height % 2 == 0) {
// 			throw new IllegalArgumentException("Width and height must be odd numbers");
// 		}
// 		
// 		float[] result = new float[width * height];
// 		int xoffset = width / 2, yoffset = height / 2;
// 		
// 		double base = 1 / (2 * Math.PI * sigma * sigma);
// 		double sum = 0;
// 		
// 		// Calculate all the weights
// 		for (int y = -yoffset, i = 0; y <= yoffset; y++) {
// 			for (int x = -xoffset; x <= xoffset; x++) {
// 				double weight = base * Math.exp(-((x * x + y * y) / (2 * sigma * sigma)));
// 				sum += weight;
// 				result[i++] = (float)weight;
// 			}
// 		}
// 		
// 		// Normalize all the weights so the sum is 1
// 		for (int i = 0; i < result.length; i++) {
// 			result[i] = (float)((double)result[i] * (1 / sum)); 
// 		}
// 		
// 		return result;
// 	}
// }


// Path: app/src/main/java/se/embargo/retroboy/filter/Pxl2000Filter.java
import java.util.Arrays;
import se.embargo.core.concurrent.IForBody;
import se.embargo.core.concurrent.Parallel;
import se.embargo.core.graphic.color.IIndexedPalette;
import se.embargo.core.graphic.color.IPalette;
import se.embargo.retroboy.color.MonochromePalette;
import se.embargo.retroboy.graphic.GaussianBlur;

package se.embargo.retroboy.filter;



/**
 * @link	http://fox-gieg.com/tutorials/2008/fake-pxl2000-effect/
 */
public class Pxl2000Filter extends AbstractFilter {
	private final double _bordersize = 0.125d;
	private final FilterBody _body = new FilterBody();

	private final IIndexedPalette _palette = new MonochromePalette(7);
