diff options
author | Jeremias Maerki <jeremias@apache.org> | 2010-07-15 06:50:21 +0000 |
---|---|---|
committer | Jeremias Maerki <jeremias@apache.org> | 2010-07-15 06:50:21 +0000 |
commit | 16f936559ddeb2c990c3bce55ca3066c01a3e5f9 (patch) | |
tree | 9ea0491d95876c65b3d6b60938b4feea1e99eb16 | |
parent | 3c385cb034d9a6363e2f012c886a53b57e4b7179 (diff) | |
download | xmlgraphics-fop-16f936559ddeb2c990c3bce55ca3066c01a3e5f9.tar.gz xmlgraphics-fop-16f936559ddeb2c990c3bce55ca3066c01a3e5f9.zip |
Added ImageElementBridge to ImageConverterSVG2G2D so output formats like Java2D (PNG, TIFF) and PCL can load image formats other than just PNG and JPEG from SVG.
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
3 files changed, 181 insertions, 2 deletions
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 index 000000000..b1808a7b9 --- /dev/null +++ b/src/java/org/apache/fop/image/loader/batik/GenericFOPBridgeContext.java @@ -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 index 000000000..7a14025c8 --- /dev/null +++ b/src/java/org/apache/fop/image/loader/batik/GenericFOPImageElementBridge.java @@ -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 <image> element. + */ + public GenericFOPImageElementBridge() { } + + private final ImageFlavor[] supportedFlavors = new ImageFlavor[] + {ImageFlavor.GRAPHICS2D, + BatikImageFlavors.SVG_DOM}; + + /** {@inheritDoc} */ + protected ImageFlavor[] getSupportedFlavours() { + return supportedFlavors; + } + +} diff --git a/src/java/org/apache/fop/image/loader/batik/ImageConverterSVG2G2D.java b/src/java/org/apache/fop/image/loader/batik/ImageConverterSVG2G2D.java index 2bb521dc9..9efc2aaf0 100644 --- a/src/java/org/apache/fop/image/loader/batik/ImageConverterSVG2G2D.java +++ b/src/java/org/apache/fop/image/loader/batik/ImageConverterSVG2G2D.java @@ -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); + } + + }; } |