]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Fixed a multi-threading bug for SVG images included through svg:image inside SVG...
authorJeremias Maerki <jeremias@apache.org>
Thu, 30 Jun 2011 09:49:55 +0000 (09:49 +0000)
committerJeremias Maerki <jeremias@apache.org>
Thu, 30 Jun 2011 09:49:55 +0000 (09:49 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1141461 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/fop/svg/AbstractFOPImageElementBridge.java
status.xml

index c4191077f4c4d5d6c5340b30492cf98819d41285..5d10a7d1b5e5bc65ef32d077fb5b4b5385460c76 100644 (file)
@@ -23,11 +23,15 @@ import java.awt.Graphics2D;
 import java.awt.Shape;
 import java.awt.geom.Rectangle2D;
 
+import org.w3c.dom.Element;
+import org.w3c.dom.svg.SVGDocument;
+
 import org.apache.batik.bridge.BridgeContext;
 import org.apache.batik.bridge.SVGImageElementBridge;
 import org.apache.batik.gvt.AbstractGraphicsNode;
 import org.apache.batik.gvt.GraphicsNode;
 import org.apache.batik.util.ParsedURL;
+
 import org.apache.xmlgraphics.image.loader.Image;
 import org.apache.xmlgraphics.image.loader.ImageException;
 import org.apache.xmlgraphics.image.loader.ImageFlavor;
@@ -39,8 +43,8 @@ import org.apache.xmlgraphics.image.loader.impl.ImageRawCCITTFax;
 import org.apache.xmlgraphics.image.loader.impl.ImageRawJPEG;
 import org.apache.xmlgraphics.image.loader.impl.ImageXMLDOM;
 import org.apache.xmlgraphics.java2d.Graphics2DImagePainter;
-import org.w3c.dom.Element;
-import org.w3c.dom.svg.SVGDocument;
+
+import org.apache.fop.image.loader.batik.BatikUtil;
 
 /**
  * Bridge class for the &lt;image> element when jpeg images.
@@ -63,6 +67,7 @@ public abstract class AbstractFOPImageElementBridge extends SVGImageElementBridg
      * @param purl the parsed url for the image resource
      * @return a new graphics node
      */
+    @Override
     protected GraphicsNode createImageGraphicsNode
                 (BridgeContext ctx, Element imageElement, ParsedURL purl) {
         AbstractFOPBridgeContext bridgeCtx = (AbstractFOPBridgeContext)ctx;
@@ -80,8 +85,11 @@ public abstract class AbstractFOPImageElementBridge extends SVGImageElementBridg
             if (image instanceof ImageXMLDOM) {
                 ImageXMLDOM xmlImage = (ImageXMLDOM)image;
                 if (xmlImage.getDocument() instanceof SVGDocument) {
-                    return createSVGImageNode(ctx, imageElement,
-                            (SVGDocument)xmlImage.getDocument());
+                    //Clone DOM because the Batik's CSS Parser attaches to the DOM and is therefore
+                    //no thread-safe.
+                    SVGDocument clonedDoc = (SVGDocument)BatikUtil.cloneSVGDocument(
+                            xmlImage.getDocument());
+                    return createSVGImageNode(ctx, imageElement, clonedDoc);
                 } else {
                     //Convert image to Graphics2D
                     image = manager.convertImage(xmlImage,
index ec3f9b6ff1791e40641f2f568ffa7030832d3c29..3272607acb592c70daa18b321d05c0af01c49bde 100644 (file)
@@ -60,6 +60,9 @@
       documents. Example: the fix of marks layering will be such a case when it's done.
     -->
     <release version="FOP Trunk" date="TBD">
+      <action context="Renderers" dev="JM" type="fix">
+        Fixed a multi-threading bug for SVG images included through svg:image inside SVG documents.
+      </action>
       <action context="Renderers" dev="PH" type="add">
         Added an IFDocumentHandler filter for triggering rendering events.  Created an Event that
         captures an end page event with the page number.