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 de...@apache.org on 2003/02/24 19:25:54 UTC

cvs commit: xml-batik/test-resources/org/apache/batik/test samplesRendering.xml

deweese     2003/02/24 10:25:54

  Modified:    sources/org/apache/batik/bridge
                        AbstractGraphicsNodeBridge.java BridgeContext.java
                        SVGSVGElementBridge.java SVGTextElementBridge.java
                        UpdateManager.java UserAgent.java
                        UserAgentAdapter.java UserAgentViewport.java
               sources/org/apache/batik/dom/svg SVGContext.java
                        SVGLocatableSupport.java SVGOMSVGElement.java
                        SVGTextContent.java
               sources/org/apache/batik/gvt AbstractGraphicsNode.java
                        CanvasGraphicsNode.java
               sources/org/apache/batik/gvt/event AWTEventDispatcher.java
               sources/org/apache/batik/swing JSVGCanvas.java
               sources/org/apache/batik/swing/gvt JGVTComponent.java
               sources/org/apache/batik/swing/svg JSVGComponent.java
               sources/org/apache/batik/transcoder
                        SVGAbstractTranscoder.java
               test-resources/org/apache/batik/test samplesRendering.xml
  Added:       samples/tests/spec/scripting currentScaleTranslate.svg
               sources/org/apache/batik/dom/svg SVGOMPoint.java
                        SVGOMRect.java
  Log:
  1) Implemented currentScale/Translate
  2) Implemented getScreenCTM, fixed getCTM
  3) 1&2 work with Transcoders as well (if -onload is given).
  4) Fixed clientX/Y values in MouseEvents.
  5) JSVGComponent no longer redraws/cancels/redraws for most cases
  
  Revision  Changes    Path
  1.1                  xml-batik/samples/tests/spec/scripting/currentScaleTranslate.svg
  
  Index: currentScaleTranslate.svg
  ===================================================================
  <?xml version="1.0" standalone="no"?>
  <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"
  "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
  
  <!-- ====================================================================== -->
  <!-- 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.                                      -->
  <!-- ====================================================================== -->
  
  <!-- ====================================================================== -->
  <!-- append child test                                                      -->
  <!--                                                                        -->
  <!-- @author tkormann@ilog.fr                                               -->
  <!-- @version $Id: currentScaleTranslate.svg,v 1.1 2003/02/24 18:25:52 deweese Exp $ -->
  <!-- ====================================================================== -->
  
  <?xml-stylesheet type="text/css" href="../../resources/style/test.css" ?>  
  
  <svg id="body" width="450" height="500" viewBox="0 0 450 500"
       onload="setScaleTrans(2, 50, 50), update()"
       xmlns="http://www.w3.org/2000/svg" 
       xmlns:xlink="http://www.w3.org/1999/xlink">
  
      <title>svg current scale/translate modification</title>
  
      <script type="text/ecmascript"><![CDATA[
  	var count = 1;
  	function setScaleTrans(scale, newX, newY) {
  	   document.getRootElement().currentScale = scale;
  	   var pt = document.getRootElement().currentTranslate;
  	   pt.x = newX;
  	   pt.y = newX;
  	}
  	 
  	function update() {
  	   if ((count%10) == 0) {
  	      var scale = 1+((count/10)%10)/4;
                document.getRootElement().currentScale = scale;
  	   }
  
  	var t;
  	var mat;
             t = document.getElementById('cnt');
  	   t.firstChild.data = ("Count: " + count);
  
  	   mat = t.getScreenCTM();
             t = document.getElementById('foo');
  	   t.firstChild.data = 
  	       "The ScrnCTM is: (" + mat.a +","+ mat.b +","+ mat.c +","+ mat.d +","+ mat.e +","+ mat.f +")";
  
  	   mat = t.getCTM();
             t = document.getElementById('bar');
  	   t.firstChild.data = 
  	       "The CTM is: (" + mat.a +","+ mat.b +","+ mat.c +","+ mat.d +","+ mat.e +","+ mat.f +")";
  
  	   var scale = document.getRootElement().currentScale;
             t = document.getElementById('baz');
  	   t.firstChild.data = "The Scale is: "+scale;
  
  	   var trans = document.getRootElement().currentTranslate;
             t = document.getElementById('bat');
  	   t.firstChild.data = "The Trans is ["+trans.x+", " +trans.y+"]";
  
             t = document.getElementById('vp');
  	   var vp = document.rootElement.viewport;
  	   t.firstChild.data = ("Viewport: ["+ vp.x+", " +vp.y+", " +
  	                        vp.width+", " +vp.height+"]");
  
  	   count++;
  	  setTimeout('update()', 1000);
  	}
  
  	function mouseOver(evt) {
  	   t = document.getElementById('rec');
  	   var x = evt.getClientX();
  	   var y = evt.getClientY();
  	   mat = t.getScreenCTM();
  	   imat = mat.inverse();
  	   var pt = document.getRootElement().createSVGPoint();
   	   pt.x = x;
  	   pt.y = y;
  	   pt = pt.matrixTransform(imat);
  	   t.firstChild.data = ("Loc: [" + evt.getClientX() + ", " + 
  	                        evt.getClientY() + "] [" + 
  	                        pt.x + ", " + pt.y + "]");
  	}
      ]]></script>
  
      <g id="test-content">
         <rect x="0" y="0" width="450" height="500" 
               fill="lightgrey" stroke="black"
               onmousemove="mouseOver(evt)"/>
         <text id="cnt" x="10" y=" 80">test</text>
         <text id="foo" x="10" y="100">test</text>
         <text id="bar" x="10" y="120">test</text>
         <text id="baz" x="10" y="140">test</text>
         <text id="bat" x="10" y="160">test</text>
         <text id="vp"  x="10" y="180">test</text>
         <text id="rec" x="10" y="200">test</text>
     </g>
  </svg>
  
  
  1.28      +34 -7     xml-batik/sources/org/apache/batik/bridge/AbstractGraphicsNodeBridge.java
  
  Index: AbstractGraphicsNodeBridge.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/AbstractGraphicsNodeBridge.java,v
  retrieving revision 1.27
  retrieving revision 1.28
  diff -u -r1.27 -r1.28
  --- AbstractGraphicsNodeBridge.java	12 Jun 2002 08:20:34 -0000	1.27
  +++ AbstractGraphicsNodeBridge.java	24 Feb 2003 18:25:52 -0000	1.28
  @@ -17,8 +17,11 @@
   import org.apache.batik.dom.svg.SVGContext;
   import org.apache.batik.dom.svg.SVGOMElement;
   
  -import org.apache.batik.gvt.GraphicsNode;
   import org.apache.batik.gvt.CompositeGraphicsNode;
  +import org.apache.batik.gvt.CanvasGraphicsNode;
  +import org.apache.batik.gvt.GraphicsNode;
  +import org.apache.batik.gvt.RootGraphicsNode;
  +
   
   import org.w3c.dom.Element;
   import org.w3c.dom.Node;
  @@ -312,17 +315,41 @@
           AffineTransform ctm = new AffineTransform();
           Element elt = e;
           while (elt != null) {
  +            if (elt instanceof SVGFitToViewBox) {
  +                AffineTransform at;
  +                if (gn instanceof CanvasGraphicsNode) {
  +                    at = ((CanvasGraphicsNode)gn).getViewingTransform();
  +                } else {
  +                    at = gn.getTransform();
  +                }
  +                if (at != null) {
  +                    ctm.preConcatenate(at);
  +                }
  +                break;
  +            }
  +
               AffineTransform at = gn.getTransform();
  -            if (at != null) {
  +            if (at != null)
                   ctm.preConcatenate(at);
  -            }
  +
               elt = SVGCSSEngine.getParentCSSStylableElement(elt);
               gn = gn.getParent();
  -            if (elt instanceof SVGFitToViewBox) {
  -                break;
  -            }
           }
           return ctm;
  +    }
  +
  +    /**
  +     * Returns the display transform.
  +     */
  +    public AffineTransform getScreenTransform() {
  +        return ctx.getUserAgent().getTransform();
  +    }
  +
  +    /**
  +     * Returns the display transform.
  +     */
  +    public void setScreenTransform(AffineTransform at) {
  +        ctx.getUserAgent().setTransform(at);
       }
   
       /**
  
  
  
  1.56      +5 -1      xml-batik/sources/org/apache/batik/bridge/BridgeContext.java
  
  Index: BridgeContext.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/BridgeContext.java,v
  retrieving revision 1.55
  retrieving revision 1.56
  diff -u -r1.55 -r1.56
  --- BridgeContext.java	14 Nov 2002 19:44:49 -0000	1.55
  +++ BridgeContext.java	24 Feb 2003 18:25:52 -0000	1.56
  @@ -519,6 +519,10 @@
           viewportStack.add(0, viewport);
       }
   
  +    public void removeViewport(Element e) {
  +        viewportMap.remove(e);
  +    }
  +
       /**
        * Closes the viewport associated to the specified element.
        * @param e the element that closes its viewport
  
  
  
  1.31      +25 -14    xml-batik/sources/org/apache/batik/bridge/SVGSVGElementBridge.java
  
  Index: SVGSVGElementBridge.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGSVGElementBridge.java,v
  retrieving revision 1.30
  retrieving revision 1.31
  diff -u -r1.30 -r1.31
  --- SVGSVGElementBridge.java	4 Jul 2002 07:19:02 -0000	1.30
  +++ SVGSVGElementBridge.java	24 Feb 2003 18:25:52 -0000	1.31
  @@ -70,7 +70,7 @@
   	    return null;
   	}
   
  -        CanvasGraphicsNode gn = new CanvasGraphicsNode();
  +        CanvasGraphicsNode cgn = new CanvasGraphicsNode();
   
           UnitProcessor.Context uctx = UnitProcessor.createContext(ctx, e);
           String s;
  @@ -111,28 +111,29 @@
               (s, SVG_HEIGHT_ATTRIBUTE, uctx);
   
           // 'visibility'
  -        gn.setVisible(CSSUtilities.convertVisibility(e));
  +        cgn.setVisible(CSSUtilities.convertVisibility(e));
   
           // 'viewBox' and "preserveAspectRatio' attributes
  -        AffineTransform at =
  +        AffineTransform viewingTransform =
               ViewBox.getPreserveAspectRatioTransform(e, w, h);
   
           float actualWidth = w;
           float actualHeight = h;
           try {
  -            AffineTransform atInv = at.createInverse();
  -            actualWidth = (float) (w*atInv.getScaleX());
  -            actualHeight = (float) (h*atInv.getScaleY());
  +            AffineTransform vtInv = viewingTransform.createInverse();
  +            actualWidth = (float) (w*vtInv.getScaleX());
  +            actualHeight = (float) (h*vtInv.getScaleY());
           } catch (NoninvertibleTransformException ex) {}
   
  -        at.preConcatenate(AffineTransform.getTranslateInstance(x, y));
  -
  +        AffineTransform positionTransform =
  +            AffineTransform.getTranslateInstance(x, y);
           // 'overflow' and 'clip'
           // The outermost preserveAspectRatio matrix is set by the user
           // agent, so we don't need to set the transform for outermost svg
           Shape clip = null;
           if (!isOutermost) {
  -            gn.setTransform(at);
  +            cgn.setPositionTransform(positionTransform);
  +            cgn.setViewingTransform(viewingTransform);
           } else {
               // <!> FIXME: hack to compute the original document's size
               if (ctx.getDocumentSize() == null) {
  @@ -158,24 +159,26 @@
   
           if (clip != null) {
               try {
  +                AffineTransform at = new AffineTransform(positionTransform);
  +                at.concatenate(viewingTransform);
                   at = at.createInverse(); // clip in user space
                   clip = at.createTransformedShape(clip);
  -                Filter filter = gn.getGraphicsNodeRable(true);
  -                gn.setClip(new ClipRable8Bit(filter, clip));
  +                Filter filter = cgn.getGraphicsNodeRable(true);
  +                cgn.setClip(new ClipRable8Bit(filter, clip));
               } catch (NoninvertibleTransformException ex) {}
           }
   
           // 'enable-background'
           Rectangle2D r = CSSUtilities.convertEnableBackground(e);
           if (r != null) {
  -            gn.setBackgroundEnable(r);
  +            cgn.setBackgroundEnable(r);
           }
   
           ctx.openViewport
               (e, new SVGSVGElementViewport((SVGSVGElement)e,
                                             actualWidth,
                                             actualHeight));
  -        return gn;
  +        return cgn;
       }
   
       /**
  @@ -199,6 +202,14 @@
       }
   
       // BridgeUpdateHandler implementation //////////////////////////////////
  +
  +    /**
  +     * Disposes this BridgeUpdateHandler and releases all resources.
  +     */
  +    public void dispose() {
  +        ctx.removeViewport(e);
  +        super.dispose();
  +    }
   
       /**
        * Invoked when an MutationEvent of type 'DOMAttrModified' is fired.
  
  
  
  1.74      +19 -1     xml-batik/sources/org/apache/batik/bridge/SVGTextElementBridge.java
  
  Index: SVGTextElementBridge.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGTextElementBridge.java,v
  retrieving revision 1.73
  retrieving revision 1.74
  diff -u -r1.73 -r1.74
  --- SVGTextElementBridge.java	19 Feb 2003 02:50:56 -0000	1.73
  +++ SVGTextElementBridge.java	24 Feb 2003 18:25:52 -0000	1.74
  @@ -1901,6 +1901,24 @@
           }
   
           /**
  +         * Returns the transformation matrix from the userspace of
  +         * the root element to the screen.
  +         */
  +        public AffineTransform getScreenTransform() {
  +            //return node.getScreenTransform();
  +            return null;
  +        }
  +
  +        /**
  +         * Sets the transformation matrix to be used from the
  +         * userspace of the root element to the screen.
  +         */
  +        public void setScreenTransform(AffineTransform at) {
  +            //return node.setScreenTransform(at);
  +            return;
  +        }
  +
  +        /**
            * Returns the width of the viewport which directly contains the
            * given element.
            */
  
  
  
  1.19      +1 -2      xml-batik/sources/org/apache/batik/bridge/UpdateManager.java
  
  Index: UpdateManager.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/UpdateManager.java,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- UpdateManager.java	25 Sep 2002 11:59:59 -0000	1.18
  +++ UpdateManager.java	24 Feb 2003 18:25:52 -0000	1.19
  @@ -150,7 +150,6 @@
           throws InterruptedException {
           scriptingEnvironment.loadScripts();
           scriptingEnvironment.dispatchSVGLoadEvent();
  -
       }
   
       /**
  
  
  
  1.25      +7 -1      xml-batik/sources/org/apache/batik/bridge/UserAgent.java
  
  Index: UserAgent.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/UserAgent.java,v
  retrieving revision 1.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- UserAgent.java	5 Sep 2002 12:58:18 -0000	1.24
  +++ UserAgent.java	24 Feb 2003 18:25:52 -0000	1.25
  @@ -143,6 +143,12 @@
       AffineTransform getTransform();
   
       /**
  +     * Sets the <code>AffineTransform</code> currently
  +     * applied to the drawing by the UserAgent.
  +     */
  +    void setTransform(AffineTransform at);
  +
  +    /**
        * Returns this user agent's CSS media.
        */
       String getMedia();
  
  
  
  1.12      +8 -1      xml-batik/sources/org/apache/batik/bridge/UserAgentAdapter.java
  
  Index: UserAgentAdapter.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/UserAgentAdapter.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- UserAgentAdapter.java	5 Sep 2002 12:58:18 -0000	1.11
  +++ UserAgentAdapter.java	24 Feb 2003 18:25:52 -0000	1.12
  @@ -223,6 +223,13 @@
       /**
        * Unsupported operation.
        */
  +    public void setTransform(AffineTransform at) {
  +        // Do nothing.
  +    }
  +
  +    /**
  +     * Unsupported operation.
  +     */
       public Point getClientAreaLocationOnScreen() {
           return new Point();
       }
  
  
  
  1.3       +5 -7      xml-batik/sources/org/apache/batik/bridge/UserAgentViewport.java
  
  Index: UserAgentViewport.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/UserAgentViewport.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- UserAgentViewport.java	8 Mar 2001 12:39:31 -0000	1.2
  +++ UserAgentViewport.java	24 Feb 2003 18:25:52 -0000	1.3
  @@ -16,29 +16,27 @@
    */
   public class UserAgentViewport implements Viewport {
   
  -    private float width;
  -    private float height;
  +    private UserAgent userAgent;
   
       /**
        * Constructs a new viewport for the specified user agent.
        * @param userAgent the user agent that defines the viewport
        */
       public UserAgentViewport(UserAgent userAgent) {
  -        width = (float) userAgent.getViewportSize().getWidth();
  -        height = (float) userAgent.getViewportSize().getHeight();
  +        this.userAgent = userAgent;
       }
   
       /**
        * Returns the width of this viewport.
        */
       public float getWidth() {
  -        return width;
  +        return (float) userAgent.getViewportSize().getWidth();
       }
   
       /**
        * Returns the height of this viewport.
        */
       public float getHeight() {
  -        return height;
  +        return (float) userAgent.getViewportSize().getHeight();
       }
   }
  
  
  
  1.10      +11 -1     xml-batik/sources/org/apache/batik/dom/svg/SVGContext.java
  
  Index: SVGContext.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/dom/svg/SVGContext.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- SVGContext.java	5 Jun 2002 21:14:48 -0000	1.9
  +++ SVGContext.java	24 Feb 2003 18:25:53 -0000	1.10
  @@ -40,6 +40,16 @@
       Rectangle2D getBBox();
   
       /**
  +     * Returns the transform from the global transform space to pixels.
  +     */
  +    AffineTransform getScreenTransform();
  +
  +    /**
  +     * Sets the transform to be used from the global transform space to pixels.
  +     */
  +    void setScreenTransform(AffineTransform at);
  +
  +    /**
        * Returns the transformation matrix from current user units
        * (i.e., after application of the transform attribute, if any) to
        * the viewport coordinate system for the nearestViewportElement.
  
  
  
  1.6       +12 -2     xml-batik/sources/org/apache/batik/dom/svg/SVGLocatableSupport.java
  
  Index: SVGLocatableSupport.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/dom/svg/SVGLocatableSupport.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- SVGLocatableSupport.java	24 Apr 2002 13:01:26 -0000	1.5
  +++ SVGLocatableSupport.java	24 Feb 2003 18:25:53 -0000	1.6
  @@ -118,7 +118,17 @@
        * org.w3c.dom.svg.SVGLocatable#getScreenCTM()}.
        */
       public static SVGMatrix getScreenCTM(Element elt) {
  -	throw new RuntimeException(" !!! TODO: getScreenCTM()");
  +        final SVGOMElement svgelt  = (SVGOMElement)elt;
  +        return new AbstractSVGMatrix() {
  +                protected AffineTransform getAffineTransform() {
  +                    SVGContext context = svgelt.getSVGContext();
  +                    AffineTransform ret = context.getGlobalTransform();
  +                    AffineTransform scrnTrans = context.getScreenTransform();
  +                    if (scrnTrans != null)
  +                        ret.preConcatenate(scrnTrans);
  +                    return ret;
  +                }
  +            };
       }
   
       /**
  
  
  
  1.20      +77 -34    xml-batik/sources/org/apache/batik/dom/svg/SVGOMSVGElement.java
  
  Index: SVGOMSVGElement.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/dom/svg/SVGOMSVGElement.java,v
  retrieving revision 1.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- SVGOMSVGElement.java	14 Aug 2002 14:12:22 -0000	1.19
  +++ SVGOMSVGElement.java	24 Feb 2003 18:25:53 -0000	1.20
  @@ -8,6 +8,8 @@
   
   package org.apache.batik.dom.svg;
   
  +import java.awt.geom.AffineTransform;
  +
   import org.apache.batik.dom.AbstractDocument;
   import org.apache.batik.dom.util.XLinkSupport;
   import org.apache.batik.dom.util.XMLSupport;
  @@ -178,8 +180,10 @@
        * <b>DOM</b>: Implements {@link SVGSVGElement#getViewport()}.
        */
       public SVGRect getViewport() {
  -        throw new RuntimeException(" !!! TODO: getViewport()");
  -    }
  +        SVGContext ctx = getSVGContext();
  +        return new SVGOMRect(0, 0, ctx.getViewportWidth(), 
  +                             ctx.getViewportHeight());
  +    } 
   
       public float getPixelUnitToMillimeterX( ) {
           throw new Error();
  @@ -204,15 +208,72 @@
           throw new Error();
       }
       public float getCurrentScale( ) {
  -        throw new Error();
  -    }
  -    public void      setCurrentScale( float currentScale )
  -        throws DOMException {
  -        throw new Error();
  +        AffineTransform scrnTrans = getSVGContext().getScreenTransform();
  +        if (scrnTrans != null)
  +            return (float)Math.sqrt(scrnTrans.getDeterminant());
  +        return 1;
  +    }
  +    public void setCurrentScale( float currentScale ) throws DOMException {
  +        SVGContext context = getSVGContext();
  +        AffineTransform scrnTrans = context.getScreenTransform();
  +        float scale = 1;
  +        if (scrnTrans != null)
  +            scale = (float)Math.sqrt(scrnTrans.getDeterminant());
  +        float delta = currentScale/scale;
  +        // The way currentScale, currentTranslate are defined
  +        // changing scale has no effect on translate.
  +        scrnTrans = new AffineTransform
  +            (scrnTrans.getScaleX()*delta, scrnTrans.getShearY()*delta,
  +             scrnTrans.getShearX()*delta, scrnTrans.getScaleY()*delta,
  +             scrnTrans.getTranslateX(), scrnTrans.getTranslateY());
  +        context.setScreenTransform(scrnTrans);
       }
  +
       public SVGPoint getCurrentTranslate( ) {
  -        throw new Error();
  +        final SVGOMElement svgelt  = this;
  +        return new SVGPoint() {
  +                AffineTransform getScreenTransform() {
  +                    SVGContext context = svgelt.getSVGContext();
  +                    return context.getScreenTransform();
  +                }
  +                    
  +                public float getX() {
  +                    AffineTransform scrnTrans = getScreenTransform();
  +                    return (float)scrnTrans.getTranslateX();
  +                }
  +                public float getY() {
  +                    AffineTransform scrnTrans = getScreenTransform();
  +                    return (float)scrnTrans.getTranslateY();
  +                }
  +                public void setX(float newX) {
  +                    SVGContext context = svgelt.getSVGContext();
  +                    AffineTransform scrnTrans = context.getScreenTransform();
  +                    scrnTrans = new AffineTransform
  +                        (scrnTrans.getScaleX(), scrnTrans.getShearY(),
  +                         scrnTrans.getShearX(), scrnTrans.getScaleY(),
  +                         newX, scrnTrans.getTranslateY());
  +                    context.setScreenTransform(scrnTrans);
  +                }
  +                public void setY(float newY) {
  +                    SVGContext context = svgelt.getSVGContext();
  +                    AffineTransform scrnTrans = context.getScreenTransform();
  +                    scrnTrans = new AffineTransform
  +                        (scrnTrans.getScaleX(), scrnTrans.getShearY(),
  +                         scrnTrans.getShearX(), scrnTrans.getScaleY(),
  +                         scrnTrans.getTranslateX(), newY);
  +                    context.setScreenTransform(scrnTrans);
  +                }
  +                public SVGPoint matrixTransform ( SVGMatrix mat ) {
  +                    AffineTransform scrnTrans = getScreenTransform();
  +                    float x = (float)scrnTrans.getTranslateX();
  +                    float y = (float)scrnTrans.getTranslateY();
  +                    float newX = mat.getA()*x + mat.getC()*y + mat.getE();
  +                    float newY = mat.getB()*x + mat.getD()*y + mat.getF();
  +                    return new SVGOMPoint(newX, newY);
  +                }
  +            };
       }
  +
       public int          suspendRedraw ( int max_wait_milliseconds ) {
           throw new Error();
       }
  @@ -290,32 +351,17 @@
        * <b>DOM</b>: Implements {@link SVGSVGElement#createSVGPoint()}.
        */
       public SVGPoint createSVGPoint() {
  -        return new SVGPoint() {
  -                float x;
  -                float y;
  -                public float getX() {
  -                    return x;
  -                }
  -                public void setX(float x) throws DOMException {
  -                    this.x = x;
  -                }
  -                public float getY() {
  -                    return y;
  -                }
  -                public void setY(float y) throws DOMException {
  -                    this.y = y;
  -                }
  -                public SVGPoint matrixTransform(SVGMatrix matrix) {
  -                    throw new RuntimeException("!!! TODO: matrixTransform()");
  -                }
  -            };
  +        return new SVGOMPoint(0, 0);
       }
   
       public SVGMatrix              createSVGMatrix (  ) {
  -        throw new Error();
  +        return new AbstractSVGMatrix() {
  +                AffineTransform at = new AffineTransform();
  +                protected AffineTransform getAffineTransform() { return at; }
  +            };
       }
       public SVGRect                createSVGRect (  ) {
  -        throw new Error();
  +        return new SVGOMRect(0,0,0,0);
       }
       public SVGTransform           createSVGTransform (  ) {
           throw new Error();
  @@ -323,11 +369,8 @@
       public SVGTransform     createSVGTransformFromMatrix ( SVGMatrix matrix ) {
           throw new Error();
       }
  -    public String              createSVGString (  ) {
  -        throw new Error();
  -    }
       public Element         getElementById ( String elementId ) {
  -        throw new Error();
  +        return ((SVGOMDocument)getDocument()).getElementById(elementId);
       }
   
       // SVGLocatable ///////////////////////////////////////////////////////
  
  
  
  1.2       +1 -141    xml-batik/sources/org/apache/batik/dom/svg/SVGTextContent.java
  
  Index: SVGTextContent.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/dom/svg/SVGTextContent.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- SVGTextContent.java	19 Feb 2003 02:50:57 -0000	1.1
  +++ SVGTextContent.java	24 Feb 2003 18:25:53 -0000	1.2
  @@ -1,141 +1 @@
  -/*****************************************************************************
  - * 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 org.apache.batik.dom.svg;
  -
  -import java.awt.geom.Rectangle2D;
  -import java.awt.geom.Point2D;
  -
  -import org.w3c.dom.DOMException;
  -
  -/**
  - * This class provides the interface for the SVGTextContentElement
  - * for the bridge to implement.
  - *
  - * @author nicolas.socheleau@bitflash.com
  - * @version $Id$
  - */
  -public interface SVGTextContent
  -{
  -    /**
  -     * Returns the total number of characters to be 
  -     * rendered within the current element. 
  -     * Includes characters which are included 
  -     * via a &lt;tref&gt; reference. 
  -     *
  -     * @return Total number of characters.
  -     */
  -    public int getNumberOfChars();
  -
  -    /**
  -     * Returns a tightest rectangle which defines the 
  -     * minimum and maximum X and Y values in the user 
  -     * coordinate system for rendering the glyph(s) 
  -     * that correspond to the specified character. 
  -     * The calculations assume that  all glyphs occupy 
  -     * the full standard glyph cell for the font. If 
  -     * multiple consecutive characters are rendered 
  -     * inseparably (e.g., as a single glyph or a 
  -     * sequence of glyphs), then each of the inseparable 
  -     * characters will return the same extent. 
  -     * 
  -     * @param charnum The index of the character, where the 
  -     *    first character has an index of 0.
  -     * @return The rectangle which encloses all of 
  -     *    the rendered glyph(s).
  -     */
  -    public Rectangle2D getExtentOfChar(int charnum );
  -
  -    /**
  -     * Returns the current text position before rendering 
  -     * the character in the user coordinate system for 
  -     * rendering the glyph(s) that correspond to the 
  -     * specified character. The current text position has 
  -     * already taken into account the effects of any inter- 
  -     * character adjustments due to properties 'kerning', 
  -     * 'letter-spacing' and 'word-spacing' and adjustments 
  -     * due to attributes x, y, dx and dy. If multiple 
  -     * consecutive characters are rendered inseparably 
  -     * (e.g., as a single glyph or a sequence of glyphs), 
  -     * then each of the inseparable characters will return
  -     * the start position for the first glyph. 
  -     * 
  -     * @param charnum The index of the character, where the 
  -     *    first character has an index of 0.
  -     * @return The character's start position.
  -     */
  -    public Point2D getStartPositionOfChar(int charnum);
  -
  -    /**
  -     * Returns the current text position after rendering 
  -     * the character in the user coordinate system for 
  -     * rendering the glyph(s) that correspond to the 
  -     * specified character. This current text position 
  -     * does not take into account the effects of any inter-
  -     * character adjustments to prepare for the next 
  -     * character, such as properties 'kerning', 
  -     * 'letter-spacing' and 'word-spacing' and adjustments 
  -     * due to attributes x, y, dx and dy. If multiple 
  -     * consecutive characters are rendered inseparably 
  -     * (e.g., as a single glyph or a sequence of glyphs), 
  -     * then each of the inseparable characters will return 
  -     * the end position for the last glyph. 
  -     * 
  -     * @param charnum The index of the character, where the 
  -     *    first character has an index of 0.
  -     * @return The character's end position.
  -     */
  -    public Point2D getEndPositionOfChar(int charnum);
  -
  -    /**
  -     * Returns the rotation value relative to the current 
  -     * user coordinate system used to render the glyph(s) 
  -     * corresponding to the specified character. If 
  -     * multiple glyph(s) are used to render the given 
  -     * character and the glyphs each have different 
  -     * rotations (e.g., due to text-on-a-path), the user 
  -     * agent shall return an average value (e.g., the 
  -     * rotation angle at the midpoint along the path for 
  -     * all glyphs used to render this character). The 
  -     * rotation value represents the rotation that is 
  -     * supplemental to any rotation due to properties 
  -     * 'glyph-orientation-horizontal' and 
  -     * 'glyph-orientation-vertical'; thus, any glyph 
  -     * rotations due to these properties are not included 
  -     * into the returned rotation value. If multiple 
  -     * consecutive characters are rendered inseparably 
  -     * (e.g., as a single glyph or a sequence of glyphs), 
  -     * then each of the inseparable characters will 
  -     * return the same rotation value. 
  -     *
  -     * @param charnum The index of the character, where the 
  -     *    first character has an index of 0.
  -     * @return The character's rotation angle.
  -     */
  -    public float getRotationOfChar(int charnum);
  -    /**
  -     * Causes the specified substring to be selected 
  -     * just as if the user selected the substring interactively. 
  -     *
  -     * @param charnum : The index of the start character 
  -     *   which is at the given point, where the first 
  -     *   character has an index of 0.
  -     * @param nchars : The number of characters in the 
  -     *   substring. If nchars specifies more characters 
  -     *   than are available, then the substring will 
  -     *   consist of all characters starting with charnum 
  -     *   until the end of the list of characters.
  -     */
  -    public void selectSubString(int charnum, int nchars);
  -
  -    public float getComputedTextLength();
  -
  -    public float getSubStringLength(int charnum, int nchars);
  -
  -    public int getCharNumAtPosition(float x, float y);
  -}
  +/*****************************************************************************


 * 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 org.apache.batik.dom.svg;

import java.awt.geom.Rectangle2D;
import java.awt.geom.Point2D;

import org.w3c.dom.DOMException;

/**
 * This class provides the interface for the SVGTextContentElement
 * for the bridge to implement.
 *
 * @author nicolas.socheleau@bitflash.com
 * @version $Id$
 */
public interface SVGTextContent
{
    /**
     * Returns the total number of characters to be 
     * rendered within the current element. 
     * Includes characters which are included 
     * via a &lt;tref&gt; reference. 
     *
     * @return Total number of characters.
     */
    public int getNumberOfChars();

    /**
     * Returns a tightest rectangle which defines the 
     * minimum and maximum X and Y values in the user 
     * coordinate system for rendering the glyph(s) 
     * that correspond to the specified character. 
     * The calculations assume that  all glyphs occupy 
     * the full standard glyph cell for the font. If 
     * multiple consecutive characters are rendered 
     * inseparably (e.g., as a single glyph or a 
     * sequence of glyphs), then each of the inseparable 
     * characters will return the same extent. 
     * 
     * @param charnum The index of the character, where the 
     *    first character has an index of 0.
     * @return The rectangle which encloses all of 
     *    the rendered glyph(s).
     */
    public Rectangle2D getExtentOfChar(int charnum );

    /**
     * Returns the current text position before rendering 
     * the character in the user coordinate system for 
     * rendering the glyph(s) that correspond to the 
     * specified character. The current text position has 
     * already taken into account the effects of any inter- 
     * character adjustments due to properties 'kerning', 
     * 'letter-spacing' and 'word-spacing' and adjustments 
     * due to attributes x, y, dx and dy. If multiple 
     * consecutive characters are rendered inseparably 
     * (e.g., as a single glyph or a sequence of glyphs), 
     * then each of the inseparable characters will return
     * the start position for the first glyph. 
     * 
     * @param charnum The index of the character, where the 
     *    first character has an index of 0.
     * @return The character's start position.
     */
    public Point2D getStartPositionOfChar(int charnum);

    /**
     * Returns the current text position after rendering 
     * the character in the user coordinate system for 
     * rendering the glyph(s) that correspond to the 
     * specified character. This current text position 
     * does not take into account the effects of any inter-
     * character adjustments to prepare for the next 
     * character, such as properties 'kerning', 
     * 'letter-spacing' and 'word-spacing' and adjustments 
     * due to attributes x, y, dx and dy. If multiple 
     * consecutive characters are rendered inseparably 
     * (e.g., as a single glyph or a sequence of glyphs), 
     * then each of the inseparable characters will return 
     * the end position for the last glyph. 
     * 
     * @param charnum The index of the character, where the 
     *    first character has an index of 0.
     * @return The character's end position.
     */
    public Point2D getEndPositionOfChar(int charnum);

    /**
     * Returns the rotation value relative to the current 
     * user coordinate system used to render the glyph(s) 
     * corresponding to the specified character. If 
     * multiple glyph(s) are used to render the given 
     * character and the glyphs each have different 
     * rotations (e.g., due to text-on-a-path), the user 
     * agent shall return an average value (e.g., the 
     * rotation angle at the midpoint along the path for 
     * all glyphs used to render this character). The 
     * rotation value represents the rotation that is 
     * supplemental to any rotation due to properties 
     * 'glyph-orientation-horizontal' and 
     * 'glyph-orientation-vertical'; thus, any glyph 
     * rotations due to these properties are not included 
     * into the returned rotation value. If multiple 
     * consecutive characters are rendered inseparably 
     * (e.g., as a single glyph or a sequence of glyphs), 
     * then each of the inseparable characters will 
     * return the same rotation value. 
     *
     * @param charnum The index of the character, where the 
     *    first character has an index of 0.
     * @return The character's rotation angle.
     */
    public float getRotationOfChar(int charnum);
    /**
     * Causes the specified substring to be selected 
     * just as if the user selected the substring interactively. 
     *
     * @param charnum : The index of the start character 
     *   which is at the given point, where the first 
     *   character has an index of 0.
     * @param nchars : The number of characters in the 
     *   substring. If nchars specifies more characters 
     *   than are available, then the substring will 
     *   consist of all characters starting with charnum 
     *   until the end of the list of characters.
     */
    public void selectSubString(int charnum, int nchars);

    public float getComputedTextLength();

    public float getSubStringLength(int charnum, int nchars);

    public int getCharNumAtPosition(float x, float y);
}
  \ No newline at end of file
  
  
  
  1.1                  xml-batik/sources/org/apache/batik/dom/svg/SVGOMPoint.java
  
  Index: SVGOMPoint.java
  ===================================================================
  /*****************************************************************************
   * 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 org.apache.batik.dom.svg;
  
  import java.awt.geom.AffineTransform;
  import java.awt.geom.NoninvertibleTransformException;
  
  import org.w3c.dom.DOMException;
  import org.w3c.dom.svg.SVGMatrix;
  import org.w3c.dom.svg.SVGPoint;
  
  /**
   * This class provides an abstract implementation of the {@link SVGMatrix}
   * interface.
   *
   * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
   * @version $Id: SVGOMPoint.java,v 1.1 2003/02/24 18:25:53 deweese Exp $
   */
  public class SVGOMPoint implements SVGPoint {
      float x, y;
      public SVGOMPoint() { x=0; y=0; }
      public SVGOMPoint(float x, float y) {
          this.x = x;
          this.y = y;
      }
  
      public float getX( )                             { return x; }
      public void  setX( float x ) throws DOMException { this.x = x; }
      public float getY( )                             { return y; }
      public void  setY( float y ) throws DOMException { this.y = y; }
  
      public SVGPoint matrixTransform ( SVGMatrix matrix ) {
          float newX = matrix.getA()*x + matrix.getC()*y + matrix.getE();
          float newY = matrix.getB()*x + matrix.getD()*y + matrix.getF();
          return new SVGOMPoint(newX, newY);
      }
  }
  
  
  
  1.3       +18 -181   xml-batik/sources/org/apache/batik/dom/svg/SVGOMRect.java
  
  
  
  
  1.45      +1 -6      xml-batik/sources/org/apache/batik/gvt/AbstractGraphicsNode.java
  
  Index: AbstractGraphicsNode.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/AbstractGraphicsNode.java,v
  retrieving revision 1.44
  retrieving revision 1.45
  diff -u -r1.44 -r1.45
  --- AbstractGraphicsNode.java	25 Jul 2002 21:42:42 -0000	1.44
  +++ AbstractGraphicsNode.java	24 Feb 2003 18:25:53 -0000	1.45
  @@ -37,13 +37,8 @@
   import org.apache.batik.ext.awt.image.PadMode;
   import org.apache.batik.ext.awt.image.renderable.ClipRable;
   import org.apache.batik.ext.awt.image.renderable.Filter;
  -import org.apache.batik.gvt.event.GraphicsNodeEvent;
   import org.apache.batik.gvt.event.GraphicsNodeChangeEvent;
   import org.apache.batik.gvt.event.GraphicsNodeChangeListener;
  -import org.apache.batik.gvt.event.GraphicsNodeKeyEvent;
  -import org.apache.batik.gvt.event.GraphicsNodeKeyListener;
  -import org.apache.batik.gvt.event.GraphicsNodeMouseEvent;
  -import org.apache.batik.gvt.event.GraphicsNodeMouseListener;
   import org.apache.batik.gvt.filter.Mask;
   import org.apache.batik.gvt.filter.GraphicsNodeRable;
   import org.apache.batik.gvt.filter.GraphicsNodeRable8Bit;
  
  
  
  1.6       +83 -1     xml-batik/sources/org/apache/batik/gvt/CanvasGraphicsNode.java
  
  Index: CanvasGraphicsNode.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/CanvasGraphicsNode.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- CanvasGraphicsNode.java	18 Sep 2001 21:18:59 -0000	1.5
  +++ CanvasGraphicsNode.java	24 Feb 2003 18:25:53 -0000	1.6
  @@ -12,6 +12,8 @@
   import java.awt.Rectangle;
   import java.awt.Graphics2D;
   import java.awt.geom.Dimension2D;
  +import java.awt.geom.AffineTransform;
  +import java.awt.geom.NoninvertibleTransformException;
   
   /**
    * The graphics node container with a background color.
  @@ -21,6 +23,21 @@
    */
   public class CanvasGraphicsNode extends CompositeGraphicsNode {
   
  +    /**
  +     * This is the position transform for this graphics node.
  +     * This is needed because getCTM returns the transform
  +     * to the viewport coordinate system which is after viewing but
  +     * before positioning.
  +     */
  +    protected AffineTransform positionTransform;
  +    /**
  +     * This is the viewing transform for this graphics node.
  +     * This is needed because getCTM returns the transform
  +     * to the viewport coordinate system which is after viewing but
  +     * before positioning.
  +     */
  +    protected AffineTransform viewingTransform;
  +
       /** 
        * The background of this canvas graphics node.
        */
  @@ -51,6 +68,71 @@
           return backgroundPaint;
       }
   
  +    public void setPositionTransform(AffineTransform at) {
  +        fireGraphicsNodeChangeStarted();
  +        invalidateGeometryCache();
  +        this.positionTransform = at;
  +        if (positionTransform != null) {
  +            transform = new AffineTransform(positionTransform);
  +            if (viewingTransform != null)
  +                transform.concatenate(viewingTransform);
  +        } else if (viewingTransform != null)
  +            transform = new AffineTransform(viewingTransform);
  +        else
  +            transform = new AffineTransform();
  +        
  +        if (transform.getDeterminant() != 0){
  +            try{
  +                inverseTransform = transform.createInverse();
  +            }catch(NoninvertibleTransformException e){
  +                // Should never happen.
  +                throw new Error();
  +            }
  +        }
  +        else{
  +            // The transform is not invertible. Use the same
  +            // transform.
  +            inverseTransform = transform;
  +        }
  +        fireGraphicsNodeChangeCompleted();
  +    }
  +
  +    public AffineTransform getPositionTransform() {
  +        return positionTransform;
  +    }
  +
  +    public void setViewingTransform(AffineTransform at) {
  +        fireGraphicsNodeChangeStarted();
  +        invalidateGeometryCache();
  +        this.viewingTransform = at;
  +        if (positionTransform != null) {
  +            transform = new AffineTransform(positionTransform);
  +            if (viewingTransform != null)
  +                transform.concatenate(viewingTransform);
  +        } else if (viewingTransform != null)
  +            transform = new AffineTransform(viewingTransform);
  +        else
  +            transform = new AffineTransform();
  +
  +        if(transform.getDeterminant() != 0){
  +            try{
  +                inverseTransform = transform.createInverse();
  +            }catch(NoninvertibleTransformException e){
  +                // Should never happen.
  +                throw new Error();
  +            }
  +        }
  +        else{
  +            // The transform is not invertible. Use the same
  +            // transform.
  +            inverseTransform = transform;
  +        }
  +        fireGraphicsNodeChangeCompleted();
  +    }
  +
  +    public AffineTransform getViewingTransform() {
  +        return viewingTransform;
  +    }
       //
       // Drawing methods
       //
  
  
  
  1.11      +4 -3      xml-batik/sources/org/apache/batik/gvt/event/AWTEventDispatcher.java
  
  Index: AWTEventDispatcher.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/event/AWTEventDispatcher.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- AWTEventDispatcher.java	28 Jun 2002 15:02:02 -0000	1.10
  +++ AWTEventDispatcher.java	24 Feb 2003 18:25:53 -0000	1.11
  @@ -338,11 +338,12 @@
       protected void dispatchMouseEvent(MouseEvent evt) {
           GraphicsNodeMouseEvent gvtevt;
           Point2D p = new Point2D.Float(evt.getX(), evt.getY());
  +        Point2D gnp = p;
           if (baseTransform != null) {
  -            p = baseTransform.transform(p, null);
  +            gnp = baseTransform.transform(p, null);
           }
   
  -        GraphicsNode node = root.nodeHitAt(p);
  +        GraphicsNode node = root.nodeHitAt(gnp);
   
           // If the receiving node has changed, send a notification
           // check if we enter a new node
  
  
  
  1.36      +2 -2      xml-batik/sources/org/apache/batik/swing/JSVGCanvas.java
  
  Index: JSVGCanvas.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/swing/JSVGCanvas.java,v
  retrieving revision 1.35
  retrieving revision 1.36
  diff -u -r1.35 -r1.36
  --- JSVGCanvas.java	11 Nov 2002 14:38:37 -0000	1.35
  +++ JSVGCanvas.java	24 Feb 2003 18:25:54 -0000	1.36
  @@ -517,7 +517,7 @@
        */
       protected class ResetTransformAction extends AbstractAction {
           public void actionPerformed(ActionEvent evt) {
  -            setFragmentIdentifier(null);
  +            fragmentIdentifier = null;
               resetRenderingTransform();
           }
       }
  
  
  
  1.30      +25 -10    xml-batik/sources/org/apache/batik/swing/gvt/JGVTComponent.java
  
  Index: JGVTComponent.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/swing/gvt/JGVTComponent.java,v
  retrieving revision 1.29
  retrieving revision 1.30
  diff -u -r1.29 -r1.30
  --- JGVTComponent.java	2 Aug 2002 00:18:35 -0000	1.29
  +++ JGVTComponent.java	24 Feb 2003 18:25:54 -0000	1.30
  @@ -113,12 +113,12 @@
       /**
        * The initial rendering transform.
        */
  -    protected AffineTransform initialTransform;
  +    protected AffineTransform initialTransform = new AffineTransform();
   
       /**
        * The transform used for rendering.
        */
  -    protected AffineTransform renderingTransform;
  +    protected AffineTransform renderingTransform = new AffineTransform();
   
       /**
        * The transform used for painting.
  @@ -206,8 +206,8 @@
   
           addComponentListener(new ComponentAdapter() {
                   public void componentResized(ComponentEvent e) {
  -                    updateRenderingTransform();
  -                    scheduleGVTRendering();
  +                    if (updateRenderingTransform())
  +                        scheduleGVTRendering();
                   }
               });
   
  @@ -264,6 +264,9 @@
        */
       public void setGraphicsNode(GraphicsNode gn) {
           setGraphicsNode(gn, true);
  +        initialTransform = new AffineTransform();
  +        updateRenderingTransform();
  +        setRenderingTransform(initialTransform, true);
       }
   
       /**
  @@ -277,7 +280,6 @@
           if (eventDispatcher != null) {
               eventDispatcher.setRootNode(gn);
           }
  -        computeRenderingTransform();
       }
   
       /**
  @@ -483,6 +485,11 @@
        * Calling this method causes a rendering to be performed.
        */
       public void setRenderingTransform(AffineTransform at) {
  +        setRenderingTransform(at, true);
  +    }
  +
  +    public void setRenderingTransform(AffineTransform at, 
  +                                      boolean performRedraw) {
           renderingTransform = at;
           suspendInteractions = true;
           if (eventDispatcher != null) {
  @@ -493,7 +500,8 @@
                   handleException(e);
               }
           }
  -        scheduleGVTRendering();
  +        if (performRedraw)
  +            scheduleGVTRendering();
       }
   
       /**
  @@ -611,17 +619,24 @@
   
       /**
        * Computes the initial value of the transform used for rendering.
  +     * Return true if a repaint is required, otherwise false.
        */
  -    protected void computeRenderingTransform() {
  +    protected boolean computeRenderingTransform() {
           initialTransform = new AffineTransform();
  -        setRenderingTransform(initialTransform);
  +        if (initialTransform != renderingTransform) {
  +            setRenderingTransform(initialTransform, false);
  +            return true;
  +        }
  +        return false;
       }
   
       /**
        * Updates the value of the transform used for rendering.
  +     * Return true if a repaint is required, otherwise false.
        */
  -    protected void updateRenderingTransform() {
  +    protected boolean updateRenderingTransform() {
           // Do nothing.
  +        return false;
       }
   
       /**
  
  
  
  1.62      +128 -23   xml-batik/sources/org/apache/batik/swing/svg/JSVGComponent.java
  
  Index: JSVGComponent.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/swing/svg/JSVGComponent.java,v
  retrieving revision 1.61
  retrieving revision 1.62
  diff -u -r1.61 -r1.62
  --- JSVGComponent.java	14 Nov 2002 19:44:49 -0000	1.61
  +++ JSVGComponent.java	24 Feb 2003 18:25:54 -0000	1.62
  @@ -8,6 +8,7 @@
   
   package org.apache.batik.swing.svg;
   
  +import java.awt.Container;
   import java.awt.Cursor;
   import java.awt.Dimension;
   import java.awt.EventQueue;
  @@ -15,6 +16,7 @@
   import java.awt.Point;
   import java.awt.Rectangle;
   import java.awt.Shape;
  +import java.awt.Window;
   
   import java.awt.event.KeyEvent;
   import java.awt.event.MouseEvent;
  @@ -58,6 +60,8 @@
   import org.apache.batik.ext.awt.image.spi.ImageTagRegistry;
   
   import org.apache.batik.gvt.GraphicsNode;
  +import org.apache.batik.gvt.CanvasGraphicsNode;
  +import org.apache.batik.gvt.CompositeGraphicsNode;
   
   import org.apache.batik.gvt.event.EventDispatcher;
   
  @@ -538,7 +542,8 @@
        */
       public void setFragmentIdentifier(String fi) {
           fragmentIdentifier = fi;
  -        computeRenderingTransform();
  +        if (computeRenderingTransform())
  +            scheduleGVTRendering();
       }
   
       /**
  @@ -593,33 +598,81 @@
           }
       }
   
  +    public CanvasGraphicsNode getCanvasGraphicsNode() {
  +        return getCanvasGraphicsNode(gvtRoot);
  +        
  +    }
  +
  +    protected CanvasGraphicsNode getCanvasGraphicsNode(GraphicsNode gn) {
  +        if (!(gn instanceof CompositeGraphicsNode))
  +            return null;
  +        CompositeGraphicsNode cgn = (CompositeGraphicsNode)gn;
  +        gn = (GraphicsNode)cgn.getChildren().get(0);
  +        if (!(gn instanceof CanvasGraphicsNode))
  +            return null;
  +        return (CanvasGraphicsNode)gn;
  +    }
  +
       /**
        * Computes the transform used for rendering.
  +     * Returns true if the component needs to be repainted.
        */
  -    protected void computeRenderingTransform() {
  +    protected boolean computeRenderingTransform() {
  +        if ((svgDocument == null) || (gvtRoot == null))
  +            return false;
  +
  +        boolean ret = false;
           try {
  -            if (svgDocument != null) {
  -                SVGSVGElement elt = svgDocument.getRootElement();
  -                Dimension d = getSize();
  -                if (d.width  < 1) d.width  = 1;
  -                if (d.height < 1) d.height = 1;
  -                setRenderingTransform
  -                    (ViewBox.getViewTransform
  -                     (fragmentIdentifier, elt, d.width, d.height));
  -                initialTransform = renderingTransform;
  +            SVGSVGElement elt = svgDocument.getRootElement();
  +            Dimension d = getSize();
  +            if (d.width  < 1) d.width  = 1;
  +            if (d.height < 1) d.height = 1;
  +            AffineTransform at = ViewBox.getViewTransform
  +                (fragmentIdentifier, elt, d.width, d.height);
  +            CanvasGraphicsNode cgn = getCanvasGraphicsNode();
  +            if (!at.equals(cgn.getViewingTransform())) {
  +                cgn.setViewingTransform(at);
  +                if (renderer != null)
  +                    renderer.setTree(gvtRoot);
  +                ret = true;
  +            }
  +
  +            initialTransform = new AffineTransform();
  +            if (!initialTransform.equals(getRenderingTransform())) {
  +                setRenderingTransform(initialTransform, false);
  +                ret = true;
               }
           } catch (BridgeException e) {
               userAgent.displayError(e);
           }
  +        return ret;
       }
   
       /**
        * Updates the value of the transform used for rendering.
  +     * Return true if a repaint is required, otherwise false.
        */
  -    protected void updateRenderingTransform() {
  -        if (initialTransform == renderingTransform) {
  -            computeRenderingTransform();
  +    protected boolean updateRenderingTransform() {
  +        if ((svgDocument == null) || (gvtRoot == null))
  +            return false;
  +        try {
  +            SVGSVGElement elt = svgDocument.getRootElement();
  +            Dimension d = getSize();
  +            if (d.width  < 1) d.width  = 1;
  +            if (d.height < 1) d.height = 1;
  +            AffineTransform at = ViewBox.getViewTransform
  +                (fragmentIdentifier, elt, d.width, d.height);
  +            CanvasGraphicsNode cgn = getCanvasGraphicsNode();
  +            if (!at.equals(cgn.getViewingTransform())) {
  +                cgn.setViewingTransform(at);
  +                if (renderer != null)
  +                    renderer.setTree(gvtRoot);
  +                return true;
  +            }
  +        } catch (BridgeException e) {
  +            userAgent.displayError(e);
           }
  +        return false;
       }
   
       /**
  @@ -866,7 +919,6 @@
            * The data of the event is initialized to the old document.
            */
           public void gvtBuildStarted(GVTTreeBuilderEvent e) {
  -            computeRenderingTransform();
           }
   
           /**
  @@ -885,16 +937,39 @@
                   return;
               }
   
  +            Dimension2D dim = bridgeContext.getDocumentSize();
  +            setMySize(new Dimension((int)dim.getWidth(),
  +                                    (int)dim.getHeight()));
  +            SVGSVGElement elt = svgDocument.getRootElement();
  +            Dimension sz = getSize();
  +            if (sz.width  < 1) sz.width  = 1;
  +            if (sz.height < 1) sz.height = 1;
  +            AffineTransform vt = ViewBox.getViewTransform
  +                (fragmentIdentifier, elt, sz.width, sz.height);
  +            CanvasGraphicsNode cgn = getCanvasGraphicsNode(e.getGVTRoot());
  +            cgn.setViewingTransform(vt);
  +            gvtRoot = null;
   
               if (isDynamicDocument && JSVGComponent.this.eventsEnabled) {
                   startSVGLoadEventDispatcher(e.getGVTRoot());
               } else {
                   JSVGComponent.this.setGraphicsNode(e.getGVTRoot(), false);
  +                scheduleGVTRendering();
               }
  -            Dimension2D dim = bridgeContext.getDocumentSize();
  -            setPreferredSize(new Dimension((int)dim.getWidth(),
  -                                           (int)dim.getHeight()));
  +        }
  +
  +        public void setMySize(Dimension d) {
  +            setPreferredSize(d);
               invalidate();
  +            Container p = getParent();
  +            while (p != null) {
  +                if (p instanceof Window) {
  +                    Window w = (Window) p;
  +                    w.pack();
  +                    break;
  +                }
  +                p = p.getParent();
  +            }
           }
   
           /**
  @@ -938,10 +1013,10 @@
                   JSVGComponent.this.image = null;
                   repaint();
               } else {
  +                setMySize(new Dimension((int)dim.getWidth(),
  +                                        (int)dim.getHeight()));
                   JSVGComponent.this.setGraphicsNode(gn, false);
  -                setPreferredSize(new Dimension((int)dim.getWidth(),
  -                                               (int)dim.getHeight()));
  -                invalidate();
  +                computeRenderingTransform();
               }
               userAgent.displayError(((GVTTreeBuilder)e.getSource())
                                      .getException());
  @@ -980,6 +1055,7 @@
               }
   
               JSVGComponent.this.setGraphicsNode(e.getGVTRoot(), false);
  +            scheduleGVTRendering();
           }
   
           /**
  @@ -1030,6 +1106,7 @@
                   repaint();
               } else {
                   JSVGComponent.this.setGraphicsNode(gn, false);
  +                computeRenderingTransform();
               }
               userAgent.displayError(((SVGLoadEventDispatcher)e.getSource())
                                      .getException());
  @@ -1945,6 +2022,25 @@
           }
   
           /**
  +         * Sets the <code>AffineTransform</code> to be
  +         * applied to the drawing by the UserAgent.
  +         */
  +        public void setTransform(AffineTransform at) {
  +            if (EventQueue.isDispatchThread()) {
  +                userAgent.setTransform(at);
  +            } else {
  +                final AffineTransform affine = at;
  +                class Query implements Runnable {
  +                    public void run() {
  +                        userAgent.setTransform(affine);
  +                    }
  +                }
  +                Query q = new Query();
  +                invokeAndWait(q);
  +            }
  +        }
  +
  +        /**
            * Returns this user agent's CSS media.
            */
           public String getMedia() {
  @@ -2497,7 +2593,8 @@
                           ((s == null) || (!s.equals(fragmentIdentifier)))) {
                           // It is, so update rendering transform.
                           fragmentIdentifier = s;
  -                        computeRenderingTransform();
  +                        if (computeRenderingTransform())
  +                            scheduleGVTRendering();
                       }
                       // Let every one know the link fired (but don't
                       // load doc, it's already loaded.).
  @@ -2567,6 +2664,14 @@
            */
           public AffineTransform getTransform() {
               return JSVGComponent.this.renderingTransform;
  +        }
  +
  +        /**
  +         * Sets the <code>AffineTransform</code> to be
  +         * applied to the drawing by the UserAgent.
  +         */
  +        public void setTransform(AffineTransform at) {
  +            JSVGComponent.this.setRenderingTransform(at);
           }
   
           /**
  
  
  
  1.4       +55 -10    xml-batik/sources/org/apache/batik/transcoder/SVGAbstractTranscoder.java
  
  Index: SVGAbstractTranscoder.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/transcoder/SVGAbstractTranscoder.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- SVGAbstractTranscoder.java	18 Sep 2002 09:23:12 -0000	1.3
  +++ SVGAbstractTranscoder.java	24 Feb 2003 18:25:54 -0000	1.4
  @@ -22,6 +22,8 @@
   import org.apache.batik.dom.util.DocumentFactory;
   
   import org.apache.batik.gvt.GraphicsNode;
  +import org.apache.batik.gvt.CanvasGraphicsNode;
  +import org.apache.batik.gvt.CompositeGraphicsNode;
   
   import org.apache.batik.bridge.BaseScriptingEnvironment;
   import org.apache.batik.bridge.BridgeContext;
  @@ -165,19 +167,12 @@
           GraphicsNode gvtRoot;
           try {
               gvtRoot = builder.build(ctx, svgDoc);
  -            // dispatch an 'onload' event if needed
  -            if (ctx.isDynamic()) {
  -                BaseScriptingEnvironment se = new BaseScriptingEnvironment(ctx);
  -                se.loadScripts();
  -                se.dispatchSVGLoadEvent();
  -            }
           } catch (BridgeException ex) {
               throw new TranscoderException(ex);
           }
           // get the 'width' and 'height' attributes of the SVG document
           float docWidth = (float)ctx.getDocumentSize().getWidth();
           float docHeight = (float)ctx.getDocumentSize().getHeight();
  -        ctx = null;
           builder = null;
   
           setImageSize(docWidth, docHeight);
  @@ -188,6 +183,7 @@
   
           try {
               Px = ViewBox.getViewTransform(ref, root, width, height);
  +            
           } catch (BridgeException ex) {
               throw new TranscoderException(ex);
           }
  @@ -219,10 +215,42 @@
           } else {
               curAOI = new Rectangle2D.Float(0, 0, width, height);
           }
  -        curTxf = Px;
  +        
  +        CanvasGraphicsNode cgn = getCanvasGraphicsNode(gvtRoot);
  +        if (cgn != null) {
  +            cgn.setViewingTransform(Px);
  +            curTxf = new AffineTransform();
  +        } else {
  +            curTxf = Px;
  +        }
  +
  +        try {
  +            // dispatch an 'onload' event if needed
  +            if (ctx.isDynamic()) {
  +                BaseScriptingEnvironment se;
  +                se = new BaseScriptingEnvironment(ctx);
  +                se.loadScripts();
  +                se.dispatchSVGLoadEvent();
  +            }
  +        } catch (BridgeException ex) {
  +            throw new TranscoderException(ex);
  +        }
  +        ctx = null;
  +
  +
           this.root = gvtRoot;
       }
   
  +    protected CanvasGraphicsNode getCanvasGraphicsNode(GraphicsNode gn) {
  +        if (!(gn instanceof CompositeGraphicsNode))
  +            return null;
  +        CompositeGraphicsNode cgn = (CompositeGraphicsNode)gn;
  +        gn = (GraphicsNode)cgn.getChildren().get(0);
  +        if (!(gn instanceof CanvasGraphicsNode))
  +            return null;
  +        return (CanvasGraphicsNode)gn;
  +    }
  +
       /**
        * Sets document size according to the hints.
        * Global variables width and height are modified.
  @@ -678,10 +706,26 @@
           }
   
           /**
  +         * Return the rendering transform.
  +         */
  +        public AffineTransform getTransform() {
  +            return SVGAbstractTranscoder.this.curTxf;
  +        }
  +
  +        /**
  +         * Return the rendering transform.
  +         */
  +        public void setTransform(AffineTransform at) {
  +            SVGAbstractTranscoder.this.curTxf = at;
  +        }
  +
  +        /**
            * Returns the default size of this user agent (400x400).
            */
           public Dimension2D getViewportSize() {
  -            return new Dimension(400, 400);
  +            return new Dimension
  +                ((int)SVGAbstractTranscoder.this.width, 
  +                 (int)SVGAbstractTranscoder.this.height);
           }
   
           /**
  @@ -701,6 +745,7 @@
            */
           public void displayError(Exception e) {
               try {
  +                e.printStackTrace();
                   SVGAbstractTranscoder.this.handler.error
                       (new TranscoderException(e));
               } catch (TranscoderException ex) {
  
  
  
  1.91      +24 -23    xml-batik/test-resources/org/apache/batik/test/samplesRendering.xml
  
  Index: samplesRendering.xml
  ===================================================================
  RCS file: /home/cvs/xml-batik/test-resources/org/apache/batik/test/samplesRendering.xml,v
  retrieving revision 1.90
  retrieving revision 1.91
  diff -u -r1.90 -r1.91
  --- samplesRendering.xml	8 Feb 2003 13:25:12 -0000	1.90
  +++ samplesRendering.xml	24 Feb 2003 18:25:54 -0000	1.91
  @@ -303,9 +303,22 @@
   
       <testGroup id="tests.spec.scripting">
           <test id="samples/tests/spec/scripting/add.svg" />
  +        <test id="samples/tests/spec/scripting/bug12933.svg" />
           <test id="samples/tests/spec/scripting/circle.svg" />
  +        <test id="samples/tests/spec/scripting/currentScaleTranslate.svg" />
           <test id="samples/tests/spec/scripting/ellipse.svg" />
  +        <test id="samples/tests/spec/scripting/fill.svg" />
  +        <test id="samples/tests/spec/scripting/filterPatternUpdate.svg" />
  +        <test id="samples/tests/spec/scripting/gradientsUpdate.svg" />
  +        <test id="samples/tests/spec/scripting/image.svg" />
  +        <test id="samples/tests/spec/scripting/imageRefUpdate.svg" />
  +        <test id="samples/tests/spec/scripting/imageUpdate.svg" />
  +        <test id="samples/tests/spec/scripting/imageraster.svg" />
  +        <test id="samples/tests/spec/scripting/imagesvg.svg" />
           <test id="samples/tests/spec/scripting/line.svg" />
  +        <test id="samples/tests/spec/scripting/markerUpdate.svg" />
  +        <test id="samples/tests/spec/scripting/maskClipUpdate.svg" />
  +        <test id="samples/tests/spec/scripting/nestedsvg.svg" />
           <test id="samples/tests/spec/scripting/path.svg" />
           <test id="samples/tests/spec/scripting/polygon.svg" />
           <test id="samples/tests/spec/scripting/polyline.svg" />
  @@ -313,35 +326,23 @@
           <test id="samples/tests/spec/scripting/remove.svg" />
           <test id="samples/tests/spec/scripting/removeLast.svg" />
           <test id="samples/tests/spec/scripting/removeOnclick.svg" />
  -        <test id="samples/tests/spec/scripting/transform.svg" />
  -        <test id="samples/tests/spec/scripting/transform2.svg" />
  -        <test id="samples/tests/spec/scripting/xyModifOnLoad.svg" />
  -        <test id="samples/tests/spec/scripting/fill.svg" />
  -        <test id="samples/tests/spec/scripting/visibility.svg" />
  -        <test id="samples/tests/spec/scripting/textProperties.svg" />
  -        <test id="samples/tests/spec/scripting/nestedsvg.svg" />
  +        <test id="samples/tests/spec/scripting/svg.svg" />
  +        <test id="samples/tests/spec/scripting/svg2.svg" />
           <test id="samples/tests/spec/scripting/text.svg" />
           <test id="samples/tests/spec/scripting/textAllProperties.svg" />
  -        <test id="samples/tests/spec/scripting/textpathProperties.svg" />
  -        <test id="samples/tests/spec/scripting/trefProperties.svg" />
  -        <test id="samples/tests/spec/scripting/tspan.svg" />
  +        <test id="samples/tests/spec/scripting/textProperties.svg" />
           <test id="samples/tests/spec/scripting/text_children1.svg" />
           <test id="samples/tests/spec/scripting/text_children2.svg" />
           <test id="samples/tests/spec/scripting/text_children3.svg" />
  +        <test id="samples/tests/spec/scripting/textpathProperties.svg" />
  +        <test id="samples/tests/spec/scripting/transform.svg" />
  +        <test id="samples/tests/spec/scripting/transform2.svg" />
  +        <test id="samples/tests/spec/scripting/trefProperties.svg" />
  +        <test id="samples/tests/spec/scripting/tspan.svg" />
           <test id="samples/tests/spec/scripting/tspanProperties.svg" />
  -        <test id="samples/tests/spec/scripting/image.svg" />
  -        <test id="samples/tests/spec/scripting/imageraster.svg" />
  -        <test id="samples/tests/spec/scripting/imagesvg.svg" />
  -        <test id="samples/tests/spec/scripting/imageRefUpdate.svg" />
  -        <test id="samples/tests/spec/scripting/imageUpdate.svg" />
  -        <test id="samples/tests/spec/scripting/gradientsUpdate.svg" />
  -        <test id="samples/tests/spec/scripting/maskClipUpdate.svg" />
  -        <test id="samples/tests/spec/scripting/markerUpdate.svg" />
  -        <test id="samples/tests/spec/scripting/filterPatternUpdate.svg" />
           <test id="samples/tests/spec/scripting/use.svg" />
  -        <test id="samples/tests/spec/scripting/svg.svg" />
  -        <test id="samples/tests/spec/scripting/svg2.svg" />
  -        <test id="samples/tests/spec/scripting/bug12933.svg" />
  +        <test id="samples/tests/spec/scripting/visibility.svg" />
  +        <test id="samples/tests/spec/scripting/xyModifOnLoad.svg" />
       </testGroup>
   
   </testSuite>
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: batik-dev-unsubscribe@xml.apache.org
For additional commands, e-mail: batik-dev-help@xml.apache.org