You are viewing a plain text version of this content. The canonical link for it is here.
Posted to batik-dev@xmlgraphics.apache.org by hi...@apache.org on 2001/02/05 08:48:41 UTC

cvs commit: xml-batik/sources/org/apache/batik/parser PreserveAspectRatioParser.java

hillion     01/02/04 23:48:41

  Modified:    sources/org/apache/batik/bridge CSSUtilities.java
                        ConcreteGVTBuilder.java SVGMarkerElementBridge.java
               sources/org/apache/batik/dom/svg
                        SVGOMToBeImplementedElement.java
               sources/org/apache/batik/parser
                        PreserveAspectRatioParser.java
  Log:
  External markers now handled correctly.
  
  Revision  Changes    Path
  1.8       +75 -10    xml-batik/sources/org/apache/batik/bridge/CSSUtilities.java
  
  Index: CSSUtilities.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/CSSUtilities.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- CSSUtilities.java	2001/02/03 00:52:29	1.7
  +++ CSSUtilities.java	2001/02/05 07:48:40	1.8
  @@ -16,17 +16,18 @@
   import java.awt.Shape;
   import java.awt.Stroke;
   import java.awt.geom.Rectangle2D;
  +
  +import java.net.MalformedURLException;
  +import java.net.URL;
  +
   import java.util.Map;
   
  -import org.apache.batik.bridge.Bridge;
  -import org.apache.batik.bridge.BridgeContext;
  -import org.apache.batik.bridge.ClipBridge;
  -import org.apache.batik.bridge.FilterBridge;
  -import org.apache.batik.bridge.IllegalAttributeValueException;
  -import org.apache.batik.bridge.MarkerBridge;
  -import org.apache.batik.bridge.MaskBridge;
  -import org.apache.batik.bridge.PaintBridge;
  +import org.apache.batik.css.AbstractViewCSS;
  +import org.apache.batik.css.CSSOMReadOnlyStyleDeclaration;
  +import org.apache.batik.css.CSSOMReadOnlyValue;
  +import org.apache.batik.css.value.ImmutableString;
   import org.apache.batik.dom.svg.SVGOMDocument;
  +import org.apache.batik.dom.util.XLinkSupport;
   import org.apache.batik.gvt.CompositeGraphicsNode;
   import org.apache.batik.gvt.CompositeShapePainter;
   import org.apache.batik.gvt.FillShapePainter;
  @@ -48,6 +49,7 @@
   
   import org.w3c.dom.Document;
   import org.w3c.dom.Element;
  +import org.w3c.dom.Node;
   import org.w3c.dom.css.CSSPrimitiveValue;
   import org.w3c.dom.css.CSSStyleDeclaration;
   import org.w3c.dom.css.CSSValue;
  @@ -61,7 +63,7 @@
    * A collection of utility methods involving CSS.
    *
    * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
  - * @version $Id: CSSUtilities.java,v 1.7 2001/02/03 00:52:29 vhardy Exp $
  + * @version $Id: CSSUtilities.java,v 1.8 2001/02/05 07:48:40 hillion Exp $
    */
   public class CSSUtilities implements SVGConstants {
   
  @@ -71,6 +73,69 @@
       protected CSSUtilities() {}
   
       /**
  +     * Partially computes the style in the use tree and set it in
  +     * the target tree.
  +     * Note: This method must be called only when 'def' has been added
  +     * to the tree.
  +     */
  +    public static void computeStyleAndURIs(Element use, ViewCSS uv,
  +                                    Element def, ViewCSS dv, URL url) {
  +        String href = XLinkSupport.getXLinkHref(def);
  +        
  +        if (!href.equals("")) {
  +            try {
  +                XLinkSupport.setXLinkHref(def, new URL(url, href).toString());
  +            } catch (MalformedURLException e) {
  +            }
  +        }
  +        
  +        CSSOMReadOnlyStyleDeclaration usd;
  +        AbstractViewCSS uview = (AbstractViewCSS)uv;
  +        
  +        usd = (CSSOMReadOnlyStyleDeclaration)uview.computeStyle(use, null);
  +        try {
  +            updateURIs(usd, url);
  +        } catch (MalformedURLException e) {
  +            e.printStackTrace();
  +        }
  +        ((AbstractViewCSS)dv).setComputedStyle(def, null, usd);
  +        
  +        for (Node un = use.getFirstChild(), dn = def.getFirstChild();
  +             un != null;
  +             un = un.getNextSibling(), dn = dn.getNextSibling()) {
  +            if (un.getNodeType() == Node.ELEMENT_NODE) {
  +                computeStyleAndURIs((Element)un, uv, (Element)dn, dv, url);
  +            }
  +        }
  +    }
  +    
  +    /**
  +     * Updates the URIs in the given style declaration.
  +     */
  +    protected static void updateURIs(CSSOMReadOnlyStyleDeclaration sd, URL url)
  +        throws MalformedURLException {
  +        int len = sd.getLength();
  +        for (int i = 0; i < len; i++) {
  +            String name = sd.item(i);
  +            CSSValue val = sd.getLocalPropertyCSSValue(name);
  +            if (val != null &&
  +                val.getCssValueType() ==
  +                CSSPrimitiveValue.CSS_PRIMITIVE_VALUE) {
  +                CSSPrimitiveValue pv = (CSSPrimitiveValue)val;
  +                if (pv.getPrimitiveType() == CSSPrimitiveValue.CSS_URI) {
  +                    CSSOMReadOnlyValue v =
  +                        new CSSOMReadOnlyValue
  +                    (new ImmutableString(CSSPrimitiveValue.CSS_URI,
  +                                         new URL(url, pv.getStringValue()).toString()));
  +                    sd.setPropertyCSSValue(name, v,
  +                                           sd.getLocalPropertyPriority(name),
  +                                       sd.getLocalPropertyOrigin(name));
  +                }
  +            }
  +        }
  +    }
  +
  +    /**
        * Returns the viewport
        */
       public static Rectangle2D convertEnableBackground(SVGElement svgElement,
  @@ -657,7 +722,7 @@
           }
   
           MarkerBridge markerBridge = (MarkerBridge)bridge;
  -        SVGOMDocument doc = (SVGOMDocument)markerElement.getOwnerDocument();
  +        //SVGOMDocument doc = (SVGOMDocument)markerElement.getOwnerDocument();
           ViewCSS v = ctx.getViewCSS();
           // ctx.setViewCSS((ViewCSS)doc.getDefaultView());
           Marker marker = markerBridge.buildMarker(ctx, 
  
  
  
  1.3       +5 -71     xml-batik/sources/org/apache/batik/bridge/ConcreteGVTBuilder.java
  
  Index: ConcreteGVTBuilder.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/ConcreteGVTBuilder.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- ConcreteGVTBuilder.java	2001/02/01 13:45:46	1.2
  +++ ConcreteGVTBuilder.java	2001/02/05 07:48:40	1.3
  @@ -8,23 +8,11 @@
   
   package org.apache.batik.bridge;
   
  -import java.net.MalformedURLException;
  -import java.net.URL;
   import java.util.List;
   
  -import org.apache.batik.bridge.BridgeContext;
  -import org.apache.batik.bridge.BridgeException;
  -import org.apache.batik.bridge.BuilderException;
  -import org.apache.batik.bridge.GVTBuilder;
  -import org.apache.batik.bridge.GraphicsNodeBridge;
  -
  -import org.apache.batik.css.AbstractViewCSS;
   import org.apache.batik.css.HiddenChildElement;
   import org.apache.batik.css.AbstractViewCSS;
  -import org.apache.batik.css.CSSOMReadOnlyStyleDeclaration;
  -import org.apache.batik.css.CSSOMReadOnlyValue;
   import org.apache.batik.css.HiddenChildElement;
  -import org.apache.batik.css.value.ImmutableString;
   import org.apache.batik.dom.svg.SVGOMDocument;
   import org.apache.batik.dom.util.XLinkSupport;
   import org.apache.batik.gvt.GraphicsNode;
  @@ -60,7 +48,7 @@
    * @author <a href="mailto:etissandier@ilog.fr">Emmanuel Tissandier</a>
    * @author <a href="mailto:cjolif@ilog.fr">Christophe Jolif</a>
    * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
  - * @version $Id: ConcreteGVTBuilder.java,v 1.2 2001/02/01 13:45:46 tkormann Exp $
  + * @version $Id: ConcreteGVTBuilder.java,v 1.3 2001/02/05 07:48:40 hillion Exp $
    */
   public class ConcreteGVTBuilder implements GVTBuilder, SVGConstants {
       /**
  @@ -243,9 +231,10 @@
                           doc = (SVGOMDocument)elt.getOwnerDocument();
                           SVGOMDocument d;
                           d = (SVGOMDocument)e.getOwnerDocument();
  -                        computeStyleAndURIs(elt,  (ViewCSS)doc.getDefaultView(),
  -                                            inst, (ViewCSS)d.getDefaultView(),
  -                                           ((SVGOMDocument)doc).getURLObject());
  +                        CSSUtilities.computeStyleAndURIs
  +                            (elt, (ViewCSS)doc.getDefaultView(),
  +                             inst, (ViewCSS)d.getDefaultView(),
  +                             ((SVGOMDocument)doc).getURLObject());
                       }
   
                       buildGraphicsNode(ctx,
  @@ -292,60 +281,5 @@
               throw new BuilderException(e, ex.getMessage());
           }
       }
  -
  -/**
  - * Partially computes the style in the use tree and set it in
  - * the target tree.
  - */
  -public void computeStyleAndURIs(Element use, ViewCSS uv,
  -                                Element def, ViewCSS dv, URL url)
  -    throws MalformedURLException {
  -    String href = XLinkSupport.getXLinkHref(def);
  -
  -    if (!href.equals("")) {
  -        XLinkSupport.setXLinkHref(def, new URL(url, href).toString());
  -    }
  -
  -    CSSOMReadOnlyStyleDeclaration usd;
  -    AbstractViewCSS uview = (AbstractViewCSS)uv;
  -
  -    usd = (CSSOMReadOnlyStyleDeclaration)uview.computeStyle(use, null);
  -    updateURIs(usd, url);
  -    ((AbstractViewCSS)dv).setComputedStyle(def, null, usd);
  -
  -    for (Node un = use.getFirstChild(), dn = def.getFirstChild();
  -         un != null;
  -         un = un.getNextSibling(), dn = dn.getNextSibling()) {
  -        if (un.getNodeType() == Node.ELEMENT_NODE) {
  -            computeStyleAndURIs((Element)un, uv, (Element)dn, dv, url);
  -        }
  -    }
  -}
  -
  -/**
  - * Updates the URIs in the given style declaration.
  - */
  -protected void updateURIs(CSSOMReadOnlyStyleDeclaration sd, URL url)
  -    throws MalformedURLException {
  -    int len = sd.getLength();
  -    for (int i = 0; i < len; i++) {
  -        String name = sd.item(i);
  -        CSSValue val = sd.getLocalPropertyCSSValue(name);
  -        if (val != null &&
  -            val.getCssValueType() ==
  -            CSSPrimitiveValue.CSS_PRIMITIVE_VALUE) {
  -            CSSPrimitiveValue pv = (CSSPrimitiveValue)val;
  -            if (pv.getPrimitiveType() == CSSPrimitiveValue.CSS_URI) {
  -                CSSOMReadOnlyValue v =
  -                    new CSSOMReadOnlyValue
  -                    (new ImmutableString(CSSPrimitiveValue.CSS_URI,
  -                                         new URL(url, pv.getStringValue()).toString()));
  -                sd.setPropertyCSSValue(name, v,
  -                                       sd.getLocalPropertyPriority(name),
  -                                       sd.getLocalPropertyOrigin(name));
  -            }
  -        }
  -    }
  -}
   
   }
  
  
  
  1.2       +75 -22    xml-batik/sources/org/apache/batik/bridge/SVGMarkerElementBridge.java
  
  Index: SVGMarkerElementBridge.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGMarkerElementBridge.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- SVGMarkerElementBridge.java	2001/02/01 16:41:51	1.1
  +++ SVGMarkerElementBridge.java	2001/02/05 07:48:40	1.2
  @@ -12,16 +12,17 @@
   import java.awt.geom.Point2D;
   import java.awt.geom.Rectangle2D;
   
  -import org.apache.batik.bridge.BridgeContext;
  -import org.apache.batik.bridge.GVTBuilder;
  -import org.apache.batik.bridge.IllegalAttributeValueException;
  -import org.apache.batik.bridge.Viewport;
  +import org.apache.batik.bridge.resources.Messages;
  +import org.apache.batik.css.CSSOMReadOnlyStyleDeclaration;
  +import org.apache.batik.css.CSSOMReadOnlyValue;
  +import org.apache.batik.css.HiddenChildElement;
  +import org.apache.batik.css.value.ValueConstants;
  +import org.apache.batik.dom.svg.SVGOMDocument;
   import org.apache.batik.gvt.CompositeGraphicsNode;
   import org.apache.batik.gvt.GraphicsNode;
   import org.apache.batik.gvt.GraphicsNodeRenderContext;
   import org.apache.batik.gvt.Marker;
   import org.apache.batik.gvt.filter.GraphicsNodeRable8Bit;
  -import org.apache.batik.bridge.resources.Messages;
   import org.apache.batik.util.SVGConstants;
   import org.apache.batik.util.UnitProcessor;
   
  @@ -32,12 +33,14 @@
   import org.w3c.dom.Node;
   import org.w3c.dom.css.CSSPrimitiveValue;
   import org.w3c.dom.css.CSSStyleDeclaration;
  +import org.w3c.dom.css.ViewCSS;
   import org.w3c.dom.svg.SVGElement;
  +
   /**
    * Turns a marker element into a <tt>Marker</tt> object
    *
    * @author <a href="mailto:vincent.hardy@eng.sun.com">Vincent Hardy</a>
  - * @version $Id: SVGMarkerElementBridge.java,v 1.1 2001/02/01 16:41:51 vhardy Exp $
  + * @version $Id: SVGMarkerElementBridge.java,v 1.2 2001/02/05 07:48:40 hillion Exp $
    */
   public class SVGMarkerElementBridge implements MarkerBridge {
       /**
  @@ -48,8 +51,58 @@
       public Marker buildMarker(BridgeContext ctx,
                                 Element markerElement,
                                 Element paintedElement){
  -        CSSStyleDeclaration cssDecl
  -            = ctx.getViewCSS().getComputedStyle(markerElement, null);
  +        // CSS setup.
  +        SVGOMDocument md = (SVGOMDocument)markerElement.getOwnerDocument();
  +        SVGOMDocument pd = (SVGOMDocument)paintedElement.getOwnerDocument();
  +
  +        ViewCSS viewCSS = (ViewCSS)pd.getDefaultView();
  +
  +        Element inst;
  +        if (md == pd) {
  +            inst = (Element)markerElement.cloneNode(true);
  +        } else {
  +            inst = (Element)paintedElement.getOwnerDocument().importNode
  +                (markerElement, true);
  +        }
  +        Element g = pd.createElementNS(SVG_NAMESPACE_URI, SVG_G_TAG);
  +        ((HiddenChildElement)g).setParentElement(paintedElement);
  +
  +        CSSOMReadOnlyStyleDeclaration gsd =
  +            (CSSOMReadOnlyStyleDeclaration)viewCSS.getComputedStyle(g, null);
  +
  +        gsd.setPropertyCSSValue
  +            (CSS_MARKER_PROPERTY, 
  +             new CSSOMReadOnlyValue(ValueConstants.NONE_VALUE),
  +             gsd.getLocalPropertyPriority(CSS_MARKER_PROPERTY),
  +             gsd.getLocalPropertyOrigin(CSS_MARKER_PROPERTY));
  +        gsd.setPropertyCSSValue
  +            (CSS_MARKER_START_PROPERTY, 
  +             new CSSOMReadOnlyValue(ValueConstants.NONE_VALUE),
  +             gsd.getLocalPropertyPriority(CSS_MARKER_START_PROPERTY),
  +             gsd.getLocalPropertyOrigin(CSS_MARKER_START_PROPERTY));
  +        gsd.setPropertyCSSValue
  +            (CSS_MARKER_MID_PROPERTY, 
  +             new CSSOMReadOnlyValue(ValueConstants.NONE_VALUE),
  +             gsd.getLocalPropertyPriority(CSS_MARKER_START_PROPERTY),
  +             gsd.getLocalPropertyOrigin(CSS_MARKER_START_PROPERTY));
  +        gsd.setPropertyCSSValue
  +            (CSS_MARKER_END_PROPERTY, 
  +             new CSSOMReadOnlyValue(ValueConstants.NONE_VALUE),
  +             gsd.getLocalPropertyPriority(CSS_MARKER_START_PROPERTY),
  +             gsd.getLocalPropertyOrigin(CSS_MARKER_START_PROPERTY));
  +        
  +
  +        g.appendChild(inst);
  +
  +        if (md != pd) {
  +            CSSUtilities.computeStyleAndURIs
  +                (markerElement, (ViewCSS)md.getDefaultView(),
  +                 inst, viewCSS, ((SVGOMDocument)md).getURLObject());
  +        }
  +
  +        CSSOMReadOnlyStyleDeclaration cssDecl
  +            = (CSSOMReadOnlyStyleDeclaration)viewCSS.getComputedStyle(inst, null);
  +
           UnitProcessor.Context uctx
               = new DefaultUnitProcessorContext(ctx,
                                                 cssDecl);
  @@ -60,7 +113,7 @@
   
           // build the GVT tree that represents the marker
           boolean hasChildren = false;
  -        for(Node node=markerElement.getFirstChild();
  +        for(Node node=inst.getFirstChild();
                    node != null;
                    node = node.getNextSibling()) {
   
  @@ -84,37 +137,37 @@
           }
   
           // Extract the Marker's reference point coordinates
  -        String s = markerElement.getAttributeNS(null, SVG_REFX_ATTRIBUTE);
  +        String s = inst.getAttributeNS(null, SVG_REFX_ATTRIBUTE);
           float refX = 0;
           if (s.length() == 0) {
               s = SVG_DEFAULT_VALUE_MARKER_REFX;
           }
   
  -        refX = SVGUtilities.svgToUserSpace(markerElement,
  +        refX = SVGUtilities.svgToUserSpace(inst,
                                              SVG_REFX_ATTRIBUTE, s,
                                              uctx,
                                              UnitProcessor.HORIZONTAL_LENGTH);
   
           // parse the refY attribute, (default is 0)
  -        s = markerElement.getAttributeNS(null, SVG_REFY_ATTRIBUTE);
  +        s = inst.getAttributeNS(null, SVG_REFY_ATTRIBUTE);
           float refY = 0;
           if (s.length() == 0) {
               s = SVG_DEFAULT_VALUE_MARKER_REFY;
           }
   
  -        refY = SVGUtilities.svgToUserSpace(markerElement,
  +        refY = SVGUtilities.svgToUserSpace(inst,
                                              SVG_REFY_ATTRIBUTE, s,
                                              uctx,
                                              UnitProcessor.VERTICAL_LENGTH);
           
           // Extract the Marker's width/height
  -        s = markerElement.getAttributeNS(null, SVG_MARKER_WIDTH_ATTRIBUTE);
  +        s = inst.getAttributeNS(null, SVG_MARKER_WIDTH_ATTRIBUTE);
           float markerWidth = 0;
           if (s.length() == 0) {
               s = SVG_DEFAULT_VALUE_MARKER_MARKER_WIDTH;
           }
   
  -        markerWidth= SVGUtilities.svgToUserSpace(markerElement,
  +        markerWidth= SVGUtilities.svgToUserSpace(inst,
                                                    SVG_MARKER_WIDTH_ATTRIBUTE, s,
                                                    uctx,
                                                    UnitProcessor.HORIZONTAL_LENGTH);
  @@ -132,13 +185,13 @@
                                            new Object[] {s}));
           }
   
  -        s = markerElement.getAttributeNS(null, SVG_MARKER_HEIGHT_ATTRIBUTE);
  +        s = inst.getAttributeNS(null, SVG_MARKER_HEIGHT_ATTRIBUTE);
           float markerHeight = 0;
           if (s.length() == 0) {
               s = SVG_DEFAULT_VALUE_MARKER_MARKER_HEIGHT;
           }
   
  -        markerHeight = SVGUtilities.svgToUserSpace(markerElement,
  +        markerHeight = SVGUtilities.svgToUserSpace(inst,
                                                      SVG_MARKER_HEIGHT_ATTRIBUTE, s,
                                                      uctx,
                                                      UnitProcessor.HORIZONTAL_LENGTH);
  @@ -157,7 +210,7 @@
           }
   
           // Extract the Marker's orient
  -        s = markerElement.getAttributeNS(null, SVG_ORIENT_ATTRIBUTE);
  +        s = inst.getAttributeNS(null, SVG_ORIENT_ATTRIBUTE);
           double orient = 0;
           boolean autoOrient = false;
           if (s.length() == 0) {
  @@ -187,7 +240,7 @@
           }
   
           // Extract the marker units
  -        s = markerElement.getAttributeNS(null,
  +        s = inst.getAttributeNS(null,
                                         SVG_MARKER_UNITS_ATTRIBUTE);
   
           if (s.length() == 0) {
  @@ -197,16 +250,16 @@
           String markerUnits = s;
   
           // Extract the viewBox and preserveAspectRatio
  -        s = markerElement.getAttributeNS(null, ATTR_VIEW_BOX);
  +        s = inst.getAttributeNS(null, ATTR_VIEW_BOX);
           boolean hasViewBox = false;
           // viewBox -> viewPort (0, 0, markerWidth, markerHeight)
           AffineTransform preserveAspectRatioTransform = null;
   
  -        s = markerElement.getAttributeNS(null, ATTR_VIEW_BOX);
  +        s = inst.getAttributeNS(null, ATTR_VIEW_BOX);
           if (s.length() > 0){
               preserveAspectRatioTransform
                   = SVGUtilities.getPreserveAspectRatioTransform
  -                ((SVGElement)markerElement,
  +                ((SVGElement)inst,
                    markerWidth,
                    markerHeight);
           }
  
  
  
  1.5       +44 -1     xml-batik/sources/org/apache/batik/dom/svg/SVGOMToBeImplementedElement.java
  
  Index: SVGOMToBeImplementedElement.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/dom/svg/SVGOMToBeImplementedElement.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- SVGOMToBeImplementedElement.java	2000/12/06 21:23:36	1.4
  +++ SVGOMToBeImplementedElement.java	2001/02/05 07:48:40	1.5
  @@ -17,7 +17,7 @@
    * been put in
    *
    * @author <a href="mailto:vincent.hardy@eng.sun.com">Vincent Hardy</a>
  - * @version $Id: SVGOMToBeImplementedElement.java,v 1.4 2000/12/06 21:23:36 hillion Exp $
  + * @version $Id: SVGOMToBeImplementedElement.java,v 1.5 2001/02/05 07:48:40 hillion Exp $
    */
   public class SVGOMToBeImplementedElement
       extends SVGGraphicsElement {
  @@ -58,4 +58,47 @@
       protected Node newNode() {
           return new SVGOMToBeImplementedElement();
       }
  +
  +    /**
  +     * Exports this node to the given document.
  +     */
  +    protected Node export(Node n, AbstractDocument d) {
  +	super.export(n, d);
  +	SVGOMToBeImplementedElement ae = (SVGOMToBeImplementedElement)n;
  +	ae.localName = localName;
  +	return n;
  +    }
  +
  +    /**
  +     * Deeply exports this node to the given document.
  +     */
  +    protected Node deepExport(Node n, AbstractDocument d) {
  +	super.deepExport(n, d);
  +	SVGOMToBeImplementedElement ae = (SVGOMToBeImplementedElement)n;
  +	ae.localName = localName;
  +	return n;
  +    }
  +
  +    /**
  +     * Copy the fields of the current node into the given node.
  +     * @param n a node of the type of this.
  +     */
  +    protected Node copyInto(Node n) {
  +	super.copyInto(n);
  +	SVGOMToBeImplementedElement ae = (SVGOMToBeImplementedElement)n;
  +	ae.localName = localName;
  +	return n;
  +    }
  +
  +    /**
  +     * Deeply copy the fields of the current node into the given node.
  +     * @param n a node of the type of this.
  +     */
  +    protected Node deepCopyInto(Node n) {
  +	super.deepCopyInto(n);
  +	SVGOMToBeImplementedElement ae = (SVGOMToBeImplementedElement)n;
  +	ae.localName = localName;
  +        return n;
  +    }
  +
   }
  
  
  
  1.4       +264 -264  xml-batik/sources/org/apache/batik/parser/PreserveAspectRatioParser.java
  
  Index: PreserveAspectRatioParser.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/parser/PreserveAspectRatioParser.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- PreserveAspectRatioParser.java	2001/02/02 08:04:47	1.3
  +++ PreserveAspectRatioParser.java	2001/02/05 07:48:40	1.4
  @@ -15,7 +15,7 @@
    * attribute values.
    *
    * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
  - * @version $Id: PreserveAspectRatioParser.java,v 1.3 2001/02/02 08:04:47 hillion Exp $
  + * @version $Id: PreserveAspectRatioParser.java,v 1.4 2001/02/05 07:48:40 hillion Exp $
    */
   public class PreserveAspectRatioParser extends AbstractParser {
   
  @@ -72,14 +72,15 @@
       protected void parsePreserveAspectRatio() throws ParseException {
   	preserveAspectRatioHandler.startPreserveAspectRatio();
   
  -	s: if (current == 'n') {
  +        align: switch (current) {
  +        case 'n':
   	    read();
   	    if (current != 'o') {
   		reportError("character.expected",
   			    new Object[] { new Character('o'),
  -					   new Integer(current) });
  +                                           new Integer(current) });
   		skipIdentifier();
  -		break s;
  +		break align;
   	    }
   	    read();
   	    if (current != 'n') {
  @@ -87,7 +88,7 @@
   			    new Object[] { new Character('n'),
   					   new Integer(current) });
   		skipIdentifier();
  -		break s;
  +		break align;
   	    }
   	    read();
   	    if (current != 'e') {
  @@ -95,284 +96,283 @@
   			    new Object[] { new Character('e'),
   					   new Integer(current) });
   		skipIdentifier();
  -		break s;
  +		break align;
   	    }
   	    read();
   	    skipSpaces();
   	    preserveAspectRatioHandler.none();
  -	} else {
  -	    align: switch (current) {
  -	    case 'x':
  -		read();
  -		if (current != 'M') {
  -		    reportError("character.expected",
  -				new Object[] { new Character('M'),
  +            break;
  +                
  +        case 'x':
  +            read();
  +            if (current != 'M') {
  +                reportError("character.expected",
  +                            new Object[] { new Character('M'),
  +					   new Integer(current) });
  +                skipIdentifier();
  +                break;
  +            }
  +            read();
  +            switch (current) {
  +            case 'a':
  +                read();
  +                if (current != 'x') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('x'),
  +			          	       new Integer(current) });
  +                    skipIdentifier();
  +                    break align;
  +                }
  +                read();
  +                if (current != 'Y') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('Y'),
  +					       new Integer(current) });
  +                    skipIdentifier();
  +                    break align;
  +                }
  +                read();
  +                if (current != 'M') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('M'),
   					       new Integer(current) });
  -		    skipIdentifier();
  -		    break;
  -		}
  -		read();
  -		switch (current) {
  -		case 'a':
  -		    read();
  -		    if (current != 'x') {
  -			reportError("character.expected",
  -				    new Object[] { new Character('x'),
  +                    skipIdentifier();
  +                    break align;
  +                }
  +                read();
  +                switch (current) {
  +                case 'a':
  +                    read();
  +                    if (current != 'x') {
  +                        reportError("character.expected",
  +                                    new Object[] { new Character('x'),
   						   new Integer(current) });
  -			skipIdentifier();
  -			break align;
  -		    }
  -		    read();
  -		    if (current != 'Y') {
  -			reportError("character.expected",
  -				    new Object[] { new Character('Y'),
  +                        skipIdentifier();
  +                        break align;
  +                    }
  +                    preserveAspectRatioHandler.xMaxYMax();
  +                    read();
  +                    break;
  +                case 'i':
  +                    read();
  +                    switch (current) {
  +                    case 'd':
  +                        preserveAspectRatioHandler.xMaxYMid();
  +                        read();
  +                        break;
  +                    case 'n':
  +                        preserveAspectRatioHandler.xMaxYMin();
  +                        read();
  +                        break;
  +                    default:
  +                        reportError("character.unexpected",
  +                                    new Object[] { new Integer(current) });
  +                        skipIdentifier();
  +                        break align;
  +                    }
  +                }
  +                break;
  +            case 'i':
  +                read();
  +                switch (current) {
  +                case 'd':
  +                    read();
  +                    if (current != 'Y') {
  +                        reportError("character.expected",
  +                                    new Object[] { new Character('Y'),
   						   new Integer(current) });
  -			skipIdentifier();
  -			break align;
  -		    }
  -		    read();
  -		    if (current != 'M') {
  -			reportError("character.expected",
  -				    new Object[] { new Character('M'),
  +                        skipIdentifier();
  +                        break align;
  +                    }
  +                    read();
  +                    if (current != 'M') {
  +                        reportError("character.expected",
  +                                    new Object[] { new Character('M'),
   						   new Integer(current) });
  -			skipIdentifier();
  -			break align;
  -		    }
  -		    read();
  -		    switch (current) {
  -		    case 'a':
  -			read();
  -			if (current != 'x') {
  -			    reportError("character.expected",
  -					new Object[] { new Character('x'),
  -						       new Integer(current) });
  -			    skipIdentifier();
  -			    break align;
  -			}
  -			preserveAspectRatioHandler.xMaxYMax();
  -			read();
  -			break;
  -		    case 'i':
  -			read();
  -			switch (current) {
  -			case 'd':
  -			    preserveAspectRatioHandler.xMaxYMid();
  -			    read();
  -			    break;
  -			case 'n':
  -			    preserveAspectRatioHandler.xMaxYMin();
  -			    read();
  -			    break;
  -			default:
  -			    reportError("character.unexpected",
  -					new Object[] { new Integer(current) });
  -			    skipIdentifier();
  -			    break align;
  -			}
  -		    }
  -		    break;
  -		case 'i':
  -		    read();
  -		    switch (current) {
  -		    case 'd':
  -			read();
  -			if (current != 'Y') {
  -			    reportError("character.expected",
  -					new Object[] { new Character('Y'),
  -						       new Integer(current) });
  -			    skipIdentifier();
  -			    break align;
  -			}
  -			read();
  -			if (current != 'M') {
  -			    reportError("character.expected",
  -					new Object[] { new Character('M'),
  -						       new Integer(current) });
  -			    skipIdentifier();
  -			    break align;
  -			}
  -			read();
  -			switch (current) {
  -			case 'a':
  -			    read();
  -			    if (current != 'x') {
  -				reportError
  -                                    ("character.expected",
  -                                     new Object[] { new Character('x'),
  +                        skipIdentifier();
  +                        break align;
  +                    }
  +                    read();
  +                    switch (current) {
  +                    case 'a':
  +                        read();
  +                        if (current != 'x') {
  +                            reportError
  +                                ("character.expected",
  +                                 new Object[] { new Character('x'),
                                                       new Integer(current) });
   			    skipIdentifier();
   			    break align;
  -			    }
  -			    preserveAspectRatioHandler.xMidYMax();
  -			    read();
  -			    break;
  -			case 'i':
  -			    read();
  -			    switch (current) {
  -			    case 'd':
  +                        }
  +                        preserveAspectRatioHandler.xMidYMax();
  +                        read();
  +                        break;
  +                    case 'i':
  +                        read();
  +                        switch (current) {
  +                        case 'd':
   			    preserveAspectRatioHandler.xMidYMid();
   			    read();
   			    break;
  -			    case 'n':
  -				preserveAspectRatioHandler.xMidYMin();
  -				read();
  -				break;
  +                        case 'n':
  +                            preserveAspectRatioHandler.xMidYMin();
  +                            read();
  +                            break;
   			default:
   			    reportError("character.unexpected",
   					new Object[] { new Integer(current) });
   			    skipIdentifier();
   			    break align;
  -			    }
  -			}
  -			break;
  -		    case 'n':
  -			read();
  -			if (current != 'Y') {
  -			    reportError("character.expected",
  -					new Object[] { new Character('Y'),
  -						       new Integer(current) });
  -			    skipIdentifier();
  -			    break align;
  -			}
  -			read();
  -			if (current != 'M') {
  -			    reportError("character.expected",
  -					new Object[] { new Character('M'),
  -						       new Integer(current) });
  -			    skipIdentifier();
  -			    break align;
  -			}
  -			read();
  -			switch (current) {
  -			case 'a':
  -			    read();
  -			    if (current != 'x') {
  -				reportError
  -                                    ("character.expected",
  -                                     new Object[] { new Character('x'),
  -                                                    new Integer(current) });
  -				skipIdentifier();
  -				break align;
  -			    }
  -			    preserveAspectRatioHandler.xMinYMax();
  -			    read();
  -			    break;
  -			case 'i':
  -			    read();
  -			    switch (current) {
  -			    case 'd':
  -				preserveAspectRatioHandler.xMinYMid();
  -				read();
  -				break;
  -			    case 'n':
  -				preserveAspectRatioHandler.xMinYMin();
  -				read();
  -				break;
  -			    default:
  -				reportError
  -                                    ("character.unexpected",
  -                                     new Object[] { new Integer(current) });
  -				skipIdentifier();
  -				break align;
  -			    }
  -			}
  -			break;
  -		    default:
  -			reportError("character.unexpected",
  -				    new Object[] { new Integer(current) });
  -			skipIdentifier();
  -			break align;
  -		    }
  -		    break;
  -		default:
  -		    reportError("character.unexpected",
  -				new Object[] { new Integer(current) });
  -		    skipIdentifier();
  -		}
  -		break;
  -	    default:
  -		if (current != -1) {
  -		    reportError("character.unexpected",
  -				new Object[] { new Integer(current) });
  -		    skipIdentifier();
  -		}
  -	    }
  -
  -	    skipCommaSpaces();
  -
  -	    switch (current) {
  -	    case 'm':
  -		read();
  -		if (current != 'e') {
  -		    reportError("character.expected",
  -				new Object[] { new Character('e'),
  -					       new Integer(current) });
  -		    skipIdentifier();
  -		    break;
  -		}
  -		read();
  -		if (current != 'e') {
  -		    reportError("character.expected",
  -				new Object[] { new Character('e'),
  -					       new Integer(current) });
  -		    skipIdentifier();
  -		    break;
  -		}
  -		read();
  -		if (current != 't') {
  -		    reportError("character.expected",
  -				new Object[] { new Character('t'),
  -					       new Integer(current) });
  -		    skipIdentifier();
  -		    break;
  -		}
  -		preserveAspectRatioHandler.meet();
  -		read();
  -		break;
  -	    case 's':
  -		read();
  -		if (current != 'l') {
  -		    reportError("character.expected",
  -				new Object[] { new Character('l'),
  -					       new Integer(current) });
  -		    skipIdentifier();
  -		    break;
  -		}
  -		read();
  -		if (current != 'i') {
  -		    reportError("character.expected",
  -				new Object[] { new Character('i'),
  -					       new Integer(current) });
  -		    skipIdentifier();
  -		    break;
  -		}
  -		read();
  -		if (current != 'c') {
  -		    reportError("character.expected",
  -				new Object[] { new Character('c'),
  -					       new Integer(current) });
  -		    skipIdentifier();
  -		    break;
  -		}
  -		read();
  -		if (current != 'e') {
  -		    reportError("character.expected",
  -				new Object[] { new Character('e'),
  -					       new Integer(current) });
  -		    skipIdentifier();
  -		    break;
  -		}
  -		preserveAspectRatioHandler.slice();
  -		read();
  -		break;
  -	    default:
  -		if (current != -1) {
  -		    reportError("character.unexpected",
  -				new Object[] { new Integer(current) });
  -		    skipIdentifier();
  -		}
  -	    }
  -	}
  +                        }
  +                    }
  +                    break;
  +                case 'n':
  +                    read();
  +                    if (current != 'Y') {
  +                        reportError("character.expected",
  +                                    new Object[] { new Character('Y'),
  +					           new Integer(current) });
  +                        skipIdentifier();
  +                        break align;
  +                    }
  +                    read();
  +                    if (current != 'M') {
  +                        reportError("character.expected",
  +                                    new Object[] { new Character('M'),
  +						   new Integer(current) });
  +                        skipIdentifier();
  +                        break align;
  +                    }
  +                    read();
  +                    switch (current) {
  +                    case 'a':
  +                        read();
  +                        if (current != 'x') {
  +                            reportError
  +                                ("character.expected",
  +                                 new Object[] { new Character('x'),
  +                                                new Integer(current) });
  +                            skipIdentifier();
  +                            break align;
  +                        }
  +                        preserveAspectRatioHandler.xMinYMax();
  +                        read();
  +                        break;
  +                    case 'i':
  +                        read();
  +                        switch (current) {
  +                        case 'd':
  +                            preserveAspectRatioHandler.xMinYMid();
  +                            read();
  +                            break;
  +                        case 'n':
  +                            preserveAspectRatioHandler.xMinYMin();
  +                            read();
  +                            break;
  +                        default:
  +                            reportError
  +                                ("character.unexpected",
  +                                 new Object[] { new Integer(current) });
  +                            skipIdentifier();
  +                            break align;
  +                        }
  +                    }
  +                    break;
  +                default:
  +                    reportError("character.unexpected",
  +                                new Object[] { new Integer(current) });
  +                    skipIdentifier();
  +                    break align;
  +                }
  +                break;
  +            default:
  +                reportError("character.unexpected",
  +                            new Object[] { new Integer(current) });
  +                skipIdentifier();
  +            }
  +            break;
  +        default:
  +            if (current != -1) {
  +                reportError("character.unexpected",
  +                            new Object[] { new Integer(current) });
  +                skipIdentifier();
  +            }
  +        }
  +
  +        skipCommaSpaces();
  +
  +        switch (current) {
  +        case 'm':
  +            read();
  +            if (current != 'e') {
  +                reportError("character.expected",
  +                            new Object[] { new Character('e'),
  +				           new Integer(current) });
  +                skipIdentifier();
  +                break;
  +            }
  +            read();
  +            if (current != 'e') {
  +                reportError("character.expected",
  +                            new Object[] { new Character('e'),
  +			         	   new Integer(current) });
  +                skipIdentifier();
  +                break;
  +            }
  +            read();
  +            if (current != 't') {
  +                reportError("character.expected",
  +                            new Object[] { new Character('t'),
  +	        			   new Integer(current) });
  +                skipIdentifier();
  +                break;
  +            }
  +            preserveAspectRatioHandler.meet();
  +            read();
  +            break;
  +        case 's':
  +            read();
  +            if (current != 'l') {
  +                reportError("character.expected",
  +                            new Object[] { new Character('l'),
  +				           new Integer(current) });
  +                skipIdentifier();
  +                break;
  +            }
  +            read();
  +            if (current != 'i') {
  +                reportError("character.expected",
  +                            new Object[] { new Character('i'),
  +					   new Integer(current) });
  +                skipIdentifier();
  +                break;
  +            }
  +            read();
  +            if (current != 'c') {
  +                reportError("character.expected",
  +                            new Object[] { new Character('c'),
  +			        	   new Integer(current) });
  +                skipIdentifier();
  +                break;
  +            }
  +            read();
  +            if (current != 'e') {
  +                reportError("character.expected",
  +                            new Object[] { new Character('e'),
  +					   new Integer(current) });
  +                skipIdentifier();
  +                break;
  +            }
  +            preserveAspectRatioHandler.slice();
  +            read();
  +            break;
  +        default:
  +            if (current != -1) {
  +                reportError("character.unexpected",
  +                            new Object[] { new Integer(current) });
  +                skipIdentifier();
  +            }
  +        }
   
   	skipSpaces();
   	if (current != -1) {