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 2004/12/16 11:50:35 UTC
cvs commit: xml-batik/sources/org/apache/batik/bridge SVGImageElementBridge.java
deweese 2004/12/16 02:50:35
Modified: sources/org/apache/batik/bridge SVGImageElementBridge.java
Log:
Memory leak when loading images is fixed.
Revision Changes Path
1.69 +37 -24 xml-batik/sources/org/apache/batik/bridge/SVGImageElementBridge.java
Index: SVGImageElementBridge.java
===================================================================
RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGImageElementBridge.java,v
retrieving revision 1.68
retrieving revision 1.69
diff -u -r1.68 -r1.69
--- SVGImageElementBridge.java 20 Aug 2004 19:29:46 -0000 1.68
+++ SVGImageElementBridge.java 16 Dec 2004 10:50:35 -0000 1.69
@@ -472,27 +472,41 @@
}
protected void rebuildImageNode() {
- //reference copy of the imgDocument
- SVGDocument oldSVGDoc = imgDocument;
+ // Reference copy of the imgDocument
+ if ((imgDocument != null) && (listener != null)) {
+ EventTarget tgt = (EventTarget)imgDocument.getRootElement();
+
+ tgt.removeEventListener(SVG_EVENT_CLICK, listener, false);
+ tgt.removeEventListener(SVG_EVENT_KEYDOWN, listener, false);
+ tgt.removeEventListener(SVG_EVENT_KEYPRESS, listener, false);
+ tgt.removeEventListener(SVG_EVENT_KEYUP, listener, false);
+ tgt.removeEventListener(SVG_EVENT_MOUSEDOWN, listener, false);
+ tgt.removeEventListener(SVG_EVENT_MOUSEMOVE, listener, false);
+ tgt.removeEventListener(SVG_EVENT_MOUSEOUT, listener, false);
+ tgt.removeEventListener(SVG_EVENT_MOUSEOVER, listener, false);
+ tgt.removeEventListener(SVG_EVENT_MOUSEUP, listener, false);
+ listener = null;
+ }
+
+ if (imgDocument != null) {
+ SVGSVGElement svgElement = imgDocument.getRootElement();
+ disposeTree(svgElement);
+ }
+
+ imgDocument = null;
+ subCtx = null;
//update of the reference of the image.
GraphicsNode inode = buildImageGraphicsNode(ctx,e);
+ ImageNode imgNode = (ImageNode)node;
+ imgNode.setImage(inode);
+
if (inode == null) {
String uriStr = XLinkSupport.getXLinkHref(e);
throw new BridgeException(e, ERR_URI_IMAGE_INVALID,
new Object[] {uriStr});
}
- ImageNode imgNode = (ImageNode)node;
- //HACK : see 'initializeDynamicSupport'
- if (!(imgNode.getImage() instanceof RasterImageNode)) {
- //it was an svg file referenced
- //dispose it
- if ( oldSVGDoc != null ){
- disposeTree(oldSVGDoc);
- }
- }
- imgNode.setImage(inode);
}
/**
@@ -601,7 +615,9 @@
CanvasGraphicsNode node;
node = (CanvasGraphicsNode)subCtx.getGVTBuilder().build
(subCtx, svgElement);
- subCtx.addUIEventListeners(imgDocument);
+
+ if (eng == null) // If we "created" this document then add listerns.
+ subCtx.addUIEventListeners(imgDocument);
// HACK: remove the clip set by the SVGSVGElement as the overflow
// and clip properties must be ignored. The clip will be set later
@@ -660,12 +676,6 @@
}
public void dispose() {
- if (imgDocument != null) {
- SVGSVGElement svgElement = imgDocument.getRootElement();
- disposeTree(svgElement);
- }
- super.dispose();
-
if ((imgDocument != null) && (listener != null)) {
EventTarget tgt = (EventTarget)imgDocument.getRootElement();
@@ -680,12 +690,15 @@
tgt.removeEventListener(SVG_EVENT_MOUSEUP, listener, false);
listener = null;
}
- if (subCtx != null) {
- subCtx.removeUIEventListeners(imgDocument);
+
+ if (imgDocument != null) {
+ SVGSVGElement svgElement = imgDocument.getRootElement();
+ disposeTree(svgElement);
+ imgDocument = null;
+ subCtx = null;
}
+ super.dispose();
- imgDocument = null;
- subCtx = null;
}
/**
* A simple DOM listener to forward events from the SVG image document to
---------------------------------------------------------------------
To unsubscribe, e-mail: batik-dev-unsubscribe@xml.apache.org
For additional commands, e-mail: batik-dev-help@xml.apache.org