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 <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]