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]

Reply via email to