You are viewing a plain text version of this content. The canonical link for it is here.
Posted to batik-commits@xmlgraphics.apache.org by de...@apache.org on 2005/10/13 12:22:10 UTC

svn commit: r320711 - in /xmlgraphics/batik/branches/svg11: sources/org/apache/batik/gvt/ sources/org/apache/batik/gvt/renderer/ test-references/samples/ test-references/samples/tests/spec/coordinates/ test-references/samples/tests/spec/filters/ test-r...

Author: deweese
Date: Thu Oct 13 03:21:45 2005
New Revision: 320711

URL: http://svn.apache.org/viewcvs?rev=320711&view=rev
Log:
1) New MacRenderer implementation that avoids 10x slowdown on
   Tiger.
2) Update to the handling of clipping in AbstractGraphicsNode.
   This avoids 'dirty bits' with Mac Renderer and potentially
   avoids other rendering errors around the edges of clipped
   regions.

Added:
    xmlgraphics/batik/branches/svg11/sources/org/apache/batik/gvt/renderer/MacRenderer.java
      - copied, changed from r290149, xmlgraphics/batik/branches/svg11/sources/org/apache/batik/gvt/renderer/DynamicRenderer.java
Modified:
    xmlgraphics/batik/branches/svg11/sources/org/apache/batik/gvt/AbstractGraphicsNode.java
    xmlgraphics/batik/branches/svg11/sources/org/apache/batik/gvt/renderer/ConcreteImageRendererFactory.java
    xmlgraphics/batik/branches/svg11/test-references/samples/tests/spec/coordinates/percentagesAndUnits.png
    xmlgraphics/batik/branches/svg11/test-references/samples/tests/spec/filters/feTileTarget.png
    xmlgraphics/batik/branches/svg11/test-references/samples/tests/spec/scripting/relativeURI.png
    xmlgraphics/batik/branches/svg11/test-references/samples/textRotate.png
    xmlgraphics/batik/branches/svg11/test-references/samples/textRotateShadows.png

Modified: xmlgraphics/batik/branches/svg11/sources/org/apache/batik/gvt/AbstractGraphicsNode.java
URL: http://svn.apache.org/viewcvs/xmlgraphics/batik/branches/svg11/sources/org/apache/batik/gvt/AbstractGraphicsNode.java?rev=320711&r1=320710&r2=320711&view=diff
==============================================================================
--- xmlgraphics/batik/branches/svg11/sources/org/apache/batik/gvt/AbstractGraphicsNode.java (original)
+++ xmlgraphics/batik/branches/svg11/sources/org/apache/batik/gvt/AbstractGraphicsNode.java Thu Oct 13 03:21:45 2005
@@ -445,25 +445,36 @@
         // Set up graphic context. It is important to setup the
         // transform first, because the clip is defined in this node's
         // user space.
-        Shape defaultClip = g2d.getClip();
-        Composite defaultComposite = g2d.getComposite();
-        AffineTransform defaultTransform = g2d.getTransform();
-        RenderingHints defaultHints = null;
-
-        if (hints != null) {
-            defaultHints = g2d.getRenderingHints();
-            g2d.addRenderingHints(hints);
-        }
-        if (transform != null) {
-            g2d.transform(transform);
-        }
-        if (composite != null) {
-            g2d.setComposite(composite);
-        }
-        if (clip != null){
+        Composite       defaultComposite = null;
+        AffineTransform defaultTransform = null;
+        RenderingHints  defaultHints     = null;
+        Graphics2D      baseG2d          = null;
+
+        if (clip != null)  { 
+            baseG2d = g2d;
+            g2d = (Graphics2D)g2d.create();
+            if (hints != null) 
+                g2d.addRenderingHints(hints);
+            if (transform != null)
+                g2d.transform(transform);
+            if (composite != null)
+                g2d.setComposite(composite);
             g2d.clip(clip.getClipPath());
+        } else {
+            if (hints != null) {
+                defaultHints = g2d.getRenderingHints();
+                g2d.addRenderingHints(hints);
+            }
+            if (transform != null) {
+                defaultTransform = g2d.getTransform();
+                g2d.transform(transform);
+            }
+            if (composite != null) {
+                defaultComposite = g2d.getComposite();
+                g2d.setComposite(composite);
+            }
         }
-
+            
         Shape curClip = g2d.getClip();
         g2d.setRenderingHint(RenderingHintsKeyExt.KEY_AREA_OF_INTEREST, 
                              curClip);
@@ -520,6 +531,12 @@
                     filteredImage = clip;
                 }
 
