import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.image.MemoryImageSource;
import java.awt.image.PixelGrabber;
import de.grogra.imp.objects.FixedImageAdapter;
import de.grogra.imp.objects.ImageRef;

module Dummy;

module A
{
	int age = 1;
	int oldAge = 0;
	Phong myShader = new Phong();
	ImageMap image = new ImageMap();

	public void update() {
		age++;
	}
}
==> 
{
	if(age!=oldAge && age/40f<=1 && age%5==0) {
		image = new ImageMap();
		image.setImageAdapter(new FixedImageAdapter(blendImg(image("leafO"), image("leafZ"), age/40f )));
		oldAge = age;
		myShader.setDiffuse(image);
	}
}
leaf(1,0.5).(setShader(myShader));


protected void init ()
[
	Axiom ==> A, ^Dummy;
]


public void run ()
[
	Dummy ==> Dummy;
	
	a:A::> {a.update();}
]


/** alpha blending between two images */
public static BufferedImage blendImg(ImageRef inputRef1, ImageRef inputRef2, float alpha) {
	println("alpha1 = "+alpha);
	
	BufferedImage input1 = inputRef1.toImageAdapter().getBufferedImage();
	BufferedImage input2 = inputRef2.toImageAdapter().getBufferedImage();
	int width = input1.getWidth();
	int height = input1.getHeight();
	int[] bi = new int[width * height];
	int[] pot = new int[width * height];
	PixelGrabber grabber = new PixelGrabber(input1, 0, 0, width, height, bi, 0, width);
	try {
		grabber.grabPixels();
	} catch (InterruptedException ex) {}
	grabber = new PixelGrabber(input2, 0, 0, width, height, pot, 0, width);
	try {
		grabber.grabPixels();
	} catch (InterruptedException ex) {}

	int[] out = new int[width * height];
	float alphaB = 1 - alpha;
	short valueR = 0, valueG = 0, valueB = 0, valueA = 0;
	
	for (int i = 0; i < out.length; i++) {
		valueR = (short) (((bi[i] >> 16) & 0xff) * alphaB + ((pot[i] >> 16) & 0xff) * alpha);
		valueG = (short) (((bi[i] >>  8) & 0xff) * alphaB + ((pot[i] >>  8) & 0xff) * alpha);
		valueB = (short) (((bi[i] >>  0) & 0xff) * alphaB + ((pot[i] >>  0) & 0xff) * alpha);
		if(valueR+valueG+valueB==0) valueA=0; else valueA=255;
		out[i] = 0xff00000000 | valueA << 24 | valueR << 16 | valueG << 8 | valueB;
	}

	Toolkit toolkit = Toolkit.getDefaultToolkit();
	Image image = toolkit.createImage(new MemoryImageSource(width, height, out, 0, width));
	BufferedImage outImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
	Graphics g = outImage.getGraphics();
	g.drawImage(image, 0, 0, null);
	return outImage;
}

