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/10/31 23:39:42 UTC

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

deweese     2003/10/31 14:39:42

  Modified:    samples/tests/spec/scripting markerUpdate.svg
               sources/org/apache/batik/bridge RepaintManager.java
                        UpdateManager.java
               sources/org/apache/batik/css/dom CSSOMSVGComputedStyle.java
                        CSSOMSVGStyleDeclaration.java
               sources/org/apache/batik/css/engine CSSEngine.java
                        SVGCSSEngine.java
               sources/org/apache/batik/dom/svg SVGStylableElement.java
               sources/org/apache/batik/ext/awt/geom RectListManager.java
               sources/org/apache/batik/gvt AbstractGraphicsNode.java
                        TextNode.java
               sources/org/apache/batik/gvt/renderer DynamicRenderer.java
                        ImageRenderer.java Renderer.java
                        StaticRenderer.java
               sources/org/apache/batik/gvt/text
                        BidiAttributedCharacterIterator.java
               sources/org/apache/batik/swing/svg JSVGComponent.java
               sources/org/apache/batik/transcoder
                        SVGAbstractTranscoder.java
               test-references/org/apache/batik/ext/awt/geom rlm.merge.out
               test-references/samples/tests/spec/scripting
                        markerUpdate.png
               test-resources/org/apache/batik/bridge unitTesting.xml
  Added:       sources/org/apache/batik/swing/svg SVGUpdateOverlay.java
  Log:
  1) elem.style.setProperty now works for short hand properties.
  2) Incremental improvement to the Update Region colecing code
     (modest gain for documents that move lots of things at once).
  3) Cool update region debug tool (uncomment the SVGUpdateOverlay
     in JSVGComponent).
  4) Minor fix in Aspect ratio fitting for transcoders.
  
  Revision  Changes    Path
  1.5       +47 -29    xml-batik/samples/tests/spec/scripting/markerUpdate.svg
  
  Index: markerUpdate.svg
  ===================================================================
  RCS file: /home/cvs/xml-batik/samples/tests/spec/scripting/markerUpdate.svg,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- markerUpdate.svg	8 Oct 2003 00:28:47 -0000	1.4
  +++ markerUpdate.svg	31 Oct 2003 22:39:41 -0000	1.5
  @@ -79,6 +79,7 @@
   var start = document.getElementById("start");
   var mid = document.getElementById("mid");
   var end = document.getElementById("end");
  +var all = document.getElementById("all");
   
   function changeGeometryEvt(evt) {
     changeGeometry(evt.target);
  @@ -100,6 +101,10 @@
   function changeMarkerEnd(tgt) { 
     changeProperty(tgt, "marker-end", "url(#markerRed)");
   }
  +function changeMarkerEvt(evt) { changeMarker(evt.target); }
  +function changeMarker(tgt) { 
  +  changeProperty(tgt, "marker", "url(#markerRed)");
  +}
   function changeProperty(tgt, prop, val) {
         tgt.style.setProperty(prop, val, "");
   }
  @@ -110,6 +115,7 @@
     changeMarkerStart(start);
     changeMarkerMid(mid);
     changeMarkerEnd(end);
  +  changeMarker(all);
   }
   
   function regardStart() {
  @@ -137,57 +143,69 @@
     <g id="test-content" transform="translate(0, -20)">
   
       <g id="board" style="fill:none; stroke:black">
  -      <rect x="40" y="80" width="75" height="20" style="fill:#eee"/>
  -      <rect x="115" y="80" width="75" height="20" style="fill:#eee"/>
  -      <rect x="190" y="80" width="75" height="20" style="fill:#eee"/>
  -      <rect x="265" y="80" width="75" height="20" style="fill:#eee"/>
  -      <rect x="340" y="80" width="75" height="20" style="fill:#eee"/>
  -
  -      <rect x="20" y="100" width="20" height="380" style="fill:#eee"/>
  -
  -      <rect x="40" y="100" width="75" height="380" />
  -      <rect x="115" y="100" width="75" height="380" />
  -      <rect x="190" y="100" width="75" height="380" />
  -      <rect x="265" y="100" width="75" height="380" />
  -      <rect x="340" y="100" width="75" height="380" />
  -
  +      <rect x="40"  y="80"  width="65" height="20" style="fill:#eee"/>
  +      <rect x="105" y="80" width="65" height="20" style="fill:#eee"/>
  +      <rect x="170" y="80" width="65" height="20" style="fill:#eee"/>
  +      <rect x="235" y="80" width="65" height="20" style="fill:#eee"/>
  +      <rect x="300" y="80" width="65" height="20" style="fill:#eee"/>
  +      <rect x="365" y="80" width="65" height="20" style="fill:#eee"/>
  +
  +      <rect x="20"  y="100" width="20" height="380" style="fill:#eee"/>
  +
  +      <rect x="40"  y="100" width="65" height="380" />
  +      <rect x="105" y="100" width="65" height="380" />
  +      <rect x="170" y="100" width="65" height="380" />
  +      <rect x="235" y="100" width="65" height="380" />
  +      <rect x="300" y="100" width="65" height="380" />
  +      <rect x="365" y="100" width="65" height="380" />
   
         <g style="fill:black; stroke:none; text-anchor:middle">
  -        <text x="77.5" y="94">strokeWidth</text>
  -        <text x="154.5" y="94">userspace<desc>userSpaceOnUse</desc></text>
  -        <text x="229.5" y="94">start</text>
  -        <text x="304.5" y="94">mid</text>
  -        <text x="379.5" y="94">end</text>
  +        <text x="72.5" y="94">strokeWidth</text>
  +        <text x="137.5" y="94">userspace<desc>userSpaceOnUse</desc></text>
  +        <text x="202.5" y="94">start</text>
  +        <text x="267.5" y="94">mid</text>
  +        <text x="332.5" y="94">end</text>
  +        <text x="397.5" y="94">marker</text>
   
           <text x="0" y="0" transform="translate(34 290)rotate(-90)">&lt;marker></text>
         </g>
       </g>
   
       <polyline id="stroke" 
  -      transform="translate(-50, 0)" onclick="changeGeometryEvt(evt)" 
  -      points="130 150 110 170 150 190 110 210 150 230 110 250 150 270 110 290 150 310 110 330 150 350 130 370" 
  -      style="stroke:black; stroke-width:4; fill:none; marker:url(#markerStrokeWidth)" />
  +      transform="translate(-55, 0)" onclick="changeGeometryEvt(evt)" 
  +      points="130 150 130 170 130 190 130 210 130 230 130 250 130 270 130 290 
  +              130 310 130 330 130 350 130 370" 
  +      style="stroke:black; stroke-width:4; fill:none; 
  +             marker:url(#markerStrokeWidth)" />
   
   
       <polyline id="userspace" 
  -      transform="translate(25 0)" onclick="changeGeometryEvt(evt)" 
  -      points="130 150 110 170 150 190 110 210 150 230 110 250 150 270 110 290 150 310 110 330 150 350 130 370" 
  -      style="stroke:black; stroke-width:4; fill:none; marker:url(#markerUserSpaceOnUse)" />
  +      transform="translate(10 0)" onclick="changeGeometryEvt(evt)" 
  +      points="130 150 130 170 130 190 130 210 130 230 130 250 130 270 130 290 
  +              130 310 130 330 130 350 130 370" 
  +      style="stroke:black; stroke-width:4; fill:none; 
  +             marker:url(#markerUserSpaceOnUse)" />
   
       <polyline id="start"
  -      transform="translate(100 0)" onclick="changeMarkerStartEvt(evt)" 
  +      transform="translate(75 0)" onclick="changeMarkerStartEvt(evt)" 
         points="130 150 110 170 150 190 110 210 150 230 110 250 150 270 110 290 150 310 110 330 150 350 130 370" 
         style="stroke:black; stroke-width:4; fill:none; marker:url(#markerUserSpaceOnUse)" />
   
       <polyline id="mid"
  -      transform="translate(175 0)" onclick="changeMarkerMidEvt(evt)" 
  +      transform="translate(140 0)" onclick="changeMarkerMidEvt(evt)" 
         points="130 150 110 170 150 190 110 210 150 230 110 250 150 270 110 290 150 310 110 330 150 350 130 370" 
         style="stroke:black; stroke-width:4; fill:none; marker:url(#markerUserSpaceOnUse)" />
   
       <polyline id="end"
  -      transform="translate(250 0)" onclick="changeMarkerEndEvt(evt)" 
  +      transform="translate(205 0)" onclick="changeMarkerEndEvt(evt)" 
         points="130 150 110 170 150 190 110 210 150 230 110 250 150 270 110 290 150 310 110 330 150 350 130 370" 
         style="stroke:black; stroke-width:4; fill:none; marker:url(#markerUserSpaceOnUse)" />
  +
  +    <polyline id="all"
  +      transform="translate(270 0)" onclick="changeMarkerEvt(evt)" 
  +      points="130 150 110 170 150 190 110 210 150 230 110 250 150 270 110 290 150 310 110 330 150 350 130 370" 
  +      style="stroke:black; stroke-width:4; fill:none; 
  +             marker:url(#markerUserSpaceOnUse)" />
     </g>
   
     <g id="run" transform="translate(195, 468)" cursor="pointer" onclick="run()">
  
  
  
  1.15      +18 -6     xml-batik/sources/org/apache/batik/bridge/RepaintManager.java
  
  Index: RepaintManager.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/RepaintManager.java,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- RepaintManager.java	8 Aug 2003 11:38:51 -0000	1.14
  +++ RepaintManager.java	31 Oct 2003 22:39:41 -0000	1.15
  @@ -56,10 +56,12 @@
   import java.awt.geom.Rectangle2D;
   import java.awt.image.BufferedImage;
   import java.util.ArrayList;
  -import java.util.Iterator;
   import java.util.List;
  +import java.util.Iterator;
  +import java.util.Collection;
   
   import org.apache.batik.gvt.renderer.ImageRenderer;
  +import org.apache.batik.ext.awt.geom.RectListManager;
   
   /**
    * This class manages the rendering of a GVT tree.
  @@ -69,6 +71,9 @@
    * @version $Id$
    */
   public class RepaintManager {
  +    final static int COPY_OVERHEAD      = 1000;
  +    final static int COPY_LINE_OVERHEAD = 10;
  +
       /**
        * The renderer used to repaint the buffer.
        */
  @@ -86,7 +91,8 @@
        * @param aoi The area of interest in the renderer space units.
        * @return the list of the rectangles to repaint.
        */
  -    public List updateRendering(List areas) throws InterruptedException {
  +    public Collection updateRendering(Collection areas) 
  +        throws InterruptedException {
           renderer.flush(areas);
           List rects = new ArrayList(areas.size());
           AffineTransform at = renderer.getTransform();
  @@ -106,9 +112,16 @@
                   
               rects.add(r);
           }
  +        RectListManager devRLM =null;
  +        try {
  +             devRLM = new RectListManager(rects);
  +             devRLM.mergeRects(COPY_OVERHEAD, COPY_LINE_OVERHEAD);
  +        } catch(Exception e) {
  +            e.printStackTrace();
  +        }
   
  -        renderer.repaint(areas);
  -        return rects;
  +        renderer.repaint(devRLM);
  +        return devRLM;
       }
   
       /**
  @@ -138,5 +151,4 @@
       public BufferedImage getOffScreen(){
           return renderer.getOffScreen();
       }
  -
   }
  
  
  
  1.28      +4 -3      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.27
  retrieving revision 1.28
  diff -u -r1.27 -r1.28
  --- UpdateManager.java	12 Oct 2003 16:55:49 -0000	1.27
  +++ UpdateManager.java	31 Oct 2003 22:39:41 -0000	1.28
  @@ -52,6 +52,7 @@
   
   import java.awt.Shape;
   import java.awt.geom.AffineTransform;
  +import java.util.Collection;
   import java.util.ArrayList;
   import java.util.Collections;
   import java.util.Iterator;
  @@ -395,8 +396,8 @@
               fireEvent(updateStartedDispatcher,new UpdateManagerEvent
                         (this, repaintManager.getOffScreen(), null));
   
  -            List l = repaintManager.updateRendering(areas);
  -
  +            Collection c = repaintManager.updateRendering(areas);
  +            List l = new ArrayList(c);
               fireEvent(updateCompletedDispatcher,new UpdateManagerEvent
                         (this, repaintManager.getOffScreen(), l));
           } catch (ThreadDeath td) {
  
  
  
  1.5       +5 -5      xml-batik/sources/org/apache/batik/css/dom/CSSOMSVGComputedStyle.java
  
  Index: CSSOMSVGComputedStyle.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/css/dom/CSSOMSVGComputedStyle.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- CSSOMSVGComputedStyle.java	8 Aug 2003 11:38:54 -0000	1.4
  +++ CSSOMSVGComputedStyle.java	31 Oct 2003 22:39:41 -0000	1.5
  @@ -79,12 +79,12 @@
        * Creates a CSSValue to manage the value at the given index.
        */
       protected CSSValue createCSSValue(int idx) {
  -        if (idx > SVGCSSEngine.WRITING_MODE_INDEX) {
  -            if (cssEngine.getValueManagers()[idx] instanceof SVGColorManager) {
  -                return new ComputedCSSColorValue(idx);
  -            }
  +        if (idx > SVGCSSEngine.FINAL_INDEX) {
               if (cssEngine.getValueManagers()[idx] instanceof SVGPaintManager) {
                   return new ComputedCSSPaintValue(idx);
  +            }
  +            if (cssEngine.getValueManagers()[idx] instanceof SVGColorManager) {
  +                return new ComputedCSSColorValue(idx);
               }
           } else {
               switch (idx) {
  
  
  
  1.5       +5 -5      xml-batik/sources/org/apache/batik/css/dom/CSSOMSVGStyleDeclaration.java
  
  Index: CSSOMSVGStyleDeclaration.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/css/dom/CSSOMSVGStyleDeclaration.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- CSSOMSVGStyleDeclaration.java	8 Aug 2003 11:38:54 -0000	1.4
  +++ CSSOMSVGStyleDeclaration.java	31 Oct 2003 22:39:41 -0000	1.5
  @@ -87,12 +87,12 @@
        */
       protected CSSValue createCSSValue(String name) {
           int idx = cssEngine.getPropertyIndex(name);
  -        if (idx > SVGCSSEngine.WRITING_MODE_INDEX) {
  -            if (cssEngine.getValueManagers()[idx] instanceof SVGColorManager) {
  -                return new StyleDeclarationColorValue(name);
  -            }
  +        if (idx > SVGCSSEngine.FINAL_INDEX) {
               if (cssEngine.getValueManagers()[idx] instanceof SVGPaintManager) {
                   return new StyleDeclarationPaintValue(name);
  +            }
  +            if (cssEngine.getValueManagers()[idx] instanceof SVGColorManager) {
  +                return new StyleDeclarationColorValue(name);
               }
           } else {
               switch (idx) {
  
  
  
  1.35      +55 -1     xml-batik/sources/org/apache/batik/css/engine/CSSEngine.java
  
  Index: CSSEngine.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/css/engine/CSSEngine.java,v
  retrieving revision 1.34
  retrieving revision 1.35
  diff -u -r1.34 -r1.35
  --- CSSEngine.java	4 Sep 2003 01:12:48 -0000	1.34
  +++ CSSEngine.java	31 Oct 2003 22:39:41 -0000	1.35
  @@ -923,6 +923,60 @@
       }
   
       /**
  +     * Interface for people interesting in having 'primary' properties
  +     * set.  Shorthand properties will be expanded "automatically".
  +     */
  +    public interface MainPropertyReciever {
  +        /**
  +         * Called with a non-shorthand property name and it's value.
  +         */
  +        public void setMainPoperty(String name, Value v, boolean important);
  +    };
  +
  +    public void setMainProperties
  +        (CSSStylableElement elt, final MainPropertyReciever dst,
  +         String pname, String value, boolean important){
  +        try {
  +            element = elt;
  +            LexicalUnit lu = parser.parsePropertyValue(value);
  +            ShorthandManager.PropertyHandler ph =
  +                new ShorthandManager.PropertyHandler() {
  +                    public void property(String pname, LexicalUnit lu,
  +                                         boolean important) {
  +                        int idx = getPropertyIndex(pname);
  +                        if (idx != -1) {
  +                            ValueManager vm = valueManagers[idx];
  +                            Value v = vm.createValue(lu, CSSEngine.this);
  +                            dst.setMainPoperty(pname, v, important);
  +                            return;
  +                        }
  +                        idx = getShorthandIndex(pname);
  +                        if (idx == -1)
  +                            return; // Unknown property...
  +                        // Shorthand value
  +                        shorthandManagers[idx].setValues
  +                            (CSSEngine.this, this, lu, important);
  +                    }
  +                };
  +            ph.property(pname, lu, important);
  +        } catch (Exception e) {
  +            String m = e.getMessage();
  +            if (m == null) m = "";
  +            String u = ((documentURI == null)?"<unknown>":
  +                        documentURI.toString());
  +            String s = Messages.formatMessage
  +                ("property.syntax.error.at",
  +                 new Object[] { u, pname, value, m});
  +            DOMException de = new DOMException(DOMException.SYNTAX_ERR, s);
  +            if (userAgent == null) throw de;
  +            userAgent.displayError(de);
  +        } finally {
  +            element = null;
  +            cssBaseURI = null;
  +        }
  +    }
  +
  +    /**
        * Parses and creates a property value from elt.
        * @param elt  The element property is from.
        * @param prop The property name.
  
  
  
  1.6       +2 -1      xml-batik/sources/org/apache/batik/css/engine/SVGCSSEngine.java
  
  Index: SVGCSSEngine.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/css/engine/SVGCSSEngine.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- SVGCSSEngine.java	8 Aug 2003 11:38:54 -0000	1.5
  +++ SVGCSSEngine.java	31 Oct 2003 22:39:41 -0000	1.6
  @@ -383,5 +383,6 @@
       public final static int VISIBILITY_INDEX = UNICODE_BIDI_INDEX + 1;
       public final static int WORD_SPACING_INDEX = VISIBILITY_INDEX + 1;
       public final static int WRITING_MODE_INDEX = WORD_SPACING_INDEX + 1;
  +    public final static int FINAL_INDEX = WRITING_MODE_INDEX;
   
   }
  
  
  
  1.12      +57 -50    xml-batik/sources/org/apache/batik/dom/svg/SVGStylableElement.java
  
  Index: SVGStylableElement.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/dom/svg/SVGStylableElement.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- SVGStylableElement.java	27 Sep 2003 01:48:15 -0000	1.11
  +++ SVGStylableElement.java	31 Oct 2003 22:39:41 -0000	1.12
  @@ -187,38 +187,39 @@
        */
       public CSSValue getPresentationAttribute(String name) {
           CSSValue result = (CSSValue)getLiveAttributeValue(null, name);
  -        if (result == null) {
  -            CSSEngine eng = ((SVGOMDocument)getOwnerDocument()).getCSSEngine();
  -            int idx = eng.getPropertyIndex(name);
  -            if (idx > SVGCSSEngine.WRITING_MODE_INDEX) {
  -                if (eng.getValueManagers()[idx] instanceof SVGColorManager) {
  -                    result = new PresentationAttributeColorValue(eng, name);
  -                }
  -                if (eng.getValueManagers()[idx] instanceof SVGPaintManager) {
  -                    result = new PresentationAttributePaintValue(eng, name);
  -                }
  -            } else {
  -                switch (idx) {
  -                case -1:
  -                    return null;
  -
  -                case SVGCSSEngine.FILL_INDEX:
  -                case SVGCSSEngine.STROKE_INDEX:
  -                    result = new PresentationAttributePaintValue(eng, name);
  -                    break;
  +        if (result != null)
  +            return result;
   
  -                case SVGCSSEngine.FLOOD_COLOR_INDEX:
  -                case SVGCSSEngine.LIGHTING_COLOR_INDEX:
  -                case SVGCSSEngine.STOP_COLOR_INDEX:
  -                    result = new PresentationAttributeColorValue(eng, name);
  -                    break;
  -                    
  -                default:
  -                    result = new PresentationAttributeValue(eng, name);
  -                }
  +        CSSEngine eng = ((SVGOMDocument)getOwnerDocument()).getCSSEngine();
  +        int idx = eng.getPropertyIndex(name);
  +        if (idx == -1) 
  +            return null;
  +
  +        if (idx > SVGCSSEngine.FINAL_INDEX) {
  +            if (eng.getValueManagers()[idx] instanceof SVGPaintManager) {
  +                result = new PresentationAttributePaintValue(eng, name);
  +            }
  +            if (eng.getValueManagers()[idx] instanceof SVGColorManager) {
  +                result = new PresentationAttributeColorValue(eng, name);
  +            }
  +        } else {
  +            switch (idx) {
  +            case SVGCSSEngine.FILL_INDEX:
  +            case SVGCSSEngine.STROKE_INDEX:
  +                result = new PresentationAttributePaintValue(eng, name);
  +                break;
  +                
  +            case SVGCSSEngine.FLOOD_COLOR_INDEX:
  +            case SVGCSSEngine.LIGHTING_COLOR_INDEX:
  +            case SVGCSSEngine.STOP_COLOR_INDEX:
  +                result = new PresentationAttributeColorValue(eng, name);
  +                break;
  +                
  +            default:
  +                result = new PresentationAttributeValue(eng, name);
               }
  -            putLiveAttributeValue(null, name, (LiveAttributeValue)result);
           }
  +        putLiveAttributeValue(null, name, (LiveAttributeValue)result);
           return result;
       }
   
  @@ -541,7 +542,8 @@
           extends CSSOMSVGStyleDeclaration
           implements LiveAttributeValue,
                      CSSOMSVGStyleDeclaration.ValueProvider,
  -                   CSSOMSVGStyleDeclaration.ModificationHandler {
  +                   CSSOMSVGStyleDeclaration.ModificationHandler, 
  +                   CSSEngine.MainPropertyReciever {
           
           /**
            * The associated CSS object.
  @@ -677,32 +679,30 @@
               }
           }
   
  -        /**
  -         * Called when a property was changed.
  -         */
  -        public void propertyChanged(String name, String value, String prio)
  -            throws DOMException {
  -            Value v = cssEngine.parsePropertyValue
  -                (SVGStylableElement.this, name, value);
  -
  -            int i = 0;
  +        public void setMainPoperty(String name, Value v, boolean important) {
               int idx = cssEngine.getPropertyIndex(name);
  -            if (i == -1) {
  -                i = cssEngine.getShorthandIndex(name);
  -                if (i == -1) {
  -                    return; // Unknown property
  -                }
  -                // TODO: Really need to set the short property properties.
  -                return;
  -            }
  +            if (idx == -1) 
  +                return;   // unknown property
  +
  +            int i=0;
               for (; i < declaration.size(); i++) {
                   if (idx == declaration.getIndex(i))
                       break;
               }
               if (i < declaration.size()) 
  -                declaration.put(i, v, idx, prio.length() > 0);
  +                declaration.put(i, v, idx, important);
               else
  -                declaration.append(v, idx, prio.length() > 0);
  +                declaration.append(v, idx, important);
  +        }
  +
  +        /**
  +         * Called when a property was changed.
  +         */
  +        public void propertyChanged(String name, String value, String prio)
  +            throws DOMException {
  +            boolean important = ((prio != null) && (prio.length() >0));
  +            cssEngine.setMainProperties(SVGStylableElement.this,
  +                                        this, name, value, important);
               mutate = true;
               setAttributeNS(null, SVG_STYLE_ATTRIBUTE,
                              declaration.toString(cssEngine));
  @@ -710,3 +710,10 @@
           }
       }
   }
  +
  +
  +
  +
  +
  +
  +
  
  
  
  1.7       +185 -66   xml-batik/sources/org/apache/batik/ext/awt/geom/RectListManager.java
  
  Index: RectListManager.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/ext/awt/geom/RectListManager.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- RectListManager.java	9 Aug 2003 16:58:42 -0000	1.6
  +++ RectListManager.java	31 Oct 2003 22:39:41 -0000	1.7
  @@ -54,6 +54,7 @@
   import java.io.Serializable;
   import java.util.Arrays;
   import java.util.Collection;
  +import java.util.List;
   import java.util.Comparator;
   import java.util.Iterator;
   import java.util.ListIterator;
  @@ -74,6 +75,8 @@
       Rectangle [] rects = null;
       int size = 0;
   
  +    Rectangle bounds = null;
  +
       /**
        * The comparator used to sort the elements of this List.
        * Sorts on x value of Rectangle.
  @@ -157,6 +160,29 @@
           this.rects = new Rectangle[capacity];
       }
   
  +    public Rectangle getBounds() {
  +        if (bounds != null ) 
  +            return bounds;
  +        if (size == 0) return null;
  +        bounds = new Rectangle(rects[0]);
  +        for (int i=1; i< size; i++) {
  +            Rectangle r = rects[i];
  +            if (r.x < bounds.x) {
  +                bounds.width = bounds.x+bounds.width-r.x;
  +                bounds.x = r.x;
  +            }
  +            if (r.y < bounds.y) {
  +                bounds.height = bounds.y+bounds.height-r.y;
  +                bounds.y = r.y;
  +            }
  +            if (r.x+r.width > bounds.x+bounds.width) 
  +                bounds.width = r.x+r.width-bounds.x;
  +            if (r.y+r.height > bounds.y+bounds.height) 
  +                bounds.height = r.y+r.height-bounds.y;
  +        }
  +        return bounds;
  +    }
  +
       /**
        * Standard <tt>Object</tt> clone method.
        */
  @@ -238,18 +264,47 @@
        * @param rect The rectangle to add
        */
       public void add(Rectangle rect) {
  +        add(rect, 0, size-1);
  +    }
  +
  +    /**
  +     * Ensures that this collection contains the specified element
  +     * l is the lower bound index for insertion r is upper
  +     * bound index for insertion.
  +     * @param rect The rectangle to add
  +     * @param l the lowest possible index for a rect with
  +     *          greater 'x' coord.
  +     * @param r the highest possible index for a rect with
  +     *          greater 'x' coord.
  +     */
  +    protected void add(Rectangle rect, int l, int r) {
           ensureCapacity(size+1);
  -        int l=0, r=size-1, idx=0;
  +        int idx=l;
           while (l <= r) {
               idx = (l+r)/2;
  +            while ((rects[idx] == null) && (idx <r)) idx++;
  +            if (rects[idx] == null) {
  +                // All 'null' from center to r so skip them
  +                r = (l+r)/2;
  +                idx = (l+r)/2;
  +                if (l>r) 
  +                    idx=l;
  +                while ((rects[idx] == null) && (idx > l)) idx--;
  +                if (rects[idx] == null) {
  +                    rects[idx] = rect;
  +                    return;
  +                }
  +            }
               if (rect.x == rects[idx].x) break;
               if (rect.x <  rects[idx].x) {
                   if (idx == 0) break;
  -                if (rect.x >= rects[idx-1].x) break;
  +                if ((rects[idx-1] != null) && 
  +                    (rect.x >= rects[idx-1].x)) break;
                   r = idx-1;
               } else {
                   if (idx == size-1)  {idx++; break; }
  -                if (rect.x <= rects[idx+1].x) { idx++; break;}
  +                if ((rects[idx+1] != null) && 
  +                    (rect.x <= rects[idx+1].x)) { idx++; break;}
                   l = idx+1;
               }
           }
  @@ -566,16 +621,23 @@
           Rectangle r, cr, mr;
           int cost1, cost2, cost3;
           mr = new Rectangle();
  -        for (int j, i=1; i<size; i++) {
  +        Rectangle []splits = new Rectangle[4];
  +        for (int j, i=0; i<size; i++) {
               r = rects[i];
               if (r == null) continue;
               cost1 = (overhead                 + 
                        (r.height*lineOverhead) +
                        (r.height*r.width));
               do {
  -                for (j=0; j<i; j++) {
  +                int maxX = r.x+r.width+overhead/r.height;
  +                for (j=i+1; j<size; j++) {
                       cr = rects[j];
                       if ((cr == null) || (cr == r)) continue;
  +                    if (cr.x >= maxX) {
  +                        // No more merges can happen.
  +                        j = size;
  +                        break;
  +                    }
                       cost2 = (overhead                 + 
                                (cr.height*lineOverhead) +
                                (cr.height*cr.width));
  @@ -585,35 +647,79 @@
                                (mr.height*lineOverhead) +
                                (mr.height*mr.width));
                       if (cost3 <= cost1+cost2) {
  -                        rects[j] = mr;
  -                        rects[i] = null;
  -                        i     = j; j=-1;
  -                        r     = mr;
  +                        r = rects[i] = mr;
  +                        rects[j] = null;
                           cost1 = cost3;
  +                        j=-1;
                           break;
                       }
  +
  +                    if (!r.intersects(cr)) continue;
  +
  +                    splitRect(cr, r, splits);
  +                    int splitCost=0;
  +                    int l=0;
  +                    for (int k=0; k<4; k++) {
  +                        if (splits[k] != null) {
  +                            Rectangle sr = splits[k];
  +                            // Collapse null entries in first three
  +                            // (That share common 'x').
  +                            if (k<3) splits[l++] = sr;
  +                            splitCost += (overhead                 + 
  +                                          (sr.height*lineOverhead) +
  +                                          (sr.height*sr.width));
  +                        }
  +                    }
  +                    if (splitCost >= cost2) continue;
  +
  +                    // Insert the splits.
  +                    if (l == 0) {
  +                        // only third split may be left (no common 'x').
  +                        rects[j] = null;
  +                        if (splits[3] != null)
  +                            add(splits[3], j, size-1);
  +                        continue;
  +                    }
  +
  +                    rects[j] = splits[0];
  +                    if (l > 1)
  +                        insertRects(splits, 1, j+1, l-1);
  +                    if (splits[3] != null)
  +                        add(splits[3], j, size-1);
                   }
   
                   // if we merged it with another rect then
                   // we need to check all the rects up to i again,
                   // against the merged rect.
  -            } while (i != j);
  +            } while (j != size);
           }
   
           // Now we will go through collapsing the nulled entries.
           int j=0, i=0;
  +        float area=0;
           while (i<size) {
  -            if (rects[i] != null) 
  -                rects[j++] = rects[i];
  +            if (rects[i] != null) {
  +                r = rects[i];
  +                rects[j++] = r;
  +                area += overhead + (r.height*lineOverhead) +
  +                    (r.height*r.width);
  +            }
               i++;
           }
           size = j;
  +        r = getBounds();
  +        if (overhead + (r.height*lineOverhead) + (r.height*r.width) < area) {
  +            rects[0] = r;
  +            size=1;
  +        }
       }
   
       public void subtract(RectListManager rlm, int overhead, int lineOverhead) {
           Rectangle r, sr;
           int cost;
           int jMin=0;
  +        Rectangle [] splits = new Rectangle[4];
  +
           for(int i=0; i<size; i++) {
               r = rects[i]; // Canidate rect...
               cost = (overhead                + 
  @@ -645,55 +751,7 @@
                   // Now we know they intersect one another lets
                   // figure out how...
   
  -                // We split the canidate rectrect into four parts.  In
  -                // many cases one or more of these will be empty.
  -                //
  -                //    +-------------------------------------+ ry0
  -                //    |                                     |
  -                //    |                                     |
  -                //    |          Split 0                    |
  -                //    |                                     |
  -                //    |                                     |
  -                // ------------+-----------------+--------------- sry0
  -                //    |        |                 |          |
  -                //    | Split2 |   subtracted    | Split 3  |
  -                //    |        |   rect          |          |
  -                //    |        |                 |          |
  -                // ------------+-----------------+--------------- sry1
  -                //    |       srx0              srx1        |
  -                //    |                                     |
  -                //    |          Split 1                    |
  -                //    |                                     |
  -                //    +-------------------------------------+ ry1
  -                //   rx0                                   rx1
  -
  -                int rx0 = r.x;
  -                int rx1 = rx0+r.width-1;
  -                int ry0 = r.y;
  -                int ry1 = ry0+r.height-1;
  -
  -                int srx0 = sr.x;
  -                int srx1 = srx0+sr.width-1;
  -                int sry0 = sr.y;
  -                int sry1 = sry0+sr.height-1;
  -
  -                Rectangle [] splits = new Rectangle[4];
  -
  -                if ((ry0 < sry0) && (ry1 >= sry0)) {
  -                    splits[0] = new Rectangle(rx0, ry0, r.width, sry0-ry0);
  -                    ry0 = sry0;
  -                }
  -
  -                if ((ry0 <= sry1) && (ry1 > sry1)) {
  -                    splits[1] = new Rectangle(rx0, sry1+1, r.width, ry1-sry1);
  -                    ry1 = sry1;
  -                }
  -                
  -                if ((rx0 < srx0) && (rx1 >= srx0))
  -                    splits[2] = new Rectangle(rx0, ry0, srx0-rx0, ry1-ry0+1);
  -                
  -                if ((rx0 <= srx1) && (rx1 > srx1))
  -                    splits[3]= new Rectangle(srx1+1, ry0, rx1-srx1, ry1-ry0+1);
  +                splitRect(r, sr, splits);
   
                   int splitCost=0;
                   Rectangle tmpR;
  @@ -715,7 +773,7 @@
                       continue;
                   
                   // Collapse null entries in first three elements
  -                // split 0, 1, 2 (entries that share a common 'x'.
  +                // split 0, 1, 2 (entries that share a common 'x').
                   int l = 0;
                   for (int k=0; k<3; k++) {
                       if (splits[k] != null)
  @@ -729,13 +787,13 @@
                       // Insert the third split (if any) at the
                       // proper place in rects list.
                       if (splits[3] != null)
  -                        add(splits[3]);
  +                        add(splits[3], i, size-1);
                       break;
                   }
   
                   // Otherwise replace the canidate with the top of
                   // the split, since it only shrunk it didn't grow,
  -                // we now that the previous subtract rects don't
  +                // we know that the previous subtract rects don't
                   // intersect it.
                   r        = splits[0]; 
                   rects[i] = r;
  @@ -752,7 +810,7 @@
                   // Insert the third split (if any) at the
                   // proper place in rects list.
                   if (splits[3] != null)
  -                    add(splits[3]);
  +                    add(splits[3], i+l, size-1);
               }
           }
   
  @@ -766,6 +824,67 @@
               i++;
           }
           size = j;
  +    }
  +
  +    protected void splitRect(Rectangle r, Rectangle sr,
  +                             Rectangle []splits) {
  +        // We split the canidate rectrect into four parts.  In
  +        // many cases one or more of these will be empty.
  +        //
  +        //    +-------------------------------------+ ry0
  +        //    |                                     |
  +        //    |                                     |
  +        //    |          Split 0                    |
  +        //    |                                     |
  +        //    |                                     |
  +        // ------------+-----------------+--------------- sry0
  +        //    |        |                 |          |
  +        //    | Split2 |   subtracted    | Split 3  |
  +        //    |        |   rect          |          |
  +        //    |        |                 |          |
  +        // ------------+-----------------+--------------- sry1
  +        //    |       srx0              srx1        |
  +        //    |                                     |
  +        //    |          Split 1                    |
  +        //    |                                     |
  +        //    +-------------------------------------+ ry1
  +        //   rx0                                   rx1
  +
  +        int rx0 = r.x;
  +        int rx1 = rx0+r.width-1;
  +        int ry0 = r.y;
  +        int ry1 = ry0+r.height-1;
  +
  +        int srx0 = sr.x;
  +        int srx1 = srx0+sr.width-1;
  +        int sry0 = sr.y;
  +        int sry1 = sry0+sr.height-1;
  +
  +        if ((ry0 < sry0) && (ry1 >= sry0)) {
  +            splits[0] = new Rectangle(rx0, ry0, r.width, sry0-ry0);
  +            ry0 = sry0;
  +        } else {
  +            splits[0] = null;
  +        }
  +
  +        if ((ry0 <= sry1) && (ry1 > sry1)) {
  +            splits[1] = new Rectangle(rx0, sry1+1, r.width, ry1-sry1);
  +            ry1 = sry1;
  +        } else {
  +            splits[1] = null;
  +        }
  +                
  +        if ((rx0 < srx0) && (rx1 >= srx0)) {
  +            splits[2] = new Rectangle(rx0, ry0, srx0-rx0, ry1-ry0+1);
  +        } else {
  +            splits[2] = null;
  +        }
  +                
  +        if ((rx0 <= srx1) && (rx1 > srx1)) {
  +            splits[3]= new Rectangle(srx1+1, ry0, rx1-srx1, ry1-ry0+1);
  +        } else {
  +            splits[3] = null;
  +        }
       }
   
       protected void insertRects(Rectangle[] rects, int srcPos, 
  
  
  
  1.52      +4 -4      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.51
  retrieving revision 1.52
  diff -u -r1.51 -r1.52
  --- AbstractGraphicsNode.java	9 Aug 2003 16:58:40 -0000	1.51
  +++ AbstractGraphicsNode.java	31 Oct 2003 22:39:41 -0000	1.52
  @@ -218,7 +218,6 @@
        */
       public void setTransform(AffineTransform newTransform) {
           fireGraphicsNodeChangeStarted();
  -        invalidateGeometryCache();
           this.transform = newTransform;
           if(transform.getDeterminant() != 0){
               try{
  @@ -227,12 +226,13 @@
                   // Should never happen.
                   throw new Error();
               }
  -        }
  -        else{
  +        } else {
               // The transform is not invertible. Use the same
               // transform.
               inverseTransform = transform;
           }
  +        if (parent != null)
  +            parent.invalidateGeometryCache();
           fireGraphicsNodeChangeCompleted();
       }
   
  
  
  
  1.31      +4 -4      xml-batik/sources/org/apache/batik/gvt/TextNode.java
  
  Index: TextNode.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/TextNode.java,v
  retrieving revision 1.30
  retrieving revision 1.31
  diff -u -r1.30 -r1.31
  --- TextNode.java	7 Sep 2003 22:25:28 -0000	1.30
  +++ TextNode.java	31 Oct 2003 22:39:41 -0000	1.31
  @@ -139,9 +139,9 @@
       }
   
       /**
  -     * Sets the text painter of this text node. If the specified text painter is
  -     * null, this text node will use its default text painter
  -     * (StrokingTextPainter.getInstance()).
  +     * Sets the text painter of this text node. If the specified text
  +     * painter is null, this text node will use its default text
  +     * painter (StrokingTextPainter.getInstance()).
        *
        * @param textPainter the text painter to use
        */
  
  
  
  1.18      +13 -44    xml-batik/sources/org/apache/batik/gvt/renderer/DynamicRenderer.java
  
  Index: DynamicRenderer.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/renderer/DynamicRenderer.java,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- DynamicRenderer.java	9 Aug 2003 16:58:40 -0000	1.17
  +++ DynamicRenderer.java	31 Oct 2003 22:39:42 -0000	1.18
  @@ -61,7 +61,7 @@
   import java.awt.image.SampleModel;
   import java.awt.image.WritableRaster;
   import java.util.Iterator;
  -import java.util.List;
  +import java.util.Collection;
   
   import org.apache.batik.ext.awt.geom.RectListManager;
   import org.apache.batik.ext.awt.image.GraphicsUtil;
  @@ -107,7 +107,7 @@
       /**
        * Flush a list of rectangles of cached image data.
        */
  -    public void flush(List areas) {
  +    public void flush(Collection areas) {
           // Since we don't cache we don't need to flush
           return;
       }
  @@ -175,8 +175,8 @@
        * user space coordinate system.  
        */
       // long lastFrame = -1;
  -    public void repaint(List areas) {
  -        if (areas == null)
  +    public void repaint(RectListManager devRLM) {
  +        if (devRLM == null)
               return;
   
           // long t0 = System.currentTimeMillis();
  @@ -209,43 +209,9 @@
               (dstR.y+dstR.height > srcR.y+srcR.height))
               cr = new PadRed(cr, dstR, PadMode.ZERO_PAD, null);
   
  -        Rectangle [] devRects = new Rectangle[areas.size()];
  -        Iterator iter = areas.iterator();
  -        Rectangle dr = copyRaster.getBounds();
  -        float dmgSz = 0f;
  -        int sz=0;
  -        // System.out.println("DR: " + dr);
  -        while (iter.hasNext()) {
  -            Shape s = (Shape)iter.next();
  -            s = usr2dev.createTransformedShape(s);
  -            Rectangle2D r2d = s.getBounds2D();
  -            int x0 = (int)Math.floor(r2d.getX());
  -            int y0 = (int)Math.floor(r2d.getY());
  -            int x1 = (int)Math.ceil(r2d.getX()+r2d.getWidth());
  -            int y1 = (int)Math.ceil(r2d.getY()+r2d.getHeight());
  -            // Rectangle r = new Rectangle(x0, y0, x1-x0+1, y1-y0+1);
  -
  -            // This rectangle must be outset one pixel to ensure
  -            // it includes the effects of anti-aliasing on object.s
  -            Rectangle r = new Rectangle(x0-1, y0-1, x1-x0+3, y1-y0+3);
  -
  -            // System.out.println("  Rect   [" + sz+ "]: " + r);
  -            //System.out.println("  Rect2D [" + sz+ "]: " + r2d);
  -            if (!dr.intersects(r)) continue;
  -            r = dr.intersection(r);
  -            devRects[sz++] = r;
  -            dmgSz += r.width*(float)r.height;
  -        }
  -        RectListManager devRLM =null;
  -        try {
  -             devRLM = new RectListManager(devRects, 0, sz);
  -        } catch(Exception e) {
  -            e.printStackTrace();
  -        }
  +        boolean repaintAll = false;
   
  -        // Merge the repaint rectangles...
  -        devRLM.mergeRects(COPY_OVERHEAD, COPY_LINE_OVERHEAD);
  -        boolean repaintAll = (dmgSz > offScreenWidth*offScreenHeight*0.9f);
  +        Rectangle dr = copyRaster.getBounds();
   
           // Ensure only one thread works on baseRaster at a time...
           synchronized (syncRaster) {
  @@ -265,16 +231,16 @@
                                     -copyRaster.getMinY());
                   }
   
  +                
                   if ((isDoubleBuffered) &&
                       (currentRaster != null) && 
                       (damagedAreas  != null)) {
  -                    
                       damagedAreas.subtract(devRLM, COPY_OVERHEAD, 
                                             COPY_LINE_OVERHEAD);
                       damagedAreas.mergeRects(COPY_OVERHEAD, 
                                               COPY_LINE_OVERHEAD); 
   
  -                    iter = damagedAreas.iterator();
  +                    Iterator iter = damagedAreas.iterator();
                       while (iter.hasNext()) {
                           Rectangle r = (Rectangle)iter.next();
                           // System.out.println("Copy: " + r);
  @@ -290,9 +256,12 @@
                       }
                   }
   
  -                iter = devRLM.iterator();
  +                Iterator iter = devRLM.iterator();
                   while (iter.hasNext()) {
                       Rectangle r = (Rectangle)iter.next();
  +                    if (!dr.intersects(r)) continue;
  +                    r = dr.intersection(r);
  +                    
                       WritableRaster dst = copyRaster.createWritableChild
                           (r.x, r.y, r.width, r.height, r.x, r.y, null);
                       cr.copyData(dst);
  
  
  
  1.6       +3 -3      xml-batik/sources/org/apache/batik/gvt/renderer/ImageRenderer.java
  
  Index: ImageRenderer.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/renderer/ImageRenderer.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- ImageRenderer.java	8 Aug 2003 11:39:17 -0000	1.5
  +++ ImageRenderer.java	31 Oct 2003 22:39:42 -0000	1.6
  @@ -52,7 +52,7 @@
   
   import java.awt.Rectangle;
   import java.awt.image.BufferedImage;
  -import java.util.List;
  +import java.util.Collection;
   
   /**
    * Interface for GVT Renderers that render into raster images.
  @@ -91,5 +91,5 @@
        * interface). Each area are transformed via the usr2dev's renderer
        * transform before the flush(Rectangle) is called.
        */
  -    public void flush(List areas);
  +    public void flush(Collection areas);
   }
  
  
  
  1.11      +3 -3      xml-batik/sources/org/apache/batik/gvt/renderer/Renderer.java
  
  Index: Renderer.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/renderer/Renderer.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- Renderer.java	8 Aug 2003 11:39:17 -0000	1.10
  +++ Renderer.java	31 Oct 2003 22:39:42 -0000	1.11
  @@ -52,9 +52,9 @@
   
   import java.awt.Shape;
   import java.awt.geom.AffineTransform;
  -import java.util.List;
   
   import org.apache.batik.gvt.GraphicsNode;
  +import org.apache.batik.ext.awt.geom.RectListManager;
   
   /**
    * Interface for GVT Renderers.
  @@ -91,7 +91,7 @@
        * @param areas a List of regions to be repainted, in the current
        * user space coordinate system.  
        */
  -    public void repaint(List areas);
  +    public void repaint(RectListManager areas);
   
       /**
        * Sets the transform from the current user space (as defined by
  
  
  
  1.28      +8 -7      xml-batik/sources/org/apache/batik/gvt/renderer/StaticRenderer.java
  
  Index: StaticRenderer.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/renderer/StaticRenderer.java,v
  retrieving revision 1.27
  retrieving revision 1.28
  diff -u -r1.27 -r1.28
  --- StaticRenderer.java	8 Aug 2003 11:39:17 -0000	1.27
  +++ StaticRenderer.java	31 Oct 2003 22:39:42 -0000	1.28
  @@ -67,7 +67,7 @@
   import java.lang.ref.SoftReference;
   import java.util.ArrayList;
   import java.util.Iterator;
  -import java.util.List;
  +import java.util.Collection;
   
   import org.apache.batik.ext.awt.image.GraphicsUtil;
   import org.apache.batik.ext.awt.image.PadMode;
  @@ -76,6 +76,7 @@
   import org.apache.batik.ext.awt.image.rendered.PadRed;
   import org.apache.batik.ext.awt.image.rendered.TileCacheRed;
   import org.apache.batik.ext.awt.image.rendered.TranslateRed;
  +import org.apache.batik.ext.awt.geom.RectListManager;
   import org.apache.batik.gvt.GraphicsNode;
   
   /**
  @@ -373,9 +374,9 @@
        */
       public void repaint(Shape area) {
           if (area == null) return;
  -        List l = new ArrayList(1);
  -        l.add(area);
  -        repaint(l);
  +        RectListManager rlm = new RectListManager();
  +        rlm.add(usr2dev.createTransformedShape(area).getBounds());
  +        repaint(rlm);
       }
   
       /**
  @@ -391,7 +392,7 @@
        * @param areas a List of regions to be repainted, in the current
        * user space coordinate system.  
        */
  -    public void repaint(List areas) {
  +    public void repaint(RectListManager areas) {
   
           if (areas == null)
               return;
  @@ -459,7 +460,7 @@
       /**
        * Flush a list of rectangles of cached image data.
        */
  -    public void flush(List areas) {
  +    public void flush(Collection areas) {
           AffineTransform at = getTransform();
           Iterator i = areas.iterator();
           while (i.hasNext()) {
  
  
  
  1.10      +27 -15    xml-batik/sources/org/apache/batik/gvt/text/BidiAttributedCharacterIterator.java
  
  Index: BidiAttributedCharacterIterator.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/text/BidiAttributedCharacterIterator.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- BidiAttributedCharacterIterator.java	9 Aug 2003 16:58:42 -0000	1.9
  +++ BidiAttributedCharacterIterator.java	31 Oct 2003 22:39:42 -0000	1.10
  @@ -71,7 +71,6 @@
    */
   public class BidiAttributedCharacterIterator implements AttributedCharacterIterator {
   
  -    private AttributedCharacterIterator aci;
       private AttributedCharacterIterator reorderedACI;
       private FontRenderContext frc;
       private int chunkStart;
  @@ -80,6 +79,18 @@
       private final static Map mirroredGlyphs = new HashMap(50);
   
   
  +    protected BidiAttributedCharacterIterator
  +        (AttributedCharacterIterator reorderedACI,
  +         FontRenderContext frc,
  +         int chunkStart,
  +         int [] newCharOrder) {
  +        this.reorderedACI = reorderedACI;
  +        this.frc = frc;
  +        this.chunkStart = chunkStart;
  +        this.newCharOrder = newCharOrder;
  +    }
  +                                              
  +
       /**
        * Constructs a character iterator that represents the visual display order
        * of characters within bidirectional text.
  @@ -169,19 +180,19 @@
               (GVTAttributedCharacterIterator.TextAttribute.BIDI_LEVEL,
                new Integer(currBiDi), runStart, numChars);
   
  +        aci = as.getIterator();
  +
           if ((runStart == 0) && (currBiDi==0)) {
               // This avoids all the mucking about we need to do when
               // bidi is actually performed for cases where it
               // is not actually needed.
  -            this.aci = this.reorderedACI = as.getIterator();
  +            this.reorderedACI = aci;
               newCharOrder = new int[numChars];
               for (int i=0; i<numChars; i++)
                   newCharOrder[i] = chunkStart+i;
               return;
           }
   
  -        this.aci = as.getIterator();
  -
           //  work out the new character order
           newCharOrder = doBidiReorder(charIndices, charLevels, 
                                              numChars, maxBiDi);
  @@ -190,7 +201,7 @@
           StringBuffer reorderedString = new StringBuffer();
           char c;
           for (int i = 0; i < numChars; i++) {
  -            c = this.aci.setIndex(newCharOrder[i]);
  +            c = aci.setIndex(newCharOrder[i]);
   
               // check for mirrored char
               int bidiLevel = tl.getCharacterLevel(newCharOrder[i]);
  @@ -208,13 +219,13 @@
           AttributedString reorderedAS 
               = new AttributedString(reorderedString.toString());
           Map [] attrs = new Map[numChars];
  -        int start=this.aci.getBeginIndex();
  -        int end  =this.aci.getEndIndex();
  +        int start=aci.getBeginIndex();
  +        int end  =aci.getEndIndex();
           int index = start;
           while (index < end) {
  -            this.aci.setIndex(index);
  -            Map attrMap = this.aci.getAttributes();
  -            int extent = this.aci.getRunLimit();
  +            aci.setIndex(index);
  +            Map attrMap = aci.getAttributes();
  +            int extent  = aci.getRunLimit();
               for (int i=index; i<extent; i++)
                   attrs[i-start] = attrMap;
               index = extent;
  @@ -234,10 +245,10 @@
           reorderedAS.addAttributes(prevAttrMap, runStart, numChars);
   
           // transfer any position atttributes to the new first char
  -        this.aci.first();
  -        Float x = (Float) this.aci.getAttribute
  +        aci.first();
  +        Float x = (Float) aci.getAttribute
               (GVTAttributedCharacterIterator.TextAttribute.X);
  -        Float y = (Float) this.aci.getAttribute
  +        Float y = (Float) aci.getAttribute
               (GVTAttributedCharacterIterator.TextAttribute.Y);
   
           if (x != null && !x.isNaN()) {
  @@ -410,7 +421,8 @@
        */
       public Object clone() {
           return new BidiAttributedCharacterIterator
  -            ((AttributedCharacterIterator)aci.clone(), frc, chunkStart);
  +            ((AttributedCharacterIterator)reorderedACI.clone(), 
  +             frc, chunkStart, (int [])newCharOrder.clone());
       }
   
       /**
  
  
  
  1.86      +12 -159   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.85
  retrieving revision 1.86
  diff -u -r1.85 -r1.86
  --- JSVGComponent.java	12 Oct 2003 16:55:50 -0000	1.85
  +++ JSVGComponent.java	31 Oct 2003 22:39:42 -0000	1.86
  @@ -358,6 +358,8 @@
   
       protected Runnable afterStopRunnable = null;
   
  +    protected SVGUpdateOverlay updateOverlay; // = new SVGUpdateOverlay(20, 4);
  +
       /**
        * Creates a new JSVGComponent.
        */
  @@ -383,6 +385,8 @@
           addSVGDocumentLoaderListener((SVGListener)listener);
           addGVTTreeBuilderListener((SVGListener)listener);
           addSVGLoadEventDispatcherListener((SVGListener)listener);
  +        if (updateOverlay != null) 
  +            getOverlays().add(updateOverlay);
       }
   
       public void dispose() {
  @@ -1751,20 +1755,21 @@
                               List l = e.getDirtyAreas();
                               if (l != null) {
                                   Rectangle visRect = getRenderRect();
  -                                List ml = mergeRectangles
  -                                    (l, visRect.x, visRect.y,
  -                                     visRect.width - 1, visRect.height - 1);
  -                                if (ml.size() < l.size()) {
  -                                    l = ml;
  -                                }
                                   Iterator i = l.iterator();
                                   while (i.hasNext()) {
                                       Rectangle r = (Rectangle)i.next();
  +                                    if (updateOverlay != null) {
  +                                        updateOverlay.addRect(r);
  +                                        r = getRenderRect();
  +                                    }
  +
                                       if (doubleBufferedRendering)
                                           repaint(r);
                                       else
                                           paintImmediately(r);
                                   }
  +                                if (updateOverlay != null)
  +                                    updateOverlay.endUpdate();
                               }
                               suspendInteractions = false;
                           }
  @@ -3320,157 +3325,5 @@
           FEATURES.add(SVGConstants.SVG_ORG_W3C_SVG_FEATURE);
           FEATURES.add(SVGConstants.SVG_ORG_W3C_SVG_LANG_FEATURE);
           FEATURES.add(SVGConstants.SVG_ORG_W3C_SVG_STATIC_FEATURE);
  -    }
  -
  -    private final static int SPLIT_THRESHOLD = 128;
  -
  -    /**
  -     * Merges the given Rectangles.
  -     */
  -    protected List mergeRectangles(List rects,
  -                                   int x1, int y1, int x2, int y2) {
  -        if (rects.size() <= 1) {
  -            return rects;
  -        }
  -        
  -        int w = x2 - x1;
  -        int h = y2 - y1;
  -
  -        if (w < SPLIT_THRESHOLD && h < SPLIT_THRESHOLD) {
  -            // Merges all the rectangles
  -            List result = new ArrayList();
  -            Iterator it = rects.iterator();
  -            Rectangle rect = (Rectangle)it.next();
  -            while (it.hasNext()) {
  -                Rectangle r = (Rectangle)it.next();
  -                rect.add(r);
  -            }
  -            result.add(rect);
  -            return result;
  -        }
  -
  -        if (w < SPLIT_THRESHOLD) {
  -            // Split horizontally
  -            List h1 = new ArrayList();
  -            List h2 = new ArrayList();
  -            int dy = h / 2;
  -            int av = y1 + dy;
  -            Iterator it = rects.iterator();
  -            while (it.hasNext()) {
  -                Rectangle r = (Rectangle)it.next();
  -                if (r.y < av) {
  -                    if (r.y + r.height > av) {
  -                        // The rectangle intersects the two regions
  -                        h2.add(new Rectangle(r.x, av, r.width,
  -                                             (r.height + r.y) - av));
  -                        r = new Rectangle(r.x, r.y, r.width, av - r.y);
  -                    }
  -                    h1.add(r);
  -                } else {
  -                    h2.add(r);
  -                }
  -            }
  -            h1 = mergeRectangles(h1, x1, y1, x2, av - 1);
  -            h2 = mergeRectangles(h2, x1, av, x2, y2);
  -            h1.addAll(h2);
  -            return h1;
  -        }
  -
  -        if (h < SPLIT_THRESHOLD) {
  -            // Split vertically
  -            List w1 = new ArrayList();
  -            List w2 = new ArrayList();
  -            int dx = w / 2;
  -            int av = x1 + dx;
  -            Iterator it = rects.iterator();
  -            while (it.hasNext()) {
  -                Rectangle r = (Rectangle)it.next();
  -                if (r.x < av) {
  -                    if (r.x + r.width > av) {
  -                        // The rectangle intersects the two regions
  -                        w2.add(new Rectangle(av, r.y,
  -                                             (r.width + r.x) - av, r.height));
  -                        r = new Rectangle(r.x, r.y, av - r.x, r.height);
  -                    }
  -                    w1.add(r);
  -                } else {
  -                    w2.add(r);
  -                }
  -            }
  -            w1 = mergeRectangles(w1, x1, y1, av - 1, y2);
  -            w2 = mergeRectangles(w2, av, y1, x2, y2);
  -            w1.addAll(w2);
  -            return w1;
  -        }
  -
  -        // Split the region into four regions
  -        List wh1 = new ArrayList();
  -        List wh2 = new ArrayList();
  -        List wh3 = new ArrayList();
  -        List wh4 = new ArrayList();
  -        int dx = w / 2;
  -        int dy = h / 2;
  -        int wav = x1 + dx;
  -        int hav = y1 + dy;
  -        Iterator it = rects.iterator();
  -        while (it.hasNext()) {
  -            Rectangle r = (Rectangle)it.next();
  -            if (r.x < wav) {
  -                if (r.y < hav) {
  -                    boolean c1 = r.x + r.width > wav;
  -                    boolean c2 = r.y + r.height > hav;
  -                    if (c1 && c2) {
  -                        // The rectangle intersects the four regions
  -                        wh2.add(new Rectangle(wav, r.y, (r.width + r.x) - wav,
  -                                              hav - r.y));
  -                        wh3.add(new Rectangle(r.x, hav, wav - r.x,
  -                                              (r.height + r.y) - hav));
  -                        wh4.add(new Rectangle(wav, hav,
  -                                              (r.width + r.x) - wav,
  -                                              (r.height + r.y) - hav));
  -                        r = new Rectangle(r.x, r.y, wav - r.x, hav - r.y);
  -                    } else if (c1) {
  -                        // The rectangle intersects two regions
  -                        wh2.add(new Rectangle(wav, r.y, (r.width + r.x) - wav,
  -                                              r.height));
  -                        r = new Rectangle(r.x, r.y, wav - r.x, r.height);
  -                    } else if (c2) {
  -                        // The rectangle intersects two regions
  -                        wh3.add(new Rectangle(r.x, hav, r.width,
  -                                              (r.height + r.y) - hav));
  -                        r = new Rectangle(r.x, r.y, r.width, hav - r.y);
  -                    }
  -                    wh1.add(r);
  -                } else {
  -                    if (r.x + r.width > wav) {
  -                        // The rectangle intersects two regions
  -                        wh4.add(new Rectangle(wav, r.y, (r.width + r.x) - wav,
  -                                              r.height));
  -                        r = new Rectangle(r.x, r.y, wav - r.x, r.height);
  -                    }
  -                    wh3.add(r);
  -                }
  -            } else {
  -                if (r.y < hav) {
  -                    if (r.y + r.height > hav) {
  -                        // The rectangle intersects two regions
  -                        wh4.add(new Rectangle(r.x, hav, r.width,
  -                                              (r.height + r.y) - hav));
  -                        r = new Rectangle(r.x, r.y, r.width, hav - r.y);
  -                    }
  -                    wh2.add(r);
  -                } else {
  -                    wh4.add(r);
  -                }
  -            }
  -        }
  -        wh1 = mergeRectangles(wh1, x1, y1, wav - 1, hav - 1);
  -        wh2 = mergeRectangles(wh2, wav, y1, x2, y2);
  -        wh3 = mergeRectangles(wh3, x1, hav, wav - 1, y2);
  -        wh4 = mergeRectangles(wh4, wav, hav, x2, y2);
  -        wh1.addAll(wh2);
  -        wh1.addAll(wh3);
  -        wh1.addAll(wh4);
  -        return wh1;
       }
   }
  
  
  
  1.1                  xml-batik/sources/org/apache/batik/swing/svg/SVGUpdateOverlay.java
  
  Index: SVGUpdateOverlay.java
  ===================================================================
  /*
  
   ============================================================================
                     The Apache Software License, Version 1.1
   ============================================================================
  
   Copyright (C) 1999-2003 The Apache Software Foundation. All rights reserved.
  
   Redistribution and use in source and binary forms, with or without modifica-
   tion, are permitted provided that the following conditions are met:
  
   1. Redistributions of  source code must  retain the above copyright  notice,
      this list of conditions and the following disclaimer.
  
   2. Redistributions in binary form must reproduce the above copyright notice,
      this list of conditions and the following disclaimer in the documentation
      and/or other materials provided with the distribution.
  
   3. The end-user documentation included with the redistribution, if any, must
      include  the following  acknowledgment:  "This product includes  software
      developed  by the  Apache Software Foundation  (http://www.apache.org/)."
      Alternately, this  acknowledgment may  appear in the software itself,  if
      and wherever such third-party acknowledgments normally appear.
  
   4. The names "Batik" and  "Apache Software Foundation" must  not  be
      used to  endorse or promote  products derived from  this software without
      prior written permission. For written permission, please contact
      apache@apache.org.
  
   5. Products  derived from this software may not  be called "Apache", nor may
      "Apache" appear  in their name,  without prior written permission  of the
      Apache Software Foundation.
  
   THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
   FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE
   APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT,
   INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
   DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS
   OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON
   ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT
   (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF
   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  
   This software  consists of voluntary contributions made  by many individuals
   on  behalf of the Apache Software  Foundation. For more  information on the
   Apache Software Foundation, please see <http://www.apache.org/>.
  
  */
  
  package org.apache.batik.swing.svg;
  
  import java.util.Iterator;
  import java.util.List;
  import java.util.LinkedList;
  
  import java.awt.Rectangle;
  import java.awt.Color;
  import java.awt.Graphics;
  
  import org.apache.batik.swing.gvt.Overlay;
  
  /**
   * One line Class Desc
   *
   * Complete Class Desc
   *
   * @author <a href="mailto:deweese@apache.org>deweese</a>
   * @version $Id: SVGUpdateOverlay.java,v 1.1 2003/10/31 22:39:42 deweese Exp $
   */
  public class SVGUpdateOverlay implements Overlay {
      List rects = new LinkedList();
      int size, updateCount;
      int []counts;
      public SVGUpdateOverlay(int size, int numUpdates) {
          this.size = size;
          counts = new int[numUpdates];
      }
  
      public void addRect(Rectangle r) {
          rects.add(r);
          if (rects.size() > size)
              rects.remove(0);
          updateCount++;
      }
  
      public void endUpdate() {
          int i=0;
          int total =0;
          for (; i<counts.length-1; i++) {
              counts[i] = counts[i+1];
          }
          counts[i] = updateCount;
          updateCount = 0;
          
          int num = rects.size();
          for (i=counts.length-1; i>=0; i--) {
              if (counts[i] > num) {
                  counts[i] = num;
              }
              num -= counts[i];
          }
          counts[0] += num;
      }
  
      public void paint(Graphics g) {
          Iterator i = rects.iterator();
          int count = 0;
          int idx = 0;
          int group = 0;
          while ((group < counts.length-1) && 
                 (idx == counts[group]))
              group++;
          int cmax = counts.length-1;
          while (i.hasNext()) {
              Rectangle r = (Rectangle)i.next();
              Color c;
              c = new Color(1f, (cmax-group)/(float)cmax, 0,
                            (count+1f)/rects.size());
              g.setColor(c);
              g.drawRect(r.x, r.y, r.width, r.height);
              count++; idx++;
              while ((group < counts.length-1) && 
                     (idx == counts[group])) {
                  group++;
                  idx = 0;
              }
          }
      }
  }
  
  
  
  1.17      +5 -4      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.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- SVGAbstractTranscoder.java	8 Oct 2003 11:20:52 -0000	1.16
  +++ SVGAbstractTranscoder.java	31 Oct 2003 22:39:42 -0000	1.17
  @@ -259,9 +259,10 @@
           if (Px.isIdentity() && (width != docWidth || height != docHeight)) {
               // The document has no viewBox, we need to resize it by hand.
               // we want to keep the document size ratio
  -            float d = Math.max(docWidth, docHeight);
  -            float dd = Math.max(width, height);
  -            float scale = dd/d;
  +            float xscale, yscale;
  +            xscale = width/docWidth;
  +            yscale = height/docHeight;
  +            float scale = Math.min(xscale,yscale);
               Px = AffineTransform.getScaleInstance(scale, scale);
           }
           // take the AOI into account if any
  
  
  
  1.3       +73 -70    xml-batik/test-references/org/apache/batik/ext/awt/geom/rlm.merge.out
  
  Index: rlm.merge.out
  ===================================================================
  RCS file: /home/cvs/xml-batik/test-references/org/apache/batik/ext/awt/geom/rlm.merge.out,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- rlm.merge.out	19 Feb 2002 20:05:07 -0000	1.2
  +++ rlm.merge.out	31 Oct 2003 22:39:42 -0000	1.3
  @@ -1,70 +1,73 @@
  -ID: rlm1-1 Sz: 2
  -  java.awt.Rectangle[x=0,y=0,width=50,height=50]
  -  java.awt.Rectangle[x=30,y=30,width=40,height=40]
  -
  -ID: rlm2-1 Sz: 3
  -  java.awt.Rectangle[x=0,y=0,width=30,height=30]
  -  java.awt.Rectangle[x=20,y=20,width=30,height=30]
  -  java.awt.Rectangle[x=40,y=40,width=30,height=30]
  -
  -ID: rlm2-1 Sz: 3
  -  java.awt.Rectangle[x=0,y=0,width=30,height=30]
  -  java.awt.Rectangle[x=20,y=20,width=30,height=30]
  -  java.awt.Rectangle[x=40,y=40,width=30,height=30]
  -
  -ID: rlm2-1 Sz: 2
  -  java.awt.Rectangle[x=0,y=0,width=50,height=50]
  -  java.awt.Rectangle[x=40,y=40,width=30,height=30]
  -
  -ID: rlm3-1 Sz: 3
  -  java.awt.Rectangle[x=0,y=40,width=30,height=30]
  -  java.awt.Rectangle[x=20,y=20,width=30,height=30]
  -  java.awt.Rectangle[x=40,y=0,width=30,height=30]
  -
  -ID: rlm3-1 Sz: 3
  -  java.awt.Rectangle[x=0,y=40,width=30,height=30]
  -  java.awt.Rectangle[x=20,y=20,width=30,height=30]
  -  java.awt.Rectangle[x=40,y=0,width=30,height=30]
  -
  -ID: rlm3-1 Sz: 2
  -  java.awt.Rectangle[x=0,y=20,width=50,height=50]
  -  java.awt.Rectangle[x=40,y=0,width=30,height=30]
  -
  -ID: rlm4-1 Sz: 2
  -  java.awt.Rectangle[x=0,y=0,width=30,height=30]
  -  java.awt.Rectangle[x=40,y=0,width=30,height=30]
  -
  -ID: rlm4-1 Sz: 1
  -  java.awt.Rectangle[x=0,y=0,width=70,height=30]
  -
  -ID: rlm5-1 Sz: 1
  -  java.awt.Rectangle[x=0,y=0,width=70,height=30]
  -
  -ID: rlm6-1 Sz: 2
  -  java.awt.Rectangle[x=0,y=40,width=30,height=30]
  -  java.awt.Rectangle[x=0,y=0,width=30,height=30]
  -
  -ID: rlm6-1 Sz: 1
  -  java.awt.Rectangle[x=0,y=0,width=30,height=70]
  -
  -ID: rlm7-1 Sz: 2
  -  java.awt.Rectangle[x=0,y=40,width=30,height=30]
  -  java.awt.Rectangle[x=0,y=0,width=30,height=30]
  -
  -ID: rlm7-1 Sz: 2
  -  java.awt.Rectangle[x=0,y=40,width=30,height=30]
  -  java.awt.Rectangle[x=0,y=0,width=30,height=30]
  -
  -ID: rlm7-1 Sz: 1
  -  java.awt.Rectangle[x=0,y=0,width=30,height=70]
  -
  -ID: rlm8-1 Sz: 4
  -  java.awt.Rectangle[x=194,y=218,width=1,height=1]
  -  java.awt.Rectangle[x=200,y=10,width=1,height=1]
  -  java.awt.Rectangle[x=226,y=246,width=1,height=1]
  -  java.awt.Rectangle[x=227,y=228,width=1,height=1]
  -
  -ID: rlm8-1 Sz: 2
  -  java.awt.Rectangle[x=194,y=218,width=34,height=29]
  -  java.awt.Rectangle[x=200,y=10,width=1,height=1]
  -
  +ID: rlm1-1 Sz: 3
  +  java.awt.Rectangle[x=0,y=0,width=50,height=50]
  +  java.awt.Rectangle[x=30,y=50,width=40,height=20]
  +  java.awt.Rectangle[x=50,y=30,width=20,height=20]
  +
  +ID: rlm2-1 Sz: 5
  +  java.awt.Rectangle[x=0,y=0,width=30,height=30]
  +  java.awt.Rectangle[x=20,y=30,width=30,height=20]
  +  java.awt.Rectangle[x=30,y=20,width=20,height=10]
  +  java.awt.Rectangle[x=40,y=50,width=30,height=20]
  +  java.awt.Rectangle[x=50,y=40,width=20,height=10]
  +
  +ID: rlm2-1 Sz: 2
  +  java.awt.Rectangle[x=0,y=0,width=50,height=50]
  +  java.awt.Rectangle[x=40,y=40,width=30,height=30]
  +
  +ID: rlm2-1 Sz: 2
  +  java.awt.Rectangle[x=0,y=0,width=50,height=50]
  +  java.awt.Rectangle[x=40,y=40,width=30,height=30]
  +
  +ID: rlm3-1 Sz: 5
  +  java.awt.Rectangle[x=0,y=40,width=30,height=30]
  +  java.awt.Rectangle[x=20,y=20,width=30,height=20]
  +  java.awt.Rectangle[x=30,y=40,width=20,height=10]
  +  java.awt.Rectangle[x=40,y=0,width=30,height=20]
  +  java.awt.Rectangle[x=50,y=20,width=20,height=10]
  +
  +ID: rlm3-1 Sz: 2
  +  java.awt.Rectangle[x=0,y=20,width=50,height=50]
  +  java.awt.Rectangle[x=40,y=0,width=30,height=30]
  +
  +ID: rlm3-1 Sz: 2
  +  java.awt.Rectangle[x=0,y=20,width=50,height=50]
  +  java.awt.Rectangle[x=40,y=0,width=30,height=30]
  +
  +ID: rlm4-1 Sz: 2
  +  java.awt.Rectangle[x=0,y=0,width=30,height=30]
  +  java.awt.Rectangle[x=40,y=0,width=30,height=30]
  +
  +ID: rlm4-1 Sz: 1
  +  java.awt.Rectangle[x=0,y=0,width=70,height=30]
  +
  +ID: rlm5-1 Sz: 1
  +  java.awt.Rectangle[x=0,y=0,width=70,height=30]
  +
  +ID: rlm6-1 Sz: 2
  +  java.awt.Rectangle[x=0,y=40,width=30,height=30]
  +  java.awt.Rectangle[x=0,y=0,width=30,height=30]
  +
  +ID: rlm6-1 Sz: 1
  +  java.awt.Rectangle[x=0,y=0,width=30,height=70]
  +
  +ID: rlm7-1 Sz: 2
  +  java.awt.Rectangle[x=0,y=40,width=30,height=30]
  +  java.awt.Rectangle[x=0,y=0,width=30,height=30]
  +
  +ID: rlm7-1 Sz: 2
  +  java.awt.Rectangle[x=0,y=40,width=30,height=30]
  +  java.awt.Rectangle[x=0,y=0,width=30,height=30]
  +
  +ID: rlm7-1 Sz: 1
  +  java.awt.Rectangle[x=0,y=0,width=30,height=70]
  +
  +ID: rlm8-1 Sz: 4
  +  java.awt.Rectangle[x=194,y=218,width=1,height=1]
  +  java.awt.Rectangle[x=200,y=10,width=1,height=1]
  +  java.awt.Rectangle[x=226,y=246,width=1,height=1]
  +  java.awt.Rectangle[x=227,y=228,width=1,height=1]
  +
  +ID: rlm8-1 Sz: 2
  +  java.awt.Rectangle[x=194,y=218,width=34,height=29]
  +  java.awt.Rectangle[x=200,y=10,width=1,height=1]
  +
  
  
  
  1.4       +93 -78    xml-batik/test-references/samples/tests/spec/scripting/markerUpdate.png
  
  	<<Binary file>>
  
  
  1.9       +3 -1      xml-batik/test-resources/org/apache/batik/bridge/unitTesting.xml
  
  Index: unitTesting.xml
  ===================================================================
  RCS file: /home/cvs/xml-batik/test-resources/org/apache/batik/bridge/unitTesting.xml,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- unitTesting.xml	27 Aug 2003 23:33:22 -0000	1.8
  +++ unitTesting.xml	31 Oct 2003 22:39:42 -0000	1.9
  @@ -184,10 +184,12 @@
               <property name="ExpectedErrorCode" class="java.lang.String"
                         value="css.uri.badTarget" />
           </test>
  +    <!-- No longer generats exception - just user warning
           <test id="bridge/error/css-invalid">
               <property name="ExpectedExceptionClass" class="java.lang.String"
                         value="org.w3c.dom.DOMException" />
           </test>
  +    -->
           <test id="bridge/error/ellipse-missing-rx">
               <property name="ExpectedExceptionClass" class="java.lang.String"
                         value="org.apache.batik.bridge.BridgeException" />
  
  
  

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