We had a need to create an SVGGenerator2D ExtensionHandler that handles
Batik's LinearGradientPaint class.. a discussion of doing exactly this
is found under "Extending Paint object to SVG element translation":
http://xml.apache.org/batik/svggen.html#custom
FWIW, here is our implementation. It would be nice to work towards a
"complete" implementation (with respect to the set of possible Batik
classes for Paint, Composite, and BufferedImageOp) of the ExtensionHandler
interface eventually. If so this could be a start.
-Archie
__________________________________________________________________________
Archie Cobbs * CTO, Awarix * http://www.awarix.com
/*
* Copyright (C) 2004-2005 Awarix, Inc. All rights reserved.
*
* $Id: GradientExtensionHandler.java 3979 2005-03-24 15:18:53Z archie $
*/
package com.awarix.batik.svggen;
import java.awt.Color;
import java.awt.Paint;
import java.awt.geom.AffineTransform;
import org.apache.batik.dom.GenericDOMImplementation;
import org.apache.batik.ext.awt.LinearGradientPaint;
import org.apache.batik.ext.awt.MultipleGradientPaint;
import org.apache.batik.svggen.DefaultExtensionHandler;
import org.apache.batik.svggen.SVGColor;
import org.apache.batik.svggen.SVGGeneratorContext;
import org.apache.batik.svggen.SVGPaintDescriptor;
import org.apache.batik.svggen.SVGSyntax;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/**
* Extension of Batik's [EMAIL PROTECTED] DefaultExtensionHandler
DefaultExtensionHandler}
* that handle's linear gradients [EMAIL PROTECTED] Paint Paint} objects which
are
* happen to be instances of [EMAIL PROTECTED] LinearGradientPaint
LinearGradientPaint}.
*/
public class GradientExtensionHandler extends DefaultExtensionHandler {
public SVGPaintDescriptor handlePaint(Paint paint,
SVGGeneratorContext genCtx) {
// We only handle LinearGradientPaint here
if (!(paint instanceof LinearGradientPaint))
return super.handlePaint(paint, genCtx);
LinearGradientPaint gradient = (LinearGradientPaint)paint;
// Create tag with unique XML id
String id = genCtx.getIDGenerator().generateID("gradient");
Element gradElem = genCtx.getDOMFactory().createElementNS(
SVGSyntax.SVG_NAMESPACE_URI, SVGSyntax.SVG_LINEAR_GRADIENT_TAG);
gradElem.setAttribute(SVGSyntax.SVG_ID_ATTRIBUTE, id);
gradElem.setAttribute(SVGSyntax.SVG_GRADIENT_UNITS_ATTRIBUTE,
SVGSyntax.SVG_USER_SPACE_ON_USE_VALUE);
// Set x,y pairs
if (gradient.getStartPoint().getX() != 0.0)
gradElem.setAttribute("x1", "" + gradient.getStartPoint().getX());
if (gradient.getStartPoint().getY() != 0.0)
gradElem.setAttribute("y1", "" + gradient.getStartPoint().getY());
if (gradient.getEndPoint().getX() != 0.0)
gradElem.setAttribute("x2", "" + gradient.getEndPoint().getX());
if (gradient.getEndPoint().getY() != 0.0)
gradElem.setAttribute("y2", "" + gradient.getEndPoint().getY());
// Do spread method
MultipleGradientPaint.CycleMethodEnum method
= gradient.getCycleMethod();
if (method == MultipleGradientPaint.REFLECT) {
gradElem.setAttribute(SVGSyntax.SVG_SPREAD_METHOD_ATTRIBUTE,
SVGSyntax.SVG_REFLECT_VALUE);
} else if (method == MultipleGradientPaint.REPEAT) {
gradElem.setAttribute(SVGSyntax.SVG_SPREAD_METHOD_ATTRIBUTE,
SVGSyntax.SVG_REPEAT_VALUE);
}
// Do color interpolation
MultipleGradientPaint.ColorSpaceEnum cs = gradient.getColorSpace();
if (cs == MultipleGradientPaint.LINEAR_RGB) {
gradElem.setAttribute(
SVGSyntax.SVG_COLOR_INTERPOLATION_ATTRIBUTE, "linearRGB");
}
// Do transform
AffineTransform tf = gradient.getTransform();
if (!tf.isIdentity()) {
gradElem.setAttribute(SVGSyntax.SVG_TRANSFORM_ATTRIBUTE,
"matrix(" + tf.getScaleX() + " " + tf.getShearX() + " "
+ tf.getTranslateX() + " " + tf.getScaleY() + " "
+ tf.getShearY() + " " + tf.getTranslateY() + ")");
}
// Do gradient stops
Color[] colors = gradient.getColors();
float[] fracs = gradient.getFractions();
for (int i = 0; i < colors.length; i++) {
Element stop = genCtx.getDOMFactory().createElementNS(
SVGSyntax.SVG_NAMESPACE_URI, SVGSyntax.SVG_STOP_TAG);
stop.setAttribute(SVGSyntax.SVG_OFFSET_ATTRIBUTE,
(int)(fracs[i] * 100.0f) + "%");
SVGPaintDescriptor pd = SVGColor.toSVG(colors[i], genCtx);
stop.setAttribute(SVGSyntax.SVG_STOP_COLOR_ATTRIBUTE,
pd.getPaintValue());
if (colors[i].getAlpha() != 255) {
stop.setAttribute(SVGSyntax.SVG_STOP_OPACITY_ATTRIBUTE,
pd.getOpacityValue());
}
gradElem.appendChild(stop);
}
// Done
return new SVGPaintDescriptor("url(#" + id + ")",
SVGSyntax.SVG_OPAQUE_VALUE, gradElem);
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]