]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Added ImageElementBridge to ImageConverterSVG2G2D so output formats like Java2D ...
authorJeremias Maerki <jeremias@apache.org>
Thu, 15 Jul 2010 06:50:21 +0000 (06:50 +0000)
committerJeremias Maerki <jeremias@apache.org>
Thu, 15 Jul 2010 06:50:21 +0000 (06:50 +0000)
This also represents a work-around for certain JPEG images that cannot be loaded properly with the Sun JPEG codec embedded in the JDK. With this, JPEGs are loaded via ImageIO.

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@964316 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/fop/image/loader/batik/GenericFOPBridgeContext.java [new file with mode: 0644]
src/java/org/apache/fop/image/loader/batik/GenericFOPImageElementBridge.java [new file with mode: 0644]
src/java/org/apache/fop/image/loader/batik/ImageConverterSVG2G2D.java

diff --git a/src/java/org/apache/fop/image/loader/batik/GenericFOPBridgeContext.java b/src/java/org/apache/fop/image/loader/batik/GenericFOPBridgeContext.java
new file mode 100644 (file)
index 0000000..b1808a7
--- /dev/null
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.image.loader.batik;
+
+import java.awt.geom.AffineTransform;
+
+import org.apache.batik.bridge.BridgeContext;
+import org.apache.batik.bridge.DocumentLoader;
+import org.apache.batik.bridge.UserAgent;
+import org.apache.batik.dom.svg.SVGOMDocument;
+
+import org.apache.xmlgraphics.image.loader.ImageManager;
+import org.apache.xmlgraphics.image.loader.ImageSessionContext;
+
+import org.apache.fop.fonts.FontInfo;
+import org.apache.fop.svg.AbstractFOPBridgeContext;
+import org.apache.fop.svg.SVGUserAgent;
+
+/**
+ * BridgeContext which registers the custom bridges for Java2D output.
+ */
+class GenericFOPBridgeContext extends AbstractFOPBridgeContext {
+
+    /**
+     * Constructs a new bridge context.
+     * @param userAgent the user agent
+     * @param documentLoader the Document Loader to use for referenced documents.
+     * @param fontInfo the font list for the text painter, may be null
+     *                 in which case text is painted as shapes
+     * @param imageManager an image manager
+     * @param imageSessionContext an image session context
+     * @param linkTransform AffineTransform to properly place links,
+     *                      may be null
+     */
+    public GenericFOPBridgeContext(UserAgent userAgent, DocumentLoader documentLoader,
+            FontInfo fontInfo, ImageManager imageManager,
+            ImageSessionContext imageSessionContext,
+            AffineTransform linkTransform) {
+        super(userAgent, documentLoader, fontInfo,
+                imageManager, imageSessionContext, linkTransform);
+    }
+
+    /**
+     * Constructs a new bridge context.
+     * @param userAgent the user agent
+     * @param fontInfo the font list for the text painter, may be null
+     *                 in which case text is painted as shapes
+     * @param imageManager an image manager
+     * @param imageSessionContext an image session context
+     */
+    public GenericFOPBridgeContext(UserAgent userAgent, FontInfo fontInfo,
+            ImageManager imageManager, ImageSessionContext imageSessionContext) {
+        super(userAgent, fontInfo, imageManager, imageSessionContext);
+    }
+
+    /**
+     * Constructs a new bridge context.
+     * @param userAgent the user agent
+     * @param fontInfo the font list for the text painter, may be null
+     *                 in which case text is painted as shapes
+     * @param imageManager an image manager
+     * @param imageSessionContext an image session context
+     * @param linkTransform AffineTransform to properly place links,
+     *                      may be null
+     */
+    public GenericFOPBridgeContext(SVGUserAgent userAgent, FontInfo fontInfo,
+            ImageManager imageManager, ImageSessionContext imageSessionContext,
+            AffineTransform linkTransform) {
+        super(userAgent, fontInfo, imageManager, imageSessionContext, linkTransform);
+    }
+
+    /** {@inheritDoc} */
+    public void registerSVGBridges() {
+        super.registerSVGBridges();
+
+        //This makes Batik load images via FOP and the XGC image loading framework
+        putBridge(new GenericFOPImageElementBridge());
+    }
+
+    /** {@inheritDoc} */
+    public BridgeContext createBridgeContext(SVGOMDocument doc) {
+        return createBridgeContext();
+    }
+
+    /** {@inheritDoc} */
+    public BridgeContext createBridgeContext() {
+        return new GenericFOPBridgeContext(getUserAgent(), getDocumentLoader(),
+                fontInfo,
+                getImageManager(),
+                getImageSessionContext(),
+                linkTransform);
+    }
+
+}
diff --git a/src/java/org/apache/fop/image/loader/batik/GenericFOPImageElementBridge.java b/src/java/org/apache/fop/image/loader/batik/GenericFOPImageElementBridge.java
new file mode 100644 (file)
index 0000000..7a14025
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.image.loader.batik;
+
+import org.apache.xmlgraphics.image.loader.ImageFlavor;
+
+import org.apache.fop.svg.AbstractFOPImageElementBridge;
+
+/**
+ * Image Element Bridge class for the SVG to Java2D converter, used to make Batik load images
+ * through FOP and XGC's image loading framework.
+ */
+class GenericFOPImageElementBridge extends AbstractFOPImageElementBridge {
+
+    /**
+     * Constructs a new bridge for the &lt;image&gt; element.
+     */
+    public GenericFOPImageElementBridge() { }
+
+    private final ImageFlavor[] supportedFlavors = new ImageFlavor[]
+                                               {ImageFlavor.GRAPHICS2D,
+                                                BatikImageFlavors.SVG_DOM};
+
+    /** {@inheritDoc} */
+    protected ImageFlavor[] getSupportedFlavours() {
+        return supportedFlavors;
+    }
+
+}
index 2bb521dc9485c2e80fef0c901ba8f9a733bb1e9b..9efc2aaf098f5717252b74010415de6a2fb70f27 100644 (file)
@@ -37,7 +37,9 @@ import org.apache.xmlgraphics.image.loader.Image;
 import org.apache.xmlgraphics.image.loader.ImageException;
 import org.apache.xmlgraphics.image.loader.ImageFlavor;
 import org.apache.xmlgraphics.image.loader.ImageInfo;
