| /* |
| |
| 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 org.apache.batik.svggen; |
| |
| import java.awt.GradientPaint; |
| import java.awt.Paint; |
| import java.awt.geom.Point2D; |
| |
| import org.apache.batik.ext.awt.g2d.GraphicContext; |
| import org.w3c.dom.Document; |
| import org.w3c.dom.Element; |
| |
| /** |
| * Utility class that converts a Java GradientPaint into an |
| * SVG linear gradient element |
| * |
| * @author <a href="mailto:vincent.hardy@eng.sun.com">Vincent Hardy</a> |
| * @version $Id$ |
| */ |
| public class SVGLinearGradient extends AbstractSVGConverter { |
| /** |
| * @param generatorContext used to build Elements |
| */ |
| public SVGLinearGradient(SVGGeneratorContext generatorContext) { |
| super(generatorContext); |
| } |
| |
| /** |
| * Converts part or all of the input GraphicContext into |
| * a set of attribute/value pairs and related definitions |
| * |
| * @param gc GraphicContext to be converted |
| * @return descriptor of the attributes required to represent |
| * some or all of the GraphicContext state, along |
| * with the related definitions |
| * @see org.apache.batik.svggen.SVGDescriptor |
| */ |
| public SVGDescriptor toSVG(GraphicContext gc) { |
| Paint paint = gc.getPaint(); |
| return toSVG((GradientPaint)paint); |
| } |
| |
| /** |
| * @param gradient the GradientPaint to be converted |
| * @return a description of the SVG paint and opacity corresponding |
| * to the gradient Paint. The definiton of the |
| * linearGradient is put in the linearGradientDefsMap |
| */ |
| public SVGPaintDescriptor toSVG(GradientPaint gradient) { |
| // Reuse definition if gradient has already been converted |
| SVGPaintDescriptor gradientDesc = |
| (SVGPaintDescriptor)descMap.get(gradient); |
| |
| Document domFactory = generatorContext.domFactory; |
| |
| if (gradientDesc == null) { |
| Element gradientDef = |
| domFactory.createElementNS(SVG_NAMESPACE_URI, |
| SVG_LINEAR_GRADIENT_TAG); |
| gradientDef.setAttributeNS(null, SVG_GRADIENT_UNITS_ATTRIBUTE, |
| SVG_USER_SPACE_ON_USE_VALUE); |
| |
| // |
| // Process gradient vector |
| // |
| Point2D p1 = gradient.getPoint1(); |
| Point2D p2 = gradient.getPoint2(); |
| gradientDef.setAttributeNS(null, SVG_X1_ATTRIBUTE, |
| doubleString(p1.getX())); |
| gradientDef.setAttributeNS(null, SVG_Y1_ATTRIBUTE, |
| doubleString(p1.getY())); |
| gradientDef.setAttributeNS(null, SVG_X2_ATTRIBUTE, |
| doubleString(p2.getX())); |
| gradientDef.setAttributeNS(null, SVG_Y2_ATTRIBUTE, |
| doubleString(p2.getY())); |
| |
| // |
| // Spread method |
| // |
| String spreadMethod = SVG_PAD_VALUE; |
| if(gradient.isCyclic()) |
| spreadMethod = SVG_REFLECT_VALUE; |
| gradientDef.setAttributeNS |
| (null, SVG_SPREAD_METHOD_ATTRIBUTE, spreadMethod); |
| |
| // |
| // First gradient stop |
| // |
| Element gradientStop = |
| domFactory.createElementNS(SVG_NAMESPACE_URI, SVG_STOP_TAG); |
| gradientStop.setAttributeNS(null, SVG_OFFSET_ATTRIBUTE, |
| SVG_ZERO_PERCENT_VALUE); |
| |
| SVGPaintDescriptor colorDesc = SVGColor.toSVG(gradient.getColor1(), generatorContext); |
| gradientStop.setAttributeNS(null, SVG_STOP_COLOR_ATTRIBUTE, |
| colorDesc.getPaintValue()); |
| gradientStop.setAttributeNS(null, SVG_STOP_OPACITY_ATTRIBUTE, |
| colorDesc.getOpacityValue()); |
| |
| gradientDef.appendChild(gradientStop); |
| |
| // |
| // Second gradient stop |
| // |
| gradientStop = |
| domFactory.createElementNS(SVG_NAMESPACE_URI, SVG_STOP_TAG); |
| gradientStop.setAttributeNS(null, SVG_OFFSET_ATTRIBUTE, |
| SVG_HUNDRED_PERCENT_VALUE); |
| |
| colorDesc = SVGColor.toSVG(gradient.getColor2(), generatorContext); |
| gradientStop.setAttributeNS(null, SVG_STOP_COLOR_ATTRIBUTE, |
| colorDesc.getPaintValue()); |
| gradientStop.setAttributeNS(null, SVG_STOP_OPACITY_ATTRIBUTE, |
| colorDesc.getOpacityValue()); |
| |
| gradientDef.appendChild(gradientStop); |
| |
| // |
| // Gradient ID |
| // |
| gradientDef. |
| setAttributeNS(null, SVG_ID_ATTRIBUTE, |
| generatorContext.idGenerator. |
| generateID(ID_PREFIX_LINEAR_GRADIENT)); |
| |
| // |
| // Build Paint descriptor |
| // |
| StringBuffer paintAttrBuf = new StringBuffer(URL_PREFIX); |
| paintAttrBuf.append(SIGN_POUND); |
| paintAttrBuf.append(gradientDef.getAttributeNS(null, SVG_ID_ATTRIBUTE)); |
| paintAttrBuf.append(URL_SUFFIX); |
| |
| gradientDesc = new SVGPaintDescriptor(paintAttrBuf.toString(), |
| SVG_OPAQUE_VALUE, |
| gradientDef); |
| |
| // |
| // Update maps so that gradient can be reused if needed |
| // |
| descMap.put(gradient, gradientDesc); |
| defSet.add(gradientDef); |
| } |
| |
| return gradientDesc; |
| } |
| } |