deweese     2003/12/14 07:14:57

  Modified:    samples/tests/spec/paints patternRegions.svg
               sources/org/apache/batik/bridge BridgeContext.java
                        SVGSVGElementBridge.java SVGUseElementBridge.java
                        TextUtilities.java
  Log:
  1) Fixed memory leak when a use element is reparented.
  
  Revision  Changes    Path
  1.4       +12 -5     xml-batik/samples/tests/spec/paints/patternRegions.svg
  
  Index: patternRegions.svg
  ===================================================================
  RCS file: /home/cvs/xml-batik/samples/tests/spec/paints/patternRegions.svg,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- patternRegions.svg        8 Aug 2003 11:39:33 -0000       1.3
  +++ patternRegions.svg        14 Dec 2003 15:14:57 -0000      1.4
  @@ -151,25 +151,30 @@
           <!-- patternUnits : userSpaceOnUse                  -->
           <!-- patternContentUnits : objectBoundingBox        -->
           <!-- viewBox : set                                  -->
  +        <!-- Note patternContentUnits is ignored if viewBox -->
  +        <!-- is set.                                        -->
           <!-- ============================================== -->
           <pattern id="pattern7" 
                    patternUnits="userSpaceOnUse" 
                    patternContentUnits="objectBoundingBox"
                    x="0" y="0" width="30" height="15" 
                    viewBox="10 10 40 30" preserveAspectRatio="none">
  -            <circle cx=".25" cy=".333" r="1" style="fill:red" />
  +            <circle cx="20" cy="20" r="20" style="fill:red" />
           </pattern>
   
           <!-- ============================================== -->
           <!-- patternUnits : userSpaceOnUse                  -->
           <!-- patternContentUnits : objectBoundingBox        -->
           <!-- viewBox : set                                  -->
  +        <!-- Note patternContentUnits is ignored if viewBox -->
  +        <!-- is set.                                        -->
           <!-- ============================================== -->
           <pattern id="pattern8" 
                    patternUnits="userSpaceOnUse" 
                    patternContentUnits="objectBoundingBox"
  -                 x="0" y="0" width="30" height="15" viewBox="10 10 40 40" 
preserveAspectRatio="xMinYMin meet">
  -            <circle cx=".25" cy=".333" r="1" style="fill:red" />
  +                 x="0" y="0" width="30" height="15" 
  +                 viewBox="10 10 40 30" preserveAspectRatio="xMinYMin meet">
  +            <circle cx="20" cy="20" r="20" style="fill:red" />
           </pattern>
   
           <radialGradient id="redToYellow" >
  @@ -181,12 +186,14 @@
           <!-- patternUnits : userSpaceOnUse                  -->
           <!-- patternContentUnits : userSpaceOnUse           -->
           <!-- viewBox : set                                  -->
  +        <!-- Note patternContentUnits is ignored if viewBox -->
  +        <!-- is set.                                        -->
           <!-- ============================================== -->
           <pattern id="pattern9" 
                    patternUnits="userSpaceOnUse" 
                    patternContentUnits="objectBoundingBox" overflow="visible"
                    x="0" y="0" width="30" height="15" viewBox="10 10 40 40" 