+                baseG2d = g2d;
+                // Only muck with the clip on a 'child'
+                // graphics 2D otherwise when we restore the
+                // clip it might 'wander' by a pixel.
+                g2d = (Graphics2D)g2d.create();
+
                 if(antialiasedClip){
                     // Remove hard edged clip
                     g2d.setClip(null);
@@ -530,17 +547,23 @@
 
                 org.apache.batik.ext.awt.image.GraphicsUtil.drawImage
                     (g2d, filteredImage);
+
+                g2d = baseG2d;
+                baseG2d = null;
             }
         }
 
         // Restore default rendering attributes
-        if (defaultHints != null) {
-            g2d.setRenderingHints(defaultHints);
-        }
-        g2d.setTransform(defaultTransform);
-        g2d.setClip(defaultClip);
-        if (composite != null) {
-            g2d.setComposite(defaultComposite);
+        if (baseG2d != null) {
+            g2d.dispose();
+        } else {
+            if (defaultHints != null)
+                g2d.setRenderingHints(defaultHints);
+            if (defaultTransform != null)
+                g2d.setTransform(defaultTransform);
+            if (defaultComposite != null) {
+                g2d.setComposite(defaultComposite);
+            }
         }
     }
 

Modified: xmlgraphics/batik/branches/svg11/sources/org/apache/batik/gvt/renderer/ConcreteImageRendererFactory.java
URL: http://svn.apache.org/viewcvs/xmlgraphics/batik/branches/svg11/sources/org/apache/batik/gvt/renderer/ConcreteImageRendererFactory.java?rev=320711&r1=320710&r2=320711&view=diff
==============================================================================
--- xmlgraphics/batik/branches/svg11/sources/org/apache/batik/gvt/renderer/ConcreteImageRendererFactory.java (original)
+++ xmlgraphics/batik/branches/svg11/sources/org/apache/batik/gvt/renderer/ConcreteImageRendererFactory.java Thu Oct 13 03:21:45 2005
@@ -37,6 +37,8 @@
      * Creates a new static image renderer
      */
     public ImageRenderer createStaticImageRenderer(){
+        if (onMacOSX)
+            return new MacRenderer();
         return new StaticRenderer();
     }
 
@@ -44,6 +46,15 @@
      * Creates a new dynamic image renderer
      */
     public ImageRenderer createDynamicImageRenderer(){
+        if (onMacOSX)
+            return new MacRenderer();
         return new DynamicRenderer();
+    }
+
+
+    static final boolean onMacOSX;
+    static {
+        // This should be OK for applets.
+        onMacOSX = ("Mac OS X".equals(System.getProperty("os.name")));
     }
 }

Copied: xmlgraphics/batik/branches/svg11/sources/org/apache/batik/gvt/renderer/MacRenderer.java (from r290149, xmlgraphics/batik/branches/svg11/sources/org/apache/batik/gvt/renderer/DynamicRenderer.java)
URL: http://svn.apache.org/viewcvs/xmlgraphics/batik/branches/svg11/sources/org/apache/batik/gvt/renderer/MacRenderer.java?p2=xmlgraphics/batik/branches/svg11/sources/org/apache/batik/gvt/renderer/MacRenderer.java&p1=xmlgraphics/batik/branches/svg11/sources/org/apache/batik/gvt/renderer/DynamicRenderer.java&r1=290149&r2=320711&rev=320711&view=diff
==============================================================================
--- xmlgraphics/batik/branches/svg11/sources/org/apache/batik/gvt/renderer/DynamicRenderer.java (original)
+++ xmlgraphics/batik/branches/svg11/sources/org/apache/batik/gvt/renderer/MacRenderer.java Thu Oct 13 03:21:45 2005
@@ -17,24 +17,21 @@
  */
 package org.apache.batik.gvt.renderer;
 
