aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/java/org/apache/fop/render/AbstractGenericSVGHandler.java131
-rw-r--r--src/java/org/apache/fop/render/AbstractGraphics2DAdapter.java92
-rw-r--r--src/java/org/apache/fop/render/AbstractPathOrientedRenderer.java25
-rw-r--r--src/java/org/apache/fop/render/PrintRenderer.java51
-rw-r--r--src/java/org/apache/fop/render/RendererContext.java63
-rw-r--r--src/java/org/apache/fop/render/java2d/Java2DRenderer.java49
-rw-r--r--src/java/org/apache/fop/render/pdf/PDFRenderer.java44
-rw-r--r--src/java/org/apache/fop/render/ps/PSRenderer.java46
-rw-r--r--src/java/org/apache/fop/render/txt/TXTRenderer.java11
-rw-r--r--src/sandbox/META-INF/services/org.apache.fop.render.XMLHandler1
-rw-r--r--src/sandbox/org/apache/fop/render/afp/AFPGraphics2DAdapter.java54
-rw-r--r--src/sandbox/org/apache/fop/render/afp/AFPRenderer.java58
-rw-r--r--src/sandbox/org/apache/fop/render/afp/AFPSVGHandler.java38
-rw-r--r--src/sandbox/org/apache/fop/render/afp/SVGConverter.java27
-rw-r--r--src/sandbox/org/apache/fop/render/pcl/PCLGraphics2DAdapter.java41
-rw-r--r--src/sandbox/org/apache/fop/render/pcl/PCLRenderer.java48
-rw-r--r--src/sandbox/org/apache/fop/render/pcl/PCLRendererContext.java36
-rw-r--r--src/sandbox/org/apache/fop/render/pcl/PCLSVGHandler.java113
18 files changed, 578 insertions, 350 deletions
diff --git a/src/java/org/apache/fop/render/AbstractGenericSVGHandler.java b/src/java/org/apache/fop/render/AbstractGenericSVGHandler.java
new file mode 100644
index 000000000..a54f6b9b8
--- /dev/null
+++ b/src/java/org/apache/fop/render/AbstractGenericSVGHandler.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright 2006 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;
+
+// Java
+import java.awt.Dimension;
+import java.awt.Graphics2D;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.Rectangle2D;
+import java.io.IOException;
+
+// DOM
+import org.w3c.dom.Document;
+
+// Batik
+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;
+
+// FOP
+import org.apache.fop.render.Graphics2DAdapter;
+import org.apache.fop.render.Graphics2DImagePainter;
+import org.apache.fop.render.RendererContextConstants;
+import org.apache.fop.render.XMLHandler;
+import org.apache.fop.render.RendererContext;
+import org.apache.fop.render.RendererContext.RendererContextWrapper;
+import org.apache.fop.svg.SVGUserAgent;
+
+// Commons-Logging
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Generic XML handler for SVG. Uses Apache Batik for SVG processing and simply paints to
+ * a Graphics2DAdapter and thus ultimatively to Graphics2D interface that is presented.
+ * <p>
+ * To use this class, subclass it and implement the missing methods (supportsRenderer, for example).
+ */
+public abstract class AbstractGenericSVGHandler implements XMLHandler, RendererContextConstants {
+
+ /** logging instance */
+ private static Log log = LogFactory.getLog(AbstractGenericSVGHandler.class);
+
+ /** @see org.apache.fop.render.XMLHandler */
+ public void handleXML(RendererContext context,
+ Document doc, String ns) throws Exception {
+
+ if (SVGDOMImplementation.SVG_NAMESPACE_URI.equals(ns)) {
+ renderSVGDocument(context, doc);
+ }
+ }
+
+ /**
+ * Render the SVG document.
+ * @param context the renderer context
+ * @param doc the SVG document
+ * @throws IOException In case of an I/O error while painting the image
+ */
+ protected void renderSVGDocument(final RendererContext context,
+ final Document doc) throws IOException {
+ final RendererContextWrapper wrappedContext = RendererContext.wrapRendererContext(context);
+ int x = wrappedContext.getCurrentXPosition();
+ int y = wrappedContext.getCurrentYPosition();
+
+ //Prepare
+ SVGUserAgent ua = new SVGUserAgent(
+ context.getUserAgent().getSourcePixelUnitToMillimeter(),
+ new AffineTransform());
+ GVTBuilder builder = new GVTBuilder();
+ final BridgeContext ctx = new BridgeContext(ua);
+
+ //Build the GVT tree
+ final GraphicsNode root;
+ try {
+ root = builder.build(ctx, doc);
+ } catch (Exception e) {
+ log.error("SVG graphic could not be built: " + e.getMessage(), e);
+ return;
+ }
+
+ //Create the painter
+ Graphics2DImagePainter painter = new Graphics2DImagePainter() {
+
+ public void paint(Graphics2D g2d, Rectangle2D area) {
+ // 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();
+ float ih = (float) ctx.getDocumentSize().getHeight();
+ float w = (float) area.getWidth();
+ float h = (float) area.getHeight();
+ g2d.scale(w / iw, h / ih);
+
+ root.paint(g2d);
+ }
+
+ public Dimension getImageSize() {
+ return new Dimension(wrappedContext.getWidth(), wrappedContext.getHeight());
+ }
+
+ };
+
+ //Let the painter paint the SVG on the Graphics2D instance
+ Graphics2DAdapter adapter = context.getRenderer().getGraphics2DAdapter();
+ adapter.paintImage(painter, context,
+ x, y, wrappedContext.getWidth(), wrappedContext.getHeight());
+ }
+
+ /** @see org.apache.fop.render.XMLHandler#getNamespace() */
+ public String getNamespace() {
+ return SVGDOMImplementation.SVG_NAMESPACE_URI;
+ }
+
+}
+
diff --git a/src/java/org/apache/fop/render/AbstractGraphics2DAdapter.java b/src/java/org/apache/fop/render/AbstractGraphics2DAdapter.java
new file mode 100644
index 000000000..af5343f33
--- /dev/null
+++ b/src/java/org/apache/fop/render/AbstractGraphics2DAdapter.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2006 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;
+
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.geom.Rectangle2D;
+import java.awt.image.BufferedImage;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.fop.render.Graphics2DAdapter;
+import org.apache.fop.render.Graphics2DImagePainter;
+import org.apache.fop.render.RendererContext.RendererContextWrapper;
+import org.apache.fop.util.UnitConv;
+
+/**
+ * Graphics2DAdapter implementation for PCL and HP GL/2.
+ */
+public abstract class AbstractGraphics2DAdapter implements Graphics2DAdapter {
+
+ /**
+ * Paints the image to a BufferedImage and returns that.
+ * @param painter the painter which will paint the actual image
+ * @param context the renderer context for the current renderer
+ * @param resolution the requested bitmap resolution
+ * @param gray true if the generated image should be in grayscales
+ * @return the generated BufferedImage
+ */
+ protected BufferedImage paintToBufferedImage(Graphics2DImagePainter painter,
+ RendererContextWrapper context, int resolution, boolean gray) {
+ int bmw = UnitConv.mpt2px(context.getWidth(), resolution);
+ int bmh = UnitConv.mpt2px(context.getHeight(), resolution);
+ BufferedImage bi;
+ if (gray) {
+ bi = new BufferedImage(bmw, bmh, BufferedImage.TYPE_BYTE_GRAY);
+ } else {
+ bi = new BufferedImage(bmw, bmh, BufferedImage.TYPE_INT_ARGB);
+ }
+ Graphics2D g2d = bi.createGraphics();
+ try {
+ g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS,
+ RenderingHints.VALUE_FRACTIONALMETRICS_ON);
+ setRenderingHintsForBufferedImage(g2d);
+
+ g2d.setBackground(Color.white);
+ g2d.setColor(Color.black);
+ g2d.clearRect(0, 0, bmw, bmh);
+ double sx = (double)bmw / context.getWidth();
+ double sy = (double)bmh / context.getHeight();
+ g2d.scale(sx, sy);
+
+ //Paint the image on the BufferedImage
+ Rectangle2D area = new Rectangle2D.Double(
+ 0.0, 0.0, context.getWidth(), context.getHeight());
+ painter.paint(g2d, area);
+ } finally {
+ g2d.dispose();
+ }
+ return bi;
+ }
+
+ /**
+ * Sets rendering hints on the Graphics2D created for painting to a BufferedImage. Subclasses
+ * can modify the settings to customize the behaviour.
+ * @param g2d the Graphics2D instance
+ */
+ protected void setRenderingHintsForBufferedImage(Graphics2D g2d) {
+ g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
+ RenderingHints.VALUE_ANTIALIAS_OFF);
+ g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
+ RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
+ }
+
+}
diff --git a/src/java/org/apache/fop/render/AbstractPathOrientedRenderer.java b/src/java/org/apache/fop/render/AbstractPathOrientedRenderer.java
index d843de5ae..54accb5b8 100644
--- a/src/java/org/apache/fop/render/AbstractPathOrientedRenderer.java
+++ b/src/java/org/apache/fop/render/AbstractPathOrientedRenderer.java
@@ -22,6 +22,7 @@ import java.awt.Color;
import java.awt.Rectangle;
import java.awt.geom.Rectangle2D;
import java.util.List;
+import java.util.Map;
import org.apache.fop.area.Area;
import org.apache.fop.area.Block;
@@ -29,12 +30,14 @@ import org.apache.fop.area.BlockViewport;
import org.apache.fop.area.CTM;
import org.apache.fop.area.RegionViewport;
import org.apache.fop.area.Trait;
+import org.apache.fop.area.inline.ForeignObject;
import org.apache.fop.area.inline.InlineArea;
import org.apache.fop.area.inline.Viewport;
import org.apache.fop.fo.Constants;
import org.apache.fop.fonts.FontMetrics;
import org.apache.fop.image.FopImage;
import org.apache.fop.traits.BorderProps;
+import org.w3c.dom.Document;
/**
* Abstract base class for renderers like PDF and PostScript where many painting operations
@@ -661,8 +664,18 @@ public abstract class AbstractPathOrientedRenderer extends PrintRenderer {
* Draw an image at the indicated location.
* @param url the URI/URL of the image
* @param pos the position of the image
+ * @param foreignAttributes an optional Map with foreign attributes, may be null
*/
- protected abstract void drawImage(String url, Rectangle2D pos);
+ protected abstract void drawImage(String url, Rectangle2D pos, Map foreignAttributes);
+
+ /**
+ * Draw an image at the indicated location.
+ * @param url the URI/URL of the image
+ * @param pos the position of the image
+ */
+ protected final void drawImage(String url, Rectangle2D pos) {
+ drawImage(url, pos, null);
+ }
/**
* Draw a border segment of an XSL-FO style border.
@@ -678,5 +691,15 @@ public abstract class AbstractPathOrientedRenderer extends PrintRenderer {
*/
protected abstract void drawBorderLine(float x1, float y1, float x2, float y2,
boolean horz, boolean startOrBefore, int style, Color col);
+
+ /**
+ * @see org.apache.fop.render.AbstractRenderer#renderForeignObject(ForeignObject, Rectangle2D)
+ */
+ public void renderForeignObject(ForeignObject fo, Rectangle2D pos) {
+ endTextObject();
+ Document doc = fo.getDocument();
+ String ns = fo.getNameSpace();
+ renderDocument(doc, ns, pos, fo.getForeignAttributes());
+ }
}
diff --git a/src/java/org/apache/fop/render/PrintRenderer.java b/src/java/org/apache/fop/render/PrintRenderer.java
index d782a7eed..4e0718a72 100644
--- a/src/java/org/apache/fop/render/PrintRenderer.java
+++ b/src/java/org/apache/fop/render/PrintRenderer.java
@@ -26,10 +26,13 @@ import org.apache.fop.fonts.FontInfo;
import org.apache.fop.fonts.FontResolver;
import org.apache.fop.fonts.FontSetup;
import org.apache.fop.fonts.FontTriplet;
+import org.w3c.dom.Document;
// Java
import java.awt.Color;
+import java.awt.geom.Rectangle2D;
import java.util.List;
+import java.util.Map;
/** Abstract base class of "Print" type renderers. */
public abstract class PrintRenderer extends AbstractRenderer {
@@ -96,4 +99,52 @@ public abstract class PrintRenderer extends AbstractRenderer {
return new Color(cols[0], cols[1], cols[2], cols[3]);
}
+ /**
+ * Creates a RendererContext for an image.
+ * @param x the x coordinate (in millipoints)
+ * @param y the y coordinate (in millipoints)
+ * @param width the width of the image (in millipoints)
+ * @param height the height of the image (in millipoints)
+ * @param foreignAttributes a Map or foreign attributes, may be null
+ * @return the RendererContext
+ */
+ protected RendererContext createRendererContext(int x, int y, int width, int height,
+ Map foreignAttributes) {
+ RendererContext context;
+ context = new RendererContext(this, getMimeType());
+ context.setUserAgent(userAgent);
+
+ context.setProperty(RendererContextConstants.WIDTH,
+ new Integer(width));
+ context.setProperty(RendererContextConstants.HEIGHT,
+ new Integer(height));
+ context.setProperty(RendererContextConstants.XPOS,
+ new Integer(x));
+ context.setProperty(RendererContextConstants.YPOS,
+ new Integer(y));
+ context.setProperty(RendererContextConstants.PAGE_VIEWPORT,
+ getCurrentPageViewport());
+ if (foreignAttributes != null) {
+ context.setProperty(RendererContextConstants.FOREIGN_ATTRIBUTES, foreignAttributes);
+ }
+ return context;
+ }
+
+ /**
+ * Renders an XML document (SVG for example).
+ * @param doc the DOM Document containing the XML document to be rendered
+ * @param ns the namespace URI for the XML document
+ * @param pos the position for the generated graphic/image
+ * @param foreignAttributes the foreign attributes containing rendering hints, or null
+ */
+ public void renderDocument(Document doc, String ns, Rectangle2D pos, Map foreignAttributes) {
+ int x = currentIPPosition + (int) pos.getX();
+ int y = currentBPPosition + (int) pos.getY();
+ int width = (int)pos.getWidth();
+ int height = (int)pos.getHeight();
+ RendererContext context = createRendererContext(x, y, width, height, foreignAttributes);
+
+ renderXML(context, doc, ns);
+ }
+
}
diff --git a/src/java/org/apache/fop/render/RendererContext.java b/src/java/org/apache/fop/render/RendererContext.java
index b81e10f69..0fdb74a1a 100644
--- a/src/java/org/apache/fop/render/RendererContext.java
+++ b/src/java/org/apache/fop/render/RendererContext.java
@@ -1,5 +1,5 @@
/*
- * Copyright 1999-2005 The Apache Software Foundation.
+ * Copyright 1999-2006 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.
@@ -22,6 +22,7 @@ package org.apache.fop.render;
import java.util.Map;
//FOP
+import org.apache.avalon.framework.configuration.Configuration;
import org.apache.fop.apps.FOUserAgent;
/**
@@ -101,5 +102,65 @@ public class RendererContext {
return props.get(prop);
}
+ /**
+ * Wrap the render context to allow easier access to its values.
+ *
+ * @param context the renderer context
+ * @return the generic renderer context wrapper
+ */
+ public static RendererContextWrapper wrapRendererContext(RendererContext context) {
+ RendererContextWrapper wrapper = new RendererContextWrapper(context);
+ return wrapper;
+ }
+
+ /**
+ * Base class for a wrapper around RendererContext to access its properties in a type-safe,
+ * renderer-specific way.
+ */
+ public static class RendererContextWrapper {
+
+ /** The wrapped RendererContext */
+ protected RendererContext context;
+
+ /**
+ * Main constructor
+ * @param context the RendererContent instance
+ */
+ public RendererContextWrapper(RendererContext context) {
+ this.context = context;
+ }
+
+ /** @return the currentXPosition */
+ public int getCurrentXPosition() {
+ return ((Integer)context.getProperty(RendererContextConstants.XPOS)).intValue();
+ }
+
+ /** @return the currentYPosition */
+ public int getCurrentYPosition() {
+ return ((Integer)context.getProperty(RendererContextConstants.YPOS)).intValue();
+ }
+
+ /** @return the width of the image */
+ public int getWidth() {
+ return ((Integer)context.getProperty(RendererContextConstants.WIDTH)).intValue();
+ }
+
+ /** @return the height of the image */
+ public int getHeight() {
+ return ((Integer)context.getProperty(RendererContextConstants.HEIGHT)).intValue();
+ }
+
+ /** @return the handler configuration */
+ public Configuration getHandlerConfiguration() {
+ return (Configuration)context.getProperty(
+ RendererContextConstants.HANDLER_CONFIGURATION);
+ }
+
+ /** @return the foreign attributes */
+ public Map getForeignAttributes() {
+ return (Map)context.getProperty(RendererContextConstants.FOREIGN_ATTRIBUTES);
+ }
+
+ }
}
diff --git a/src/java/org/apache/fop/render/java2d/Java2DRenderer.java b/src/java/org/apache/fop/render/java2d/Java2DRenderer.java
index a2cdce9ab..d8b8312b3 100644
--- a/src/java/org/apache/fop/render/java2d/Java2DRenderer.java
+++ b/src/java/org/apache/fop/render/java2d/Java2DRenderer.java
@@ -45,6 +45,7 @@ import java.io.IOException;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import org.w3c.dom.Document;
@@ -68,6 +69,7 @@ import org.apache.fop.render.AbstractPathOrientedRenderer;
import org.apache.fop.render.Graphics2DAdapter;
import org.apache.fop.render.RendererContext;
import org.apache.fop.render.pdf.CTMHelper;
+import org.apache.fop.render.pdf.PDFRendererContextConstants;
/**
* The <code>Java2DRenderer</code> class provides the abstract technical
@@ -770,9 +772,9 @@ public abstract class Java2DRenderer extends AbstractPathOrientedRenderer implem
/**
* @see org.apache.fop.render.AbstractPathOrientedRenderer#drawImage(
- * java.lang.String, java.awt.geom.Rectangle2D)
+ * java.lang.String, java.awt.geom.Rectangle2D, java.util.Map)
*/
- protected void drawImage(String url, Rectangle2D pos) {
+ protected void drawImage(String url, Rectangle2D pos, Map foreignAttributes) {
int x = currentIPPosition + (int)Math.round(pos.getX());
int y = currentBPPosition + (int)Math.round(pos.getY());
@@ -796,7 +798,7 @@ public abstract class Java2DRenderer extends AbstractPathOrientedRenderer implem
}
Document doc = ((XMLImage) fopimage).getDocument();
String ns = ((XMLImage) fopimage).getNameSpace();
- renderDocument(doc, ns, pos);
+ renderDocument(doc, ns, pos, foreignAttributes);
} else if ("image/svg+xml".equals(mime)) {
if (!fopimage.load(FopImage.ORIGINAL_DATA)) {
@@ -805,7 +807,7 @@ public abstract class Java2DRenderer extends AbstractPathOrientedRenderer implem
Document doc = ((XMLImage) fopimage).getDocument();
String ns = ((XMLImage) fopimage).getNameSpace();
- renderDocument(doc, ns, pos);
+ renderDocument(doc, ns, pos, foreignAttributes);
} else if ("image/eps".equals(mime)) {
log.warn("EPS images are not supported by this renderer");
} else {
@@ -840,40 +842,15 @@ public abstract class Java2DRenderer extends AbstractPathOrientedRenderer implem
}
/**
- * @see org.apache.fop.render.AbstractRenderer#renderForeignObject(ForeignObject,
- * Rectangle2D)
- */
- public void renderForeignObject(ForeignObject fo, Rectangle2D pos) {
- Document doc = fo.getDocument();
- String ns = fo.getNameSpace();
- renderDocument(doc, ns, pos);
- }
-
- /**
- * Renders an XML document (SVG for example).
- *
- * @param doc DOM document representing the XML document
- * @param ns Namespace for the document
- * @param pos Position on the page
+ * @see org.apache.fop.render.PrintRenderer#createRendererContext(
+ * int, int, int, int, java.util.Map)
*/
- public void renderDocument(Document doc, String ns, Rectangle2D pos) {
- RendererContext context;
- context = new RendererContext(this, getMimeType());
- context.setUserAgent(userAgent);
-
+ protected RendererContext createRendererContext(int x, int y, int width, int height,
+ Map foreignAttributes) {
+ RendererContext context = super.createRendererContext(
+ x, y, width, height, foreignAttributes);
context.setProperty(Java2DRendererContextConstants.JAVA2D_STATE, state);
- context.setProperty(Java2DRendererContextConstants.XPOS,
- new Integer(currentIPPosition + (int)pos.getX()));
- context.setProperty(Java2DRendererContextConstants.YPOS,
- new Integer(currentBPPosition + (int)pos.getY()));
- context.setProperty(Java2DRendererContextConstants.WIDTH,
- new Integer((int)pos.getWidth()));
- context.setProperty(Java2DRendererContextConstants.HEIGHT,
- new Integer((int) pos.getHeight()));
- context.setProperty(Java2DRendererContextConstants.PAGE_VIEWPORT,
- getCurrentPageViewport());
-
- renderXML(context, doc, ns);
+ return context;
}
/**
diff --git a/src/java/org/apache/fop/render/pdf/PDFRenderer.java b/src/java/org/apache/fop/render/pdf/PDFRenderer.java
index 0852eda39..fbc7049ca 100644
--- a/src/java/org/apache/fop/render/pdf/PDFRenderer.java
+++ b/src/java/org/apache/fop/render/pdf/PDFRenderer.java
@@ -54,7 +54,6 @@ import org.apache.fop.area.OffDocumentItem;
import org.apache.fop.area.BookmarkData;
import org.apache.fop.area.inline.AbstractTextArea;
import org.apache.fop.area.inline.TextArea;
-import org.apache.fop.area.inline.ForeignObject;
import org.apache.fop.area.inline.Image;
import org.apache.fop.area.inline.Leader;
import org.apache.fop.area.inline.InlineParent;
@@ -1323,7 +1322,7 @@ public class PDFRenderer extends AbstractPathOrientedRenderer {
}
/** @see org.apache.fop.render.AbstractPathOrientedRenderer */
- protected void drawImage(String url, Rectangle2D pos) {
+ protected void drawImage(String url, Rectangle2D pos, Map foreignAttributes) {
endTextObject();
putImage(url, pos);
}
@@ -1360,7 +1359,7 @@ public class PDFRenderer extends AbstractPathOrientedRenderer {
Document doc = ((XMLImage) fopimage).getDocument();
String ns = ((XMLImage) fopimage).getNameSpace();
- renderDocument(doc, ns, pos);
+ renderDocument(doc, ns, pos, null);
} else if ("image/svg+xml".equals(mime)) {
if (!fopimage.load(FopImage.ORIGINAL_DATA)) {
return;
@@ -1368,7 +1367,7 @@ public class PDFRenderer extends AbstractPathOrientedRenderer {
Document doc = ((XMLImage) fopimage).getDocument();
String ns = ((XMLImage) fopimage).getNameSpace();
- renderDocument(doc, ns, pos);
+ renderDocument(doc, ns, pos, null);
} else if ("image/eps".equals(mime)) {
FopPDFImage pdfimage = new FopPDFImage(fopimage, url);
int xobj = pdfDoc.addImage(currentContext, pdfimage).getXNumber();
@@ -1428,49 +1427,26 @@ public class PDFRenderer extends AbstractPathOrientedRenderer {
}
/**
- * @see org.apache.fop.render.AbstractRenderer#renderForeignObject(ForeignObject, Rectangle2D)
+ * @see org.apache.fop.render.PrintRenderer#createRendererContext(
+ * int, int, int, int, java.util.Map)
*/
- public void renderForeignObject(ForeignObject fo, Rectangle2D pos) {
- endTextObject();
- Document doc = fo.getDocument();
- String ns = fo.getNameSpace();
- renderDocument(doc, ns, pos);
- }
-
- /**
- * Renders an XML document (SVG for example).
- * @param doc DOM document representing the XML document
- * @param ns Namespace for the document
- * @param pos Position on the page
- */
- public void renderDocument(Document doc, String ns, Rectangle2D pos) {
- RendererContext context;
- context = new RendererContext(this, MIME_TYPE);
- context.setUserAgent(userAgent);
-
+ protected RendererContext createRendererContext(int x, int y, int width, int height,
+ Map foreignAttributes) {
+ RendererContext context = super.createRendererContext(
+ x, y, width, height, foreignAttributes);
context.setProperty(PDFRendererContextConstants.PDF_DOCUMENT, pdfDoc);
context.setProperty(PDFRendererContextConstants.OUTPUT_STREAM, ostream);
- context.setProperty(PDFRendererContextConstants.PAGE_VIEWPORT, getCurrentPageViewport());
context.setProperty(PDFRendererContextConstants.PDF_STATE, currentState);
context.setProperty(PDFRendererContextConstants.PDF_PAGE, currentPage);
context.setProperty(PDFRendererContextConstants.PDF_CONTEXT,
currentContext == null ? currentPage : currentContext);
context.setProperty(PDFRendererContextConstants.PDF_CONTEXT, currentContext);
context.setProperty(PDFRendererContextConstants.PDF_STREAM, currentStream);
- context.setProperty(PDFRendererContextConstants.XPOS,
- new Integer(currentIPPosition + (int) pos.getX()));
- context.setProperty(PDFRendererContextConstants.YPOS,
- new Integer(currentBPPosition + (int) pos.getY()));
context.setProperty(PDFRendererContextConstants.PDF_FONT_INFO, fontInfo);
context.setProperty(PDFRendererContextConstants.PDF_FONT_NAME, currentFontName);
context.setProperty(PDFRendererContextConstants.PDF_FONT_SIZE,
new Integer(currentFontSize));
- context.setProperty(PDFRendererContextConstants.WIDTH,
- new Integer((int) pos.getWidth()));
- context.setProperty(PDFRendererContextConstants.HEIGHT,
- new Integer((int) pos.getHeight()));
- renderXML(context, doc, ns);
-
+ return context;
}
/**
diff --git a/src/java/org/apache/fop/render/ps/PSRenderer.java b/src/java/org/apache/fop/render/ps/PSRenderer.java
index 71c3bbcc2..e37e3734c 100644
--- a/src/java/org/apache/fop/render/ps/PSRenderer.java
+++ b/src/java/org/apache/fop/render/ps/PSRenderer.java
@@ -45,7 +45,6 @@ import org.apache.fop.area.PageViewport;
import org.apache.fop.area.RegionViewport;
import org.apache.fop.area.Trait;
import org.apache.fop.area.inline.AbstractTextArea;
-import org.apache.fop.area.inline.ForeignObject;
import org.apache.fop.area.inline.Image;
import org.apache.fop.area.inline.InlineParent;
import org.apache.fop.area.inline.Leader;
@@ -66,6 +65,7 @@ import org.apache.fop.render.Graphics2DAdapter;
import org.apache.fop.render.AbstractPathOrientedRenderer;
import org.apache.fop.render.ImageAdapter;
import org.apache.fop.render.RendererContext;
+import org.apache.fop.render.pdf.PDFRendererContextConstants;
import org.apache.fop.render.ps.extensions.PSSetupCode;
import org.apache.fop.util.CharUtilities;
@@ -281,7 +281,7 @@ public class PSRenderer extends AbstractPathOrientedRenderer implements ImageAda
}
/** @see org.apache.fop.render.AbstractPathOrientedRenderer */
- protected void drawImage(String url, Rectangle2D pos) {
+ protected void drawImage(String url, Rectangle2D pos, Map foreignAttributes) {
endTextObject();
url = ImageFactory.getURL(url);
ImageFactory fact = userAgent.getFactory().getImageFactory();
@@ -307,7 +307,7 @@ public class PSRenderer extends AbstractPathOrientedRenderer implements ImageAda
Document doc = ((XMLImage) fopimage).getDocument();
String ns = ((XMLImage) fopimage).getNameSpace();
- renderDocument(doc, ns, pos);
+ renderDocument(doc, ns, pos, foreignAttributes);
} else if ("image/svg+xml".equals(mime)) {
if (!fopimage.load(FopImage.ORIGINAL_DATA)) {
return;
@@ -315,7 +315,7 @@ public class PSRenderer extends AbstractPathOrientedRenderer implements ImageAda
Document doc = ((XMLImage) fopimage).getDocument();
String ns = ((XMLImage) fopimage).getNameSpace();
- renderDocument(doc, ns, pos);
+ renderDocument(doc, ns, pos, foreignAttributes);
} else if (fopimage instanceof EPSImage) {
PSImageUtils.renderEPS((EPSImage)fopimage, x, y, w, h, gen);
} else {
@@ -1108,40 +1108,16 @@ public class PSRenderer extends AbstractPathOrientedRenderer implements ImageAda
}
/**
- * @see org.apache.fop.render.AbstractRenderer#renderForeignObject(ForeignObject, Rectangle2D)
+ * @see org.apache.fop.render.PrintRenderer#createRendererContext(
+ * int, int, int, int, java.util.Map)
*/
- public void renderForeignObject(ForeignObject fo, Rectangle2D pos) {
- Document doc = fo.getDocument();
- String ns = fo.getNameSpace();
- renderDocument(doc, ns, pos);
- }
-
- /**
- * Renders an XML document (SVG for example).
- * @param doc DOM Document containing the XML document to be rendered
- * @param ns Namespace for the XML document
- * @param pos Position for the generated graphic/image
- */
- public void renderDocument(Document doc, String ns, Rectangle2D pos) {
- endTextObject();
- RendererContext context;
- context = new RendererContext(this, MIME_TYPE);
- context.setUserAgent(userAgent);
-
+ protected RendererContext createRendererContext(int x, int y, int width, int height,
+ Map foreignAttributes) {
+ RendererContext context = super.createRendererContext(
+ x, y, width, height, foreignAttributes);
context.setProperty(PSRendererContextConstants.PS_GENERATOR, this.gen);
context.setProperty(PSRendererContextConstants.PS_FONT_INFO, fontInfo);
- context.setProperty(PSRendererContextConstants.WIDTH,
- new Integer((int) pos.getWidth()));
- context.setProperty(PSRendererContextConstants.HEIGHT,
- new Integer((int) pos.getHeight()));
- context.setProperty(PSRendererContextConstants.XPOS,
- new Integer(currentIPPosition + (int) pos.getX()));
- context.setProperty(PSRendererContextConstants.YPOS,
- new Integer(currentBPPosition + (int) pos.getY()));
- context.setProperty(PSRendererContextConstants.PAGE_VIEWPORT,
- getCurrentPageViewport());
-
- renderXML(context, doc, ns);
+ return context;
}
/** @see org.apache.fop.render.AbstractRenderer */
diff --git a/src/java/org/apache/fop/render/txt/TXTRenderer.java b/src/java/org/apache/fop/render/txt/TXTRenderer.java
index f2f2c770b..a45199242 100644
--- a/src/java/org/apache/fop/render/txt/TXTRenderer.java
+++ b/src/java/org/apache/fop/render/txt/TXTRenderer.java
@@ -24,6 +24,7 @@ import java.awt.geom.Rectangle2D;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
+import java.util.Map;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
@@ -444,12 +445,12 @@ public class TXTRenderer extends AbstractPathOrientedRenderer {
}
}
- /**
- * Does nothing.
- * @param url String
- * @param pos Rectangle2D
+ /**
+ * @see org.apache.fop.render.AbstractPathOrientedRenderer#drawImage(
+ * java.lang.String, java.awt.geom.Rectangle2D, java.util.Map)
*/
- protected void drawImage(String url, Rectangle2D pos) {
+ protected void drawImage(String url, Rectangle2D pos, Map foreignAttributes) {
+ //No images are painted here
}
/**
diff --git a/src/sandbox/META-INF/services/org.apache.fop.render.XMLHandler b/src/sandbox/META-INF/services/org.apache.fop.render.XMLHandler
index cbb7eaa67..3b85504a1 100644
--- a/src/sandbox/META-INF/services/org.apache.fop.render.XMLHandler
+++ b/src/sandbox/META-INF/services/org.apache.fop.render.XMLHandler
@@ -1 +1,2 @@
org.apache.fop.render.pcl.PCLSVGHandler
+org.apache.fop.render.afp.AFPSVGHandler
diff --git a/src/sandbox/org/apache/fop/render/afp/AFPGraphics2DAdapter.java b/src/sandbox/org/apache/fop/render/afp/AFPGraphics2DAdapter.java
new file mode 100644
index 000000000..7aa68fe33
--- /dev/null
+++ b/src/sandbox/org/apache/fop/render/afp/AFPGraphics2DAdapter.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2006 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.afp;
+
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+
+import org.apache.fop.render.AbstractGraphics2DAdapter;
+import org.apache.fop.render.Graphics2DImagePainter;
+import org.apache.fop.render.RendererContext;
+
+/**
+ * Graphics2DAdapter implementation for AFP.
+ */
+public class AFPGraphics2DAdapter extends AbstractGraphics2DAdapter {
+
+ /**
+ * Main constructor
+ */
+ public AFPGraphics2DAdapter() {
+ }
+
+ /** @see org.apache.fop.render.Graphics2DAdapter */
+ public void paintImage(Graphics2DImagePainter painter,
+ RendererContext context,
+ int x, int y, int width, int height) throws IOException {
+ RendererContext.RendererContextWrapper wrappedContext
+ = new RendererContext.RendererContextWrapper(context);
+ AFPRenderer afp = (AFPRenderer)context.getRenderer();
+
+ //Paint to a BufferedImage
+ int resolution = (int)Math.round(context.getUserAgent().getTargetResolution());
+ BufferedImage bi = paintToBufferedImage(painter, wrappedContext, resolution, false);
+
+ afp.drawBufferedImage(bi, resolution, x, y, width, height);
+ }
+
+}
diff --git a/src/sandbox/org/apache/fop/render/afp/AFPRenderer.java b/src/sandbox/org/apache/fop/render/afp/AFPRenderer.java
index fafaf6b6d..2a514d1a1 100644
--- a/src/sandbox/org/apache/fop/render/afp/AFPRenderer.java
+++ b/src/sandbox/org/apache/fop/render/afp/AFPRenderer.java
@@ -21,6 +21,7 @@ package org.apache.fop.render.afp;
import java.awt.Color;
import java.awt.Rectangle;
import java.awt.geom.Rectangle2D;
+import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
@@ -33,6 +34,7 @@ import java.util.Map;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
+import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.MimeConstants;
import org.apache.fop.area.Block;
@@ -77,6 +79,7 @@ import org.apache.fop.render.afp.modca.AFPConstants;
import org.apache.fop.render.afp.modca.AFPDataStream;
import org.apache.fop.render.afp.modca.ImageObject;
import org.apache.fop.render.afp.modca.PageObject;
+import org.w3c.dom.Document;
/**
@@ -565,8 +568,7 @@ public class AFPRenderer extends AbstractPathOrientedRenderer {
/** @see org.apache.fop.render.Renderer#getGraphics2DAdapter() */
public Graphics2DAdapter getGraphics2DAdapter() {
- // TODO
- return null;
+ return new AFPGraphics2DAdapter();
}
/**
@@ -1053,9 +1055,9 @@ public class AFPRenderer extends AbstractPathOrientedRenderer {
/**
* Draw an image at the indicated location.
- * @see org.apache.fop.render.AbstractRenderer#drawImage(String, Rectangle2D)
+ * @see org.apache.fop.render.AbstractRenderer#drawImage(String, Rectangle2D, Map)
*/
- public void drawImage(String url, Rectangle2D pos) {
+ public void drawImage(String url, Rectangle2D pos, Map foreignAttributes) {
String name = null;
if (_pageSegmentsMap != null) {
name = (String)_pageSegmentsMap.get(url);
@@ -1076,6 +1078,13 @@ public class AFPRenderer extends AbstractPathOrientedRenderer {
}
String mime = fopimage.getMimeType();
if ("text/xml".equals(mime)) {
+ if (!fopimage.load(FopImage.ORIGINAL_DATA)) {
+ return;
+ }
+ Document doc = ((XMLImage) fopimage).getDocument();
+ String ns = ((XMLImage) fopimage).getNameSpace();
+
+ renderDocument(doc, ns, pos, foreignAttributes);
} else if (MimeConstants.MIME_SVG.equals(mime)) {
if (!fopimage.load(FopImage.ORIGINAL_DATA)) {
return;
@@ -1098,6 +1107,7 @@ public class AFPRenderer extends AbstractPathOrientedRenderer {
convertToGrayScaleImage(io, SVGConverter.convertToTIFF((XMLImage)fopimage));
}
} else if (MimeConstants.MIME_EPS.equals(mime)) {
+ log.warn("EPS images are not supported by this renderer");
/*
} else if (MimeConstants.MIME_JPEG.equals(mime)) {
if (!fopimage.load(FopImage.ORIGINAL_DATA)) {
@@ -1189,6 +1199,46 @@ public class AFPRenderer extends AbstractPathOrientedRenderer {
}
/**
+ * Draws a BufferedImage to AFP.
+ * @param bi the BufferedImage
+ * @param resolution the resolution of the BufferedImage
+ * @param x the x coordinate (in mpt)
+ * @param y the y coordinate (in mpt)
+ * @param w the width of the viewport (in mpt)
+ * @param h the height of the viewport (in mpt)
+ */
+ public void drawBufferedImage(BufferedImage bi, int resolution, int x, int y, int w, int h) {
+ int afpx = mpts2units(x);
+ int afpy = mpts2units(y);
+ int afpw = mpts2units(w);
+ int afph = mpts2units(h);
+ ByteArrayOutputStream baout = new ByteArrayOutputStream();
+ try {
+ //Serialize image
+ SVGConverter.writeImage(bi, baout);
+ byte[] buf = baout.toByteArray();
+
+ //Generate image
+ ImageObject io = _afpDataStream.getImageObject(afpx, afpy, afpw, afph);
+ io.setImageParameters(
+ resolution, resolution,
+ bi.getWidth(),
+ bi.getHeight()
+ );
+ if (colorImages) {
+ io.setImageIDESize((byte)24);
+ io.setImageData(buf);
+ } else {
+ //TODO Teach it how to handle grayscale BufferedImages directly
+ //because this is pretty inefficient
+ convertToGrayScaleImage(io, buf);
+ }
+ } catch (IOException ioe) {
+ log.error("Error while serializing bitmap: " + ioe.getMessage(), ioe);
+ }
+ }
+
+ /**
* Establishes a new foreground or fill color.
* @see org.apache.fop.render.AbstractRenderer#updateColor(Color, boolean)
*/
diff --git a/src/sandbox/org/apache/fop/render/afp/AFPSVGHandler.java b/src/sandbox/org/apache/fop/render/afp/AFPSVGHandler.java
new file mode 100644
index 000000000..8640486ce
--- /dev/null
+++ b/src/sandbox/org/apache/fop/render/afp/AFPSVGHandler.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2006 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.afp;
+
+// FOP
+import org.apache.fop.render.AbstractGenericSVGHandler;
+import org.apache.fop.render.Renderer;
+
+/**
+ * AFP XML handler for SVG. Uses Apache Batik for SVG processing.
+ * This handler handles XML for foreign objects and delegates to AFPGraphics2DAdapter.
+ * @see AFPGraphics2DAdapter
+ */
+public class AFPSVGHandler extends AbstractGenericSVGHandler {
+
+ /** @see org.apache.fop.render.XMLHandler#supportsRenderer(org.apache.fop.render.Renderer) */
+ public boolean supportsRenderer(Renderer renderer) {
+ return (renderer instanceof AFPRenderer);
+ }
+
+}
+
diff --git a/src/sandbox/org/apache/fop/render/afp/SVGConverter.java b/src/sandbox/org/apache/fop/render/afp/SVGConverter.java
index a8c0e23ca..0adc32a53 100644
--- a/src/sandbox/org/apache/fop/render/afp/SVGConverter.java
+++ b/src/sandbox/org/apache/fop/render/afp/SVGConverter.java
@@ -19,6 +19,7 @@
package org.apache.fop.render.afp;
import java.awt.image.BufferedImage;
+import java.io.IOException;
import java.io.OutputStream;
import org.apache.batik.transcoder.TranscoderException;
import org.apache.batik.transcoder.TranscoderInput;
@@ -38,6 +39,21 @@ public class SVGConverter extends ImageTranscoder {
public void writeImage(BufferedImage img, TranscoderOutput output) {
OutputStream os = output.getOutputStream();
+ try {
+ writeImage(img, os);
+ } catch (IOException ioe) {
+ //ignore
+ //TODO Handle IOException properly!
+ }
+ }
+
+ /**
+ * Writes a BufferedImage to an OutputStream as raw sRGB bitmaps.
+ * @param img the BufferedImage
+ * @param out the OutputStream
+ * @throws IOException In case of an I/O error.
+ */
+ public static void writeImage(BufferedImage img, OutputStream out) throws IOException {
int w = img.getWidth();
int h = img.getHeight();
int[] tmpMap = img.getRGB(0, 0, w, h, null, 0, w);
@@ -47,13 +63,9 @@ public class SVGConverter extends ImageTranscoder {
int r = (p >> 16) & 0xFF;
int g = (p >> 8) & 0xFF;
int b = (p) & 0xFF;
- try {
- os.write((byte)(r & 0xFF));
- os.write((byte)(g & 0xFF));
- os.write((byte)(b & 0xFF));
- } catch (java.io.IOException ioex) {
-
- }
+ out.write((byte)(r & 0xFF));
+ out.write((byte)(g & 0xFF));
+ out.write((byte)(b & 0xFF));
}
}
}
@@ -69,6 +81,7 @@ public class SVGConverter extends ImageTranscoder {
* Converts a SVG image to a TIFF bitmap.
* @param image the SVG image
* @return a byte array containing the TIFF image
+ * @todo Please rename! The method name is misleading.
*/
public static byte[] convertToTIFF(XMLImage image) {
// TIFFTranscoder transcoder = new TIFFTranscoder();
diff --git a/src/sandbox/org/apache/fop/render/pcl/PCLGraphics2DAdapter.java b/src/sandbox/org/apache/fop/render/pcl/PCLGraphics2DAdapter.java
index 7f2c9d6cf..665eb6d6c 100644
--- a/src/sandbox/org/apache/fop/render/pcl/PCLGraphics2DAdapter.java
+++ b/src/sandbox/org/apache/fop/render/pcl/PCLGraphics2DAdapter.java
@@ -18,10 +18,7 @@
package org.apache.fop.render.pcl;
-import java.awt.Color;
import java.awt.Dimension;
-import java.awt.Graphics2D;
-import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
@@ -30,7 +27,7 @@ import java.io.IOException;
import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.apache.fop.render.Graphics2DAdapter;
+import org.apache.fop.render.AbstractGraphics2DAdapter;
import org.apache.fop.render.Graphics2DImagePainter;
import org.apache.fop.render.RendererContext;
import org.apache.fop.util.UnitConv;
@@ -39,7 +36,7 @@ import org.apache.xmlgraphics.java2d.GraphicContext;
/**
* Graphics2DAdapter implementation for PCL and HP GL/2.
*/
-public class PCLGraphics2DAdapter implements Graphics2DAdapter {
+public class PCLGraphics2DAdapter extends AbstractGraphics2DAdapter {
/** logging instance */
private static Log log = LogFactory.getLog(PCLGraphics2DAdapter.class);
@@ -58,7 +55,7 @@ public class PCLGraphics2DAdapter implements Graphics2DAdapter {
PCLRenderer pcl = (PCLRenderer)context.getRenderer();
PCLGenerator gen = pcl.gen;
- // get the 'width' and 'height' attributes of the SVG document
+ // get the 'width' and 'height' attributes of the image/document
Dimension dim = painter.getImageSize();
float imw = (float)dim.getWidth();
float imh = (float)dim.getHeight();
@@ -109,35 +106,9 @@ public class PCLGraphics2DAdapter implements Graphics2DAdapter {
}
if (!painted) {
- int resolution = 300; //TODO not hard-coded, please!
- int bmw = UnitConv.mpt2px(pclContext.getWidth(), resolution);
- int bmh = UnitConv.mpt2px(pclContext.getHeight(), resolution);
- BufferedImage bi = new BufferedImage(
- bmw, bmh,
- BufferedImage.TYPE_BYTE_GRAY);
- Graphics2D g2d = bi.createGraphics();
- try {
- g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
- RenderingHints.VALUE_ANTIALIAS_OFF);
- g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
- RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
- g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS,
- RenderingHints.VALUE_FRACTIONALMETRICS_ON);
-
- g2d.setBackground(Color.white);
- g2d.setColor(Color.black);
- g2d.clearRect(0, 0, bmw, bmh);
- double sx = (double)bmw / pclContext.getWidth();
- double sy = (double)bmh / pclContext.getHeight();
- g2d.scale(sx, sy);
-
- //Paint the SVG on the BufferedImage
- Rectangle2D area = new Rectangle2D.Double(
- 0.0, 0.0, pclContext.getWidth(), pclContext.getHeight());
- painter.paint(g2d, area);
- } finally {
- g2d.dispose();
- }
+ //Fallback solution: Paint to a BufferedImage
+ int resolution = (int)Math.round(context.getUserAgent().getTargetResolution());
+ BufferedImage bi = paintToBufferedImage(painter, pclContext, resolution, true);
pcl.setCursorPos(x, y);
gen.paintBitmap(bi, resolution);
diff --git a/src/sandbox/org/apache/fop/render/pcl/PCLRenderer.java b/src/sandbox/org/apache/fop/render/pcl/PCLRenderer.java
index 903d3eec7..450fb5852 100644
--- a/src/sandbox/org/apache/fop/render/pcl/PCLRenderer.java
+++ b/src/sandbox/org/apache/fop/render/pcl/PCLRenderer.java
@@ -776,54 +776,6 @@ public class PCLRenderer extends PrintRenderer {
renderDocument(doc, ns, pos, fo.getForeignAttributes());
}
- /**
- * Renders an XML document (SVG for example).
- * @param doc the DOM Document containing the XML document to be rendered
- * @param ns the namespace URI for the XML document
- * @param pos the position for the generated graphic/image
- * @param foreignAttributes the foreign attributes containing rendering hints, or null
- */
- public void renderDocument(Document doc, String ns, Rectangle2D pos, Map foreignAttributes) {
- int x = currentIPPosition + (int) pos.getX();
- int y = currentBPPosition + (int) pos.getY();
- int width = (int)pos.getWidth();
- int height = (int)pos.getHeight();
- RendererContext context = createRendererContext(x, y, width, height, foreignAttributes);
-
- renderXML(context, doc, ns);
- }
-
- /**
- * Creates a RendererContext for an image.
- * @param x the x coordinate (in millipoints)
- * @param y the y coordinate (in millipoints)
- * @param width the width of the image (in millipoints)
- * @param height the height of the image (in millipoints)
- * @param foreignAttributes a Map or foreign attributes, may be null
- * @return the RendererContext
- */
- protected RendererContext createRendererContext(int x, int y, int width, int height,
- Map foreignAttributes) {
- RendererContext context;
- context = new RendererContext(this, MIME_TYPE);
- context.setUserAgent(userAgent);
-
- context.setProperty(RendererContextConstants.WIDTH,
- new Integer(width));
- context.setProperty(RendererContextConstants.HEIGHT,
- new Integer(height));
- context.setProperty(RendererContextConstants.XPOS,
- new Integer(x));
- context.setProperty(RendererContextConstants.YPOS,
- new Integer(y));
- context.setProperty(RendererContextConstants.PAGE_VIEWPORT,
- getCurrentPageViewport());
- if (foreignAttributes != null) {
- context.setProperty(RendererContextConstants.FOREIGN_ATTRIBUTES, foreignAttributes);
- }
- return context;
- }
-
/**
* Common method to render the background and borders for any inline area.
* The all borders and padding are drawn outside the specified area.
diff --git a/src/sandbox/org/apache/fop/render/pcl/PCLRendererContext.java b/src/sandbox/org/apache/fop/render/pcl/PCLRendererContext.java
index 73e27bcac..2f77dd4aa 100644
--- a/src/sandbox/org/apache/fop/render/pcl/PCLRendererContext.java
+++ b/src/sandbox/org/apache/fop/render/pcl/PCLRendererContext.java
@@ -29,10 +29,8 @@ import org.apache.fop.util.QName;
* Wrapper on the RendererContext to access the information structure for drawing
* the XML document.
*/
-public class PCLRendererContext {
+public class PCLRendererContext extends RendererContext.RendererContextWrapper {
- private RendererContext context;
-
/**
* Wrap the render context to allow easier access to its values.
*
@@ -49,37 +47,7 @@ public class PCLRendererContext {
* @param context the RendererContent instance
*/
public PCLRendererContext(RendererContext context) {
- this.context = context;
- }
-
- /** @return the currentXPosition */
- public int getCurrentXPosition() {
- return ((Integer)context.getProperty(PCLSVGHandler.XPOS)).intValue();
- }
-
- /** @return the currentYPosition */
- public int getCurrentYPosition() {
- return ((Integer)context.getProperty(PCLSVGHandler.YPOS)).intValue();
- }
-
- /** @return the width of the image */
- public int getWidth() {
- return ((Integer)context.getProperty(PCLSVGHandler.WIDTH)).intValue();
- }
-
- /** @return the height of the image */
- public int getHeight() {
- return ((Integer)context.getProperty(PCLSVGHandler.HEIGHT)).intValue();
- }
-
- /** @return the handler configuration */
- public Configuration getHandlerConfiguration() {
- return (Configuration)context.getProperty(PCLSVGHandler.HANDLER_CONFIGURATION);
- }
-
- /** @return the foreign attributes */
- public Map getForeignAttributes() {
- return (Map)context.getProperty(PCLSVGHandler.FOREIGN_ATTRIBUTES);
+ super(context);
}
/** @return true if the SVG image should be rendered as a bitmap */
diff --git a/src/sandbox/org/apache/fop/render/pcl/PCLSVGHandler.java b/src/sandbox/org/apache/fop/render/pcl/PCLSVGHandler.java
index 7eec5169d..7c1a45a0d 100644
--- a/src/sandbox/org/apache/fop/render/pcl/PCLSVGHandler.java
+++ b/src/sandbox/org/apache/fop/render/pcl/PCLSVGHandler.java
@@ -18,129 +18,22 @@
package org.apache.fop.render.pcl;
-// Java
-import java.awt.Dimension;
-import java.awt.Graphics2D;
-import java.awt.geom.AffineTransform;
-import java.awt.geom.Rectangle2D;
-import java.io.IOException;
-
-// DOM
-import org.w3c.dom.Document;
-
-// Batik
-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;
-
// FOP
-import org.apache.fop.render.Graphics2DAdapter;
-import org.apache.fop.render.Graphics2DImagePainter;
+import org.apache.fop.render.AbstractGenericSVGHandler;
import org.apache.fop.render.Renderer;
-import org.apache.fop.render.RendererContextConstants;
-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;
/**
* PCL XML handler for SVG. Uses Apache Batik for SVG processing.
* This handler handles XML for foreign objects when rendering to HP GL/2.
* It renders SVG to HP GL/2 using the PCLGraphics2D.
- *
- * @version $Id$
+ * @see PCLGraphics2DAdapter
*/
-public class PCLSVGHandler implements XMLHandler, RendererContextConstants {
-
- /** logging instance */
- private static Log log = LogFactory.getLog(PCLSVGHandler.class);
-
- /**
- * Create a new XML handler for use by the PCL renderer.
- */
- public PCLSVGHandler() {
- }
-
- /** @see org.apache.fop.render.XMLHandler */
- public void handleXML(RendererContext context,
- Document doc, String ns) throws Exception {
- PCLRendererContext pclContext = PCLRendererContext.wrapRendererContext(context);
-
- if (SVGDOMImplementation.SVG_NAMESPACE_URI.equals(ns)) {
- renderSVGDocument(context, doc, pclContext);
- }
- }
-
- /**
- * Render the SVG document.
- * @param context the renderer context
- * @param doc the SVG document
- * @param pclContext the information of the current context
- */
- protected void renderSVGDocument(final RendererContext context,
- final Document doc, final PCLRendererContext pclContext) {
- int x = pclContext.getCurrentXPosition();
- int y = pclContext.getCurrentYPosition();
-
- SVGUserAgent ua = new SVGUserAgent(
- context.getUserAgent().getSourcePixelUnitToMillimeter(),
- new AffineTransform());
- GVTBuilder builder = new GVTBuilder();
- final BridgeContext ctx = new BridgeContext(ua);
-
- final GraphicsNode root;
- try {
- root = builder.build(ctx, doc);
-
- } catch (Exception e) {
- log.error("SVG graphic could not be built: "
- + e.getMessage(), e);
- return;
- }
-
- Graphics2DImagePainter painter = new Graphics2DImagePainter() {
-
- public void paint(Graphics2D g2d, Rectangle2D area) {
-
- // 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();
- float ih = (float) ctx.getDocumentSize().getHeight();
- float w = (float) area.getWidth();
- float h = (float) area.getHeight();
- g2d.scale(w / iw, h / ih);
-
- root.paint(g2d);
- }
-
- public Dimension getImageSize() {
- return new Dimension(pclContext.getWidth(), pclContext.getHeight());
- }
-
- };
-
- try {
- Graphics2DAdapter adapter = context.getRenderer().getGraphics2DAdapter();
- adapter.paintImage(painter, context,
- x, y, pclContext.getWidth(), pclContext.getHeight());
- } catch (IOException ioe) {
- ((PCLRenderer)context.getRenderer()).handleIOTrouble(ioe);
- }
- }
+public class PCLSVGHandler extends AbstractGenericSVGHandler {
/** @see org.apache.fop.render.XMLHandler#supportsRenderer(org.apache.fop.render.Renderer) */
public boolean supportsRenderer(Renderer renderer) {
return (renderer instanceof PCLRenderer);
}
- /** @see org.apache.fop.render.XMLHandler#getNamespace() */
- public String getNamespace() {
- return SVGDOMImplementation.SVG_NAMESPACE_URI;
- }
-
}