preserveAspectRatio="xMinYMin slice">
  -            <circle cx=".25" cy=".333" r="1" style="fill:url(#redToYellow)" />
  +            <circle cx="20" cy="20" r="40" style="fill:url(#redToYellow)" />
           </pattern>
   
       </defs>
  
  
  
  1.74      +66 -17    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.73
  retrieving revision 1.74
  diff -u -r1.73 -r1.74
  --- BridgeContext.java        6 Oct 2003 00:56:00 -0000       1.73
  +++ BridgeContext.java        14 Dec 2003 15:14:57 -0000      1.74
  @@ -65,6 +65,7 @@
   import java.util.ListIterator;
   import java.util.Map;
   import java.util.Set;
  +import java.util.WeakHashMap;
   
   import org.apache.batik.css.engine.CSSContext;
   import org.apache.batik.css.engine.CSSEngine;
  @@ -143,7 +144,7 @@
        * key is an Element -
        * value is a Viewport
        */
  -    protected Map viewportMap = new HashMap();
  +    protected Map viewportMap = new WeakHashMap();
   
       /**
        * The viewport stack. Used in building time.
  @@ -160,21 +161,34 @@
        * key is an SVG Element -
        * value is a GraphicsNode
        */
  -    protected HashMap elementNodeMap;
  +    protected Map elementNodeMap;
   
       /**
        * Binding Map:
        * key is GraphicsNode -
        * value is a SVG Element.
        */
  -    protected HashMap nodeElementMap;
  +    protected Map nodeElementMap;
   
       /**
        * Bridge Map:
        * Keys are namespace URI - values are HashMap (with keys are local
        * name and values are a Bridge instance).
        */
  -    protected HashMap namespaceURIMap;
  +    protected Map namespaceURIMap;
  +
  +    /**
  +     * Element Data Map:
  +     * This is a general location for elements to 'cache'
  +     * data.  Such as the graphics tree for a pattern or
  +     * the Gradient arrays.
  +     *
  +     * This is a weak hash map and the data is referenced
  +     * by SoftReference so both must be referenced elsewhere
  +     * to stay live.
  +     */
  +    protected Map elementDataMap;
  +
   
       /**
        * The interpreter pool used to handle scripts.
  @@ -360,6 +374,35 @@
       }
   
       /**
  +     * Set Element Data.
  +     * Associates data object with element so it can be
  +     * retrieved later.
  +     */
  +    public void setElementData(Node n, Object data) {
  +        if (elementDataMap == null)
  +            elementDataMap = new WeakHashMap();
  +        elementDataMap.put(n, new SoftReference(data));
  +    }
  +
  +    /**
  +     * Set Element Data.
  +     * Associates data object with element so it can be
  +     * retrieved later.
  +     */
  +    public Object getElementData(Node n) {
  +        if (elementDataMap == null)
  +            return null;
  +        Object o = elementDataMap.get(n);
  +        if (o == null) return null;
  +        SoftReference sr = (SoftReference)o;
  +        o = sr.get();
  +        if (o == null) {
  +            elementDataMap.remove(n);
  +        }
  +        return o;
  +    }
  +
  +    /**
        * Returns the user agent of this bridge context.
        */
       public UserAgent getUserAgent() {
  @@ -640,11 +683,11 @@
        */
       public void bind(Element element, GraphicsNode node) {
           if (elementNodeMap == null) {
  -            elementNodeMap = new HashMap();
  -            nodeElementMap = new HashMap();
  +            elementNodeMap = new WeakHashMap();
  +            nodeElementMap = new WeakHashMap();
           }
  -        elementNodeMap.put(element, node);
  -        nodeElementMap.put(node, element);
  +        elementNodeMap.put(element, new SoftReference(node));
  +        nodeElementMap.put(node, new SoftReference(element));
       }
   
       /**
  @@ -656,9 +699,13 @@
           if (elementNodeMap == null) {
               return;
           }
  -        GraphicsNode node = (GraphicsNode)elementNodeMap.get(element);
  +        GraphicsNode node = null;
  +        SoftReference sr = (SoftReference)elementNodeMap.get(element);
  +        if (sr != null)
  +            node = (GraphicsNode)sr.get();
           elementNodeMap.remove(element);
  -        nodeElementMap.remove(node);
  +        if (node != null)
  +            nodeElementMap.remove(node);
       }
   
       /**
  @@ -669,10 +716,11 @@
        */
       public GraphicsNode getGraphicsNode(Element element) {
           if (elementNodeMap != null) {
  -            return (GraphicsNode)elementNodeMap.get(element);
  -        } else {
  -            return null;
  +            SoftReference sr = (SoftReference)elementNodeMap.get(element);
  +            if (sr != null) 
  +                return (GraphicsNode)sr.get();
           }
  +        return null;
       }
   
       /**
  @@ -683,10 +731,11 @@
        */
       public Element getElement(GraphicsNode node) {
           if (nodeElementMap != null) {
  -            return (Element)nodeElementMap.get(node);
  -        } else {
  -            return null;
  +            SoftReference sr = (SoftReference)nodeElementMap.get(node);
  +            if (sr != null) 
  +                return (Element)sr.get();
           }
  +        return null;
       }
   
       // Bridge management /////////////////////////////////////////////////////
  
  
  
  1.41      +3 -8      
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.40
  retrieving revision 1.41
  diff -u -r1.40 -r1.41
  --- SVGSVGElementBridge.java  9 Dec 2003 10:44:10 -0000       1.40
  +++ SVGSVGElementBridge.java  14 Dec 2003 15:14:57 -0000      1.41
  @@ -225,8 +225,7 @@
           }
   
           ctx.openViewport
  -            (e, new SVGSVGElementViewport((SVGSVGElement)e,
  -                                          actualWidth,
  +            (e, new SVGSVGElementViewport(actualWidth,
                                             actualHeight));
           return cgn;
       }
  @@ -403,7 +402,6 @@
           }
   
           if (rebuild) {
  -            System.err.println("REbuild");
               CompositeGraphicsNode gn = node.getParent();
               gn.remove(node);
               disposeTree(e);
  @@ -416,8 +414,6 @@
        * A viewport defined an &lt;svg> element.
        */
       public static class SVGSVGElementViewport implements Viewport {
  -
  -        private SVGSVGElement e;
           private float width;
           private float height;
   
  @@ -427,8 +423,7 @@
            * @param w the width of the viewport
            * @param h the height of the viewport
            */
  -        public SVGSVGElementViewport(SVGSVGElement e, float w, float h) {
  -            this.e = e;
  +        public SVGSVGElementViewport(float w, float h) {
               this.width = w;
               this.height = h;
           }
  
  
  
  1.38      +31 -29    
xml-batik/sources/org/apache/batik/bridge/SVGUseElementBridge.java
  
  Index: SVGUseElementBridge.java
  ===================================================================
  RCS file: 
/home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGUseElementBridge.java,v
  retrieving revision 1.37
  retrieving revision 1.38
  diff -u -r1.37 -r1.38
  --- SVGUseElementBridge.java  2 Dec 2003 10:58:32 -0000       1.37
  +++ SVGUseElementBridge.java  14 Dec 2003 15:14:57 -0000      1.38
  @@ -255,48 +255,50 @@
               } else {
                   // Remove event listeners
                   EventTarget target = l.target;
  -                target.removeEventListener("DOMAttrModified",
  -                                           l,
  -                                           true);
  -                
  -                target.removeEventListener("DOMNodeInserted",
  -                                           l,
  -                                           true);
  -                
  -                target.removeEventListener("DOMNodeRemoved",
  -                                           l,
  -                                           true);
  -                
  -                target.removeEventListener("DOMCharacterDataModified",
  -                                           l,
  -                                           true);
  +                target.removeEventListener("DOMAttrModified", l, true);
  +                target.removeEventListener("DOMNodeInserted", l, true);
  +                target.removeEventListener("DOMNodeRemoved", l, true);
  +                target.removeEventListener("DOMCharacterDataModified",l, true);
               }
           
               EventTarget target = (EventTarget)refElement;
               l.target = target;
               
  -            target.addEventListener("DOMAttrModified",
  -                                    l,
  -                                    true);
  +            target.addEventListener("DOMAttrModified", l, true);
               ctx.storeEventListener(target, "DOMAttrModified", l, true);
               
  -            target.addEventListener("DOMNodeInserted",
  -                                    l,
  -                                    true);
  +            target.addEventListener("DOMNodeInserted", l, true);
               ctx.storeEventListener(target, "DOMNodeInserted", l, true);
               
  -            target.addEventListener("DOMNodeRemoved",
  -                                    l,
  -                                    true);
  +            target.addEventListener("DOMNodeRemoved", l, true);
               ctx.storeEventListener(target, "DOMNodeRemoved", l, true);
               
  -            target.addEventListener("DOMCharacterDataModified",
  -                                    l,
  -                                    true);
  -            ctx.storeEventListener(target, "DOMCharacterDataModified", l, true);
  +            target.addEventListener("DOMCharacterDataModified", l, true);
  +            ctx.storeEventListener
  +                (target, "DOMCharacterDataModified", l, true);
           }
           
           return gn;
  +    }
  +
  +    public void dispose() {
  +        SVGOMUseElement ue = (SVGOMUseElement)e;
  +        if ((ue != null) &&
  +            (ue.getCSSImportedElementRoot() != null)) {
  +            disposeTree(ue.getCSSImportedElementRoot());
  +        }
  +
  +        super.dispose();
  +
  +        if (l == null) 
  +            return;
  +        // Remove event listeners
  +        EventTarget target = l.target;
  +        target.removeEventListener("DOMAttrModified", l, true);
  +        target.removeEventListener("DOMNodeInserted", l, true);
  +        target.removeEventListener("DOMNodeRemoved", l,true);
  +        target.removeEventListener("DOMCharacterDataModified", l, true);
  +        l = null;
       }
   
       /**
  
  
  
  1.8       +11 -1     xml-batik/sources/org/apache/batik/bridge/TextUtilities.java
  
  Index: TextUtilities.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/TextUtilities.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- TextUtilities.java        8 Aug 2003 11:38:51 -0000       1.7
  +++ TextUtilities.java        14 Dec 2003 15:14:57 -0000      1.8
  @@ -252,6 +252,16 @@
               return TextAttribute.WEIGHT_SEMIBOLD;
           default:
               return TextAttribute.WEIGHT_BOLD;
  +            /* Would like to do this but the JDK 1.3 & 1.4
  +               seems to drop back to 'REGULAR' instead of 'BOLD'
  +               if there is not a match.
  +        case 700:
  +            return TextAttribute.WEIGHT_HEAVY;
  +        case 800:
  +            return TextAttribute.WEIGHT_EXTRABOLD;
  +        case 900:
  +            return TextAttribute.WEIGHT_ULTRABOLD;
  +            */
           }
       }
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to