diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/java/org/apache/fop/svg/AbstractFOPImageElementBridge.java | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/src/java/org/apache/fop/svg/AbstractFOPImageElementBridge.java b/src/java/org/apache/fop/svg/AbstractFOPImageElementBridge.java index c4191077f..5d10a7d1b 100644 --- a/src/java/org/apache/fop/svg/AbstractFOPImageElementBridge.java +++ b/src/java/org/apache/fop/svg/AbstractFOPImageElementBridge.java @@ -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 <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, |