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]