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