// RadialGradientPaint.java package net.sf.gogui.boardpainter; import java.awt.Color; import java.awt.Paint; import java.awt.PaintContext; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.geom.AffineTransform; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.awt.image.ColorModel; /** Creates a PaintContext for a radial gradient. */ public class RadialGradientPaint implements Paint { /** Create a radial gradient paint. @param center The center point. @param radius1 The radius along the first axis of the ellipse. @param radius2 The radius along the second axis of the ellipse. @param focus Focus shift away from the center along second radius normalized to interval between zero and one. @param color1 First color. @param color2 Second color. */ public RadialGradientPaint(Point2D center, Point2D radius1, Point2D radius2, double focus, Color color1, Color color2) { m_center = center; m_radius1 = radius1; m_radius2 = radius2; m_focus = focus; m_color1 = color1; m_color2 = color2; int alpha1 = color1.getAlpha(); int alpha2 = color2.getAlpha(); if ((alpha1 & alpha2) == 0xff) m_transparency = OPAQUE; else m_transparency = TRANSLUCENT; } public PaintContext createContext(ColorModel colorModel, Rectangle deviceBounds, Rectangle2D userBounds, AffineTransform xform, RenderingHints hints) { Point2D transformedCenter = xform.transform(m_center, null); Point2D transformedRadius1 = xform.deltaTransform(m_radius1, null); Point2D transformedRadius2 = xform.deltaTransform(m_radius2, null); if (m_cachedContext != null && transformedCenter.equals(m_transformedCenter) && transformedRadius1.equals(m_transformedRadius1) && transformedRadius2.equals(m_transformedRadius2)) return m_cachedContext; m_transformedCenter = (Point2D)transformedCenter.clone(); m_transformedRadius1 = (Point2D)transformedRadius1.clone(); m_transformedRadius2 = (Point2D)transformedRadius2.clone(); m_cachedContext = new RadialGradientContext(transformedCenter, transformedRadius1, transformedRadius2, m_focus, m_color1, m_color2); return m_cachedContext; } public int getTransparency() { return m_transparency; } private final int m_transparency; private Point2D m_transformedCenter; private Point2D m_transformedRadius1; private Point2D m_transformedRadius2; private RadialGradientContext m_cachedContext; private final double m_focus; private final Point2D m_center; private final Point2D m_radius1; private final Point2D m_radius2; private final Color m_color1; private final Color m_color2; }