aboutsummaryrefslogtreecommitdiffstats
path: root/src/sandbox/org
diff options
context:
space:
mode:
authorJeremias Maerki <jeremias@apache.org>2008-09-28 13:17:57 +0000
committerJeremias Maerki <jeremias@apache.org>2008-09-28 13:17:57 +0000
commitd6d3411ca856d605080c25624da32cd9ad1df9bb (patch)
tree66974a04550755b6e933d9a2daa3510557c688b6 /src/sandbox/org
parentc785bd37ca4848a0a0022eb9a480560c1a0b7af1 (diff)
downloadxmlgraphics-fop-d6d3411ca856d605080c25624da32cd9ad1df9bb.tar.gz
xmlgraphics-fop-d6d3411ca856d605080c25624da32cd9ad1df9bb.zip
Split IFPainter into IFDocumentHandler and IFPainter. This makes the implementation classes smaller, better allows to isolate the painting parts and helps with formats that generate one object per page (SVG, PNG etc.).
Added ImageHandlerFactory to FopFactory. Started TIFF output in order to develop the Java2DPainter that will be needed for certain tasks when generating PCL. Tweaked the way XML is generated for IF and SVG output. git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign@699813 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/sandbox/org')
-rw-r--r--src/sandbox/org/apache/fop/render/svg/AbstractSVGDocumentHandler.java116
-rw-r--r--src/sandbox/org/apache/fop/render/svg/AbstractSVGPainter.java446
-rw-r--r--src/sandbox/org/apache/fop/render/svg/SVGDocumentHandler.java272
-rw-r--r--src/sandbox/org/apache/fop/render/svg/SVGDocumentHandlerMaker.java (renamed from src/sandbox/org/apache/fop/render/svg/SVGPainterMaker.java)19
-rw-r--r--src/sandbox/org/apache/fop/render/svg/SVGPainter.java490
-rw-r--r--src/sandbox/org/apache/fop/render/svg/SVGPrintDocumentHandler.java (renamed from src/sandbox/org/apache/fop/render/svg/SVGPrintPainter.java)37
-rw-r--r--src/sandbox/org/apache/fop/render/svg/SVGPrintDocumentHandlerMaker.java (renamed from src/sandbox/org/apache/fop/render/svg/SVGPrintPainterMaker.java)19
7 files changed, 755 insertions, 644 deletions
diff --git a/src/sandbox/org/apache/fop/render/svg/AbstractSVGDocumentHandler.java b/src/sandbox/org/apache/fop/render/svg/AbstractSVGDocumentHandler.java
new file mode 100644
index 000000000..fbb6728ca
--- /dev/null
+++ b/src/sandbox/org/apache/fop/render/svg/AbstractSVGDocumentHandler.java
@@ -0,0 +1,116 @@
+/*
+ * 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.render.svg;
+
+import org.xml.sax.SAXException;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.apache.xmlgraphics.xmp.Metadata;
+
+import org.apache.fop.fonts.FontInfo;
+import org.apache.fop.render.intermediate.AbstractXMLWritingIFDocumentHandler;
+import org.apache.fop.render.intermediate.IFDocumentHandlerConfigurator;
+import org.apache.fop.render.intermediate.IFException;
+import org.apache.fop.render.intermediate.IFState;
+import org.apache.fop.render.java2d.Java2DUtil;
+
+/**
+ * Abstract base class for SVG Painter implementations.
+ */
+public abstract class AbstractSVGDocumentHandler extends AbstractXMLWritingIFDocumentHandler
+ implements SVGConstants {
+
+ /** logging instance */
+ private static Log log = LogFactory.getLog(AbstractSVGDocumentHandler.class);
+
+ /** Font configuration */
+ protected FontInfo fontInfo;
+
+ /** Holds the intermediate format state */
+ protected IFState state;
+
+ private static final int MODE_NORMAL = 0;
+ private static final int MODE_TEXT = 1;
+
+ private int mode = MODE_NORMAL;
+
+ /** {@inheritDoc} */
+ protected String getMainNamespace() {
+ return NAMESPACE;
+ }
+
+ /** {@inheritDoc} */
+ public FontInfo getFontInfo() {
+ return this.fontInfo;
+ }
+
+ /** {@inheritDoc} */
+ public void setFontInfo(FontInfo fontInfo) {
+ this.fontInfo = fontInfo;
+ }
+
+ /** {@inheritDoc} */
+ public void setDefaultFontInfo(FontInfo fontInfo) {
+ FontInfo fi = Java2DUtil.buildDefaultJava2DBasedFontInfo(fontInfo, getUserAgent());
+ setFontInfo(fi);
+ }
+
+ /** {@inheritDoc} */
+ public IFDocumentHandlerConfigurator getConfigurator() {
+ return null; //No configurator, yet.
+ }
+
+ /** {@inheritDoc} */
+ public void startDocumentHeader() throws IFException {
+ try {
+ handler.startElement("defs");
+ } catch (SAXException e) {
+ throw new IFException("SAX error in startDocumentHeader()", e);
+ }
+ }
+
+ /** {@inheritDoc} */
+ public void endDocumentHeader() throws IFException {
+ try {
+ handler.endElement("defs");
+ } catch (SAXException e) {
+ throw new IFException("SAX error in startDocumentHeader()", e);
+ }
+ }
+
+ /** {@inheritDoc} */
+ public void handleExtensionObject(Object extension) throws IFException {
+ if (extension instanceof Metadata) {
+ Metadata meta = (Metadata)extension;
+ try {
+ handler.startElement("metadata");
+ meta.toSAX(this.handler);
+ handler.endElement("metadata");
+ } catch (SAXException e) {
+ throw new IFException("SAX error while handling extension object", e);
+ }
+ } else {
+ log.debug("Don't know how to handle extension object. Ignoring: "
+ + extension + " (" + extension.getClass().getName() + ")");
+ }
+ }
+}
diff --git a/src/sandbox/org/apache/fop/render/svg/AbstractSVGPainter.java b/src/sandbox/org/apache/fop/render/svg/AbstractSVGPainter.java
deleted file mode 100644
index 8f0be026e..000000000
--- a/src/sandbox/org/apache/fop/render/svg/AbstractSVGPainter.java
+++ /dev/null
@@ -1,446 +0,0 @@
-/*
- * 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.render.svg;
-
-import java.awt.Color;
-import java.awt.Dimension;
-import java.awt.Paint;
-import java.awt.Point;
-import java.awt.Rectangle;
-import java.awt.geom.AffineTransform;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.Map;
-
-import org.w3c.dom.Document;
-
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.AttributesImpl;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.xmlgraphics.image.loader.ImageException;
-import org.apache.xmlgraphics.image.loader.ImageInfo;
-import org.apache.xmlgraphics.image.loader.ImageManager;
-import org.apache.xmlgraphics.image.loader.ImageSessionContext;
-import org.apache.xmlgraphics.util.MimeConstants;
-import org.apache.xmlgraphics.util.QName;
-import org.apache.xmlgraphics.xmp.Metadata;
-
-import org.apache.fop.events.ResourceEventProducer;
-import org.apache.fop.fo.extensions.ExtensionElementMapping;
-import org.apache.fop.render.RenderingContext;
-import org.apache.fop.render.intermediate.AbstractXMLWritingIFPainter;
-import org.apache.fop.render.intermediate.IFConstants;
-import org.apache.fop.render.intermediate.IFException;
-import org.apache.fop.render.intermediate.IFState;
-import org.apache.fop.traits.BorderProps;
-import org.apache.fop.traits.RuleStyle;
-import org.apache.fop.util.ColorUtil;
-
-/**
- * Abstract base class for SVG Painter implementations.
- */
-public abstract class AbstractSVGPainter extends AbstractXMLWritingIFPainter
- implements SVGConstants {
-
- /** logging instance */
- private static Log log = LogFactory.getLog(AbstractSVGPainter.class);
-
- /** Holds the intermediate format state */
- protected IFState state;
-
- private static final int MODE_NORMAL = 0;
- private static final int MODE_TEXT = 1;
-
- private int mode = MODE_NORMAL;
-
- /** {@inheritDoc} */
- protected String getMainNamespace() {
- return NAMESPACE;
- }
-
- /** {@inheritDoc} */
- public void startDocumentHeader() throws IFException {
- try {
- startElement("defs");
- } catch (SAXException e) {
- throw new IFException("SAX error in startDocumentHeader()", e);
- }
- }
-
- /** {@inheritDoc} */
- public void endDocumentHeader() throws IFException {
- try {
- endElement("defs");
- } catch (SAXException e) {
- throw new IFException("SAX error in startDocumentHeader()", e);
- }
- }
-
- /** {@inheritDoc} */
- public void startPageContent() throws IFException {
- this.state = IFState.create();
- }
-
- /** {@inheritDoc} */
- public void endPageContent() throws IFException {
- assert this.state.pop() == null;
- }
-
- /** {@inheritDoc} */
- public void startViewport(AffineTransform transform, Dimension size, Rectangle clipRect)
- throws IFException {
- startViewport(toString(transform), size, clipRect);
- }
-
- /** {@inheritDoc} */
- public void startViewport(AffineTransform[] transforms, Dimension size, Rectangle clipRect)
- throws IFException {
- startViewport(toString(transforms), size, clipRect);
- }
-
- private void startViewport(String transform, Dimension size, Rectangle clipRect)
- throws IFException {
- try {
- establish(MODE_NORMAL);
- AttributesImpl atts = new AttributesImpl();
- if (transform != null && transform.length() > 0) {
- atts.addAttribute("", "transform", "transform", CDATA, transform);
- }
- startElement("g", atts);
-
- atts.clear();
- atts.addAttribute("", "width", "width", CDATA, Integer.toString(size.width));
- atts.addAttribute("", "height", "height", CDATA, Integer.toString(size.height));
- if (clipRect != null) {
- int[] v = new int[] {
- clipRect.y,
- -clipRect.x + size.width - clipRect.width,
- -clipRect.y + size.height - clipRect.height,
- clipRect.x};
- int sum = 0;
- for (int i = 0; i < 4; i++) {
- sum += Math.abs(v[i]);
- }
- if (sum != 0) {
- StringBuffer sb = new StringBuffer("rect(");
- sb.append(v[0]).append(',');
- sb.append(v[1]).append(',');
- sb.append(v[2]).append(',');
- sb.append(v[3]).append(')');
- atts.addAttribute("", "clip", "clip", CDATA, sb.toString());
- }
- atts.addAttribute("", "overflow", "overflow", CDATA, "hidden");
- } else {
- atts.addAttribute("", "overflow", "overflow", CDATA, "visible");
- }
- startElement("svg", atts);
- } catch (SAXException e) {
- throw new IFException("SAX error in startBox()", e);
- }
- }
-
- /** {@inheritDoc} */
- public void endViewport() throws IFException {
- try {
- establish(MODE_NORMAL);
- endElement("svg");
- endElement("g");
- } catch (SAXException e) {
- throw new IFException("SAX error in endBox()", e);
- }
- }
-
- /** {@inheritDoc} */
- public void startGroup(AffineTransform[] transforms) throws IFException {
- startGroup(toString(transforms));
- }
-
- /** {@inheritDoc} */
- public void startGroup(AffineTransform transform) throws IFException {
- startGroup(toString(transform));
- }
-
- private void startGroup(String transform) throws IFException {
- try {
- AttributesImpl atts = new AttributesImpl();
- if (transform != null && transform.length() > 0) {
- atts.addAttribute("", "transform", "transform", CDATA, transform);
- }
- startElement("g", atts);
- } catch (SAXException e) {
- throw new IFException("SAX error in startGroup()", e);
- }
- }
-
- /** {@inheritDoc} */
- public void endGroup() throws IFException {
- try {
- establish(MODE_NORMAL);
- endElement("g");
- } catch (SAXException e) {
- throw new IFException("SAX error in endGroup()", e);
- }
- }
-
- private static final QName CONVERSION_MODE
- = new QName(ExtensionElementMapping.URI, null, "conversion-mode");
-
- /** {@inheritDoc} */
- public void drawImage(String uri, Rectangle rect, Map foreignAttributes) throws IFException {
- try {
- establish(MODE_NORMAL);
-
- ImageManager manager = getUserAgent().getFactory().getImageManager();
- ImageInfo info = null;
- try {
- ImageSessionContext sessionContext = getUserAgent().getImageSessionContext();
- info = manager.getImageInfo(uri, sessionContext);
-
- String mime = info.getMimeType();
- String conversionMode = (String)foreignAttributes.get(CONVERSION_MODE);
- if ("reference".equals(conversionMode)
- && (MimeConstants.MIME_GIF.equals(mime)
- || MimeConstants.MIME_JPEG.equals(mime)
- || MimeConstants.MIME_PNG.equals(mime)
- || MimeConstants.MIME_SVG.equals(mime))) {
- //Just reference the image
- //TODO Some additional URI rewriting might be necessary
- AttributesImpl atts = new AttributesImpl();
- addAttribute(atts, IFConstants.XLINK_HREF, uri);
- atts.addAttribute("", "x", "x", CDATA, Integer.toString(rect.x));
- atts.addAttribute("", "y", "y", CDATA, Integer.toString(rect.y));
- atts.addAttribute("", "width", "width", CDATA, Integer.toString(rect.width));
- atts.addAttribute("", "height", "height", CDATA, Integer.toString(rect.height));
- element("image", atts);
- } else {
- drawImageUsingImageHandler(info, rect);
- }
- } catch (ImageException ie) {
- ResourceEventProducer eventProducer = ResourceEventProducer.Provider.get(
- getUserAgent().getEventBroadcaster());
- eventProducer.imageError(this, (info != null ? info.toString() : uri), ie, null);
- } catch (FileNotFoundException fe) {
- ResourceEventProducer eventProducer = ResourceEventProducer.Provider.get(
- getUserAgent().getEventBroadcaster());
- eventProducer.imageNotFound(this, (info != null ? info.toString() : uri), fe, null);
- } catch (IOException ioe) {
- ResourceEventProducer eventProducer = ResourceEventProducer.Provider.get(
- getUserAgent().getEventBroadcaster());
- eventProducer.imageIOError(this, (info != null ? info.toString() : uri), ioe, null);
- }
- } catch (SAXException e) {
- throw new IFException("SAX error in drawImage()", e);
- }
- }
-
- /** {@inheritDoc} */
- public void drawImage(Document doc, Rectangle rect, Map foreignAttributes) throws IFException {
- try {
- establish(MODE_NORMAL);
-
- drawImageUsingDocument(doc, rect);
- } catch (SAXException e) {
- throw new IFException("SAX error in drawImage()", e);
- }
- }
-
- /** {@inheritDoc} */
- protected RenderingContext createRenderingContext() {
- SVGRenderingContext svgContext = new SVGRenderingContext(
- getUserAgent(), handler);
- return svgContext;
- }
-
- private static String toString(Paint paint) {
- //TODO Paint serialization: Fine-tune and extend!
- if (paint instanceof Color) {
- return ColorUtil.colorToString((Color)paint);
- } else {
- throw new UnsupportedOperationException("Paint not supported: " + paint);
- }
- }
-
- /** {@inheritDoc} */
- public void clipRect(Rectangle rect) throws IFException {
- //TODO Implement me!!!
- }
-
- /** {@inheritDoc} */
- public void fillRect(Rectangle rect, Paint fill) throws IFException {
- if (fill == null) {
- return;
- }
- try {
- establish(MODE_NORMAL);
- AttributesImpl atts = new AttributesImpl();
- atts.addAttribute("", "x", "x", CDATA, Integer.toString(rect.x));
- atts.addAttribute("", "y", "y", CDATA, Integer.toString(rect.y));
- atts.addAttribute("", "width", "width", CDATA, Integer.toString(rect.width));
- atts.addAttribute("", "height", "height", CDATA, Integer.toString(rect.height));
- if (fill != null) {
- atts.addAttribute("", "fill", "fill", CDATA, toString(fill));
- }
- /* disabled
- if (stroke != null) {
- atts.addAttribute("", "stroke", "stroke", CDATA, toString(stroke));
- }*/
- element("rect", atts);
- } catch (SAXException e) {
- throw new IFException("SAX error in fillRect()", e);
- }
- }
-
- /** {@inheritDoc} */
- public void drawBorderRect(Rectangle rect, BorderProps before, BorderProps after,
- BorderProps start, BorderProps end) throws IFException {
- // TODO Auto-generated method stub
- }
-
- /** {@inheritDoc} */
- public void drawLine(Point start, Point end, int width, Color color, RuleStyle style)
- throws IFException {
- try {
- establish(MODE_NORMAL);
- AttributesImpl atts = new AttributesImpl();
- atts.addAttribute("", "x1", "x1", CDATA, Integer.toString(start.x));
- atts.addAttribute("", "y1", "y1", CDATA, Integer.toString(start.y));
- atts.addAttribute("", "x2", "x2", CDATA, Integer.toString(end.x));
- atts.addAttribute("", "y2", "y2", CDATA, Integer.toString(end.y));
- atts.addAttribute("", "stroke-width", "stroke-width", CDATA, toString(color));
- atts.addAttribute("", "fill", "fill", CDATA, toString(color));
- //TODO Handle style parameter
- element("line", atts);
- } catch (SAXException e) {
- throw new IFException("SAX error in drawLine()", e);
- }
- }
-
- /** {@inheritDoc} */
- public void drawText(int x, int y, int[] dx, int[] dy, String text) throws IFException {
- try {
- establish(MODE_TEXT);
- AttributesImpl atts = new AttributesImpl();
- atts.addAttribute("", "x", "x", CDATA, Integer.toString(x));
- atts.addAttribute("", "y", "y", CDATA, Integer.toString(y));
- if (dx != null) {
- atts.addAttribute("", "dx", "dx", CDATA, toString(dx));
- }
- if (dy != null) {
- atts.addAttribute("", "dy", "dy", CDATA, toString(dy));
- }
- startElement("text", atts);
- char[] chars = text.toCharArray();
- handler.characters(chars, 0, chars.length);
- endElement("text");
- } catch (SAXException e) {
- throw new IFException("SAX error in setFont()", e);
- }
- }
-
- /** {@inheritDoc} */
- public void setFont(String family, String style, Integer weight, String variant, Integer size,
- Color color) throws IFException {
- if (family != null) {
- state.setFontFamily(family);
- }
- if (style != null) {
- state.setFontStyle(style);
- }
- if (weight != null) {
- state.setFontWeight(weight.intValue());
- }
- if (variant != null) {
- state.setFontVariant(variant);
- }
- if (size != null) {
- state.setFontSize(size.intValue());
- }
- if (color != null) {
- state.setTextColor(color);
- }
- }
-
- private void leaveTextMode() throws SAXException {
- assert this.mode == MODE_TEXT;
- endElement("g");
- this.mode = MODE_NORMAL;
- }
-
- private void establish(int newMode) throws SAXException {
- switch (newMode) {
- case MODE_TEXT:
- enterTextMode();
- break;
- default:
- if (this.mode == MODE_TEXT) {
- leaveTextMode();
- }
- }
- }
-
- private void enterTextMode() throws SAXException {
- if (state.isFontChanged() && this.mode == MODE_TEXT) {
- leaveTextMode();
- }
- if (this.mode != MODE_TEXT) {
- startTextGroup();
- this.mode = MODE_TEXT;
- }
- }
-
- private void startTextGroup() throws SAXException {
- AttributesImpl atts = new AttributesImpl();
- atts.addAttribute("", "font-family", "font-family",
- CDATA, state.getFontFamily());
- atts.addAttribute("", "font-style", "font-style",
- CDATA, state.getFontStyle());
- atts.addAttribute("", "font-weight", "font-weight",
- CDATA, Integer.toString(state.getFontWeight()));
- atts.addAttribute("", "font-variant", "font-variant",
- CDATA, state.getFontVariant());
- atts.addAttribute("", "font-size", "font-size",
- CDATA, Integer.toString(state.getFontSize()));
- atts.addAttribute("", "fill", "fill",
- CDATA, toString(state.getTextColor()));
- startElement("g", atts);
- state.resetFontChanged();
- }
-
- /** {@inheritDoc} */
- public void handleExtensionObject(Object extension) throws IFException {
- if (extension instanceof Metadata) {
- Metadata meta = (Metadata)extension;
- try {
- establish(MODE_NORMAL);
- startElement("metadata");
- meta.toSAX(this.handler);
- endElement("metadata");
- } catch (SAXException e) {
- throw new IFException("SAX error while handling extension object", e);
- }
- } else {
- throw new UnsupportedOperationException(
- "Don't know how to handle extension object: " + extension);
- }
- }
-}
diff --git a/src/sandbox/org/apache/fop/render/svg/SVGDocumentHandler.java b/src/sandbox/org/apache/fop/render/svg/SVGDocumentHandler.java
new file mode 100644
index 000000000..bd3dbc4e1
--- /dev/null
+++ b/src/sandbox/org/apache/fop/render/svg/SVGDocumentHandler.java
@@ -0,0 +1,272 @@
+/*
+ * 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.render.svg;
+
+import java.awt.Dimension;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.dom.DOMResult;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.sax.SAXResult;
+import javax.xml.transform.sax.TransformerHandler;
+import javax.xml.transform.stream.StreamResult;
+
+import org.w3c.dom.Document;
+
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.AttributesImpl;
+
+import org.apache.commons.io.IOUtils;
+
+import org.apache.fop.render.bitmap.MultiFileRenderingUtil;
+import org.apache.fop.render.intermediate.DelegatingFragmentContentHandler;
+import org.apache.fop.render.intermediate.IFException;
+import org.apache.fop.render.intermediate.IFPainter;
+import org.apache.fop.util.GenerationHelperContentHandler;
+import org.apache.fop.util.XMLUtil;
+
+/**
+ * {@code IFDocumentHandler} implementation that writes SVG 1.1.
+ */
+public class SVGDocumentHandler extends AbstractSVGDocumentHandler {
+
+ /** Helper class for generating multiple files */
+ private MultiFileRenderingUtil multiFileUtil;
+
+ private StreamResult firstStream;
+ private StreamResult currentStream;
+
+ private Document reusedParts;
+
+ /**
+ * Default constructor.
+ */
+ public SVGDocumentHandler() {
+ //nop
+ }
+
+ /** {@inheritDoc} */
+ public boolean supportsPagesOutOfOrder() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ public String getMimeType() {
+ return MIME_TYPE;
+ }
+
+ /** {@inheritDoc} */
+ public void setResult(Result result) throws IFException {
+ if (result instanceof StreamResult) {
+ multiFileUtil = new MultiFileRenderingUtil(FILE_EXTENSION_SVG,
+ getUserAgent().getOutputFile());
+ this.firstStream = (StreamResult)result;
+ } else {
+ throw new UnsupportedOperationException("Result is not supported: " + result);
+ }
+ }
+
+ /** {@inheritDoc} */
+ public void startDocument() throws IFException {
+ DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
+ builderFactory.setNamespaceAware(true);
+ builderFactory.setValidating(false);
+ try {
+ DocumentBuilder builder = builderFactory.newDocumentBuilder();
+ this.reusedParts = builder.newDocument();
+ } catch (ParserConfigurationException e) {
+ throw new IFException("Error while setting up a DOM for SVG generation", e);
+ }
+
+ try {
+ TransformerHandler toDOMHandler = tFactory.newTransformerHandler();
+ toDOMHandler.setResult(new DOMResult(this.reusedParts));
+ this.handler = decorate(toDOMHandler);
+ this.handler.startDocument();
+ } catch (SAXException se) {
+ throw new IFException("SAX error in startDocument()", se);
+ } catch (TransformerConfigurationException e) {
+ throw new IFException(
+ "Error while setting up a TransformerHandler for SVG generation", e);
+ }
+ }
+
+ /** {@inheritDoc} */
+ public void endDocument() throws IFException {
+ //nop
+ }
+
+ /** {@inheritDoc} */
+ public void endDocumentHeader() throws IFException {
+ super.endDocumentHeader();
+ try {
+ //Stop recording parts reused for each page
+ this.handler.endDocument();
+ this.handler = null;
+ } catch (SAXException e) {
+ throw new IFException("SAX error in endDocumentHeader()", e);
+ }
+ }
+
+ /** {@inheritDoc} */
+ public void startPageSequence(String id) throws IFException {
+ //nop
+ }
+
+ /** {@inheritDoc} */
+ public void endPageSequence() throws IFException {
+ //nop
+ }
+
+ /** {@inheritDoc} */
+ public void startPage(int index, String name, Dimension size) throws IFException {
+ OutputStream out;
+ try {
+ if (index == 0) {
+ out = null;
+ } else {
+ out = this.multiFileUtil.createOutputStream(index);
+ if (out == null) {
+ //TODO Convert to event
+ throw new IFException(
+ "No filename information available. Stopping after first page.", null);
+ }
+ }
+ } catch (IOException ioe) {
+ throw new IFException("I/O exception while setting up output file", ioe);
+ }
+ if (out == null) {
+ this.handler = decorate(createContentHandler(this.firstStream));
+ } else {
+ this.currentStream = new StreamResult(out);
+ this.handler = decorate(createContentHandler(this.currentStream));
+ }
+ if (false) {
+ final ContentHandler originalHandler = this.handler;
+ this.handler = decorate((ContentHandler)Proxy.newProxyInstance(
+ ContentHandler.class.getClassLoader(),
+ new Class[] {ContentHandler.class},
+ new InvocationHandler() {
+ public Object invoke(Object proxy, Method method, Object[] args)
+ throws Throwable {
+ String methodName = method.getName();
+ System.out.println(methodName + ":");
+ if (args != null) {
+ for (int i = 0; i < args.length; i++) {
+ System.out.println(" " + args[i]);
+ }
+ }
+ return method.invoke(originalHandler, args);
+ }
+ }));
+ }
+ try {
+ handler.startDocument();
+ handler.startPrefixMapping("", NAMESPACE);
+ handler.startPrefixMapping(XLINK_PREFIX, XLINK_NAMESPACE);
+ AttributesImpl atts = new AttributesImpl();
+ XMLUtil.addAttribute(atts, "version", "1.1"); //SVG 1.1
+ /*
+ XMLUtil.addAttribute(atts, "index", Integer.toString(index));
+ XMLUtil.addAttribute(atts, "name", name);
+ */
+ XMLUtil.addAttribute(atts, "width", Float.toString(size.width / 1000f) + "pt");
+ XMLUtil.addAttribute(atts, "height", Float.toString(size.height / 1000f) + "pt");
+ XMLUtil.addAttribute(atts, "viewBox",
+ "0 0 " + Integer.toString(size.width) + " " + Integer.toString(size.height));
+ handler.startElement("svg", atts);
+
+ try {
+ Transformer transformer = tFactory.newTransformer();
+ Source src = new DOMSource(this.reusedParts.getDocumentElement());
+ Result res = new SAXResult(new DelegatingFragmentContentHandler(this.handler));
+ transformer.transform(src, res);
+ } catch (TransformerConfigurationException tce) {
+ throw new IFException("Error setting up a Transformer", tce);
+ } catch (TransformerException te) {
+ if (te.getCause() instanceof SAXException) {
+ throw (SAXException)te.getCause();
+ } else {
+ throw new IFException("Error while serializing reused parts", te);
+ }
+ }
+ } catch (SAXException e) {
+ throw new IFException("SAX error in startPage()", e);
+ }
+ }
+
+ private GenerationHelperContentHandler decorate(ContentHandler contentHandler) {
+ return new GenerationHelperContentHandler(contentHandler, getMainNamespace());
+ }
+
+ private void closeCurrentStream() {
+ if (this.currentStream != null) {
+ IOUtils.closeQuietly(currentStream.getOutputStream());
+ currentStream.setOutputStream(null);
+ IOUtils.closeQuietly(currentStream.getWriter());
+ currentStream.setWriter(null);
+ this.currentStream = null;
+ }
+ }
+
+ /** {@inheritDoc} */
+ public IFPainter startPageContent() throws IFException {
+ try {
+ handler.startElement("g");
+ } catch (SAXException e) {
+ throw new IFException("SAX error in startPageContent()", e);
+ }
+ return new SVGPainter(this, handler);
+ }
+
+ /** {@inheritDoc} */
+ public void endPageContent() throws IFException {
+ try {
+ handler.endElement("g");
+ } catch (SAXException e) {
+ throw new IFException("SAX error in endPageContent()", e);
+ }
+ }
+
+ /** {@inheritDoc} */
+ public void endPage() throws IFException {
+ try {
+ handler.endElement("svg");
+ this.handler.endDocument();
+ } catch (SAXException e) {
+ throw new IFException("SAX error in endPage()", e);
+ }
+ closeCurrentStream();
+ }
+
+}
diff --git a/src/sandbox/org/apache/fop/render/svg/SVGPainterMaker.java b/src/sandbox/org/apache/fop/render/svg/SVGDocumentHandlerMaker.java
index a25a2f3b7..0296135fd 100644
--- a/src/sandbox/org/apache/fop/render/svg/SVGPainterMaker.java
+++ b/src/sandbox/org/apache/fop/render/svg/SVGDocumentHandlerMaker.java
@@ -20,20 +20,22 @@
package org.apache.fop.render.svg;
import org.apache.fop.apps.FOUserAgent;
-import org.apache.fop.render.intermediate.AbstractIFPainterMaker;
-import org.apache.fop.render.intermediate.IFPainter;
-import org.apache.fop.render.intermediate.IFPainterConfigurator;
+import org.apache.fop.render.intermediate.AbstractIFDocumentHandlerMaker;
+import org.apache.fop.render.intermediate.IFDocumentHandler;
+import org.apache.fop.render.intermediate.IFDocumentHandlerConfigurator;
/**
- * Painter factory for SVG output.
+ * Document handler factory for SVG output.
*/
-public class SVGPainterMaker extends AbstractIFPainterMaker {
+public class SVGDocumentHandlerMaker extends AbstractIFDocumentHandlerMaker {
private static final String[] MIMES = new String[] {SVGConstants.MIME_TYPE};
/** {@inheritDoc} */
- public IFPainter makePainter(FOUserAgent ua) {
- return new SVGPainter();
+ public IFDocumentHandler makeIFDocumentHandler(FOUserAgent ua) {
+ SVGDocumentHandler handler = new SVGDocumentHandler();
+ handler.setUserAgent(ua);
+ return handler;
}
/** {@inheritDoc} */
@@ -47,8 +49,7 @@ public class SVGPainterMaker extends AbstractIFPainterMaker {
}
/** {@inheritDoc} */
- public IFPainterConfigurator getConfigurator(FOUserAgent userAgent) {
- // TODO Auto-generated method stub
+ public IFDocumentHandlerConfigurator getConfigurator(FOUserAgent userAgent) {
return null;
}
diff --git a/src/sandbox/org/apache/fop/render/svg/SVGPainter.java b/src/sandbox/org/apache/fop/render/svg/SVGPainter.java
index aa52673a9..e0d12d9c7 100644
--- a/src/sandbox/org/apache/fop/render/svg/SVGPainter.java
+++ b/src/sandbox/org/apache/fop/render/svg/SVGPainter.java
@@ -19,250 +19,416 @@
package org.apache.fop.render.svg;
+import java.awt.Color;
import java.awt.Dimension;
+import java.awt.Paint;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.geom.AffineTransform;
+import java.io.FileNotFoundException;
import java.io.IOException;
-import java.io.OutputStream;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.Result;
-import javax.xml.transform.Source;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.dom.DOMResult;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.sax.SAXResult;
-import javax.xml.transform.sax.TransformerHandler;
-import javax.xml.transform.stream.StreamResult;
+import java.util.Map;
import org.w3c.dom.Document;
-import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;
-import org.apache.commons.io.IOUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
-import org.apache.fop.render.bitmap.MultiFileRenderingUtil;
-import org.apache.fop.render.intermediate.DelegatingFragmentContentHandler;
+import org.apache.xmlgraphics.image.loader.ImageException;
+import org.apache.xmlgraphics.image.loader.ImageInfo;
+import org.apache.xmlgraphics.image.loader.ImageManager;
+import org.apache.xmlgraphics.image.loader.ImageSessionContext;
+import org.apache.xmlgraphics.util.QName;
+import org.apache.xmlgraphics.xmp.Metadata;
+
+import org.apache.fop.apps.FOUserAgent;
+import org.apache.fop.apps.MimeConstants;
+import org.apache.fop.events.ResourceEventProducer;
+import org.apache.fop.fo.extensions.ExtensionElementMapping;
+import org.apache.fop.render.RenderingContext;
+import org.apache.fop.render.intermediate.AbstractIFPainter;
+import org.apache.fop.render.intermediate.IFConstants;
import org.apache.fop.render.intermediate.IFException;
+import org.apache.fop.render.intermediate.IFState;
+import org.apache.fop.render.intermediate.IFUtil;
+import org.apache.fop.traits.BorderProps;
+import org.apache.fop.traits.RuleStyle;
+import org.apache.fop.util.ColorUtil;
+import org.apache.fop.util.GenerationHelperContentHandler;
+import org.apache.fop.util.XMLUtil;
/**
* IFPainter implementation that writes SVG.
*/
-public class SVGPainter extends AbstractSVGPainter {
+public class SVGPainter extends AbstractIFPainter implements SVGConstants {
+
+ /** logging instance */
+ private static Log log = LogFactory.getLog(SVGPainter.class);
+
+ /** Holds the intermediate format state */
+ protected IFState state;
- /** Helper class for generating multiple files */
- private MultiFileRenderingUtil multiFileUtil;
+ private AbstractSVGDocumentHandler parent;
- private StreamResult firstStream;
- private StreamResult currentStream;
+ /** The SAX content handler that receives the generated XML events. */
+ protected GenerationHelperContentHandler handler;
- private Document reusedParts;
+ private static final int MODE_NORMAL = 0;
+ private static final int MODE_TEXT = 1;
+
+ private int mode = MODE_NORMAL;
/**
- * Default constructor.
+ * Main constructor.
+ * @param parent the parent document handler
+ * @param contentHandler the target SAX content handler
*/
- public SVGPainter() {
- //nop
+ public SVGPainter(AbstractSVGDocumentHandler parent,
+ GenerationHelperContentHandler contentHandler) {
+ super();
+ this.parent = parent;
+ this.handler = contentHandler;
+ this.state = IFState.create();
}
/** {@inheritDoc} */
- public boolean supportsPagesOutOfOrder() {
- return true;
+ protected FOUserAgent getUserAgent() {
+ return parent.getUserAgent();
}
/** {@inheritDoc} */
- public String getMimeType() {
- return MIME_TYPE;
+ public void startViewport(AffineTransform transform, Dimension size, Rectangle clipRect)
+ throws IFException {
+ startViewport(IFUtil.toString(transform), size, clipRect);
}
/** {@inheritDoc} */
- public void setResult(Result result) throws IFException {
- if (result instanceof StreamResult) {
- multiFileUtil = new MultiFileRenderingUtil(FILE_EXTENSION_SVG,
- getUserAgent().getOutputFile());
- this.firstStream = (StreamResult)result;
- } else {
- throw new UnsupportedOperationException("Result is not supported: " + result);
- }
+ public void startViewport(AffineTransform[] transforms, Dimension size, Rectangle clipRect)
+ throws IFException {
+ startViewport(IFUtil.toString(transforms), size, clipRect);
}
- /** {@inheritDoc} */
- public void startDocument() throws IFException {
- DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
- builderFactory.setNamespaceAware(true);
- builderFactory.setValidating(false);
+ private void startViewport(String transform, Dimension size, Rectangle clipRect)
+ throws IFException {
try {
- DocumentBuilder builder = builderFactory.newDocumentBuilder();
- this.reusedParts = builder.newDocument();
- } catch (ParserConfigurationException e) {
- throw new IFException("Error while setting up a DOM for SVG generation", e);
+ establish(MODE_NORMAL);
+ AttributesImpl atts = new AttributesImpl();
+ if (transform != null && transform.length() > 0) {
+ XMLUtil.addAttribute(atts, "transform", transform);
+ }
+ handler.startElement("g", atts);
+
+ atts.clear();
+ XMLUtil.addAttribute(atts, "width", Integer.toString(size.width));
+ XMLUtil.addAttribute(atts, "height", Integer.toString(size.height));
+ if (clipRect != null) {
+ int[] v = new int[] {
+ clipRect.y,
+ -clipRect.x + size.width - clipRect.width,
+ -clipRect.y + size.height - clipRect.height,
+ clipRect.x};
+ int sum = 0;
+ for (int i = 0; i < 4; i++) {
+ sum += Math.abs(v[i]);
+ }
+ if (sum != 0) {
+ StringBuffer sb = new StringBuffer("rect(");
+ sb.append(v[0]).append(',');
+ sb.append(v[1]).append(',');
+ sb.append(v[2]).append(',');
+ sb.append(v[3]).append(')');
+ XMLUtil.addAttribute(atts, "clip", sb.toString());
+ }
+ XMLUtil.addAttribute(atts, "overflow", "hidden");
+ } else {
+ XMLUtil.addAttribute(atts, "overflow", "visible");
+ }
+ handler.startElement("svg", atts);
+ } catch (SAXException e) {
+ throw new IFException("SAX error in startBox()", e);
}
+ }
+ /** {@inheritDoc} */
+ public void endViewport() throws IFException {
try {
- TransformerHandler toDOMHandler = tFactory.newTransformerHandler();
- toDOMHandler.setResult(new DOMResult(this.reusedParts));
- this.handler = toDOMHandler;
- this.handler.startDocument();
- } catch (SAXException se) {
- throw new IFException("SAX error in startDocument()", se);
- } catch (TransformerConfigurationException e) {
- throw new IFException(
- "Error while setting up a TransformerHandler for SVG generation", e);
+ establish(MODE_NORMAL);
+ handler.endElement("svg");
+ handler.endElement("g");
+ } catch (SAXException e) {
+ throw new IFException("SAX error in endBox()", e);
}
}
/** {@inheritDoc} */
- public void endDocument() throws IFException {
- //nop
+ public void startGroup(AffineTransform[] transforms) throws IFException {
+ startGroup(IFUtil.toString(transforms));
}
/** {@inheritDoc} */
- public void endDocumentHeader() throws IFException {
- super.endDocumentHeader();
+ public void startGroup(AffineTransform transform) throws IFException {
+ startGroup(IFUtil.toString(transform));
+ }
+
+ private void startGroup(String transform) throws IFException {
try {
- //Stop recording parts reused for each page
- this.handler.endDocument();
- this.handler = null;
+ AttributesImpl atts = new AttributesImpl();
+ if (transform != null && transform.length() > 0) {
+ XMLUtil.addAttribute(atts, "transform", transform);
+ }
+ handler.startElement("g", atts);
} catch (SAXException e) {
- throw new IFException("SAX error in endDocumentHeader()", e);
+ throw new IFException("SAX error in startGroup()", e);
}
}
/** {@inheritDoc} */
- public void startPageSequence(String id) throws IFException {
- //nop
+ public void endGroup() throws IFException {
+ try {
+ establish(MODE_NORMAL);
+ handler.endElement("g");
+ } catch (SAXException e) {
+ throw new IFException("SAX error in endGroup()", e);
+ }
}
- /** {@inheritDoc} */
- public void endPageSequence() throws IFException {
- //nop
- }
+ private static final QName CONVERSION_MODE
+ = new QName(ExtensionElementMapping.URI, null, "conversion-mode");
/** {@inheritDoc} */
- public void startPage(int index, String name, Dimension size) throws IFException {
- OutputStream out;
+ public void drawImage(String uri, Rectangle rect, Map foreignAttributes) throws IFException {
try {
- if (index == 0) {
- out = null;
- } else {
- out = this.multiFileUtil.createOutputStream(index);
- if (out == null) {
- //TODO Convert to event
- throw new IFException(
- "No filename information available. Stopping after first page.", null);
+ establish(MODE_NORMAL);
+
+ ImageManager manager = getUserAgent().getFactory().getImageManager();
+ ImageInfo info = null;
+ try {
+ ImageSessionContext sessionContext = getUserAgent().getImageSessionContext();
+ info = manager.getImageInfo(uri, sessionContext);
+
+ String mime = info.getMimeType();
+ String conversionMode = (String)foreignAttributes.get(CONVERSION_MODE);
+ if ("reference".equals(conversionMode)
+ && (MimeConstants.MIME_GIF.equals(mime)
+ || MimeConstants.MIME_JPEG.equals(mime)
+ || MimeConstants.MIME_PNG.equals(mime)
+ || MimeConstants.MIME_SVG.equals(mime))) {
+ //Just reference the image
+ //TODO Some additional URI rewriting might be necessary
+ AttributesImpl atts = new AttributesImpl();
+ XMLUtil.addAttribute(atts, IFConstants.XLINK_HREF, uri);
+ XMLUtil.addAttribute(atts, "x", Integer.toString(rect.x));
+ XMLUtil.addAttribute(atts, "y", Integer.toString(rect.y));
+ XMLUtil.addAttribute(atts, "width", Integer.toString(rect.width));
+ XMLUtil.addAttribute(atts, "height", Integer.toString(rect.height));
+ handler.element("image", atts);
+ } else {
+ drawImageUsingImageHandler(info, rect);
}
+ } catch (ImageException ie) {
+ ResourceEventProducer eventProducer = ResourceEventProducer.Provider.get(
+ getUserAgent().getEventBroadcaster());
+ eventProducer.imageError(this, (info != null ? info.toString() : uri), ie, null);
+ } catch (FileNotFoundException fe) {
+ ResourceEventProducer eventProducer = ResourceEventProducer.Provider.get(
+ getUserAgent().getEventBroadcaster());
+ eventProducer.imageNotFound(this, (info != null ? info.toString() : uri), fe, null);
+ } catch (IOException ioe) {
+ ResourceEventProducer eventProducer = ResourceEventProducer.Provider.get(
+ getUserAgent().getEventBroadcaster());
+ eventProducer.imageIOError(this, (info != null ? info.toString() : uri), ioe, null);
}
- } catch (IOException ioe) {
- throw new IFException("I/O exception while setting up output file", ioe);
+ } catch (SAXException e) {
+ throw new IFException("SAX error in drawImage()", e);
}
- if (out == null) {
- this.handler = createContentHandler(this.firstStream);
+ }
+
+ /** {@inheritDoc} */
+ public void drawImage(Document doc, Rectangle rect, Map foreignAttributes) throws IFException {
+ try {
+ establish(MODE_NORMAL);
+
+ drawImageUsingDocument(doc, rect);
+ } catch (SAXException e) {
+ throw new IFException("SAX error in drawImage()", e);
+ }
+ }
+
+ /** {@inheritDoc} */
+ protected RenderingContext createRenderingContext() {
+ SVGRenderingContext svgContext = new SVGRenderingContext(
+ getUserAgent(), handler);
+ return svgContext;
+ }
+
+ private static String toString(Paint paint) {
+ //TODO Paint serialization: Fine-tune and extend!
+ if (paint instanceof Color) {
+ return ColorUtil.colorToString((Color)paint);
} else {
- this.currentStream = new StreamResult(out);
- this.handler = createContentHandler(this.currentStream);
+ throw new UnsupportedOperationException("Paint not supported: " + paint);
}
- if (false) {
- final ContentHandler originalHandler = this.handler;
- this.handler = (ContentHandler)Proxy.newProxyInstance(
- ContentHandler.class.getClassLoader(),
- new Class[] {ContentHandler.class},
- new InvocationHandler() {
- public Object invoke(Object proxy, Method method, Object[] args)
- throws Throwable {
- String methodName = method.getName();
- System.out.println(methodName + ":");
- if (args != null) {
- for (int i = 0; i < args.length; i++) {
- System.out.println(" " + args[i]);
- }
- }
- return method.invoke(originalHandler, args);
- }
- });
+ }
+
+ /** {@inheritDoc} */
+ public void clipRect(Rectangle rect) throws IFException {
+ //TODO Implement me!!!
+ }
+
+ /** {@inheritDoc} */
+ public void fillRect(Rectangle rect, Paint fill) throws IFException {
+ if (fill == null) {
+ return;
}
try {
- handler.startDocument();
- handler.startPrefixMapping("", NAMESPACE);
- handler.startPrefixMapping(XLINK_PREFIX, XLINK_NAMESPACE);
+ establish(MODE_NORMAL);
AttributesImpl atts = new AttributesImpl();
- atts.addAttribute("", "version", "version", CDATA, "1.1"); //SVG 1.1
- /*
- atts.addAttribute("", "index", "index", CDATA, Integer.toString(index));
- atts.addAttribute("", "name", "name", CDATA, name);
- */
- atts.addAttribute("", "width", "width", CDATA,
- Float.toString(size.width / 1000f) + "pt");
- atts.addAttribute("", "height", "height", CDATA,
- Float.toString(size.height / 1000f) + "pt");
- atts.addAttribute("", "viewBox", "viewBox", CDATA,
- "0 0 " + Integer.toString(size.width) + " " + Integer.toString(size.height));
- startElement("svg", atts);
-
- try {
- Transformer transformer = tFactory.newTransformer();
- Source src = new DOMSource(this.reusedParts.getDocumentElement());
- Result res = new SAXResult(new DelegatingFragmentContentHandler(this.handler));
- transformer.transform(src, res);
- } catch (TransformerConfigurationException tce) {
- throw new IFException("Error setting up a Transformer", tce);
- } catch (TransformerException te) {
- if (te.getCause() instanceof SAXException) {
- throw (SAXException)te.getCause();
- } else {
- throw new IFException("Error while serializing reused parts", te);
- }
+ XMLUtil.addAttribute(atts, "x", Integer.toString(rect.x));
+ XMLUtil.addAttribute(atts, "y", Integer.toString(rect.y));
+ XMLUtil.addAttribute(atts, "width", Integer.toString(rect.width));
+ XMLUtil.addAttribute(atts, "height", Integer.toString(rect.height));
+ if (fill != null) {
+ XMLUtil.addAttribute(atts, "fill", toString(fill));
}
+ /* disabled
+ if (stroke != null) {
+ XMLUtil.addAttribute(atts, "stroke", toString(stroke));
+ }*/
+ handler.element("rect", atts);
} catch (SAXException e) {
- throw new IFException("SAX error in startPage()", e);
+ throw new IFException("SAX error in fillRect()", e);
}
}
- private void closeCurrentStream() {
- if (this.currentStream != null) {
- IOUtils.closeQuietly(currentStream.getOutputStream());
- currentStream.setOutputStream(null);
- IOUtils.closeQuietly(currentStream.getWriter());
- currentStream.setWriter(null);
- this.currentStream = null;
- }
+ /** {@inheritDoc} */
+ public void drawBorderRect(Rectangle rect, BorderProps before, BorderProps after,
+ BorderProps start, BorderProps end) throws IFException {
+ // TODO Auto-generated method stub
}
/** {@inheritDoc} */
- public void startPageContent() throws IFException {
- super.startPageContent();
+ public void drawLine(Point start, Point end, int width, Color color, RuleStyle style)
+ throws IFException {
try {
- startElement("g");
+ establish(MODE_NORMAL);
+ AttributesImpl atts = new AttributesImpl();
+ XMLUtil.addAttribute(atts, "x1", Integer.toString(start.x));
+ XMLUtil.addAttribute(atts, "y1", Integer.toString(start.y));
+ XMLUtil.addAttribute(atts, "x2", Integer.toString(end.x));
+ XMLUtil.addAttribute(atts, "y2", Integer.toString(end.y));
+ XMLUtil.addAttribute(atts, "stroke-width", toString(color));
+ XMLUtil.addAttribute(atts, "fill", toString(color));
+ //TODO Handle style parameter
+ handler.element("line", atts);
} catch (SAXException e) {
- throw new IFException("SAX error in startPageContent()", e);
+ throw new IFException("SAX error in drawLine()", e);
}
}
/** {@inheritDoc} */
- public void endPageContent() throws IFException {
+ public void drawText(int x, int y, int[] dx, int[] dy, String text) throws IFException {
try {
- endElement("g");
+ establish(MODE_TEXT);
+ AttributesImpl atts = new AttributesImpl();
+ XMLUtil.addAttribute(atts, "x", Integer.toString(x));
+ XMLUtil.addAttribute(atts, "y", Integer.toString(y));
+ if (dx != null) {
+ XMLUtil.addAttribute(atts, "dx", IFUtil.toString(dx));
+ }
+ if (dy != null) {
+ XMLUtil.addAttribute(atts, "dy", IFUtil.toString(dy));
+ }
+ handler.startElement("text", atts);
+ char[] chars = text.toCharArray();
+ handler.characters(chars, 0, chars.length);
+ handler.endElement("text");
} catch (SAXException e) {
- throw new IFException("SAX error in endPageContent()", e);
+ throw new IFException("SAX error in setFont()", e);
}
- super.endPageContent();
}
/** {@inheritDoc} */
- public void endPage() throws IFException {
- try {
- endElement("svg");
- this.handler.endDocument();
- } catch (SAXException e) {
- throw new IFException("SAX error in endPage()", e);
+ public void setFont(String family, String style, Integer weight, String variant, Integer size,
+ Color color) throws IFException {
+ if (family != null) {
+ state.setFontFamily(family);
+ }
+ if (style != null) {
+ state.setFontStyle(style);
+ }
+ if (weight != null) {
+ state.setFontWeight(weight.intValue());
+ }
+ if (variant != null) {
+ state.setFontVariant(variant);
+ }
+ if (size != null) {
+ state.setFontSize(size.intValue());
+ }
+ if (color != null) {
+ state.setTextColor(color);
+ }
+ }
+
+ private void leaveTextMode() throws SAXException {
+ assert this.mode == MODE_TEXT;
+ handler.endElement("g");
+ this.mode = MODE_NORMAL;
+ }
+
+ private void establish(int newMode) throws SAXException {
+ switch (newMode) {
+ case MODE_TEXT:
+ enterTextMode();
+ break;
+ default:
+ if (this.mode == MODE_TEXT) {
+ leaveTextMode();
+ }
+ }
+ }
+
+ private void enterTextMode() throws SAXException {
+ if (state.isFontChanged() && this.mode == MODE_TEXT) {
+ leaveTextMode();
+ }
+ if (this.mode != MODE_TEXT) {
+ startTextGroup();
+ this.mode = MODE_TEXT;
+ }
+ }
+
+ private void startTextGroup() throws SAXException {
+ AttributesImpl atts = new AttributesImpl();
+ XMLUtil.addAttribute(atts, "font-family", state.getFontFamily());
+ XMLUtil.addAttribute(atts, "font-style", state.getFontStyle());
+ XMLUtil.addAttribute(atts, "font-weight", Integer.toString(state.getFontWeight()));
+ XMLUtil.addAttribute(atts, "font-variant", state.getFontVariant());
+ XMLUtil.addAttribute(atts, "font-size", Integer.toString(state.getFontSize()));
+ XMLUtil.addAttribute(atts, "fill", toString(state.getTextColor()));
+ handler.startElement("g", atts);
+ state.resetFontChanged();
+ }
+
+ /** {@inheritDoc} */
+ public void handleExtensionObject(Object extension) throws IFException {
+ if (extension instanceof Metadata) {
+ Metadata meta = (Metadata)extension;
+ try {
+ establish(MODE_NORMAL);
+ handler.startElement("metadata");
+ meta.toSAX(this.handler);
+ handler.endElement("metadata");
+ } catch (SAXException e) {
+ throw new IFException("SAX error while handling extension object", e);
+ }
+ } else {
+ throw new UnsupportedOperationException(
+ "Don't know how to handle extension object: " + extension);
}
- closeCurrentStream();
}
}
diff --git a/src/sandbox/org/apache/fop/render/svg/SVGPrintPainter.java b/src/sandbox/org/apache/fop/render/svg/SVGPrintDocumentHandler.java
index 7f5c84cef..ee69f95ae 100644
--- a/src/sandbox/org/apache/fop/render/svg/SVGPrintPainter.java
+++ b/src/sandbox/org/apache/fop/render/svg/SVGPrintDocumentHandler.java
@@ -28,16 +28,18 @@ import org.xml.sax.helpers.AttributesImpl;
import org.apache.fop.render.intermediate.IFConstants;
import org.apache.fop.render.intermediate.IFException;
+import org.apache.fop.render.intermediate.IFPainter;
+import org.apache.fop.util.XMLUtil;
/**
- * IFPainter implementation that writes SVG Print.
+ * {@code IFDocumentHandler} implementation that writes SVG Print.
*/
-public class SVGPrintPainter extends AbstractSVGPainter {
+public class SVGPrintDocumentHandler extends AbstractSVGDocumentHandler {
/**
* Default constructor.
*/
- public SVGPrintPainter() {
+ public SVGPrintDocumentHandler() {
//nop
}
@@ -47,7 +49,7 @@ public class SVGPrintPainter extends AbstractSVGPainter {
* @param result the JAXP Result object to receive the generated content
* @throws IFException if an error occurs setting up the output
*/
- public SVGPrintPainter(Result result) throws IFException {
+ public SVGPrintDocumentHandler(Result result) throws IFException {
setResult(result);
}
@@ -69,8 +71,8 @@ public class SVGPrintPainter extends AbstractSVGPainter {
handler.startPrefixMapping(XLINK_PREFIX, XLINK_NAMESPACE);
handler.startPrefixMapping("if", IFConstants.NAMESPACE);
AttributesImpl atts = new AttributesImpl();
- atts.addAttribute("", "version", "version", CDATA, "1.2"); //SVG Print is SVG 1.2
- startElement("svg", atts);
+ XMLUtil.addAttribute(atts, "version", "1.2"); //SVG Print is SVG 1.2
+ handler.startElement("svg", atts);
} catch (SAXException e) {
throw new IFException("SAX error in startDocument()", e);
}
@@ -79,7 +81,7 @@ public class SVGPrintPainter extends AbstractSVGPainter {
/** {@inheritDoc} */
public void endDocument() throws IFException {
try {
- endElement("svg");
+ handler.endElement("svg");
handler.endDocument();
} catch (SAXException e) {
throw new IFException("SAX error in endDocument()", e);
@@ -93,7 +95,7 @@ public class SVGPrintPainter extends AbstractSVGPainter {
if (id != null) {
atts.addAttribute(XML_NAMESPACE, "id", "xml:id", CDATA, id);
}
- startElement("pageSet", atts);
+ handler.startElement("pageSet", atts);
} catch (SAXException e) {
throw new IFException("SAX error in startPageSequence()", e);
}
@@ -102,7 +104,7 @@ public class SVGPrintPainter extends AbstractSVGPainter {
/** {@inheritDoc} */
public void endPageSequence() throws IFException {
try {
- endElement("pageSet");
+ handler.endElement("pageSet");
} catch (SAXException e) {
throw new IFException("SAX error in endPageSequence()", e);
}
@@ -113,8 +115,8 @@ public class SVGPrintPainter extends AbstractSVGPainter {
try {
AttributesImpl atts = new AttributesImpl();
/*
- atts.addAttribute("", "index", "index", CDATA, Integer.toString(index));
- atts.addAttribute("", "name", "name", CDATA, name);
+ XMLUtil.addAttribute(atts, "index", Integer.toString(index));
+ XMLUtil.addAttribute(atts, "name", name);
*/
//NOTE: SVG Print doesn't support individual page sizes for each page
atts.addAttribute(IFConstants.NAMESPACE, "width", "if:width",
@@ -123,7 +125,7 @@ public class SVGPrintPainter extends AbstractSVGPainter {
CDATA, Integer.toString(size.height));
atts.addAttribute(IFConstants.NAMESPACE, "viewBox", "if:viewBox", CDATA,
"0 0 " + Integer.toString(size.width) + " " + Integer.toString(size.height));
- startElement("page", atts);
+ handler.startElement("page", atts);
} catch (SAXException e) {
throw new IFException("SAX error in startPage()", e);
}
@@ -138,23 +140,22 @@ public class SVGPrintPainter extends AbstractSVGPainter {
}
/** {@inheritDoc} */
- public void startPageContent() throws IFException {
- super.startPageContent();
+ public IFPainter startPageContent() throws IFException {
try {
- startElement("g");
+ handler.startElement("g");
} catch (SAXException e) {
throw new IFException("SAX error in startPageContent()", e);
}
+ return new SVGPainter(this, handler);
}
/** {@inheritDoc} */
public void endPageContent() throws IFException {
try {
- endElement("g");
+ handler.endElement("g");
} catch (SAXException e) {
throw new IFException("SAX error in endPageContent()", e);
}
- super.endPageContent();
}
/** {@inheritDoc} */
@@ -168,7 +169,7 @@ public class SVGPrintPainter extends AbstractSVGPainter {
/** {@inheritDoc} */
public void endPage() throws IFException {
try {
- endElement("page");
+ handler.endElement("page");
} catch (SAXException e) {
throw new IFException("SAX error in endPage()", e);
}
diff --git a/src/sandbox/org/apache/fop/render/svg/SVGPrintPainterMaker.java b/src/sandbox/org/apache/fop/render/svg/SVGPrintDocumentHandlerMaker.java
index 55a7bf753..61993da13 100644
--- a/src/sandbox/org/apache/fop/render/svg/SVGPrintPainterMaker.java
+++ b/src/sandbox/org/apache/fop/render/svg/SVGPrintDocumentHandlerMaker.java
@@ -20,20 +20,22 @@
package org.apache.fop.render.svg;
import org.apache.fop.apps.FOUserAgent;
-import org.apache.fop.render.intermediate.AbstractIFPainterMaker;
-import org.apache.fop.render.intermediate.IFPainter;
-import org.apache.fop.render.intermediate.IFPainterConfigurator;
+import org.apache.fop.render.intermediate.AbstractIFDocumentHandlerMaker;
+import org.apache.fop.render.intermediate.IFDocumentHandler;
+import org.apache.fop.render.intermediate.IFDocumentHandlerConfigurator;
/**
- * Painter factory for SVG Print output.
+ * Document handler factory for SVG Print output.
*/
-public class SVGPrintPainterMaker extends AbstractIFPainterMaker {
+public class SVGPrintDocumentHandlerMaker extends AbstractIFDocumentHandlerMaker {
private static final String[] MIMES = new String[] {SVGConstants.MIME_SVG_PRINT};
/** {@inheritDoc} */
- public IFPainter makePainter(FOUserAgent ua) {
- return new SVGPrintPainter();
+ public IFDocumentHandler makeIFDocumentHandler(FOUserAgent ua) {
+ SVGPrintDocumentHandler handler = new SVGPrintDocumentHandler();
+ handler.setUserAgent(ua);
+ return handler;
}
/** {@inheritDoc} */
@@ -47,8 +49,7 @@ public class SVGPrintPainterMaker extends AbstractIFPainterMaker {
}
/** {@inheritDoc} */
- public IFPainterConfigurator getConfigurator(FOUserAgent userAgent) {
- // TODO Auto-generated method stub
+ public IFDocumentHandlerConfigurator getConfigurator(FOUserAgent userAgent) {
return null;
}