diff options
Diffstat (limited to 'src/java/org/apache/fop/render/java2d/Java2DSVGHandler.java')
-rw-r--r-- | src/java/org/apache/fop/render/java2d/Java2DSVGHandler.java | 209 |
1 files changed, 209 insertions, 0 deletions
diff --git a/src/java/org/apache/fop/render/java2d/Java2DSVGHandler.java b/src/java/org/apache/fop/render/java2d/Java2DSVGHandler.java new file mode 100644 index 000000000..d89adf63d --- /dev/null +++ b/src/java/org/apache/fop/render/java2d/Java2DSVGHandler.java @@ -0,0 +1,209 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed 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.render.java2d; + +import org.apache.fop.render.XMLHandler; +import org.apache.fop.render.RendererContext; +import org.apache.fop.svg.SVGUserAgent; + +// Commons-Logging +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/* org.w3c.dom.Document is not imported to avoid conflict with + org.apache.fop.apps.Document */ + +import org.apache.batik.bridge.GVTBuilder; +import org.apache.batik.bridge.BridgeContext; +import org.apache.batik.dom.svg.SVGDOMImplementation; +import org.apache.batik.gvt.GraphicsNode; + +import java.awt.geom.AffineTransform; + +/** + * Java2D XML handler for SVG (uses Apache Batik). + * This handler handles XML for foreign objects when rendering to Java2D. + * The properties from the Java2D renderer are subject to change. + */ +public class Java2DSVGHandler implements XMLHandler { + + /** + * logging instance + */ + private Log log = LogFactory.getLog(Java2DSVGHandler.class); + + /** + * The current Java2DGraphicsState. + */ + public static final String JAVA2D_STATE = "state"; + + /** + * The width of the svg image/document to render. + */ + public static final String JAVA2D_WIDTH = "width"; + + /** + * The height of the svg image/document to render. + */ + public static final String JAVA2D_HEIGHT = "height"; + + /** + * The x position that this is being drawn at. + */ + public static final String JAVA2D_XPOS = "xpos"; + + /** + * The y position that this is being drawn at. + */ + public static final String JAVA2D_YPOS = "ypos"; + + /** + * Create a new Java2D XML handler for use by the Java2D renderer. + */ + public Java2DSVGHandler() { + } + + /** @see org.apache.fop.render.XMLHandler */ + public void handleXML(RendererContext context, + org.w3c.dom.Document doc, String ns) throws Exception { + Java2DInfo pdfi = getJava2DInfo(context); + + if (SVGDOMImplementation.SVG_NAMESPACE_URI.equals(ns)) { + SVGHandler svghandler = new SVGHandler(); + svghandler.renderSVGDocument(context, doc, pdfi); + } + } + + /** + * Get the pdf information from the render context. + * + * @param context the renderer context + * @return the pdf information retrieved from the context + */ + public static Java2DInfo getJava2DInfo(RendererContext context) { + Java2DInfo pdfi = new Java2DInfo(); + pdfi.state = (Java2DGraphicsState)context.getProperty(JAVA2D_STATE); + pdfi.width = ((Integer)context.getProperty(JAVA2D_WIDTH)).intValue(); + pdfi.height = ((Integer)context.getProperty(JAVA2D_HEIGHT)).intValue(); + pdfi.currentXPosition = ((Integer)context.getProperty(JAVA2D_XPOS)).intValue(); + pdfi.currentYPosition = ((Integer)context.getProperty(JAVA2D_YPOS)).intValue(); + return pdfi; + } + + /** + * Java2D information structure for drawing the XML document. + */ + public static class Java2DInfo { + /** see Java2D_STATE */ + public Java2DGraphicsState state; + /** see Java2D_WIDTH */ + public int width; + /** see Java2D_HEIGHT */ + public int height; + /** see Java2D_XPOS */ + public int currentXPosition; + /** see Java2D_YPOS */ + public int currentYPosition; + + /** @see java.lang.Object#toString() */ + public String toString() { + return "Java2DInfo {" + + "state = " + state + ", " + + "width = " + width + ", " + + "height = " + height + ", " + + "currentXPosition = " + currentXPosition + ", " + + "currentYPosition = " + currentYPosition + "}"; + } + } + + /** + * This method is placed in an inner class so that we don't get class + * loading errors if batik is not present. + */ + protected class SVGHandler { + + /** + * Render the svg document. + * @param context the renderer context + * @param doc the svg document + * @param info the pdf information of the current context + */ + protected void renderSVGDocument(RendererContext context, + org.w3c.dom.Document doc, + Java2DInfo info) { + + log.debug("renderSVGDocument(" + context + ", " + doc + ", " + info + ")"); + + int x = info.currentXPosition; + int y = info.currentYPosition; + + float ptom = context.getUserAgent().getPixelUnitToMillimeter(); + SVGUserAgent ua = new SVGUserAgent(ptom, new AffineTransform()); + + GVTBuilder builder = new GVTBuilder(); + BridgeContext ctx = new BridgeContext(ua); + + GraphicsNode root; + try { + root = builder.build(ctx, doc); + } catch (Exception e) { + log.error("SVG graphic could not be built: " + e.getMessage(), e); + return; + } + + // If no viewbox is defined in the svg file, a viewbox of 100x100 is + // assumed, as defined in SVGUserAgent.getViewportSize() + float iw = (float) ctx.getDocumentSize().getWidth() * 1000f; + float ih = (float) ctx.getDocumentSize().getHeight() * 1000f; + + float w = (float) info.width; + float h = (float) info.height; + + AffineTransform origTransform = info.state.getGraph().getTransform(); + + // correct integer roundoff + info.state.getGraph().translate(x / 1000, y / 1000); + + //SVGSVGElement svg = ((SVGDocument) doc).getRootElement(); + // Aspect ratio preserved by layout engine, not here + AffineTransform at = AffineTransform.getScaleInstance(w / iw, h / ih); + if (!at.isIdentity()) { + info.state.getGraph().transform(at); + } + + try { + root.paint(info.state.getGraph()); + } catch (Exception e) { + log.error("Error while painting SVG", e); + } + + info.state.getGraph().setTransform(origTransform); + } + } + + /** @see org.apache.fop.render.XMLHandler#getMimeType() */ + public String getMimeType() { + return Java2DRenderer.MIME_TYPE; + } + + /** @see org.apache.fop.render.XMLHandler#getNamespace() */ + public String getNamespace() { + return SVGDOMImplementation.SVG_NAMESPACE_URI; + } +} |