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: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]