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&nbsp;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