deweese 2005/02/23 03:05:54 Modified: sources/org/apache/batik/gvt CompositeGraphicsNode.java sources/org/apache/batik/gvt/renderer DynamicRenderer.java sources/org/apache/batik/swing JSVGScrollPane.java sources/org/apache/batik/util RunnableQueue.java test-sources/org/apache/batik/util RunnableQueueTest.java Log: 1) Improved consistency of events from the RunnableQueue. Calling suspend/resumeExecution should now always generate a runHandler event (although the events may be "compressed" so suspend/resume may only generate one resume event). 2) Fixed "no paint" bug with dynamic canvas as child of JSVGScrollPane 3) ScrollPane now should do a better job of fitting document w/o scrollbars Revision Changes Path 1.43 +12 -2 xml-batik/sources/org/apache/batik/gvt/CompositeGraphicsNode.java Index: CompositeGraphicsNode.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/CompositeGraphicsNode.java,v retrieving revision 1.42 retrieving revision 1.43 diff -u -r1.42 -r1.43 --- CompositeGraphicsNode.java 12 Feb 2005 01:48:23 -0000 1.42 +++ CompositeGraphicsNode.java 23 Feb 2005 11:05:53 -0000 1.43 @@ -196,7 +196,14 @@ Rectangle2D bounds = null; while ((bounds == null) && i < count) { bounds = children[i++].getTransformedBounds(IDENTITY); + if (((i & 0x0F) == 0) && HaltingThread.hasBeenHalted()) + break; // check every 16 children if we have been interrupted. } + if (HaltingThread.hasBeenHalted()) { + invalidateGeometryCache(); + return null; + } + if (bounds == null) { primitiveBounds = NULL_RECT; return null; @@ -215,6 +222,9 @@ primitiveBounds.add(ctb); } } + + if (((i & 0x0F) == 0) && HaltingThread.hasBeenHalted()) + break; // check every 16 children if we have been interrupted. } // Check If we should halt early. @@ -300,7 +310,7 @@ */ public Rectangle2D getGeometryBounds() { if (geometryBounds == null) { - // System.out.println("geometryBounds are null"); + // System.err.println("geometryBounds are null"); int i=0; while(geometryBounds == null && i < count){ geometryBounds = 1.22 +3 -4 xml-batik/sources/org/apache/batik/gvt/renderer/DynamicRenderer.java Index: DynamicRenderer.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/renderer/DynamicRenderer.java,v retrieving revision 1.21 retrieving revision 1.22 diff -u -r1.21 -r1.22 --- DynamicRenderer.java 23 Oct 2004 17:11:03 -0000 1.21 +++ DynamicRenderer.java 23 Feb 2005 11:05:54 -0000 1.22 @@ -119,7 +119,6 @@ (rootCR.getColorModel(), workingRaster, rootCR.getColorModel().isAlphaPremultiplied(), null); - } if (!isDoubleBuffered) { @@ -160,8 +159,8 @@ updateWorkingBuffers(); if ((rootCR == null) || (workingBaseRaster == null)) { - // System.out.println("RootCR: " + rootCR); - // System.out.println("wrkBaseRaster: " + workingBaseRaster); + // System.err.println("RootCR: " + rootCR); + // System.err.println("wrkBaseRaster: " + workingBaseRaster); return; } cr = rootCR; 1.8 +4 -1 xml-batik/sources/org/apache/batik/swing/JSVGScrollPane.java Index: JSVGScrollPane.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/swing/JSVGScrollPane.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- JSVGScrollPane.java 20 Nov 2004 19:27:10 -0000 1.7 +++ JSVGScrollPane.java 23 Feb 2005 11:05:54 -0000 1.8 @@ -345,12 +345,15 @@ public void gvtBuildPrepare (GVTTreeBuilderEvent e) { isReady = false; + // Start by assuming we won't need them. + vertical .setVisible(false); + horizontalPanel.setVisible(false); + cornerBox .setVisible(false); } public void gvtBuildCompleted(GVTTreeBuilderEvent e) { isReady = true; viewBox = null; // new document forget old viewBox if any. - resizeScrollBars(); }// gvtRenderingCompleted() public void updateCompleted(UpdateManagerEvent e) { 1.21 +41 -12 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.20 retrieving revision 1.21 diff -u -r1.20 -r1.21 --- RunnableQueue.java 2 Dec 2004 01:24:37 -0000 1.20 +++ RunnableQueue.java 23 Feb 2005 11:05:54 -0000 1.21 @@ -71,6 +71,11 @@ */ protected Object stateLock = new Object(); + /** + * Used to indicate if the queue was resumed while + * still running, so a 'resumed' event can be sent. + */ + protected boolean wasResumed; /** * The Runnable objects list, also used as synchoronization point @@ -78,6 +83,10 @@ */ protected DoublyLinkedList list = new DoublyLinkedList(); + /** + * Count of preempt entries in queue, so preempt entries + * can be kept properly ordered. + */ protected int preemptCount = 0; /** @@ -131,21 +140,30 @@ // Mutex for suspention work. synchronized (stateLock) { - if (state != RUNNING) { - state = SUSPENDED; - - // notify suspendExecution in case it is - // waiting til we shut down. - stateLock.notifyAll(); - - executionSuspended(); + if (state == RUNNING) { + if (wasResumed) { + wasResumed = false; + executionResumed(); + } + } else { + while (state != RUNNING) { state = SUSPENDED; + + // notify suspendExecution in case it is + // waiting til we shut down. + stateLock.notifyAll(); + + executionSuspended(); + // Wait until resumeExecution called. - stateLock.wait(); + try { + stateLock.wait(); + } catch(InterruptedException ie) { } } + wasResumed = false; executionResumed(); } } @@ -321,10 +339,16 @@ throw new IllegalStateException ("RunnableQueue not started or has exited"); } + // System.err.println("Suspend Called"); synchronized (stateLock) { - if (state == SUSPENDED) - // already suspended... + wasResumed = false; + + if (state == SUSPENDED) { + // already suspended, notify stateLock so an event is + // generated. + stateLock.notifyAll(); return; + } if (state == RUNNING) { state = SUSPENDING; @@ -351,12 +375,15 @@ * @throws IllegalStateException if getThread() is null. */ public void resumeExecution() { + // System.err.println("Resume Called"); if (runnableQueueThread == null) { throw new IllegalStateException ("RunnableQueue not started or has exited"); } synchronized (stateLock) { + wasResumed = true; + if (state != RUNNING) { state = RUNNING; stateLock.notifyAll(); // wake it up. @@ -425,6 +452,7 @@ * Currently just notifies runHandler */ protected synchronized void executionSuspended() { + // System.err.println("Suspend Sent"); if (runHandler != null) { runHandler.executionSuspended(this); } @@ -435,6 +463,7 @@ * Currently just notifies runHandler */ protected synchronized void executionResumed() { + // System.err.println("Resumed Sent"); if (runHandler != null) { runHandler.executionResumed(this); } 1.7 +5 -2 xml-batik/test-sources/org/apache/batik/util/RunnableQueueTest.java Index: RunnableQueueTest.java =================================================================== RCS file: /home/cvs/xml-batik/test-sources/org/apache/batik/util/RunnableQueueTest.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- RunnableQueueTest.java 18 Aug 2004 07:17:15 -0000 1.6 +++ RunnableQueueTest.java 23 Feb 2005 11:05:54 -0000 1.7 @@ -37,9 +37,12 @@ * @param sync Should requests be made synchronously (from * different threads). */ - public RunnableQueueTest(int nThreads, boolean sync) { + public RunnableQueueTest(int nThreads) { this.nThreads = nThreads; } + public RunnableQueueTest(Integer nThreads) { + this((nThreads==null)?10:nThreads.intValue()); + } /** * Returns this Test's name @@ -203,7 +206,7 @@ } public static void main(String []args) { - RunnableQueueTest rqt = new RunnableQueueTest(20, false); + RunnableQueueTest rqt = new RunnableQueueTest(20); try { rqt.runImpl(); } catch (Exception e) {
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]