/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package java.awt; import java.awt.geom.AffineTransform; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.awt.image.ColorModel; import org.apache.harmony.awt.internal.nls.Messages; /** * The GradientPaint class defines a way to fill a Shape with a linear color * gradient pattern. * <p> * The GradientPaint's fill pattern is determined by two points and two colors, * plus the cyclic mode option. Each of the two points is painted with its * corresponding color, and on the line segment connecting the two points, the * color is proportionally changed between the two colors. For points on the * same line which are not between the two specified points (outside of the * connecting segment) their color is determined by the cyclic mode option. If * the mode is cyclic, then the rest of the line repeats the color pattern of * the connecting segment, cycling back and forth between the two colors. If * not, the mode is acyclic which means that all points on the line outside the * connecting line segment are given the same color as the closest of the two * specified points. * <p> * The color of points that are not on the line connecting the two specified * points are given by perpendicular projection: by taking the set of lines * perpendicular to the connecting line and for each one, the whole line is * colored with the same color. * * @since Android 1.0 */ public class GradientPaint implements Paint { /** * The start point color. */ Color color1; /** * The end color point. */ Color color2; /** * The location of the start point. */ Point2D point1; /** * The location of the end point. */ Point2D point2; /** * The indicator of cycle filling. If TRUE filling repeated outside points * stripe, if FALSE solid color filling outside. */ boolean cyclic; /** * Instantiates a new GradientPaint with cyclic or acyclic mode. * * @param point1 * the first specified point. * @param color1 * the Color of the first specified point. * @param point2 * the second specified point. * @param color2 * the Color of the second specified point. * @param cyclic * the cyclic mode - true if the gradient pattern should cycle * repeatedly between the two colors; false otherwise. */ public GradientPaint(Point2D point1, Color color1, Point2D point2, Color color2, boolean cyclic) { if (point1 == null || point2 == null) { // awt.6D=Point is null throw new NullPointerException(Messages.getString("awt.6D")); //$NON-NLS-1$ } if (color1 == null || color2 == null) { // awt.6E=Color is null throw new NullPointerException(Messages.getString("awt.6E")); //$NON-NLS-1$ } this.point1 = point1; this.point2 = point2; this.color1 = color1; this.color2 = color2; this.cyclic = cyclic; } /** * Instantiates a new GradientPaint with cyclic or acyclic mode; points are * specified by coordinates. * * @param x1 * the X coordinate of the first point. * @param y1 * the Y coordinate of the first point. * @param color1 * the color of the first point. * @param x2 * the X coordinate of the second point. * @param y2 * the Y coordinate of the second point. * @param color2 * the color of the second point. * @param cyclic * the cyclic mode - true if the gradient pattern should cycle * repeatedly between the two colors; false otherwise. */ public GradientPaint(float x1, float y1, Color color1, float x2, float y2, Color color2, boolean cyclic) { this(new Point2D.Float(x1, y1), color1, new Point2D.Float(x2, y2), color2, cyclic); } /** * Instantiates a new acyclic GradientPaint; points are specified by * coordinates. * * @param x1 * the X coordinate of the first point. * @param y1 * the Y coordinate of the first point. * @param color1 * the color of the first point. * @param x2 * the X coordinate of the second point. * @param y2 * the Y coordinate of the second point. * @param color2 * the color of the second point. */ public GradientPaint(float x1, float y1, Color color1, float x2, float y2, Color color2) { this(x1, y1, color1, x2, y2, color2, false); } /** * Instantiates a new acyclic GradientPaint. * * @param point1 * the first specified point. * @param color1 * the Color of the first specified point. * @param point2 * the second specified point. * @param color2 * the Color of the second specified point. */ public GradientPaint(Point2D point1, Color color1, Point2D point2, Color color2) { this(point1, color1, point2, color2, false); } /** * Creates PaintContext for a color pattern generating. * * @param cm * the ColorModel of the Paint data. * @param deviceBounds * the bounding Rectangle of graphics primitives being rendered * in the device space. * @param userBounds * the bounding Rectangle of graphics primitives being rendered * in the user space. * @param t * the AffineTransform from user space into device space. * @param hints * the RrenderingHints object. * @return the PaintContext for color pattern generating. * @see java.awt.Paint#createContext(java.awt.image.ColorModel, * java.awt.Rectangle, java.awt.geom.Rectangle2D, * java.awt.geom.AffineTransform, java.awt.RenderingHints) */ public PaintContext createContext(ColorModel cm, Rectangle deviceBounds, Rectangle2D userBounds, AffineTransform t, RenderingHints hints) { return new GradientPaintContext(cm, t, point1, color1, point2, color2, cyclic); } /** * Gets the color of the first point. * * @return the color of the first point. */ public Color getColor1() { return color1; } /** * Gets the color of the second point. * * @return the color of the second point. */ public Color getColor2() { return color2; } /** * Gets the first point. * * @return the Point object - the first point. */ public Point2D getPoint1() { return point1; } /** * Gets the second point. * * @return the Point object - the second point. */ public Point2D getPoint2() { return point2; } /** * Gets the transparency mode for the GradientPaint. * * @return the transparency mode for the GradientPaint. * @see java.awt.Transparency#getTransparency() */ public int getTransparency() { int a1 = color1.getAlpha(); int a2 = color2.getAlpha(); return (a1 == 0xFF && a2 == 0xFF) ? OPAQUE : TRANSLUCENT; } /** * Returns the GradientPaint mode: true for cyclic mode, false for acyclic * mode. * * @return true if the gradient cycles repeatedly between the two colors; * false otherwise. */ public boolean isCyclic() { return cyclic; } }