RoundGradientPaintFill.java Source code

Java tutorial

Introduction

Here is the source code for RoundGradientPaintFill.java

Source

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
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.geom.RoundRectangle2D;
import java.awt.image.ColorModel;
import java.awt.image.Raster;
import java.awt.image.WritableRaster;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class RoundGradientPaintFill extends JPanel {
    public void paint(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        RoundRectangle2D r = new RoundRectangle2D.Float(5, 5, 150, 150, 25, 25);
        RoundGradientPaint rgp = new RoundGradientPaint(75, 75, Color.magenta, new Point2D.Double(0, 85),
                Color.blue);
        g2.setPaint(rgp);
        g2.fill(r);
    }

    public static void main(String[] args) {
        JFrame f = new JFrame();
        f.getContentPane().add(new RoundGradientPaintFill());
        f.setSize(200, 200);
        f.show();
    }

    class RoundGradientPaint implements Paint {
        protected Point2D point;

        protected Point2D mRadius;

        protected Color mPointColor, mBackgroundColor;

        public RoundGradientPaint(double x, double y, Color pointColor, Point2D radius, Color backgroundColor) {
            if (radius.distance(0, 0) <= 0)
                throw new IllegalArgumentException("Radius must be greater than 0.");
            point = new Point2D.Double(x, y);
            mPointColor = pointColor;
            mRadius = radius;
            mBackgroundColor = backgroundColor;
        }

        public PaintContext createContext(ColorModel cm, Rectangle deviceBounds, Rectangle2D userBounds,
                AffineTransform xform, RenderingHints hints) {
            Point2D transformedPoint = xform.transform(point, null);
            Point2D transformedRadius = xform.deltaTransform(mRadius, null);
            return new RoundGradientContext(transformedPoint, mPointColor, transformedRadius, mBackgroundColor);
        }

        public int getTransparency() {
            int a1 = mPointColor.getAlpha();
            int a2 = mBackgroundColor.getAlpha();
            return (((a1 & a2) == 0xff) ? OPAQUE : TRANSLUCENT);
        }
    }

    public class RoundGradientContext implements PaintContext {
        protected Point2D mPoint;

        protected Point2D mRadius;

        protected Color color1, color2;

        public RoundGradientContext(Point2D p, Color c1, Point2D r, Color c2) {
            mPoint = p;
            color1 = c1;
            mRadius = r;
            color2 = c2;
        }

        public void dispose() {
        }

        public ColorModel getColorModel() {
            return ColorModel.getRGBdefault();
        }

        public Raster getRaster(int x, int y, int w, int h) {
            WritableRaster raster = getColorModel().createCompatibleWritableRaster(w, h);

            int[] data = new int[w * h * 4];
            for (int j = 0; j < h; j++) {
                for (int i = 0; i < w; i++) {
                    double distance = mPoint.distance(x + i, y + j);
                    double radius = mRadius.distance(0, 0);
                    double ratio = distance / radius;
                    if (ratio > 1.0)
                        ratio = 1.0;

                    int base = (j * w + i) * 4;
                    data[base + 0] = (int) (color1.getRed() + ratio * (color2.getRed() - color1.getRed()));
                    data[base + 1] = (int) (color1.getGreen() + ratio * (color2.getGreen() - color1.getGreen()));
                    data[base + 2] = (int) (color1.getBlue() + ratio * (color2.getBlue() - color1.getBlue()));
                    data[base + 3] = (int) (color1.getAlpha() + ratio * (color2.getAlpha() - color1.getAlpha()));
                }
            }
            raster.setPixels(0, 0, w, h, data);

            return raster;
        }
    }

}