You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-commits@xmlgraphics.apache.org by ke...@apache.org on 2001/10/05 11:49:21 UTC
cvs commit: xml-fop/src/org/apache/fop/render/svg SVGRenderer.java
keiron 01/10/05 02:49:21
Modified: src/org/apache/fop/apps CommandLineOptions.java Driver.java
Added: src/org/apache/fop/render/svg SVGRenderer.java
Log:
added svg renderer
Revision Changes Path
1.14 +18 -1 xml-fop/src/org/apache/fop/apps/CommandLineOptions.java
Index: CommandLineOptions.java
===================================================================
RCS file: /home/cvs/xml-fop/src/org/apache/fop/apps/CommandLineOptions.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- CommandLineOptions.java 2001/09/17 13:29:52 1.13
+++ CommandLineOptions.java 2001/10/05 09:49:21 1.14
@@ -1,5 +1,5 @@
/*
- * $Id: CommandLineOptions.java,v 1.13 2001/09/17 13:29:52 keiron Exp $
+ * $Id: CommandLineOptions.java,v 1.14 2001/10/05 09:49:21 keiron Exp $
* Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
* For details on use and redistribution please refer to the
* LICENSE file included with these sources.
@@ -48,6 +48,8 @@
private static final int PS_OUTPUT = 6;
/* output: text file */
private static final int TXT_OUTPUT = 7;
+ /* output: svg file */
+ private static final int SVG_OUTPUT = 8;
/* System buffers */
private static final int BUFFER_FILE = 8;
@@ -247,6 +249,14 @@
outfile = new File(args[i + 1]);
i++;
}
+ } else if (args[i].equals("-svg")) {
+ setOutputMode(SVG_OUTPUT);
+ if ((i + 1 == args.length)
+ || (args[i + 1].charAt(0) == '-')) {
+ throw new FOPException("you must specify the svg output file"); } else {
+ outfile = new File(args[i + 1]);
+ i++;
+ }
} else if (args[i].charAt(0) != '-') {
if (inputmode == NOT_SET) {
inputmode = FO_INPUT;
@@ -376,6 +386,8 @@
return Driver.RENDER_PS;
case TXT_OUTPUT:
return Driver.RENDER_TXT;
+ case SVG_OUTPUT:
+ return Driver.RENDER_SVG;
case AREA_OUTPUT:
rendererOptions.put("fineDetail", isCoarseAreaXml());
return Driver.RENDER_XML;
@@ -532,6 +544,7 @@
+ " -pcl outfile input will be rendered as pcl file (outfile req'd) \n"
+ " -ps outfile input will be rendered as PostScript file (outfile req'd) \n"
+ " -txt outfile input will be rendered as text file (outfile req'd) \n"
+ + " -svg outfile input will be rendered as an svg slides file (outfile req'd) \n"
+ " -at outfile representation of area tree as XML (outfile req'd) \n"
+ " -print input file will be rendered and sent to the printer \n"
+ " see options with \"-print help\" \n\n"
@@ -612,6 +625,10 @@
break;
case TXT_OUTPUT:
log.debug("txt");
+ log.debug("output file: " + outfile.toString());
+ break;
+ case SVG_OUTPUT:
+ log.debug("svg");
log.debug("output file: " + outfile.toString());
break;
default:
1.36 +10 -1 xml-fop/src/org/apache/fop/apps/Driver.java
Index: Driver.java
===================================================================
RCS file: /home/cvs/xml-fop/src/org/apache/fop/apps/Driver.java,v
retrieving revision 1.35
retrieving revision 1.36
diff -u -r1.35 -r1.36
--- Driver.java 2001/09/17 13:29:52 1.35
+++ Driver.java 2001/10/05 09:49:21 1.36
@@ -1,5 +1,5 @@
/*
- * $Id: Driver.java,v 1.35 2001/09/17 13:29:52 keiron Exp $
+ * $Id: Driver.java,v 1.36 2001/10/05 09:49:21 keiron Exp $
* Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
* For details on use and redistribution please refer to the
* LICENSE file included with these sources.
@@ -132,6 +132,11 @@
public static final int RENDER_TXT = 8;
/**
+ * Render to SVG. OutputStream must be set
+ */
+ public static final int RENDER_SVG = 9;
+
+ /**
* the FO tree builder
*/
private FOTreeBuilder _treeBuilder;
@@ -308,6 +313,7 @@
* <li>RENDER_PCL
* <li>RENDER_PS
* <li>RENDER_TXT
+ * <li>RENDER_SVG
* </ul>
* @param renderer the type of renderer to use
*/
@@ -334,6 +340,9 @@
break;
case RENDER_XML:
setRenderer(new org.apache.fop.render.xml.XMLRenderer());
+ break;
+ case RENDER_SVG:
+ setRenderer(new org.apache.fop.render.svg.SVGRenderer());
break;
default:
throw new IllegalArgumentException("Unknown renderer type");
1.1 xml-fop/src/org/apache/fop/render/svg/SVGRenderer.java
Index: SVGRenderer.java
===================================================================
/*
* $Id: SVGRenderer.java,v 1.1 2001/10/05 09:49:21 keiron Exp $
* Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
* For details on use and redistribution please refer to the
* LICENSE file included with these sources.
*/
package org.apache.fop.render.svg;
import org.apache.fop.layout.*;
import org.apache.fop.layout.inline.*;
import org.apache.fop.datatypes.*;
import org.apache.fop.image.*;
import org.apache.fop.svg.*;
import org.apache.fop.render.pdf.*;
import org.apache.fop.render.awt.*;
import org.apache.fop.viewer.*;
import org.apache.fop.apps.*;
import org.apache.fop.svg.SVGUtilities;
import org.w3c.dom.*;
import org.w3c.dom.svg.*;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.DOMImplementation;
import org.apache.batik.bridge.*;
import org.apache.batik.swing.svg.*;
import org.apache.batik.swing.gvt.*;
import org.apache.batik.gvt.*;
import org.apache.batik.gvt.renderer.*;
import org.apache.batik.gvt.filter.*;
import org.apache.batik.gvt.event.*;
import org.apache.batik.dom.svg.SVGDOMImplementation;
import org.apache.batik.dom.svg.SVGOMElement;
import org.apache.batik.dom.util.XMLSupport;
import org.apache.batik.transcoder.svg2svg.SVGTranscoder;
import org.apache.batik.transcoder.TranscoderInput;
import org.apache.batik.transcoder.TranscoderOutput;
import org.apache.batik.transcoder.TranscoderException;
import java.awt.*;
import java.awt.Image;
import java.awt.image.*;
import java.awt.geom.*;
import java.awt.font.*;
import java.util.*;
import java.net.URL;
import java.net.MalformedURLException;
import java.io.*;
import java.beans.*;
import javax.swing.*;
import java.awt.print.*;
import java.awt.image.BufferedImage;
import java.text.*;
import org.apache.fop.render.AbstractRenderer;
import org.apache.batik.util.SVGConstants;
import org.apache.batik.svggen.SVGGraphics2D;
import org.apache.batik.dom.svg.ExtensibleSVGDOMImplementation;
public class SVGRenderer extends AbstractRenderer {
static final String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
Document svgDocument;
Element svgRoot;
Element currentPageG = null;
Element lastLink = null;
float totalWidth = 0;
float totalHeight = 0;
protected int pageWidth = 0;
protected int pageHeight = 0;
protected int pageNumber = 0;
protected Hashtable fontNames = new Hashtable();
protected Hashtable fontStyles = new Hashtable();
protected Color saveColor = null;
protected IDReferences idReferences = null;
/**
* The current (internal) font name
*/
protected String currentFontName;
/**
* The current font size in millipoints
*/
protected int currentFontSize;
/**
* The current colour's red, green and blue component
*/
protected float currentRed = 0;
protected float currentGreen = 0;
protected float currentBlue = 0;
/**
* The parent component, used to set up the font.
* This is needed as FontSetup needs a live AWT component
* in order to generate valid font measures.
*/
protected Component parent;
/**
* options
*/
protected Hashtable options;
/**
* set up renderer options
*/
public void setOptions(Hashtable options) {
this.options = options;
}
public SVGRenderer() {
}
/**
* add a line to the current stream
*
* @param x1 the start x location in millipoints
* @param y1 the start y location in millipoints
* @param x2 the end x location in millipoints
* @param y2 the end y location in millipoints
* @param th the thickness in millipoints
* @param r the red component
* @param g the green component
* @param b the blue component
*/
protected void addLine(int x1, int y1, int x2, int y2, int th, float r,
float g, float b) {
Element line = SVGUtilities.createLine(svgDocument, x1 / 1000f, pageHeight - (y1 / 1000f), x2 / 1000f, pageHeight - (y2 / 1000f));
line.setAttributeNS(null, "style", "stroke-width:" + (Math.abs(th) / 1000f)
+ ";stroke:rgb(" + ((int)(255 * r)) + "," + ((int)(255 * g)) + "," + ((int)(255 * b)) + ")");
currentPageG.appendChild(line);
}
/**
* draw a rectangle
*
* @param x the x position of left edge in millipoints
* @param y the y position of top edge in millipoints
* @param w the width in millipoints
* @param h the height in millipoints
* @param r the red component
* @param g the green component
* @param b the blue component
*/
protected void addRect(int x, int y, int w, int h, float r, float g,
float b) {
Element rect = SVGUtilities.createRect(svgDocument, x / 1000f, pageHeight - (y / 1000f), w / 1000f, h / 1000f);
rect.setAttributeNS(null, "style", "stroke:rgb(" + ((int)(255 * r)) + "," + ((int)(255 * g)) + "," + ((int)(255 * b)) + ")");
currentPageG.appendChild(rect);
}
/**
* draw a filled rectangle
*
* @param x the x position of left edge in millipoints
* @param y the y position of top edge in millipoints
* @param w the width in millipoints
* @param h the height in millipoints
* @param r the red component of edges
* @param g the green component of edges
* @param b the blue component of edges
* @param fr the red component of the fill
* @param fg the green component of the fill
* @param fb the blue component of the fill
*/
protected void addRect(int x, int y, int w, int h, float r, float g,
float b, float fr, float fg, float fb) {
Element rect = SVGUtilities.createRect(svgDocument, x / 1000f, pageHeight - (y / 1000f), w / 1000f, h / 1000f);
rect.setAttributeNS(null, "style", "stroke:rgb(" + ((int)(255 * r)) + "," + ((int)(255 * g)) + "," + ((int)(255 * b)) + ");fill:rgb(" + ((int)(255 * fr)) + "," + ((int)(255 * fg)) + "," + ((int)(255 * fb)) + ")");
currentPageG.appendChild(rect);
}
/**
* draw a filled rectangle in the current color
*
* @param x the x position of left edge in millipoints
* @param y the y position of top edge in millipoints
* @param w the width in millipoints
* @param h the height in millipoints
* @param drawAsOutline true for draw, false for fill
*/
protected void addRect(int x, int y, int w, int h,
boolean drawAsOutline) {
int startx = (x + 500) / 1000;
int starty = pageHeight - ((y + 500) / 1000);
int endx = (x + w + 500) / 1000;
int endy = pageHeight - ((y + h + 500) / 1000);
if (drawAsOutline) {
Element rect = SVGUtilities.createRect(svgDocument, startx, starty, endx - startx, endy - starty);
rect.setAttributeNS(null, "style", "fill:none");
currentPageG.appendChild(rect);
} else {
Element rect = SVGUtilities.createRect(svgDocument, startx, starty, endx - startx, starty - endy);
rect.setAttributeNS(null, "style", "stroke:none");
currentPageG.appendChild(rect);
}
}
protected void addFilledRect(int x, int y, int w, int h,
ColorType col) {
float r = col.red();
float g = col.green();
float b = col.blue();
addRect(x, y, w, h, r, g, b, r, g, b);
}
protected void drawFrame() {
int width = pageWidth;
int height = pageHeight;
Element rect = SVGUtilities.createRect(svgDocument, 0, 0, width, height);
rect.setAttributeNS(null, "style", "fill:none;stroke:black");
currentPageG.appendChild(rect);
}
public void render(Page page, OutputStream stream)
throws IOException {
pageNumber++;
this.render(page);
}
public void render(Page page)
throws IOException {
idReferences = page.getIDReferences();
int lastWidth = pageWidth;
int lastHeight = pageHeight;
pageWidth = (int)((float)page.getWidth() / 1000f + .5);
pageHeight = (int)((float)page.getHeight() / 1000f + .5);
if(lastLink != null && currentPageG != null) {
lastLink.setAttributeNS(null, "xlink:href", "#svgView(viewBox(0, "+ (totalHeight) + ", " + pageWidth + ", " + pageHeight + "))");
currentPageG.appendChild(lastLink);
}
totalHeight += pageHeight;
if(totalWidth < pageWidth) {
totalWidth = pageWidth;
}
currentPageG = SVGUtilities.createG(svgDocument);
currentPageG.setAttributeNS(null, "id", /*title + */"Page-" + pageNumber);
currentPageG.setAttributeNS(null, "style", "font-family:sanserif;font-size:12");
svgRoot.appendChild(currentPageG);
drawFrame();
renderPage(page);
currentPageG.setAttributeNS(null, "transform", "translate(0," + (totalHeight - pageHeight) + ")");
Element lastPageLink = svgDocument.createElementNS(svgNS, "a");
if(lastLink != null) {
lastPageLink.setAttributeNS(null, "xlink:href", "#svgView(viewBox(0, " + (totalHeight - pageHeight - lastHeight) + ", " + lastWidth + ", " + lastHeight + "))");
} else {
lastPageLink.setAttributeNS(null, "xlink:href", "#svgView(viewBox(0, " + (totalHeight - pageHeight) + ", " + pageWidth + ", " + pageHeight + "))");
}
currentPageG.appendChild(lastPageLink);
Element rect = SVGUtilities.createRect(svgDocument, 0, 0, pageWidth / 2, pageHeight);
rect.setAttributeNS(null, "style", "fill:blue;visibility:hidden");
lastPageLink.appendChild(rect);
lastLink = svgDocument.createElementNS(svgNS, "a");
rect = SVGUtilities.createRect(svgDocument, pageWidth / 2, 0, pageWidth / 2, pageHeight);
rect.setAttributeNS(null, "style", "fill:blue;visibility:hidden");
lastLink.appendChild(rect);
/*
* if (page.hasLinks()) {
* ....
* }
*/
}
public void renderPage(Page page) {
BodyAreaContainer body;
AreaContainer before, after;
body = page.getBody();
before = page.getBefore();
after = page.getAfter();
this.currentFontName = "";
this.currentFontSize = 0;
renderBodyAreaContainer(body);
if (before != null) {
renderAreaContainer(before);
}
if (after != null) {
renderAreaContainer(after);
}
}
protected void doFrame(org.apache.fop.layout.Area area) {
int w, h;
int rx = this.currentAreaContainerXPosition;
w = area.getContentWidth();
if (area instanceof BlockArea) {
rx += ((BlockArea)area).getStartIndent();
}
h = area.getContentHeight();
int ry = this.currentYPosition;
ColorType bg = area.getBackgroundColor();
rx = rx - area.getPaddingLeft();
ry = ry + area.getPaddingTop();
w = w + area.getPaddingLeft() + area.getPaddingRight();
h = h + area.getPaddingTop() + area.getPaddingBottom();
// I'm not sure I should have to check for bg being null
// but I do
if ((bg != null) && (bg.alpha() == 0)) {
this.addRect(rx, ry, w, h, bg.red(), bg.green(), bg.blue(),
bg.red(), bg.green(), bg.blue());
}
rx = rx - area.getBorderLeftWidth();
ry = ry + area.getBorderTopWidth();
w = w + area.getBorderLeftWidth() + area.getBorderRightWidth();
h = h + area.getBorderTopWidth() + area.getBorderBottomWidth();
BorderAndPadding bp = area.getBorderAndPadding();
ColorType borderColor;
if (area.getBorderTopWidth() != 0) {
borderColor = bp.getBorderColor(BorderAndPadding.TOP);
addLine(rx, ry, rx + w, ry, area.getBorderTopWidth(),
borderColor.red(), borderColor.green(),
borderColor.blue());
}
if (area.getBorderLeftWidth() != 0) {
borderColor = bp.getBorderColor(BorderAndPadding.LEFT);
addLine(rx, ry, rx, ry - h, area.getBorderLeftWidth(),
borderColor.red(), borderColor.green(),
borderColor.blue());
}
if (area.getBorderRightWidth() != 0) {
borderColor = bp.getBorderColor(BorderAndPadding.RIGHT);
addLine(rx + w, ry, rx + w, ry - h,
area.getBorderRightWidth(), borderColor.red(),
borderColor.green(),
borderColor.blue());
}
if (area.getBorderBottomWidth() != 0) {
borderColor = bp.getBorderColor(BorderAndPadding.BOTTOM);
addLine(rx, ry - h, rx + w, ry - h, area.getBorderBottomWidth(),
borderColor.red(), borderColor.green(),
borderColor.blue());
}
}
protected Rectangle2D getBounds(org.apache.fop.layout.Area a) {
return new Rectangle2D.Double(currentAreaContainerXPosition,
currentYPosition,
a.getAllocationWidth(), a.getHeight());
}
public void setupFontInfo(FontInfo fontInfo) {
// create a temp Image to test font metrics on
BufferedImage fontImage =
new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
org.apache.fop.render.awt.FontSetup.setup(fontInfo, fontImage.createGraphics());
}
public void renderDisplaySpace(DisplaySpace space) {
int d = space.getSize();
this.currentYPosition -= d;
}
public void renderImageArea(ImageArea area) {
int x = currentXPosition + area.getXOffset();
int y = currentYPosition;
int w = area.getContentWidth();
int h = area.getHeight();
this.currentYPosition -= h;
FopImage img = area.getImage();
if (img == null) {
log.error("Error while loading image : area.getImage() is null");
addRect(x, y, w, h, true); // use helper function
} else {
if (img instanceof SVGImage) {
try {
SVGDocument svg = ((SVGImage)img).getSVGDocument();
renderSVGDocument(svg, x / 1000f, pageHeight - y / 1000f);
} catch (FopImageException e) {}
} else {
String urlString = img.getURL();
try {
URL url = new URL(urlString);
ImageIcon icon = new ImageIcon(url);
Image image = icon.getImage();
int startx = (x + 500) / 1000;
int starty = pageHeight - ((y + 500) / 1000);
int endx = (x + w + 500) / 1000;
int endy = pageHeight - ((y + h + 500) / 1000);
// reverse start and end y because h is positive
//graphics.drawImage(image, startx, starty, endx - startx,
// starty - endy, null);
} catch (MalformedURLException mue) {
// cannot normally occur because, if URL is wrong, constructing FopImage
// will already have failed earlier on
}
}
}
this.currentXPosition += area.getContentWidth();
}
public void renderWordArea(WordArea area) {
char ch;
StringBuffer pdf = new StringBuffer();
String name = area.getFontState().getFontFamily();
int size = area.getFontState().getFontSize();
boolean underlined = area.getUnderlined();
float red = area.getRed();
float green = area.getGreen();
float blue = area.getBlue();
if ((!name.equals(this.currentFontName))
|| (size != this.currentFontSize)) {
this.currentFontName = name;
this.currentFontSize = size;
}
if ((red != this.currentRed) || (green != this.currentGreen)
|| (blue != this.currentBlue)) {
this.currentRed = red;
this.currentGreen = green;
this.currentBlue = blue;
}
int rx = this.currentXPosition;
int bl = this.currentYPosition;
String s; // = area.getText();
if (area.getPageNumberID()
!= null) { // this text is a page number, so resolve it
s = idReferences.getPageNumber(area.getPageNumberID());
if (s == null) {
s = "";
}
} else {
s = area.getText();
}
if (saveColor != null) {
if (saveColor.getRed() != red || saveColor.getGreen() != green
|| saveColor.getBlue() != blue) {
saveColor = new Color(red, green, blue);
}
} else {
saveColor = new Color(red, green, blue);
}
Element text = SVGUtilities.createText(svgDocument, rx / 1000f, pageHeight - bl / 1000f, s);
String st = null;
if(!"sans-serif".equals(this.currentFontName)) {
st = "font-family:" + this.currentFontName;
}
if(this.currentFontSize != 12000) {
if(st == null) {
st = "";
} else {
st += ";";
}
st += "font-size:" + (this.currentFontSize / 1000f);
}
if(red != 0 || green != 0 || blue != 0) {
if(st == null) {
st = "";
} else {
st += ";";
}
st += "fill:rgb(" + ((int)(255 * red)) + "," + ((int)(255 * green)) + "," + ((int)(255 * blue)) + ")";
}
String fweight = area.getFontState().getFontWeight();
if(!"normal".equals(fweight)) {
if(st == null) {
st = "";
} else {
st += ";";
}
st += "font-weight:" + fweight;
}
String fstyle = area.getFontState().getFontStyle();
if(!"normal".equals(fstyle)) {
if(st == null) {
st = "";
} else {
st += ";";
}
st += "font-style:" + fstyle;
}
if(st != null) {
text.setAttributeNS(null, "style", st);
}
currentPageG.appendChild(text);
this.currentXPosition += area.getContentWidth();
}
public void renderInlineSpace(InlineSpace space) {
this.currentXPosition += space.getSize();
}
/**
*
* @param area area to render
*/
public void renderLeaderArea(LeaderArea area) {
int rx = this.currentXPosition;
int ry = this.currentYPosition;
int w = area.getLeaderLength();
int h = area.getHeight();
int th = area.getRuleThickness();
int st = area.getRuleStyle(); // not used at the moment
float r = area.getRed();
float g = area.getGreen();
float b = area.getBlue();
//graphics.setColor(new Color(r, g, b));
addRect(rx, ry, w, th, false);
this.currentXPosition += area.getContentWidth();
}
public void renderSVGArea(SVGArea area) {
float x = this.currentXPosition / 1000f;
float y = pageHeight - this.currentYPosition / 1000f;
int w = area.getContentWidth();
int h = area.getHeight();
Document doc = area.getSVGDocument();
renderSVGDocument(doc, x, y);
this.currentXPosition += area.getContentWidth();
}
protected void renderSVGDocument(Document doc, float x, float y) {
SVGSVGElement svg = ((SVGDocument)doc).getRootElement();
Element view = svgDocument.createElementNS(svgNS, "svg");
Node newsvg = svgDocument.importNode(svg, true);
//view.setAttributeNS(null, "viewBox", "0 0 ");
view.setAttributeNS(null, "x", "" + x);
view.setAttributeNS(null, "y", "" + y);
// this fixes a problem where the xmlns is repeated sometimes
Element ele = (Element)newsvg;
ele.setAttributeNS(XMLSupport.XMLNS_NAMESPACE_URI, "xmlns", svgNS);
if(ele.hasAttributeNS(null, "xmlns")) {
ele.removeAttributeNS(null, "xmlns");
}
view.appendChild(newsvg);
currentPageG.appendChild(view);
}
public void setProducer(String producer) {
// defined in Renderer Interface
}
public static Color colorType2Color(ColorType ct) {
if (ct == null) {
return null;
}
return new Color(ct.red(), ct.green(), ct.blue());
}
public void renderForeignObjectArea(ForeignObjectArea area) {
area.getObject().render(this);
}
public void startRenderer(OutputStream outputStream)
throws IOException {
DOMImplementation impl = SVGDOMImplementation.getDOMImplementation();
svgDocument = impl.createDocument(svgNS, "svg", null);
svgRoot = svgDocument.getDocumentElement();
}
public void stopRenderer(OutputStream outputStream)
throws IOException {
svgRoot.setAttributeNS(null, "width", "" + totalWidth);
svgRoot.setAttributeNS(null, "height", "" + totalHeight);
//svgRoot.setAttributeNS(null, "viewBox", "0 0 " + pageWidth + " " + pageHeight);
SVGTranscoder svgT = new SVGTranscoder();
TranscoderInput input = new TranscoderInput(svgDocument);
TranscoderOutput output = new TranscoderOutput(new OutputStreamWriter(outputStream));
try {
svgT.transcode(input, output);
} catch(TranscoderException e) {
log.error("could not write svg file :" + e.getMessage(), e);
}
outputStream.flush();
svgDocument = null;
svgRoot = null;
currentPageG = null;
lastLink = null;
totalWidth = 0;
totalHeight = 0;
pageNumber = 0;
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: fop-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: fop-cvs-help@xml.apache.org