deweese 2003/11/05 14:21:10
Modified: sources/org/apache/batik/bridge SVGSVGElementBridge.java
SVGUseElementBridge.java UpdateManager.java
sources/org/apache/batik/gvt/filter BackgroundRable8Bit.java
sources/org/apache/batik/swing/svg JSVGComponent.java
sources/org/apache/batik/util DoublyLinkedList.java
RunnableQueue.java
Log:
1) Fixed memory leak when 'use'd content changes.
2) More Race condition work
3) JSVGCanvas now delays setting Canvas side until after onload event if any.
Revision Changes Path
1.39 +3 -5
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.38
retrieving revision 1.39
diff -u -r1.38 -r1.39
--- SVGSVGElementBridge.java 7 Sep 2003 22:25:27 -0000 1.38
+++ SVGSVGElementBridge.java 5 Nov 2003 22:21:09 -0000 1.39
@@ -183,11 +183,9 @@
if (!isOutermost) {
// X & Y are ignored on outermost SVG.
cgn.setPositionTransform(positionTransform);
- } else {
+ } else if (doc == ctx.getDocument()) {
// <!> FIXME: hack to compute the original document's size
- if (ctx.getDocumentSize() == null) {
- ctx.setDocumentSize(new Dimension((int)w, (int)h));
- }
+ ctx.setDocumentSize(new Dimension((int)w, (int)h));
}
// Set the viewing transform, this is often updated when the
// component prepares for rendering.
1.36 +5 -1
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.35
retrieving revision 1.36
diff -u -r1.35 -r1.36
--- SVGUseElementBridge.java 9 Aug 2003 16:58:37 -0000 1.35
+++ SVGUseElementBridge.java 5 Nov 2003 22:21:09 -0000 1.36
@@ -198,6 +198,10 @@
root.appendChild(localRefElement);
SVGOMUseElement ue = (SVGOMUseElement)e;
+ Node oldRoot = ue.getCSSImportedElementRoot();
+ if (oldRoot != null) {
+ disposeTree(oldRoot);
+ }
ue.setCSSImportedElementRoot(root);
Element g = localRefElement;
1.29 +10 -10 xml-batik/sources/org/apache/batik/bridge/UpdateManager.java
Index: UpdateManager.java
===================================================================
RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/UpdateManager.java,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -r1.28 -r1.29
--- UpdateManager.java 31 Oct 2003 22:39:41 -0000 1.28
+++ UpdateManager.java 5 Nov 2003 22:21:10 -0000 1.29
@@ -313,21 +313,21 @@
*/
public synchronized void interrupt() {
if (updateRunnableQueue.getThread() != null) {
- if (started) {
- dispatchSVGUnLoadEvent();
- } else {
- // Invoke first to cancel the pending tasks
- updateRunnableQueue.preemptLater(new Runnable() {
- public void run() {
+ // Preempt to cancel the pending tasks
+ updateRunnableQueue.preemptLater(new Runnable() {
+ public void run() {
+ if (started) {
+ dispatchSVGUnLoadEvent();
+ } else {
synchronized (UpdateManager.this) {
running = false;
scriptingEnvironment.interrupt();
updateRunnableQueue.getThread().interrupt();
}
}
- });
- resume();
- }
+ }
+ });
+ resume();
}
}
1.15 +6 -3
xml-batik/sources/org/apache/batik/gvt/filter/BackgroundRable8Bit.java
Index: BackgroundRable8Bit.java
===================================================================
RCS file:
/home/cvs/xml-batik/sources/org/apache/batik/gvt/filter/BackgroundRable8Bit.java,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- BackgroundRable8Bit.java 8 Aug 2003 11:39:15 -0000 1.14
+++ BackgroundRable8Bit.java 5 Nov 2003 22:21:10 -0000 1.15
@@ -204,8 +204,11 @@
// Add our childrens bounds to it...
CompositeGraphicsNode cgn = (CompositeGraphicsNode)gn;
r2d = addBounds(cgn, child, r2d);
- } else
- r2d.add(gn.getPrimitiveBounds());
+ } else {
+ Rectangle2D gnb = gn.getPrimitiveBounds();
+ if (gnb != null)
+ r2d.add(gnb);
+ }
return r2d;
}
1.91 +39 -42 xml-batik/sources/org/apache/batik/swing/svg/JSVGComponent.java
Index: JSVGComponent.java
===================================================================
RCS file: /home/cvs/xml-batik/sources/org/apache/batik/swing/svg/JSVGComponent.java,v
retrieving revision 1.90
retrieving revision 1.91
diff -u -r1.90 -r1.91
--- JSVGComponent.java 3 Nov 2003 11:58:27 -0000 1.90
+++ JSVGComponent.java 5 Nov 2003 22:21:10 -0000 1.91
@@ -596,33 +596,26 @@
* queue thread. It returns immediately.
*/
protected void stopThenRun(final Runnable r) {
- synchronized (this) {
- if (afterStopRunnable != null) {
- // Have it run our new runnable, and not
+ if (afterStopRunnable != null) {
+ // Have it run our new runnable, and not
// run the 'old' runnable.
- afterStopRunnable = r;
- return;
- }
afterStopRunnable = r;
+ return;
}
- if (documentLoader != null) {
- stopProcessing();
- } else if (gvtTreeBuilder != null) {
- stopProcessing();
- } else if (updateManager != null) {
- stopProcessing();
- } else if (nextUpdateManager != null) {
- stopProcessing();
- } else if (svgLoadEventDispatcher != null) {
- stopProcessing();
- } else {
- stopProcessing();
- synchronized (this) {
- Runnable asr = afterStopRunnable;
- afterStopRunnable = null;
- asr.run();
- }
+ afterStopRunnable = r;
+
+ stopProcessing();
+
+ if ((documentLoader == null) &&
+ (gvtTreeBuilder == null) &&
+ (gvtTreeRenderer == null) &&
+ (svgLoadEventDispatcher == null) &&
+ (nextUpdateManager == null) &&
+ (updateManager == null)) {
+ Runnable asr = afterStopRunnable;
+ afterStopRunnable = null;
+ asr.run();
}
}
@@ -749,6 +742,28 @@
reg.flushCache();
}
+ public void setGraphicsNode(GraphicsNode gn, boolean createDispatcher) {
+ Dimension2D dim = bridgeContext.getDocumentSize();
+ Dimension mySz = new Dimension((int)dim.getWidth(),
+ (int)dim.getHeight());
+ JSVGComponent.this.setMySize(mySz);
+ SVGSVGElement elt = svgDocument.getRootElement();
+ Dimension d = getSize();
+ prevComponentSize = d;
+ if (d.width < 1) d.width = 1;
+ if (d.height < 1) d.height = 1;
+ AffineTransform at = ViewBox.getViewTransform
+ (fragmentIdentifier, elt, d.width, d.height);
+ CanvasGraphicsNode cgn = getCanvasGraphicsNode(gn);
+ cgn.setViewingTransform(at);
+ initialTransform = new AffineTransform();
+ setRenderingTransform(initialTransform, false);
+ jsvgComponentListener.updateMatrix(initialTransform);
+ addJGVTComponentListener(jsvgComponentListener);
+ addComponentListener(jsvgComponentListener);
+ super.setGraphicsNode(gn, createDispatcher);
+ }
+
/**
* Creates a new bridge context.
*/
@@ -1282,24 +1297,6 @@
return;
}
- Dimension2D dim = bridgeContext.getDocumentSize();
- Dimension mySz = new Dimension((int)dim.getWidth(),
- (int)dim.getHeight());
- JSVGComponent.this.setMySize(mySz);
- SVGSVGElement elt = svgDocument.getRootElement();
- Dimension d = getSize();
- prevComponentSize = d;
- if (d.width < 1) d.width = 1;
- if (d.height < 1) d.height = 1;
- AffineTransform at = ViewBox.getViewTransform
- (fragmentIdentifier, elt, d.width, d.height);
- CanvasGraphicsNode cgn = getCanvasGraphicsNode(e.getGVTRoot());
- cgn.setViewingTransform(at);
- initialTransform = new AffineTransform();
- setRenderingTransform(initialTransform, false);
- jsvgComponentListener.updateMatrix(initialTransform);
- addJGVTComponentListener(jsvgComponentListener);
- addComponentListener(jsvgComponentListener);
gvtRoot = null;
if (isDynamicDocument && JSVGComponent.this.eventsEnabled) {
1.4 +13 -0 xml-batik/sources/org/apache/batik/util/DoublyLinkedList.java
Index: DoublyLinkedList.java
===================================================================
RCS file: /home/cvs/xml-batik/sources/org/apache/batik/util/DoublyLinkedList.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- DoublyLinkedList.java 8 Aug 2003 11:39:26 -0000 1.3
+++ DoublyLinkedList.java 5 Nov 2003 22:21:10 -0000 1.4
@@ -148,6 +148,19 @@
head = nde;
}
+ public void add(int index, Node nde) {
+ if (nde == null) return;
+ Node after = head;
+ while (index != 0) {
+ after = after.getNext();
+ index--;
+ }
+ nde.insertBefore(after);
+ if (after == head)
+ head=nde;
+ size++;
+ }
+
/**
* Adds <tt>nde</tt> to the head of the list.
* In perl this is called an 'unpop'. <tt>nde</tt> should
1.15 +8 -3 xml-batik/sources/org/apache/batik/util/RunnableQueue.java
Index: RunnableQueue.java
===================================================================
RCS file: /home/cvs/xml-batik/sources/org/apache/batik/util/RunnableQueue.java,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- RunnableQueue.java 16 Sep 2003 01:12:53 -0000 1.14
+++ RunnableQueue.java 5 Nov 2003 22:21:10 -0000 1.15
@@ -111,6 +111,8 @@
*/
protected DoublyLinkedList list = new DoublyLinkedList();
+ protected int preemptCount = 0;
+
/**
* The object which handle run events.
*/
@@ -191,6 +193,7 @@
if (state == SUSPENDING)
continue;
l = (Link)list.pop();
+ if (preemptCount != 0) preemptCount--;
if (l == null) {
// No item to run, wait till there is one.
list.wait();
@@ -288,7 +291,8 @@
("RunnableQueue not started or has exited");
}
synchronized (list) {
- list.unpop(new Link(r));
+ list.add(preemptCount, new Link(r));
+ preemptCount++;
list.notify();
}
}
@@ -315,7 +319,8 @@
LockableLink l = new LockableLink(r);
synchronized (list) {
- list.unpop(l);
+ list.add(preemptCount, l);
+ preemptCount++;
list.notify();
}
l.lock();
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]