/*
 * HGenerator.java
 * (c) 2005 Avelino Herrera Morales
 *
 * Released under the terms of the GNU General Public License (see http://www.gnu.org/licenses/gpl.txt)
 */
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.DataBuffer;

import java.io.FileInputStream;
import java.io.InputStream;

import javax.imageio.ImageIO;

public class HGenerator 
{
	public static final int PIXEL_ROW_WIDTH = 40;
	
	public static void main(String[] args) 
	{
		try 
		{
			String prefix = "exptiles";
			if (args.length > 1)
				prefix = args[1];
			InputStream is = new FileInputStream(args[0]);
			BufferedImage img = ImageIO.read(is);
			System.out.println("/* Generated by HGenerator. */");
			System.out.println();
			System.out.println("#define  " + prefix + "_WIDTH  " + img.getWidth());
			System.out.println("#define  " + prefix + "_HEIGHT " + img.getHeight());
			System.out.println();
			if (img.getType() == BufferedImage.TYPE_BYTE_INDEXED) 
			{
				System.out.println("/* It's a 256 color (indexed) image. */");
				ColorModel m = img.getColorModel();
				// Obtenemos los valores de la paleta
				System.out.println("const u16 " + prefix + "Palette[] = {");
				for (int i = 0; i < 256; i++) 
				{
					int red = (m.getRed(i) >> 3);
					int green = (m.getGreen(i) >> 3);
					int blue = (m.getBlue(i) >> 3);
					short rgb = (short) (red | (green << 5) | (blue << 10));
					System.out.print("\t0x" + Integer.toHexString(rgb));
					if (i < 255)
						System.out.println(",");
				}
				System.out.println("};");
				System.out.println();
				// Y los valores de los pixels de la imagen
				DataBuffer buffer = img.getData().getDataBuffer();
				System.out.print("const u16 " + prefix + "Data[] = {");
				int n = buffer.getSize();
				for (int i = 0; i < n; i += 2) 
				{
					if ((i % PIXEL_ROW_WIDTH) == 0)
						System.out.println();
					int pixel = (buffer.getElem(i) | (buffer.getElem(i + 1) << 8));
					System.out.print("0x" + Integer.toHexString(pixel));
					if (i < (n - 2))
						System.out.print(", ");
				}
				System.out.println();
				System.out.println("};");
			}
			else 
			{
				System.out.println("/* It is not an indexed 256 color image. Dumping RGB entries. */");
				System.out.println("const u16 " + prefix + "Data[] = {");
				int width = img.getWidth();
				int height = img.getHeight();
				for (int y = 0; y < height; y++) {
					for (int x = 0; x < width; x++) {
						int pixel = img.getRGB(x, y);
						int red = ((pixel >> 16) & 0x0000FF) >> 3;
						int green = ((pixel >>  8) & 0x0000FF) >> 3;
						int blue = (pixel & 0x0000FF) >> 3;
						short rgb = (short) (red | (green << 5) | (blue << 10));
						System.out.print("0x" + Integer.toHexString(rgb));
						if ((x < (width - 1)) || (y < (height - 1)))
							System.out.print(", ");
					}
					System.out.println();
				}
				System.out.println("};");
			}
		} catch (Exception e) 
		{
			System.err.println("Syntax: java HGenerator image_file [variable_name_prefix]");
			// e.printStackTrace(System.err);
		}
	}
}