+import org.apache.xmlgraphics.image.loader.ImageManager;
 import org.apache.xmlgraphics.image.loader.ImageProcessingHints;
+import org.apache.xmlgraphics.image.loader.ImageSessionContext;
 import org.apache.xmlgraphics.image.loader.XMLNamespaceEnabledImageFlavor;
 import org.apache.xmlgraphics.image.loader.impl.AbstractImageConverter;
 import org.apache.xmlgraphics.image.loader.impl.ImageGraphics2D;
@@ -77,7 +79,16 @@ public class ImageConverterSVG2G2D extends AbstractImageConverter {
         }
         UserAgent ua = createBatikUserAgent(pxToMillimeter);
         GVTBuilder builder = new GVTBuilder();
-        final BridgeContext ctx = new BridgeContext(ua);
+
+        final ImageManager imageManager = (ImageManager)hints.get(
+                ImageProcessingHints.IMAGE_MANAGER);
+        final ImageSessionContext sessionContext = (ImageSessionContext)hints.get(
+                ImageProcessingHints.IMAGE_SESSION_CONTEXT);
+
+        boolean useEnhancedBridgeContext = (imageManager != null && sessionContext != null);
+        final BridgeContext ctx = (useEnhancedBridgeContext
+                ? new GenericFOPBridgeContext(ua, null, imageManager, sessionContext)
+                : new BridgeContext(ua));
 
         Document doc = svg.getDocument();
         //Cloning SVG DOM as Batik attaches non-thread-safe facilities (like the CSS engine)
@@ -117,9 +128,20 @@ public class ImageConverterSVG2G2D extends AbstractImageConverter {
             /** {@inheritDoc} */
             public void displayMessage(String message) {
                 //TODO Refine and pipe through to caller
-                log.debug(message);
+                log.info(message);
+            }
+
+            /** {@inheritDoc} */
+            public void displayError(Exception e) {
+                log.error("Error converting SVG to a Java2D graphic", e);
             }
 
+            /** {@inheritDoc} */
+            public void displayError(String message) {
+                log.error(message);
+            }
+
+
         };
     }