From 8f6baaa89272c01fb960bffa2c5840bcd4f9aeab Mon Sep 17 00:00:00 2001 From: Jeremias Maerki Date: Tue, 5 Aug 2008 15:19:02 +0000 Subject: [PATCH] Refinements based on the extensions of XML Graphics Commons (better distinction of the various image flavors). Added an image converter from Java2D to SVG (using Batik's SVGGraphics2D). git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign@682746 13f79535-47bb-0310-9956-ffa450edef68 --- ...mlgraphics.image.loader.spi.ImageConverter | 1 + .../image/loader/batik/BatikImageFlavors.java | 36 +++++++ .../loader/batik/ImageConverterG2D2SVG.java | 94 +++++++++++++++++++ .../loader/batik/ImageConverterSVG2G2D.java | 2 +- .../loader/batik/ImageLoaderFactorySVG.java | 2 +- .../image/loader/batik/ImageLoaderSVG.java | 2 +- .../fop/image/loader/batik/PreloaderSVG.java | 3 +- 7 files changed, 135 insertions(+), 5 deletions(-) create mode 100644 src/java/org/apache/fop/image/loader/batik/BatikImageFlavors.java create mode 100644 src/java/org/apache/fop/image/loader/batik/ImageConverterG2D2SVG.java diff --git a/src/java/META-INF/services/org.apache.xmlgraphics.image.loader.spi.ImageConverter b/src/java/META-INF/services/org.apache.xmlgraphics.image.loader.spi.ImageConverter index c3c688a2c..804a66cc4 100644 --- a/src/java/META-INF/services/org.apache.xmlgraphics.image.loader.spi.ImageConverter +++ b/src/java/META-INF/services/org.apache.xmlgraphics.image.loader.spi.ImageConverter @@ -1,2 +1,3 @@ org.apache.fop.image.loader.batik.ImageConverterSVG2G2D +org.apache.fop.image.loader.batik.ImageConverterG2D2SVG org.apache.fop.image.loader.batik.ImageConverterWMF2G2D diff --git a/src/java/org/apache/fop/image/loader/batik/BatikImageFlavors.java b/src/java/org/apache/fop/image/loader/batik/BatikImageFlavors.java new file mode 100644 index 000000000..7766fdbcb --- /dev/null +++ b/src/java/org/apache/fop/image/loader/batik/BatikImageFlavors.java @@ -0,0 +1,36 @@ +/* + * 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.batik.dom.svg.SVGDOMImplementation; + +import org.apache.xmlgraphics.image.loader.ImageFlavor; +import org.apache.xmlgraphics.image.loader.XMLNamespaceEnabledImageFlavor; + +/** + * Image flavors used by Batik. + */ +public interface BatikImageFlavors { + + /** An SVG image in form of a W3C DOM instance */ + XMLNamespaceEnabledImageFlavor SVG_DOM = new XMLNamespaceEnabledImageFlavor( + ImageFlavor.XML_DOM, SVGDOMImplementation.SVG_NAMESPACE_URI); + +} diff --git a/src/java/org/apache/fop/image/loader/batik/ImageConverterG2D2SVG.java b/src/java/org/apache/fop/image/loader/batik/ImageConverterG2D2SVG.java new file mode 100644 index 000000000..d56f543c7 --- /dev/null +++ b/src/java/org/apache/fop/image/loader/batik/ImageConverterG2D2SVG.java @@ -0,0 +1,94 @@ +/* + * 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.Dimension; +import java.awt.geom.Rectangle2D; +import java.util.Map; + +import org.w3c.dom.DOMImplementation; +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +import org.apache.batik.dom.GenericDOMImplementation; +import org.apache.batik.dom.svg.SVGDOMImplementation; +import org.apache.batik.svggen.SVGGeneratorContext; +import org.apache.batik.svggen.SVGGraphics2D; + +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.ImageSize; +import org.apache.xmlgraphics.image.loader.impl.AbstractImageConverter; +import org.apache.xmlgraphics.image.loader.impl.ImageGraphics2D; +import org.apache.xmlgraphics.image.loader.impl.ImageXMLDOM; + +/** + * This ImageConverter converts Java2D images into SVG images. + */ +public class ImageConverterG2D2SVG extends AbstractImageConverter { + + /** {@inheritDoc} */ + public Image convert(Image src, Map hints) throws ImageException { + checkSourceFlavor(src); + ImageGraphics2D g2dImage = (ImageGraphics2D)src; + + DOMImplementation domImpl = GenericDOMImplementation.getDOMImplementation(); + + // Create an instance of org.w3c.dom.Document + Document document = domImpl.createDocument( + SVGDOMImplementation.SVG_NAMESPACE_URI, "svg", null); + Element root = document.getDocumentElement(); + + // Create an SVGGeneratorContext to customize SVG generation + SVGGeneratorContext genCtx = SVGGeneratorContext.createDefault(document); + genCtx.setComment("Generated by Apache Batik's SVGGraphics2D"); + genCtx.setEmbeddedFontsOn(true); + + // Create an instance of the SVG Generator + SVGGraphics2D g2d = new SVGGraphics2D(genCtx, true); + ImageSize size = src.getSize(); + Dimension dim = size.getDimensionMpt(); + g2d.setSVGCanvasSize(dim); + //SVGGraphics2D doesn't generate the viewBox by itself + root.setAttribute("viewBox", "0 0 " + dim.width + " " + dim.height); + + g2dImage.getGraphics2DImagePainter().paint(g2d, + new Rectangle2D.Float(0, 0, dim.width, dim.height)); + //Populate the document root with the generated SVG content. + g2d.getRoot(root); + + //Return the generated SVG image + ImageXMLDOM svgImage = new ImageXMLDOM(src.getInfo(), document, BatikImageFlavors.SVG_DOM); + g2d.dispose(); + return svgImage; + } + + /** {@inheritDoc} */ + public ImageFlavor getSourceFlavor() { + return ImageFlavor.GRAPHICS2D; + } + + /** {@inheritDoc} */ + public ImageFlavor getTargetFlavor() { + return BatikImageFlavors.SVG_DOM; + } + +} 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 8ad9fea44..6a8d76b13 100644 --- a/src/java/org/apache/fop/image/loader/batik/ImageConverterSVG2G2D.java +++ b/src/java/org/apache/fop/image/loader/batik/ImageConverterSVG2G2D.java @@ -132,7 +132,7 @@ public class ImageConverterSVG2G2D extends AbstractImageConverter { /** {@inheritDoc} */ public ImageFlavor getSourceFlavor() { - return ImageFlavor.XML_DOM; + return BatikImageFlavors.SVG_DOM; } /** {@inheritDoc} */ diff --git a/src/java/org/apache/fop/image/loader/batik/ImageLoaderFactorySVG.java b/src/java/org/apache/fop/image/loader/batik/ImageLoaderFactorySVG.java index 9203bf7e8..8935ac8d4 100644 --- a/src/java/org/apache/fop/image/loader/batik/ImageLoaderFactorySVG.java +++ b/src/java/org/apache/fop/image/loader/batik/ImageLoaderFactorySVG.java @@ -30,7 +30,7 @@ import org.apache.xmlgraphics.util.MimeConstants; public class ImageLoaderFactorySVG extends AbstractImageLoaderFactory { private static final ImageFlavor[] FLAVORS = new ImageFlavor[] { - ImageFlavor.XML_DOM}; + BatikImageFlavors.SVG_DOM}; private static final String[] MIMES = new String[] { MimeConstants.MIME_SVG}; diff --git a/src/java/org/apache/fop/image/loader/batik/ImageLoaderSVG.java b/src/java/org/apache/fop/image/loader/batik/ImageLoaderSVG.java index 483d6c502..c80f38c64 100644 --- a/src/java/org/apache/fop/image/loader/batik/ImageLoaderSVG.java +++ b/src/java/org/apache/fop/image/loader/batik/ImageLoaderSVG.java @@ -45,7 +45,7 @@ public class ImageLoaderSVG extends AbstractImageLoader { * @param targetFlavor the target flavor */ public ImageLoaderSVG(ImageFlavor targetFlavor) { - if (!(ImageFlavor.XML_DOM.equals(targetFlavor))) { + if (!(targetFlavor.isCompatible(ImageFlavor.XML_DOM))) { throw new IllegalArgumentException("Unsupported target ImageFlavor: " + targetFlavor); } this.targetFlavor = targetFlavor; diff --git a/src/java/org/apache/fop/image/loader/batik/PreloaderSVG.java b/src/java/org/apache/fop/image/loader/batik/PreloaderSVG.java index ce6cde9d9..1c277c083 100644 --- a/src/java/org/apache/fop/image/loader/batik/PreloaderSVG.java +++ b/src/java/org/apache/fop/image/loader/batik/PreloaderSVG.java @@ -34,7 +34,6 @@ import org.apache.batik.bridge.BridgeContext; import org.apache.batik.bridge.UnitProcessor; import org.apache.batik.bridge.UserAgent; import org.apache.batik.dom.svg.SAXSVGDocumentFactory; -import org.apache.batik.dom.svg.SVGDOMImplementation; import org.apache.batik.dom.svg.SVGOMDocument; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -194,7 +193,7 @@ public class PreloaderSVG extends AbstractImagePreloader { //The whole image had to be loaded for this, so keep it ImageXMLDOM xmlImage = new ImageXMLDOM(info, - doc, SVGDOMImplementation.SVG_NAMESPACE_URI); + doc, BatikImageFlavors.SVG_DOM); info.getCustomObjects().put(ImageInfo.ORIGINAL_IMAGE, xmlImage); return info; } -- 2.39.5