package com.jhlabs.composite;
import java.awt.CompositeContext;
import java.awt.RenderingHints;
import java.awt.image.ColorModel;
/**
* This special composite solves the problem described at http://javagraphics.blogspot.hu/2008/06/crossfades-what-is-and-isnt-possible.html
* TODO it is not working with all image types.
*/
public class CrossFadeComposite extends RGBComposite {
public CrossFadeComposite(float alpha) {
super(alpha);
}
public CompositeContext createContext(ColorModel srcColorModel, ColorModel dstColorModel, RenderingHints hints) {
return new Context(extraAlpha, srcColorModel, dstColorModel);
}
static class Context extends RGBCompositeContext {
public Context(float alpha, ColorModel srcColorModel, ColorModel dstColorModel) {
super(alpha, srcColorModel, dstColorModel);
}
public void composeRGB(int[] src, int[] dst, float alpha) {
int w = src.length;
for (int i = 0; i < w; i += 4) {
int sr = src[i];
int sg = src[i + 1];
int sb = src[i + 2];
int sa = src[i + 3];
float a = alpha * sa / 255f;
float ac = 1 - a;
dst[i] = (int) (a * sr);
dst[i + 1] = (int) (a * sg);
dst[i + 2] = (int) (a * sb);
dst[i + 3] = (int) (sa * alpha);
}
}
}
}