/***************************************************************************** * Copyright (C) The Apache Software Foundation. All rights reserved. * * ------------------------------------------------------------------------- * * This software is published under the terms of the Apache Software License * * version 1.1, a copy of which has been included with this distribution in * * the LICENSE file. * *****************************************************************************/ package com.kitfox.svg.batik; import java.awt.Color; import java.awt.Paint; import java.awt.geom.AffineTransform; /** This is the superclass for Paints which use a multiple color * gradient to fill in their raster. It provides storage for variables and * enumerated values common to LinearGradientPaint and RadialGradientPaint. * * * @author Nicholas Talian, Vincent Hardy, Jim Graham, Jerry Evans * @author Vincent Hardy * @version $Id: MultipleGradientPaint.java,v 1.2 2004/09/27 09:27:27 kitfox Exp $ * */ public abstract class MultipleGradientPaint implements Paint { /** Transparency. */ protected int transparency; /** Gradient keyframe values in the range 0 to 1. */ protected float[] fractions; /** Gradient colors. */ protected Color[] colors; /** Transform to apply to gradient. */ protected AffineTransform gradientTransform; /** The method to use when painting out of the gradient bounds. */ protected CycleMethodEnum cycleMethod; /** The colorSpace in which to perform the interpolation. */ protected ColorSpaceEnum colorSpace; /** Inner class to allow for typesafe enumerated ColorSpace values. */ public static class ColorSpaceEnum { } /** Inner class to allow for typesafe enumerated CycleMethod values. */ public static class CycleMethodEnum { } /** Indicates (if the gradient starts or ends inside the target region) * to use the terminal colors to fill the remaining area. (default) */ public static final CycleMethodEnum NO_CYCLE = new CycleMethodEnum(); /** Indicates (if the gradient starts or ends inside the target region), * to cycle the gradient colors start-to-end, end-to-start to fill the * remaining area. */ public static final CycleMethodEnum REFLECT = new CycleMethodEnum(); /** Indicates (if the gradient starts or ends inside the target region), * to cycle the gradient colors start-to-end, start-to-end to fill the * remaining area. */ public static final CycleMethodEnum REPEAT = new CycleMethodEnum(); /** Indicates that the color interpolation should occur in sRGB space. * (default) */ public static final ColorSpaceEnum SRGB = new ColorSpaceEnum(); /** Indicates that the color interpolation should occur in linearized * RGB space. */ public static final ColorSpaceEnum LINEAR_RGB = new ColorSpaceEnum(); /** * Superclass constructor, typical user should never have to call this. * * @param fractions numbers ranging from 0.0 to 1.0 specifying the * distribution of colors along the gradient * * @param colors array of colors corresponding to each fractional value * * @param cycleMethod either NO_CYCLE, REFLECT, or REPEAT * * @param colorSpace which colorspace to use for interpolation, * either SRGB or LINEAR_RGB * * @param gradientTransform transform to apply to the gradient * * @throws NullPointerException if arrays are null, or * gradientTransform is null * * @throws IllegalArgumentException if fractions.length != colors.length, * or if colors is less than 2 in size, or if an enumerated value is bad. * * @see java.awt.PaintContext */ public MultipleGradientPaint(float[] fractions, Color[] colors, CycleMethodEnum cycleMethod, ColorSpaceEnum colorSpace, AffineTransform gradientTransform) { if (fractions == null) { throw new IllegalArgumentException("Fractions array cannot be " + "null"); } if (colors == null) { throw new IllegalArgumentException("Colors array cannot be null"); } if (fractions.length != colors.length) { throw new IllegalArgumentException("Colors and fractions must " + "have equal size"); } if (colors.length < 2) { throw new IllegalArgumentException("User must specify at least " + "2 colors"); } if ((colorSpace != LINEAR_RGB) && (colorSpace != SRGB)) { throw new IllegalArgumentException("Invalid colorspace for " + "interpolation."); } if ((cycleMethod != NO_CYCLE) && (cycleMethod != REFLECT) && (cycleMethod != REPEAT)) { throw new IllegalArgumentException("Invalid cycle method."); } if (gradientTransform == null) { throw new IllegalArgumentException("Gradient transform cannot be "+ "null."); } //copy the fractions array this.fractions = new float[fractions.length]; System.arraycopy(fractions, 0, this.fractions, 0, fractions.length); //copy the colors array this.colors = new Color[colors.length]; System.arraycopy(colors, 0, this.colors, 0, colors.length); //copy some flags this.colorSpace = colorSpace; this.cycleMethod = cycleMethod; //copy the gradient transform this.gradientTransform = (AffineTransform)gradientTransform.clone(); // Process transparency boolean opaque = true; for(int i=0; i