| /* |
| * 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; |
| } |
| } |