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 hi...@apache.org on 2001/03/26 17:46:21 UTC
cvs commit: xml-batik/sources/org/apache/batik/swing/gvt GVTTreeRenderer.java JGVTComponent.java
hillion 01/03/26 07:46:21
Modified: resources/org/apache/batik/apps/svgbrowser/resources
GUI.properties
sources/org/apache/batik/apps/svgbrowser
JSVGViewerFrame.java
sources/org/apache/batik/swing/gvt GVTTreeRenderer.java
JGVTComponent.java
Log:
Integration of the renderer double-buffering feature in JGVTComponent and
the browser (an item as been added to the 'Options' menu).
Revision Changes Path
1.9 +4 -3 xml-batik/resources/org/apache/batik/apps/svgbrowser/resources/GUI.properties
Index: GUI.properties
===================================================================
RCS file: /home/cvs/xml-batik/resources/org/apache/batik/apps/svgbrowser/resources/GUI.properties,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- GUI.properties 2001/03/19 09:15:47 1.8
+++ GUI.properties 2001/03/26 15:46:16 1.9
@@ -9,7 +9,7 @@
# The viewer's GUI resources.
#
# Author: stephane@hillion.org
-# $Id: GUI.properties,v 1.8 2001/03/19 09:15:47 hillion Exp $
+# $Id: GUI.properties,v 1.9 2001/03/26 15:46:16 hillion Exp $
#
ViewSource.width = 750
@@ -186,7 +186,8 @@
HistoryMarker.text = @@@
# Options menu ############
-Options = ShowRendering AutoAdjust - Language StyleSheet - ShowDebug
+Options = ShowRendering AutoAdjust DoubleBuffer - Language StyleSheet \
+ - ShowDebug
Options.type = MENU
Options.text = Options
Options.mnemonic = O
@@ -206,7 +207,7 @@
AutoAdjust.selected = true
DoubleBuffer.type = CHECK
-DoubleBuffer.text = Enable/Disable Double Buffering
+DoubleBuffer.text = Enable Double Buffering
DoubleBuffer.icon = resources/blank.gif
DoubleBuffer.mnemonic = D
DoubleBuffer.action = DoubleBufferAction
1.10 +28 -7 xml-batik/sources/org/apache/batik/apps/svgbrowser/JSVGViewerFrame.java
Index: JSVGViewerFrame.java
===================================================================
RCS file: /home/cvs/xml-batik/sources/org/apache/batik/apps/svgbrowser/JSVGViewerFrame.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- JSVGViewerFrame.java 2001/03/24 10:03:03 1.9
+++ JSVGViewerFrame.java 2001/03/26 15:46:18 1.10
@@ -125,7 +125,7 @@
* This class represents a SVG viewer swing frame.
*
* @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
- * @version $Id: JSVGViewerFrame.java,v 1.9 2001/03/24 10:03:03 hillion Exp $
+ * @version $Id: JSVGViewerFrame.java,v 1.10 2001/03/26 15:46:18 hillion Exp $
*/
public class JSVGViewerFrame
extends JFrame
@@ -157,7 +157,7 @@
public final static String ZOOM_IN_ACTION = "ZoomInAction";
public final static String ZOOM_OUT_ACTION = "ZoomOutAction";
public final static String STOP_ACTION = "StopAction";
- //public final static String DOUBLE_BUFFER_ACTION = "DoubleBufferAction";
+ public final static String DOUBLE_BUFFER_ACTION = "DoubleBufferAction";
public final static String AUTO_ADJUST_ACTION = "AutoAdjustAction";
public final static String SHOW_DEBUG_ACTION = "ShowDebugAction";
public final static String SHOW_RENDERING_ACTION = "ShowRenderingAction";
@@ -308,6 +308,11 @@
protected LocalHistory localHistory;
/**
+ * the ShowRenderingAction.
+ */
+ protected ShowRenderingAction showRenderingAction = new ShowRenderingAction();
+
+ /**
* Creates a new SVG viewer frame.
*/
public JSVGViewerFrame(Application app) {
@@ -335,10 +340,10 @@
listeners.put(ZOOM_IN_ACTION, new ZoomInAction());
listeners.put(ZOOM_OUT_ACTION, new ZoomOutAction());
listeners.put(STOP_ACTION, stopAction);
- //listeners.put(DOUBLE_BUFFER_ACTION, new DoubleBufferAction());
+ listeners.put(DOUBLE_BUFFER_ACTION, new DoubleBufferAction());
listeners.put(AUTO_ADJUST_ACTION, new AutoAdjustAction());
listeners.put(SHOW_DEBUG_ACTION, new ShowDebugAction());
- listeners.put(SHOW_RENDERING_ACTION, new ShowRenderingAction());
+ listeners.put(SHOW_RENDERING_ACTION, showRenderingAction);
listeners.put(LANGUAGE_ACTION, new LanguageAction());
listeners.put(STYLE_SHEET_ACTION, new StyleSheetAction());
listeners.put(MONITOR_ACTION, new MonitorAction());
@@ -998,8 +1003,9 @@
public class DoubleBufferAction extends AbstractAction {
public DoubleBufferAction() {}
public void actionPerformed(ActionEvent e) {
- svgCanvas.setDoubleBufferedRendering
- (((JCheckBoxMenuItem)e.getSource()).isSelected());
+ boolean b = ((JCheckBoxMenuItem)e.getSource()).isSelected();
+ showRenderingAction.update(!b);
+ svgCanvas.setDoubleBufferedRendering(b);
}
}
@@ -1027,11 +1033,26 @@
/**
* To enable progressive rendering.
*/
- public class ShowRenderingAction extends AbstractAction {
+ public class ShowRenderingAction
+ extends AbstractAction
+ implements JComponentModifier {
+ java.util.List components = new LinkedList();
public ShowRenderingAction() {}
public void actionPerformed(ActionEvent e) {
svgCanvas.setProgressivePaint
(((JCheckBoxMenuItem)e.getSource()).isSelected());
+ }
+
+ public void addJComponent(JComponent c) {
+ components.add(c);
+ c.setEnabled(true);
+ }
+
+ public void update(boolean enabled) {
+ Iterator it = components.iterator();
+ while (it.hasNext()) {
+ ((JComponent)it.next()).setEnabled(enabled);
+ }
}
}
1.2 +46 -6 xml-batik/sources/org/apache/batik/swing/gvt/GVTTreeRenderer.java
Index: GVTTreeRenderer.java
===================================================================
RCS file: /home/cvs/xml-batik/sources/org/apache/batik/swing/gvt/GVTTreeRenderer.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- GVTTreeRenderer.java 2001/03/08 01:21:07 1.1
+++ GVTTreeRenderer.java 2001/03/26 15:46:19 1.2
@@ -11,6 +11,8 @@
import java.awt.EventQueue;
import java.awt.Shape;
+import java.awt.geom.AffineTransform;
+
import java.awt.image.BufferedImage;
import java.util.Collections;
@@ -24,7 +26,7 @@
* a GVT tree.
*
* @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
- * @version $Id: GVTTreeRenderer.java,v 1.1 2001/03/08 01:21:07 hillion Exp $
+ * @version $Id: GVTTreeRenderer.java,v 1.2 2001/03/26 15:46:19 hillion Exp $
*/
public class GVTTreeRenderer extends Thread {
@@ -49,6 +51,16 @@
protected int height;
/**
+ * The user to device transform.
+ */
+ protected AffineTransform user2DeviceTransform;
+
+ /**
+ * Whether to enable the double buffering.
+ */
+ protected boolean doubleBuffering;
+
+ /**
* The listeners.
*/
protected List listeners = Collections.synchronizedList(new LinkedList());
@@ -56,12 +68,18 @@
/**
* Creates a new GVTTreeRenderer.
* @param r The renderer to use to paint.
+ * @param usr2dev The user to device transform.
+ * @param dbuffer Whether the double buffering should be enabled.
* @param aoi The area of interest in the renderer space units.
* @param width height The offscreen buffer size.
*/
- public GVTTreeRenderer(ImageRenderer r, Shape aoi, int width, int height) {
+ public GVTTreeRenderer(ImageRenderer r, AffineTransform usr2dev,
+ boolean dbuffer,
+ Shape aoi, int width, int height) {
renderer = r;
areaOfInterest = aoi;
+ user2DeviceTransform = usr2dev;
+ doubleBuffering = dbuffer;
this.width = width;
this.height = height;
}
@@ -73,18 +91,24 @@
try {
firePrepareEvent();
+ renderer.setTransform(user2DeviceTransform);
+ renderer.setDoubleBuffered(doubleBuffering);
renderer.updateOffScreen(width, height);
renderer.clearOffScreen();
+ if (checkInterrupted()) {
+ return;
+ }
+
fireStartedEvent(renderer.getOffScreen());
renderer.repaint(areaOfInterest);
- if (Thread.currentThread().isInterrupted()) {
- fireCancelledEvent(renderer.getOffScreen());
- } else {
- fireCompletedEvent(renderer.getOffScreen());
+ if (checkInterrupted()) {
+ return;
}
+
+ fireCompletedEvent(renderer.getOffScreen());
} catch (Exception e) {
e.printStackTrace();
fireFailedEvent();
@@ -103,6 +127,22 @@
*/
public void removeGVTTreeRendererListener(GVTTreeRendererListener l) {
listeners.remove(l);
+ }
+
+ /**
+ * Checks for this thread to be interrupted.
+ */
+ protected boolean checkInterrupted() {
+ // don't use isInterrupted() since that won't clear the
+ // interrupted state of this thread. If that isn't cleared
+ // then the next function that is declaired to throw
+ // InterruptedException will do so, this in particular
+ // effects class loading.
+ if (!Thread.interrupted())
+ return false;
+
+ fireCancelledEvent(renderer.getOffScreen());
+ return true;
}
/**
1.4 +115 -60 xml-batik/sources/org/apache/batik/swing/gvt/JGVTComponent.java
Index: JGVTComponent.java
===================================================================
RCS file: /home/cvs/xml-batik/sources/org/apache/batik/swing/gvt/JGVTComponent.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- JGVTComponent.java 2001/03/18 16:29:22 1.3
+++ JGVTComponent.java 2001/03/26 15:46:20 1.4
@@ -52,7 +52,7 @@
* This class represents a component which can display a GVT tree.
*
* @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
- * @version $Id: JGVTComponent.java,v 1.3 2001/03/18 16:29:22 hillion Exp $
+ * @version $Id: JGVTComponent.java,v 1.4 2001/03/26 15:46:20 hillion Exp $
*/
public class JGVTComponent extends JComponent {
@@ -148,6 +148,11 @@
protected TextSelectionManager textSelectionManager;
/**
+ * Whether the double buffering is enabled.
+ */
+ protected boolean doubleBufferedRendering;
+
+ /**
* Whether the GVT tree should be reactive to mouse and key events.
*/
protected boolean eventsEnabled;
@@ -159,6 +164,11 @@
protected boolean selectableText;
/**
+ * Whether to suspend interactions.
+ */
+ protected boolean suspendInteractions;
+
+ /**
* Creates a new JGVTComponent.
*/
public JGVTComponent() {
@@ -173,7 +183,6 @@
* if eventEnabled is false, this flag is ignored.
*/
public JGVTComponent(boolean eventsEnabled, boolean selectableText) {
- setDoubleBuffered(false);
setBackground(Color.white);
this.eventsEnabled = eventsEnabled;
@@ -190,13 +199,7 @@
addComponentListener(new ComponentAdapter() {
public void componentResized(ComponentEvent e) {
updateRenderingTransform();
- if (gvtTreeRenderer != null) {
- needRender = true;
- gvtTreeRenderer.interrupt();
- } else {
- image = null;
- renderGVTTree();
- }
+ scheduleGVTRendering();
}
});
@@ -229,10 +232,7 @@
public void stopProcessing() {
if (gvtTreeRenderer != null) {
gvtTreeRenderer.interrupt();
- if (progressivePaintThread != null) {
- progressivePaintThread.interrupt();
- progressivePaintThread = null;
- }
+ interruptProgressivePaintThread();
}
}
@@ -278,9 +278,33 @@
public void setProgressivePaint(boolean b) {
if (progressivePaint != b) {
progressivePaint = b;
- if (progressivePaintThread != null) {
- progressivePaintThread.interrupt();
- progressivePaintThread = null;
+ interruptProgressivePaintThread();
+ }
+ }
+
+ /**
+ * Tells whether the progressive paint is enabled.
+ */
+ public boolean getProgressivePaint() {
+ return progressivePaint;
+ }
+
+ /**
+ * Repaints immediately the component.
+ */
+ public void immediateRepaint() {
+ if (java.awt.EventQueue.isDispatchThread()) {
+ Dimension dim = getSize();
+ paintImmediately(0, 0, dim.width, dim.height);
+ } else {
+ try {
+ java.awt.EventQueue.invokeAndWait(new Runnable() {
+ public void run() {
+ Dimension dim = getSize();
+ paintImmediately(0, 0, dim.width, dim.height);
+ }
+ });
+ } catch (Exception e) {
}
}
}
@@ -319,7 +343,7 @@
*/
public void setPaintingTransform(AffineTransform at) {
paintingTransform = at;
- repaint();
+ immediateRepaint();
}
/**
@@ -335,21 +359,15 @@
*/
public void setRenderingTransform(AffineTransform at) {
renderingTransform = at;
+ suspendInteractions = true;
if (eventDispatcher != null) {
try {
eventDispatcher.setBaseTransform(renderingTransform.createInverse());
} catch (NoninvertibleTransformException e) {
handleException(e);
}
- }
- paintingTransform = null;
- if (gvtTreeRenderer != null) {
- needRender = true;
- gvtTreeRenderer.interrupt();
- } else {
- image = null;
- renderGVTTree();
}
+ scheduleGVTRendering();
}
/**
@@ -361,10 +379,19 @@
/**
* Sets whether this component should use double buffering to render
- * SVG documents.
+ * SVG documents. The change will be effective during the next
+ * rendering.
*/
public void setDoubleBufferedRendering(boolean b) {
- // !!! TODO
+ doubleBufferedRendering = b;
+ }
+
+ /**
+ * Tells whether this component use double buffering to render
+ * SVG documents.
+ */
+ public boolean getDoubleBufferedRendering() {
+ return doubleBufferedRendering;
}
/**
@@ -395,7 +422,6 @@
renderer = rendererFactory.createImageRenderer();
renderer.setTree(gvtRoot);
}
- renderer.setTransform(renderingTransform);
// Area of interest computation.
AffineTransform inv;
@@ -407,7 +433,9 @@
Shape s = inv.createTransformedShape(new Rectangle(0, 0, d.width, d.height));
// Rendering thread setup.
- gvtTreeRenderer = new GVTTreeRenderer(renderer, s, d.width, d.height);
+ gvtTreeRenderer = new GVTTreeRenderer(renderer, renderingTransform,
+ doubleBufferedRendering,
+ s, d.width, d.height);
gvtTreeRenderer.setPriority(Thread.MIN_PRIORITY);
Iterator it = gvtTreeRendererListeners.iterator();
@@ -436,7 +464,7 @@
* Updates the value of the transform used for rendering.
*/
protected void updateRenderingTransform() {
- // Do nothing
+ // Do nothing.
}
/**
@@ -460,6 +488,25 @@
}
/**
+ * Schedules a new GVT rendering.
+ */
+ protected void scheduleGVTRendering() {
+ if (gvtTreeRenderer != null) {
+ needRender = true;
+ gvtTreeRenderer.interrupt();
+ } else {
+ renderGVTTree();
+ }
+ }
+
+ private void interruptProgressivePaintThread() {
+ if (progressivePaintThread != null) {
+ progressivePaintThread.interrupt();
+ progressivePaintThread = null;
+ }
+ }
+
+ /**
* Creates an instance of Listener.
*/
protected Listener createListener() {
@@ -487,85 +534,93 @@
* Called when a rendering is in its preparing phase.
*/
public void gvtRenderingPrepare(GVTTreeRendererEvent e) {
- // Do nothing
+ suspendInteractions = true;
+ if (!progressivePaint && !doubleBufferedRendering) {
+ image = null;
+ immediateRepaint();
+ }
}
/**
* Called when a rendering started.
- * The data of the event is initialized to the old document.
*/
public void gvtRenderingStarted(GVTTreeRendererEvent e) {
- if (progressivePaint /* && !doubleBuffering */) {
+ paintingTransform = null;
+ if (progressivePaint && !doubleBufferedRendering) {
image = e.getImage();
progressivePaintThread = new Thread() {
public void run() {
+ final Thread thisThread = this;
try {
while (!isInterrupted()) {
- repaint();
+ java.awt.EventQueue.invokeAndWait(new Runnable() {
+ public void run() {
+ if (progressivePaintThread == thisThread) {
+ Dimension dim = getSize();
+ paintImmediately(0, 0,
+ dim.width, dim.height);
+ }
+ }
+ });
sleep(200);
}
- } catch (InterruptedException e) {
+ } catch (Exception e) {
}
}
};
progressivePaintThread.setPriority(Thread.MIN_PRIORITY + 1);
progressivePaintThread.start();
}
+ suspendInteractions = false;
}
/**
* Called when a rendering was completed.
*/
public void gvtRenderingCompleted(GVTTreeRendererEvent e) {
- if (progressivePaintThread != null) {
- progressivePaintThread.interrupt();
- progressivePaintThread = null;
- }
+ interruptProgressivePaintThread();
+
gvtTreeRenderer = null;
- image = e.getImage();
if (needRender) {
- image = null;
renderGVTTree();
needRender = false;
+ } else {
+ image = e.getImage();
+ immediateRepaint();
}
if (eventDispatcher != null) {
eventDispatcher.setRootNode(gvtRoot);
}
- repaint();
}
/**
* Called when a rendering was cancelled.
*/
public void gvtRenderingCancelled(GVTTreeRendererEvent e) {
- if (progressivePaintThread != null) {
- progressivePaintThread.interrupt();
- progressivePaintThread = null;
- }
- gvtTreeRenderer = null;
- image = null;
- if (needRender) {
- renderGVTTree();
- needRender = false;
- }
- repaint();
+ renderingStopped();
}
/**
* Called when a rendering failed.
*/
public void gvtRenderingFailed(GVTTreeRendererEvent e) {
- if (progressivePaintThread != null) {
- progressivePaintThread.interrupt();
- progressivePaintThread = null;
- }
+ renderingStopped();
+ }
+
+ /**
+ * The actual implementation of gvtRenderingCancelled() and
+ * gvtRenderingFailed().
+ */
+ private void renderingStopped() {
+ interruptProgressivePaintThread();
+
gvtTreeRenderer = null;
- image = null;
if (needRender) {
renderGVTTree();
needRender = false;
+ } else {
+ immediateRepaint();
}
- repaint();
}
// KeyListener //////////////////////////////////////////////////////////
@@ -712,7 +767,7 @@
* Selects an interactor, given an input event.
*/
protected void selectInteractor(InputEvent ie) {
- if (interactor == null) {
+ if (!suspendInteractions && interactor == null) {
Iterator it = interactors.iterator();
while (it.hasNext()) {
Interactor i = (Interactor)it.next();
---------------------------------------------------------------------
To unsubscribe, e-mail: batik-dev-unsubscribe@xml.apache.org
For additional commands, e-mail: batik-dev-help@xml.apache.org