-import java.awt.Point;
+import java.awt.Color;
 import java.awt.Rectangle;
 import java.awt.RenderingHints;
 import java.awt.Shape;
+import java.awt.Graphics2D;
+import java.awt.AlphaComposite;
 import java.awt.geom.AffineTransform;
-import java.awt.geom.Rectangle2D;
+import java.awt.geom.GeneralPath;
 import java.awt.image.BufferedImage;
-import java.awt.image.Raster;
-import java.awt.image.SampleModel;
-import java.awt.image.WritableRaster;
 import java.util.Iterator;
 import java.util.Collection;
 
 import org.apache.batik.ext.awt.geom.RectListManager;
 import org.apache.batik.ext.awt.image.GraphicsUtil;
-import org.apache.batik.ext.awt.image.PadMode;
-import org.apache.batik.ext.awt.image.rendered.CachableRed;
-import org.apache.batik.ext.awt.image.rendered.PadRed;
+import org.apache.batik.gvt.GraphicsNode;
 import org.apache.batik.util.HaltingThread;
 
 /**
@@ -43,33 +40,215 @@
  * @author <a href="mailto:Thierry.Kormann@sophia.inria.fr">Thierry Kormann</a>
  * @version $Id$
  */
-public class DynamicRenderer extends StaticRenderer {
+public class MacRenderer implements ImageRenderer {
 
     final static int COPY_OVERHEAD      = 1000;
     final static int COPY_LINE_OVERHEAD = 10;
+    final static AffineTransform IDENTITY = new AffineTransform();
+
+    protected RenderingHints renderingHints;
+    protected AffineTransform usr2dev;
+
+    protected GraphicsNode rootGN;
+
+    protected int offScreenWidth;
+    protected int offScreenHeight;
+    protected boolean isDoubleBuffered;
+    protected BufferedImage currImg;
+    protected BufferedImage workImg;
+    protected RectListManager damagedAreas;
+
+    public static int IMAGE_TYPE = BufferedImage.TYPE_INT_ARGB_PRE;
+    public static Color TRANSPARENT_WHITE = new Color(255, 255, 255, 0);
+
+    protected static RenderingHints defaultRenderingHints;
+    static {
+        defaultRenderingHints = new RenderingHints(null);
+        defaultRenderingHints.put(RenderingHints.KEY_ANTIALIASING,
+                                  RenderingHints.VALUE_ANTIALIAS_ON);
+
+        defaultRenderingHints.put(RenderingHints.KEY_INTERPOLATION,
+                                  RenderingHints.VALUE_INTERPOLATION_BILINEAR);
+    }
 
     /**
      * Constructs a new dynamic renderer with the specified buffer image.
      */
-    public DynamicRenderer() {
-        super();
+    public MacRenderer() {
+        renderingHints = new RenderingHints(defaultRenderingHints);
+        usr2dev = new AffineTransform();
+    }
+
+    public MacRenderer(RenderingHints rh,
+                       AffineTransform at){
+        renderingHints = new RenderingHints(rh);
+        if (at == null) at = new AffineTransform();
+        else            at = new AffineTransform(at);
+    }
+
+    public void dispose() {
+        rootGN  = null;
+        currImg = null;
+        workImg = null;
+        renderingHints = null;
+        usr2dev = null;
+        damagedAreas = null;
+    }
+    /**
+     * This associates the given GVT Tree with this renderer.
+     * Any previous tree association is forgotten.
+     * Not certain if this should be just GraphicsNode, or CanvasGraphicsNode.
+     */
+    public void setTree(GraphicsNode treeRoot) {
+        rootGN = treeRoot;
     }
 
-    public DynamicRenderer(RenderingHints rh,
-                           AffineTransform at){
-        super(rh, at);
+    /**
+     * Returns the GVT tree associated with this renderer
+     */
+    public GraphicsNode getTree() {
+        return rootGN;
     }
 
-    RectListManager damagedAreas;
+    /**
+     * Sets the transform from the current user space (as defined by
+     * the top node of the GVT tree, to the associated device space.
+     */
+    public void setTransform(AffineTransform usr2dev) {
+        if(usr2dev == null)
+            this.usr2dev = new AffineTransform();
+        else
+            this.usr2dev = new AffineTransform(usr2dev);
+        if (workImg == null) return;
+        synchronized (workImg) {
+            Graphics2D g2d = workImg.createGraphics();
+            g2d.setComposite(AlphaComposite.Clear);
+            g2d.fillRect(0, 0, workImg.getWidth(), workImg.getHeight());
+            g2d.dispose();
+        }
+        damagedAreas = null;
+    }
 
-    protected CachableRed setupCache(CachableRed img) {
-        // Don't do any caching of content for dynamic case
-        return img;
+    /**
+     * Returns a copy of the transform from the current user space (as
+     * defined by the top node of the GVT tree) to the device space (1
+     * unit = 1/72nd of an inch / 1 pixel, roughly speaking
+     */
+    public AffineTransform getTransform() {
+        return usr2dev;
     }
 
+    /**
+     * @param rh Set of rendering hints to use for future renderings
+     */
+    public void setRenderingHints(RenderingHints rh) {
+        this.renderingHints = new RenderingHints(rh);
+        damagedAreas = null;
+    }
+        
+    /**
+     * @return the RenderingHints which the Renderer is using for its
+     *         rendering 
+     */
+    public RenderingHints getRenderingHints() {
+        return renderingHints;
+    }
+
+    /**
+     * Returns true if the Renderer is currently doubleBuffering is
+     * rendering requests.  If it is then getOffscreen will only
+     * return completed renderings (or null if nothing is available).  
+     */
+    public boolean isDoubleBuffered(){
+        return isDoubleBuffered;
+    }
+
+    /**
+     * Turns on/off double buffering in renderer.  Turning off
+     * double buffering makes it possible to see the ongoing results
+     * of a render operation.
+     *
+     * @param isDoubleBuffered the new value for double buffering
+     */
+    public void setDoubleBuffered(boolean isDoubleBuffered){
+        if (this.isDoubleBuffered == isDoubleBuffered)
+            return;
+
+        this.isDoubleBuffered = isDoubleBuffered;
+        if (isDoubleBuffered) {
+            workImg = null;  // start double buffer, split buffers
+        } else {
+            // No longer double buffering so delete second offscreen
+            workImg = currImg;
+            damagedAreas = null;
+        }
+    }
+
+    /**
+     * Update the size of the image to be returned by getOffScreen.
+     * Note that this change will not be reflected by calls to
+     * getOffscreen until either clearOffScreen has completed (when
+     * isDoubleBuffered is false) or reapint has completed (when
+     * isDoubleBuffered is true).  
+     *
+     */
+    public void updateOffScreen(int width, int height) {
+        offScreenWidth  = width;
+        offScreenHeight = height;
+    }
+
+    /**
+     * Returns the current offscreen image.
+     * 
+     * The exact symantics of this vary base on the value of
+     * isDoubleBuffered.  If isDoubleBuffered is false this will
+     * return the image currently being worked on as soon as it is
+     * available.
+     *
+     * if isDoubleBuffered is false this will return the most recently
+     * completed result of repaint.
+     */
+    public BufferedImage getOffScreen() {
+        if (rootGN == null)
+            return null;
+
+        return currImg;
+    }
+
+    /**
+     * Sets up and clears the current offscreen buffer.
+     *
+     * When not double buffering one should call this method before
+     * calling getOffscreen to get the offscreen being drawn into.
+     * This ensures the buffer is up to date and doesn't contain junk.
+     *
+     * When double buffering this call can effectively be skipped,
+     * since getOffscreen will only refect the new rendering after
+     * repaint completes.  
+     */
+    public void clearOffScreen() {
+        // No need to clear in double buffer case people will
+        // only see it when it is done...
+        if (isDoubleBuffered) 
+            return;
+
+        updateWorkingBuffers();
+        if (workImg == null) return;
+
+        synchronized (workImg) {
+            Graphics2D g2d = workImg.createGraphics();
+            g2d.setComposite(AlphaComposite.Clear);
+            g2d.fillRect(0, 0, workImg.getWidth(), workImg.getHeight());
+            g2d.dispose();
+        }
+        damagedAreas = null;
+    }
+
+    public void flush() { 
+        // Since we don't cache we don't need to flush
+    }
     public void flush(Rectangle r) {
         // Since we don't cache we don't need to flush
-        return;
     }
 
     /**
@@ -77,57 +256,36 @@
      */
     public void flush(Collection areas) {
         // Since we don't cache we don't need to flush
-        return;
     }
 
     protected void updateWorkingBuffers() {
-        if (rootFilter == null) {
-            rootFilter = rootGN.getGraphicsNodeRable(true);
-            rootCR = null;
-        }
-
-        rootCR = renderGNR();
-        if (rootCR == null) {
-            // No image to display so clear everything out...
-            workingRaster = null;
-            workingOffScreen = null;
-            workingBaseRaster = null;
-            
-            currentOffScreen = null;
-            currentBaseRaster = null;
-            currentRaster = null;
+        if (rootGN == null) {
+            currImg = null;
+            workImg = null;
             return;
         }
 
-        SampleModel sm = rootCR.getSampleModel();
         int         w  = offScreenWidth;
         int         h  = offScreenHeight;
-
-        if ((workingBaseRaster == null) ||
-            (workingBaseRaster.getWidth()  < w) ||
-            (workingBaseRaster.getHeight() < h)) {
-
-            sm = sm.createCompatibleSampleModel(w, h);
-            
-            workingBaseRaster 
-                = Raster.createWritableRaster(sm, new Point(0,0));
-
-            workingRaster = workingBaseRaster.createWritableChild
-                (0, 0, w, h, 0, 0, null);
-
-            workingOffScreen =  new BufferedImage
-                (rootCR.getColorModel(), 
-                 workingRaster,
-                 rootCR.getColorModel().isAlphaPremultiplied(), null);
+        if ((workImg == null)         ||
+            (workImg.getWidth()  < w) ||
+            (workImg.getHeight() < h)) {
+            workImg = new BufferedImage(w, h, IMAGE_TYPE);
+            // workImg = new BI(w, h, IMAGE_TYPE);
         }
 
         if (!isDoubleBuffered) {
-            currentOffScreen  = workingOffScreen;
-            currentBaseRaster = workingBaseRaster;
-            currentRaster     = workingRaster;
+            currImg = workImg;
         }
     }
 
+    public void repaint(Shape area) {
+        if (area == null) return;
+        RectListManager rlm = new RectListManager();
+        rlm.add(usr2dev.createTransformedShape(area).getBounds());
+        repaint(rlm);
+    }
+
     /**
      * Repaints the associated GVT tree under the list of <tt>areas</tt>.
      * 
@@ -146,105 +304,60 @@
         if (devRLM == null)
             return;
 
-        // long t0 = System.currentTimeMillis();
-        // if (lastFrame != -1) {
-        //     System.out.println("InterFrame time: " + (t0-lastFrame));
-        // }
-        // lastFrame = t0;
-
-        CachableRed cr;
-        WritableRaster syncRaster;
-        WritableRaster copyRaster;
-
         updateWorkingBuffers();
-        if ((rootCR == null)           ||
-            (workingBaseRaster == null)) {
-            // System.err.println("RootCR: " + rootCR);
-            // System.err.println("wrkBaseRaster: " + workingBaseRaster);
-            return;
-        }
-        cr = rootCR;
-        syncRaster = workingBaseRaster;
-        copyRaster = workingRaster;
-
-        Rectangle srcR = rootCR.getBounds();
-        // System.out.println("RootCR: " + srcR);
-        Rectangle dstR = workingRaster.getBounds();
-        if ((dstR.x < srcR.x) ||
-            (dstR.y < srcR.y) ||
-            (dstR.x+dstR.width  > srcR.x+srcR.width) ||
-            (dstR.y+dstR.height > srcR.y+srcR.height))
-            cr = new PadRed(cr, dstR, PadMode.ZERO_PAD, null);
-
-        boolean repaintAll = false;
-
-        Rectangle dr = copyRaster.getBounds();
-
-        // Ensure only one thread works on baseRaster at a time...
-        synchronized (syncRaster) {
-            // System.out.println("Dynamic:");
-            if (repaintAll) {
-                // System.out.println("Repainting All");
-                cr.copyData(copyRaster);
-            } else {
-                java.awt.Graphics2D g2d = null;
-                if (false) {
-                    BufferedImage tmpBI = new BufferedImage
-                        (workingOffScreen.getColorModel(),
-                         copyRaster.createWritableTranslatedChild(0, 0),
-                         workingOffScreen.isAlphaPremultiplied(), null);
-                    g2d = GraphicsUtil.createGraphics(tmpBI);
-                    g2d.translate(-copyRaster.getMinX(), 
-                                  -copyRaster.getMinY());
-                }
+        if ((rootGN == null) || (workImg == null))
+            return;
 
-                
-                if ((isDoubleBuffered) &&
-                    (currentRaster != null) && 
-                    (damagedAreas  != null)) {
-                    damagedAreas.subtract(devRLM, COPY_OVERHEAD, 
-                                          COPY_LINE_OVERHEAD);
-                    damagedAreas.mergeRects(COPY_OVERHEAD, 
-                                            COPY_LINE_OVERHEAD); 
-
-                    Iterator iter = damagedAreas.iterator();
-                    while (iter.hasNext()) {
-                        Rectangle r = (Rectangle)iter.next();
-                        if (!dr.intersects(r)) continue;
-                        r = dr.intersection(r);
-                        // System.err.println("Copy: " + r);
-                        Raster src = currentRaster.createWritableChild
-                            (r.x, r.y, r.width, r.height, r.x, r.y, null);
-                        GraphicsUtil.copyData(src, copyRaster);
-                        if (g2d != null) {
-                            g2d.setPaint(new java.awt.Color(0,0,255,50));
-                            g2d.fill(r);
-                            g2d.setPaint(new java.awt.Color(0,0,0,50));
-                            g2d.draw(r);
-                        }
-                    }
-                }
+        try {
+        // Ensure only one thread works on WorkImg at a time...
+        synchronized (workImg) {
+            Graphics2D g2d = GraphicsUtil.createGraphics
+                (workImg, renderingHints);
+
+            Rectangle dr;
+            dr = new Rectangle(0, 0, offScreenWidth, offScreenHeight);
+
+            if ((isDoubleBuffered) &&
+                (currImg != null) && 
+                (damagedAreas  != null)) {
 
-                Iterator iter = devRLM.iterator();
+                damagedAreas.subtract(devRLM, COPY_OVERHEAD, 
+                                      COPY_LINE_OVERHEAD);
+
+                damagedAreas.mergeRects(COPY_OVERHEAD, 
+                                        COPY_LINE_OVERHEAD); 
+
+                Iterator iter = damagedAreas.iterator();
+                g2d.setComposite(AlphaComposite.Src);
                 while (iter.hasNext()) {
                     Rectangle r = (Rectangle)iter.next();
                     if (!dr.intersects(r)) continue;
-                    r = dr.intersection(r);
-                    
-                    // System.err.println("Render: " + r);
-                    WritableRaster dst = copyRaster.createWritableChild
-                        (r.x, r.y, r.width, r.height, r.x, r.y, null);
-                    cr.copyData(dst);
-                    if (g2d != null) {
-                        g2d.setPaint(new java.awt.Color(255,0,0,50));
-                        g2d.fill(r);
-                        g2d.setPaint(new java.awt.Color(0,0,0,50));
-                        g2d.draw(r);
-                    }
+                    r = dr.intersection(r); 
+                    g2d.setClip     (r.x, r.y, r.width, r.height);
+                    g2d.setComposite(AlphaComposite.Clear);
+                    g2d.fillRect    (r.x, r.y, r.width, r.height);
+                    g2d.setComposite(AlphaComposite.SrcOver);
+                    g2d.drawImage   (currImg, 0, 0, null);
                 }
             }
-        }
 
+                
+            Iterator iter = devRLM.iterator();
+            while (iter.hasNext()) {
+                Rectangle r = (Rectangle)iter.next();
+                if (!dr.intersects(r)) continue;
+                r = dr.intersection(r);
+                g2d.setTransform(IDENTITY);
+                g2d.setClip(r.x, r.y, r.width, r.height);
+                g2d.setComposite(AlphaComposite.Clear);
+                g2d.fillRect(r.x, r.y, r.width, r.height);
+                g2d.setComposite(AlphaComposite.SrcOver);
+                g2d.transform(usr2dev);
+                rootGN.paint(g2d);
+            }
+            g2d.dispose();
+        }
+        } catch (Throwable t) { t.printStackTrace(); }
         if (HaltingThread.hasBeenHalted())
             return;
 
@@ -252,16 +365,11 @@
         // System.out.println("Areas: " + devRects);
 
         // Swap the buffers if the rendering completed cleanly.
-        BufferedImage tmpBI = workingOffScreen;
-        
-        workingBaseRaster = currentBaseRaster;
-        workingRaster     = currentRaster;
-        workingOffScreen  = currentOffScreen;
-        
-        currentRaster     = copyRaster;
-        currentBaseRaster = syncRaster;
-        currentOffScreen  = tmpBI;
-        
-        damagedAreas = devRLM;
+        if (isDoubleBuffered) {
+            BufferedImage tmpImg = workImg;
+            workImg = currImg;
+            currImg = tmpImg;
+            damagedAreas = devRLM;
+        }
     }
 }

Modified: xmlgraphics/batik/branches/svg11/test-references/samples/tests/spec/coordinates/percentagesAndUnits.png
URL: http://svn.apache.org/viewcvs/xmlgraphics/batik/branches/svg11/test-references/samples/tests/spec/coordinates/percentagesAndUnits.png?rev=320711&r1=320710&r2=320711&view=diff
==============================================================================
Binary files - no diff available.

Modified: xmlgraphics/batik/branches/svg11/test-references/samples/tests/spec/filters/feTileTarget.png
URL: http://svn.apache.org/viewcvs/xmlgraphics/batik/branches/svg11/test-references/samples/tests/spec/filters/feTileTarget.png?rev=320711&r1=320710&r2=320711&view=diff
==============================================================================
Binary files - no diff available.

Modified: xmlgraphics/batik/branches/svg11/test-references/samples/tests/spec/scripting/relativeURI.png
URL: http://svn.apache.org/viewcvs/xmlgraphics/batik/branches/svg11/test-references/samples/tests/spec/scripting/relativeURI.png?rev=320711&r1=320710&r2=320711&view=diff
==============================================================================
Binary files - no diff available.

Modified: xmlgraphics/batik/branches/svg11/test-references/samples/textRotate.png
URL: http://svn.apache.org/viewcvs/xmlgraphics/batik/branches/svg11/test-references/samples/textRotate.png?rev=320711&r1=320710&r2=320711&view=diff
==============================================================================
Binary files - no diff available.

Modified: xmlgraphics/batik/branches/svg11/test-references/samples/textRotateShadows.png
URL: http://svn.apache.org/viewcvs/xmlgraphics/batik/branches/svg11/test-references/samples/textRotateShadows.png?rev=320711&r1=320710&r2=320711&view=diff
==============================================================================
Binary files - no diff available.