001 /*
002 * $Id: LinearGradientPainter.java,v 1.3 2006/04/11 18:47:55 rbair Exp $
003 *
004 * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
005 * Santa Clara, California 95054, U.S.A. All rights reserved.
006 *
007 * This library is free software; you can redistribute it and/or
008 * modify it under the terms of the GNU Lesser General Public
009 * License as published by the Free Software Foundation; either
010 * version 2.1 of the License, or (at your option) any later version.
011 *
012 * This library is distributed in the hope that it will be useful,
013 * but WITHOUT ANY WARRANTY; without even the implied warranty of
014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015 * Lesser General Public License for more details.
016 *
017 * You should have received a copy of the GNU Lesser General Public
018 * License along with this library; if not, write to the Free Software
019 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
020 */
021
022 package org.jdesktop.swingx.painter.gradient;
023
024 import java.awt.Color;
025 import java.awt.Paint;
026 import java.awt.geom.Point2D;
027 import org.apache.batik.ext.awt.LinearGradientPaint;
028
029 /**
030 * <p>A Gradient based painter used for painting "multi-stop" gradients. These are
031 * gradients that imploys more than 2 colors, where each color is defined along
032 * with a float value between 0 and 1 indicating at what point along the gradient
033 * the new color is used.</p>
034 *
035 * <p>As with BasicGradienPainter and mentioned in AbstractGradientPainter, the values
036 * given to the startPoint and endPoint of the LinearGradientPainter are crucial. They
037 * represent what distance from the origin the gradient should begin and end at,
038 * depending on the size of the component. That is, they must be specified as values between
039 * 0 and 1, where 0 means "all the way on the left/top" and 1 means "all the way on the
040 * right/bottom".</p>
041 *
042 * <p><strong>NOTE: LinearGradientPainter relies on LinearGradientPaint, which is
043 * included in the optional jar MultipleGradientPaint.jar. Be sure to have this
044 * jar on your classpath if you use this class</strong></p>
045 *
046 * @author rbair
047 */
048 public class LinearGradientPainter extends AbstractGradientPainter {
049 public static final LinearGradientPaint ORANGE_DELIGHT = new LinearGradientPaint(
050 new Point2D.Double(0, 0),
051 new Point2D.Double(0, 1),
052 new float[] {0f, .5f, .51f, 1f},
053 new Color[] {
054 new Color(248, 192, 75),
055 new Color(253, 152, 6),
056 new Color(243, 133, 0),
057 new Color(254, 124, 0)});
058 public static final LinearGradientPaint BLACK_STAR = new LinearGradientPaint(
059 new Point2D.Double(0, 0),
060 new Point2D.Double(0, 1),
061 new float[] {0f, .5f, .51f, 1f},
062 new Color[] {
063 new Color(54, 62, 78),
064 new Color(32, 39, 55),
065 new Color(74, 82, 96),
066 new Color(123, 132, 145)});
067 public static final LinearGradientPaint BLACK_PERSPECTIVE = new LinearGradientPaint (
068 new Point2D.Double(0, 0),
069 new Point2D.Double(0, 1),
070 new float[] {0f, .5f, 1f},
071 new Color[] {
072 Color.BLACK,
073 new Color(110, 110, 110),
074 Color.BLACK});
075
076 private LinearGradientPaint paint;
077
078 /**
079 * Creates a new instance of LinearGradientPainter
080 */
081 public LinearGradientPainter() {
082 }
083
084 /**
085 * Creates a new instance of LinearGradientPainter with the given LinearGradientPaint
086 * as input
087 *
088 * @param paint the Paint to use
089 */
090 public LinearGradientPainter(LinearGradientPaint paint) {
091 this.paint = paint;
092 }
093
094 /**
095 * Set the gradient paint to use. This may be null. If null, nothing is painted
096 *
097 * @param paint the LinearGradientPaint to use
098 */
099 public void setGradientPaint(LinearGradientPaint paint) {
100 LinearGradientPaint old = getGradientPaint();
101 this.paint = paint;
102 firePropertyChange("gradientPaint", old, getGradientPaint());
103 }
104
105 /**
106 * @return the LinearGradientPaint used for painting. This may be null
107 */
108 public LinearGradientPaint getGradientPaint() {
109 return paint;
110 }
111
112 /**
113 * @inheritDoc
114 */
115 protected Paint calculateSizedPaint(int width, int height) {
116 LinearGradientPaint paint = getGradientPaint();
117 if (paint == null) {
118 return null;
119 }
120
121 Point2D startPoint = paint.getStartPoint();
122 Point2D endPoint = paint.getEndPoint();
123
124 double x1 = isResizeHorizontal() ? startPoint.getX() * width : startPoint.getX();
125 double y1 = isResizeVertical() ? startPoint.getY() * height : startPoint.getY();
126 double x2 = isResizeHorizontal() ? endPoint.getX() * width : endPoint.getX();
127 double y2 = isResizeVertical() ? endPoint.getY() * height : endPoint.getY();
128 startPoint = new Point2D.Double(x1, y1);
129 endPoint = new Point2D.Double(x2, y2);
130
131 return new LinearGradientPaint(
132 startPoint,
133 endPoint,
134 paint.getFractions(),
135 paint.getColors(),
136 paint.getCycleMethod(),
137 paint.getColorSpace(),
138 paint.getTransform());
139 }
140 }