Frames | No Frames |
1: /* GradientPaintContext.java -- 2: Copyright (C) 2005, Free Software Foundation, Inc. 3: 4: This file is part of GNU Classpath. 5: 6: GNU Classpath is free software; you can redistribute it and/or modify 7: it under the terms of the GNU General Public License as published by 8: the Free Software Foundation; either version 2, or (at your option) 9: any later version. 10: 11: GNU Classpath is distributed in the hope that it will be useful, but 12: WITHOUT ANY WARRANTY; without even the implied warranty of 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14: General Public License for more details. 15: 16: You should have received a copy of the GNU General Public License 17: along with GNU Classpath; see the file COPYING. If not, write to the 18: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 19: 02110-1301 USA. 20: 21: Linking this library statically or dynamically with other modules is 22: making a combined work based on this library. Thus, the terms and 23: conditions of the GNU General Public License cover the whole 24: combination. 25: 26: As a special exception, the copyright holders of this library give you 27: permission to link this library with independent modules to produce an 28: executable, regardless of the license terms of these independent 29: modules, and to copy and distribute the resulting executable under 30: terms of your choice, provided that you also meet, for each linked 31: independent module, the terms and conditions of the license of that 32: module. An independent module is a module which is not derived from 33: or based on this library. If you modify this library, you may extend 34: this exception to your version of the library, but you are not 35: obligated to do so. If you do not wish to do so, delete this 36: exception statement from your version. */ 37: 38: package gnu.java.awt; 39: 40: import java.awt.geom.Point2D; 41: import java.awt.image.ColorModel; 42: import java.awt.image.Raster; 43: import java.awt.image.WritableRaster; 44: import java.awt.PaintContext; 45: import java.awt.Color; 46: 47: /** 48: * A {@link PaintContext} used by the {@link GradientPaint} class. 49: */ 50: public class GradientPaintContext implements PaintContext 51: { 52: 53: // This implementation follows the technique described in 54: // "Java(tm) 2D Graphics" by Jonathan Knudsen (O'Reilly 1999). 55: 56: /** The x-coordinate of the anchor point for color 1. */ 57: private final float x1; 58: 59: /** The y-coordinate of the anchor point for color 1. */ 60: private final float y1; 61: 62: /** Color 1. */ 63: private final Color c1; 64: 65: /** The x-coordinate of the anchor point for color 2. */ 66: private final float x2; 67: 68: /** The y-coordinate of the anchor point for color 2. */ 69: private final float y2; 70: 71: /** Color 2. */ 72: private final Color c2; 73: 74: /** A flag indicating whether the gradient is cyclic or acyclic. */ 75: private final boolean cyclic; 76: 77: /** The length of the gradient line - computed from the two anchor points. */ 78: private final double length; 79: 80: /** 81: * Creates a new instance. 82: * 83: * @param x1 the x-coordinate for the anchor point for color 1. 84: * @param y1 the y-coordinate for the anchor point for color 1. 85: * @param c1 color 1. 86: * @param x2 the x-coordinate for the anchor point for color 2. 87: * @param y2 the y-coordinate for the anchor point for color 2. 88: * @param c2 color 2. 89: * @param cyclic a flag that determines whether the gradient is cyclic 90: * or acyclic. 91: */ 92: public GradientPaintContext(float x1, float y1, Color c1, 93: float x2, float y2, Color c2, boolean cyclic) 94: { 95: this.x1 = x1; 96: this.y1 = y1; 97: this.c1 = c1; 98: this.x2 = x2; 99: this.y2 = y2; 100: this.c2 = c2; 101: this.cyclic = cyclic; 102: length = Point2D.distance(x1, y1, x2, y2); 103: } 104: 105: /** 106: * Return the color model of this context. It may be different from the 107: * hint specified during createContext, as not all contexts can generate 108: * color patterns in an arbitrary model. 109: * 110: * @return the context color model 111: */ 112: public ColorModel getColorModel() 113: { 114: return ColorModel.getRGBdefault(); 115: } 116: 117: /** 118: * Return a raster containing the colors for the graphics operation. 119: * 120: * @param x the x-coordinate, in device space 121: * @param y the y-coordinate, in device space 122: * @param w the width, in device space 123: * @param h the height, in device space 124: * @return a raster for the given area and color 125: */ 126: public Raster getRaster(int x, int y, int w, int h) { 127: ColorModel cm = getColorModel(); 128: WritableRaster raster = cm.createCompatibleWritableRaster(w, h); 129: int[] data = new int[w * h * 4]; 130: double pd2 = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2); 131: for (int r = 0; r < h; r++) { 132: for (int c = 0; c < w; c++) { 133: double u = 0.0; 134: if (pd2 != 0) 135: u = (((x + c) - x1) * (x2 - x1) + ((y + r) - y1) * (y2 - y1)) 136: / Math.sqrt(pd2); 137: double ratio = u / length; 138: if (cyclic) 139: ratio = Math.abs(ratio - Math.floor((ratio + 1.0) / 2.0) * 2.0); 140: else 141: ratio = Math.max(0.0, Math.min(1.0, ratio)); 142: int base = (r * w + c) * 4; 143: data[base] = (int) (c1.getRed() + ratio * (c2.getRed() - c1.getRed())); 144: data[base + 1] 145: = (int) (c1.getGreen() + ratio * (c2.getGreen() - c1.getGreen())); 146: data[base + 2] 147: = (int) (c1.getBlue() + ratio * (c2.getBlue() - c1.getBlue())); 148: data[base + 3] 149: = (int) (c1.getAlpha() + ratio * (c2.getAlpha() - c1.getAlpha())); 150: } 151: } 152: raster.setPixels(0, 0, w, h, data); 153: return raster; 154: } 155: 156: /** 157: * Release the resources allocated for the paint (none in this 158: * implementation). 159: */ 160: public void dispose() { 161: // nothing to do 162: } 163: 164: }