package uk.org.squirm3.derivative;
import java.awt.Color;
import java.awt.PaintContext;
import java.awt.geom.Point2D;
import java.awt.image.ColorModel;
import java.awt.image.Raster;
import java.awt.image.WritableRaster;
/**
* This file is part of Organic Builder and is a derivative work from an
* oreilly's example.
*
* @author from oreilly, Bertrand Dechoux
*
* see "http://www.oreilly.com/pub/a/oreilly/ask_tim/2001/codepolicy.html"
* see "http://examples.oreilly.com/java2d/examples/RoundGradientContext.java"
*/
public class RoundGradientContext implements PaintContext {
protected Point2D mPoint;
protected Point2D mRadius;
protected Color mC1, mC2;
public RoundGradientContext(final Point2D p, final Color c1, final Point2D r, final Color c2) {
mPoint = p;
mC1 = c1;
mRadius = r;
mC2 = c2;
}
@Override
public void dispose() {
}
@Override
public ColorModel getColorModel() {
return ColorModel.getRGBdefault();
}
@Override
public Raster getRaster(final int x, final int y, final int w, final int h) {
final WritableRaster raster = getColorModel().createCompatibleWritableRaster(w, h);
final int[] data = new int[w * h * 4];
for (int j = 0; j < h; j++) {
for (int i = 0; i < w; i++) {
final double distance = mPoint.distance(x + i, y + j);
final double radius = mRadius.distance(0, 0);
double ratio = distance / radius;
if (ratio > 1.0) {
ratio = 1.0;
}
final int base = (j * w + i) * 4;
data[base + 0] = (int) (mC1.getRed() + ratio * (mC2.getRed() - mC1.getRed()));
data[base + 1] = (int) (mC1.getGreen() + ratio * (mC2.getGreen() - mC1.getGreen()));
data[base + 2] = (int) (mC1.getBlue() + ratio * (mC2.getBlue() - mC1.getBlue()));
data[base + 3] = (int) (mC1.getAlpha() + ratio * (mC2.getAlpha() - mC1.getAlpha()));
}
}
raster.setPixels(0, 0, w, h, data);
return raster;
}
}